Add debug => go-debug
This commit is contained in:
parent
95d134b57e
commit
f2139e2a16
17
debug/README.md
Normal file
17
debug/README.md
Normal file
@ -0,0 +1,17 @@
|
||||
# Debug
|
||||
|
||||
Debug is a debugging library for microservices
|
||||
|
||||
## Overview
|
||||
|
||||
Debug is a pluggable library for debugging. It includes base level requirements for logging, tracing and metrics.
|
||||
Our goal is to provide a simple experience for understanding what's happening in a running system with zero dependencies
|
||||
by default or by plugging into robust systems like ELK, zipkin, etc.
|
||||
|
||||
## Features
|
||||
|
||||
- Health (Checks)
|
||||
- Log (Logging)
|
||||
- Stats (Metrics)
|
||||
- Trace (Requests)
|
||||
|
2
debug/handler/handler.go
Normal file
2
debug/handler/handler.go
Normal file
@ -0,0 +1,2 @@
|
||||
// Package handler provides handlers
|
||||
package handler
|
17
debug/handler/http/http.go
Normal file
17
debug/handler/http/http.go
Normal file
@ -0,0 +1,17 @@
|
||||
// Package http provides http handlers
|
||||
package http
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
)
|
||||
|
||||
type Handler struct{}
|
||||
|
||||
func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
switch r.URL.Path {
|
||||
case "/debug/health":
|
||||
case "/debug/log":
|
||||
case "/debug/stats":
|
||||
case "/debug/trace":
|
||||
}
|
||||
}
|
157
debug/handler/rpc/proto/debug.micro.go
Normal file
157
debug/handler/rpc/proto/debug.micro.go
Normal file
@ -0,0 +1,157 @@
|
||||
// Code generated by protoc-gen-micro. DO NOT EDIT.
|
||||
// source: go-debug/handler/rpc/proto/debug.proto
|
||||
|
||||
/*
|
||||
Package go_micro_debug is a generated protocol buffer package.
|
||||
|
||||
It is generated from these files:
|
||||
go-debug/handler/rpc/proto/debug.proto
|
||||
|
||||
It has these top-level messages:
|
||||
Check
|
||||
Log
|
||||
Stats
|
||||
Trace
|
||||
Request
|
||||
HealthResponse
|
||||
LogResponse
|
||||
StatsResponse
|
||||
TraceResponse
|
||||
*/
|
||||
package go_micro_debug
|
||||
|
||||
import proto "github.com/golang/protobuf/proto"
|
||||
import fmt "fmt"
|
||||
import math "math"
|
||||
|
||||
import (
|
||||
context "context"
|
||||
client "github.com/micro/go-micro/client"
|
||||
server "github.com/micro/go-micro/server"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
// This is a compile-time assertion to ensure that this generated file
|
||||
// is compatible with the proto package it is being compiled against.
|
||||
// A compilation error at this line likely means your copy of the
|
||||
// proto package needs to be updated.
|
||||
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ context.Context
|
||||
var _ client.Option
|
||||
var _ server.Option
|
||||
|
||||
// Client API for Debug service
|
||||
|
||||
type DebugService interface {
|
||||
Health(ctx context.Context, in *Request, opts ...client.CallOption) (*HealthResponse, error)
|
||||
Log(ctx context.Context, in *Request, opts ...client.CallOption) (*LogResponse, error)
|
||||
Stats(ctx context.Context, in *Request, opts ...client.CallOption) (*StatsResponse, error)
|
||||
Trace(ctx context.Context, in *Request, opts ...client.CallOption) (*TraceResponse, error)
|
||||
}
|
||||
|
||||
type debugService struct {
|
||||
c client.Client
|
||||
name string
|
||||
}
|
||||
|
||||
func NewDebugService(name string, c client.Client) DebugService {
|
||||
if c == nil {
|
||||
c = client.NewClient()
|
||||
}
|
||||
if len(name) == 0 {
|
||||
name = "go.micro.debug"
|
||||
}
|
||||
return &debugService{
|
||||
c: c,
|
||||
name: name,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *debugService) Health(ctx context.Context, in *Request, opts ...client.CallOption) (*HealthResponse, error) {
|
||||
req := c.c.NewRequest(c.name, "Debug.Health", in)
|
||||
out := new(HealthResponse)
|
||||
err := c.c.Call(ctx, req, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *debugService) Log(ctx context.Context, in *Request, opts ...client.CallOption) (*LogResponse, error) {
|
||||
req := c.c.NewRequest(c.name, "Debug.Log", in)
|
||||
out := new(LogResponse)
|
||||
err := c.c.Call(ctx, req, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *debugService) Stats(ctx context.Context, in *Request, opts ...client.CallOption) (*StatsResponse, error) {
|
||||
req := c.c.NewRequest(c.name, "Debug.Stats", in)
|
||||
out := new(StatsResponse)
|
||||
err := c.c.Call(ctx, req, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *debugService) Trace(ctx context.Context, in *Request, opts ...client.CallOption) (*TraceResponse, error) {
|
||||
req := c.c.NewRequest(c.name, "Debug.Trace", in)
|
||||
out := new(TraceResponse)
|
||||
err := c.c.Call(ctx, req, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// Server API for Debug service
|
||||
|
||||
type DebugHandler interface {
|
||||
Health(context.Context, *Request, *HealthResponse) error
|
||||
Log(context.Context, *Request, *LogResponse) error
|
||||
Stats(context.Context, *Request, *StatsResponse) error
|
||||
Trace(context.Context, *Request, *TraceResponse) error
|
||||
}
|
||||
|
||||
func RegisterDebugHandler(s server.Server, hdlr DebugHandler, opts ...server.HandlerOption) error {
|
||||
type debug interface {
|
||||
Health(ctx context.Context, in *Request, out *HealthResponse) error
|
||||
Log(ctx context.Context, in *Request, out *LogResponse) error
|
||||
Stats(ctx context.Context, in *Request, out *StatsResponse) error
|
||||
Trace(ctx context.Context, in *Request, out *TraceResponse) error
|
||||
}
|
||||
type Debug struct {
|
||||
debug
|
||||
}
|
||||
h := &debugHandler{hdlr}
|
||||
return s.Handle(s.NewHandler(&Debug{h}, opts...))
|
||||
}
|
||||
|
||||
type debugHandler struct {
|
||||
DebugHandler
|
||||
}
|
||||
|
||||
func (h *debugHandler) Health(ctx context.Context, in *Request, out *HealthResponse) error {
|
||||
return h.DebugHandler.Health(ctx, in, out)
|
||||
}
|
||||
|
||||
func (h *debugHandler) Log(ctx context.Context, in *Request, out *LogResponse) error {
|
||||
return h.DebugHandler.Log(ctx, in, out)
|
||||
}
|
||||
|
||||
func (h *debugHandler) Stats(ctx context.Context, in *Request, out *StatsResponse) error {
|
||||
return h.DebugHandler.Stats(ctx, in, out)
|
||||
}
|
||||
|
||||
func (h *debugHandler) Trace(ctx context.Context, in *Request, out *TraceResponse) error {
|
||||
return h.DebugHandler.Trace(ctx, in, out)
|
||||
}
|
561
debug/handler/rpc/proto/debug.pb.go
Normal file
561
debug/handler/rpc/proto/debug.pb.go
Normal file
@ -0,0 +1,561 @@
|
||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// source: go-debug/handler/rpc/proto/debug.proto
|
||||
|
||||
package go_micro_debug
|
||||
|
||||
import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
grpc "google.golang.org/grpc"
|
||||
math "math"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
// This is a compile-time assertion to ensure that this generated file
|
||||
// is compatible with the proto package it is being compiled against.
|
||||
// A compilation error at this line likely means your copy of the
|
||||
// proto package needs to be updated.
|
||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
||||
|
||||
type Check struct {
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *Check) Reset() { *m = Check{} }
|
||||
func (m *Check) String() string { return proto.CompactTextString(m) }
|
||||
func (*Check) ProtoMessage() {}
|
||||
func (*Check) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_a796f9dd3ce1270e, []int{0}
|
||||
}
|
||||
|
||||
func (m *Check) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_Check.Unmarshal(m, b)
|
||||
}
|
||||
func (m *Check) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_Check.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *Check) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_Check.Merge(m, src)
|
||||
}
|
||||
func (m *Check) XXX_Size() int {
|
||||
return xxx_messageInfo_Check.Size(m)
|
||||
}
|
||||
func (m *Check) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_Check.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_Check proto.InternalMessageInfo
|
||||
|
||||
type Log struct {
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *Log) Reset() { *m = Log{} }
|
||||
func (m *Log) String() string { return proto.CompactTextString(m) }
|
||||
func (*Log) ProtoMessage() {}
|
||||
func (*Log) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_a796f9dd3ce1270e, []int{1}
|
||||
}
|
||||
|
||||
func (m *Log) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_Log.Unmarshal(m, b)
|
||||
}
|
||||
func (m *Log) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_Log.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *Log) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_Log.Merge(m, src)
|
||||
}
|
||||
func (m *Log) XXX_Size() int {
|
||||
return xxx_messageInfo_Log.Size(m)
|
||||
}
|
||||
func (m *Log) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_Log.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_Log proto.InternalMessageInfo
|
||||
|
||||
type Stats struct {
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *Stats) Reset() { *m = Stats{} }
|
||||
func (m *Stats) String() string { return proto.CompactTextString(m) }
|
||||
func (*Stats) ProtoMessage() {}
|
||||
func (*Stats) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_a796f9dd3ce1270e, []int{2}
|
||||
}
|
||||
|
||||
func (m *Stats) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_Stats.Unmarshal(m, b)
|
||||
}
|
||||
func (m *Stats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_Stats.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *Stats) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_Stats.Merge(m, src)
|
||||
}
|
||||
func (m *Stats) XXX_Size() int {
|
||||
return xxx_messageInfo_Stats.Size(m)
|
||||
}
|
||||
func (m *Stats) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_Stats.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_Stats proto.InternalMessageInfo
|
||||
|
||||
type Trace struct {
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *Trace) Reset() { *m = Trace{} }
|
||||
func (m *Trace) String() string { return proto.CompactTextString(m) }
|
||||
func (*Trace) ProtoMessage() {}
|
||||
func (*Trace) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_a796f9dd3ce1270e, []int{3}
|
||||
}
|
||||
|
||||
func (m *Trace) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_Trace.Unmarshal(m, b)
|
||||
}
|
||||
func (m *Trace) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_Trace.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *Trace) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_Trace.Merge(m, src)
|
||||
}
|
||||
func (m *Trace) XXX_Size() int {
|
||||
return xxx_messageInfo_Trace.Size(m)
|
||||
}
|
||||
func (m *Trace) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_Trace.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_Trace proto.InternalMessageInfo
|
||||
|
||||
type Request struct {
|
||||
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *Request) Reset() { *m = Request{} }
|
||||
func (m *Request) String() string { return proto.CompactTextString(m) }
|
||||
func (*Request) ProtoMessage() {}
|
||||
func (*Request) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_a796f9dd3ce1270e, []int{4}
|
||||
}
|
||||
|
||||
func (m *Request) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_Request.Unmarshal(m, b)
|
||||
}
|
||||
func (m *Request) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_Request.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *Request) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_Request.Merge(m, src)
|
||||
}
|
||||
func (m *Request) XXX_Size() int {
|
||||
return xxx_messageInfo_Request.Size(m)
|
||||
}
|
||||
func (m *Request) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_Request.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_Request proto.InternalMessageInfo
|
||||
|
||||
func (m *Request) GetId() string {
|
||||
if m != nil {
|
||||
return m.Id
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type HealthResponse struct {
|
||||
Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"`
|
||||
Checks []*Check `protobuf:"bytes,2,rep,name=checks,proto3" json:"checks,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *HealthResponse) Reset() { *m = HealthResponse{} }
|
||||
func (m *HealthResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*HealthResponse) ProtoMessage() {}
|
||||
func (*HealthResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_a796f9dd3ce1270e, []int{5}
|
||||
}
|
||||
|
||||
func (m *HealthResponse) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_HealthResponse.Unmarshal(m, b)
|
||||
}
|
||||
func (m *HealthResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_HealthResponse.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *HealthResponse) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_HealthResponse.Merge(m, src)
|
||||
}
|
||||
func (m *HealthResponse) XXX_Size() int {
|
||||
return xxx_messageInfo_HealthResponse.Size(m)
|
||||
}
|
||||
func (m *HealthResponse) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_HealthResponse.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_HealthResponse proto.InternalMessageInfo
|
||||
|
||||
func (m *HealthResponse) GetStatus() string {
|
||||
if m != nil {
|
||||
return m.Status
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (m *HealthResponse) GetChecks() []*Check {
|
||||
if m != nil {
|
||||
return m.Checks
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type LogResponse struct {
|
||||
Logs []*Log `protobuf:"bytes,1,rep,name=logs,proto3" json:"logs,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *LogResponse) Reset() { *m = LogResponse{} }
|
||||
func (m *LogResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*LogResponse) ProtoMessage() {}
|
||||
func (*LogResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_a796f9dd3ce1270e, []int{6}
|
||||
}
|
||||
|
||||
func (m *LogResponse) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_LogResponse.Unmarshal(m, b)
|
||||
}
|
||||
func (m *LogResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_LogResponse.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *LogResponse) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_LogResponse.Merge(m, src)
|
||||
}
|
||||
func (m *LogResponse) XXX_Size() int {
|
||||
return xxx_messageInfo_LogResponse.Size(m)
|
||||
}
|
||||
func (m *LogResponse) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_LogResponse.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_LogResponse proto.InternalMessageInfo
|
||||
|
||||
func (m *LogResponse) GetLogs() []*Log {
|
||||
if m != nil {
|
||||
return m.Logs
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type StatsResponse struct {
|
||||
Stats []*Stats `protobuf:"bytes,1,rep,name=stats,proto3" json:"stats,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *StatsResponse) Reset() { *m = StatsResponse{} }
|
||||
func (m *StatsResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*StatsResponse) ProtoMessage() {}
|
||||
func (*StatsResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_a796f9dd3ce1270e, []int{7}
|
||||
}
|
||||
|
||||
func (m *StatsResponse) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_StatsResponse.Unmarshal(m, b)
|
||||
}
|
||||
func (m *StatsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_StatsResponse.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *StatsResponse) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_StatsResponse.Merge(m, src)
|
||||
}
|
||||
func (m *StatsResponse) XXX_Size() int {
|
||||
return xxx_messageInfo_StatsResponse.Size(m)
|
||||
}
|
||||
func (m *StatsResponse) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_StatsResponse.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_StatsResponse proto.InternalMessageInfo
|
||||
|
||||
func (m *StatsResponse) GetStats() []*Stats {
|
||||
if m != nil {
|
||||
return m.Stats
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type TraceResponse struct {
|
||||
Traces []*Trace `protobuf:"bytes,1,rep,name=traces,proto3" json:"traces,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
}
|
||||
|
||||
func (m *TraceResponse) Reset() { *m = TraceResponse{} }
|
||||
func (m *TraceResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*TraceResponse) ProtoMessage() {}
|
||||
func (*TraceResponse) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor_a796f9dd3ce1270e, []int{8}
|
||||
}
|
||||
|
||||
func (m *TraceResponse) XXX_Unmarshal(b []byte) error {
|
||||
return xxx_messageInfo_TraceResponse.Unmarshal(m, b)
|
||||
}
|
||||
func (m *TraceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
|
||||
return xxx_messageInfo_TraceResponse.Marshal(b, m, deterministic)
|
||||
}
|
||||
func (m *TraceResponse) XXX_Merge(src proto.Message) {
|
||||
xxx_messageInfo_TraceResponse.Merge(m, src)
|
||||
}
|
||||
func (m *TraceResponse) XXX_Size() int {
|
||||
return xxx_messageInfo_TraceResponse.Size(m)
|
||||
}
|
||||
func (m *TraceResponse) XXX_DiscardUnknown() {
|
||||
xxx_messageInfo_TraceResponse.DiscardUnknown(m)
|
||||
}
|
||||
|
||||
var xxx_messageInfo_TraceResponse proto.InternalMessageInfo
|
||||
|
||||
func (m *TraceResponse) GetTraces() []*Trace {
|
||||
if m != nil {
|
||||
return m.Traces
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterType((*Check)(nil), "go.micro.debug.Check")
|
||||
proto.RegisterType((*Log)(nil), "go.micro.debug.Log")
|
||||
proto.RegisterType((*Stats)(nil), "go.micro.debug.Stats")
|
||||
proto.RegisterType((*Trace)(nil), "go.micro.debug.Trace")
|
||||
proto.RegisterType((*Request)(nil), "go.micro.debug.Request")
|
||||
proto.RegisterType((*HealthResponse)(nil), "go.micro.debug.HealthResponse")
|
||||
proto.RegisterType((*LogResponse)(nil), "go.micro.debug.LogResponse")
|
||||
proto.RegisterType((*StatsResponse)(nil), "go.micro.debug.StatsResponse")
|
||||
proto.RegisterType((*TraceResponse)(nil), "go.micro.debug.TraceResponse")
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterFile("go-debug/handler/rpc/proto/debug.proto", fileDescriptor_a796f9dd3ce1270e)
|
||||
}
|
||||
|
||||
var fileDescriptor_a796f9dd3ce1270e = []byte{
|
||||
// 312 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0xc1, 0x4f, 0x83, 0x30,
|
||||
0x18, 0xc5, 0x37, 0x26, 0x2c, 0x7e, 0xcb, 0x38, 0xd4, 0xa8, 0x53, 0xa3, 0x59, 0x7a, 0xd0, 0x25,
|
||||
0x06, 0x48, 0x66, 0xe2, 0x49, 0x4d, 0xcc, 0x3c, 0x78, 0xd8, 0x09, 0x4d, 0x3c, 0x33, 0x68, 0x80,
|
||||
0x88, 0x2b, 0xb6, 0xe5, 0x0f, 0xf1, 0x3f, 0x36, 0xfd, 0xa8, 0x18, 0x70, 0x1c, 0xbc, 0xb5, 0x1f,
|
||||
0xef, 0xf7, 0xfa, 0xfa, 0x0a, 0x5c, 0xa6, 0xdc, 0x4b, 0xd8, 0xa6, 0x4a, 0x83, 0x2c, 0xda, 0x26,
|
||||
0x05, 0x13, 0x81, 0x28, 0xe3, 0xa0, 0x14, 0x5c, 0xf1, 0x00, 0xe7, 0x3e, 0xae, 0x89, 0x9b, 0x72,
|
||||
0xff, 0x23, 0x8f, 0x05, 0xf7, 0x71, 0x4a, 0xc7, 0x60, 0xaf, 0x32, 0x16, 0xbf, 0x53, 0x1b, 0x46,
|
||||
0x6b, 0x8e, 0xfb, 0x17, 0x15, 0x29, 0xa9, 0x17, 0xaf, 0x22, 0x8a, 0x19, 0x3d, 0x81, 0x71, 0xc8,
|
||||
0x3e, 0x2b, 0x26, 0x15, 0x71, 0xc1, 0xca, 0x93, 0xd9, 0x70, 0x3e, 0x5c, 0xec, 0x87, 0x56, 0x9e,
|
||||
0xd0, 0x37, 0x70, 0x9f, 0x59, 0x54, 0xa8, 0x2c, 0x64, 0xb2, 0xe4, 0x5b, 0xc9, 0xc8, 0x11, 0x38,
|
||||
0x52, 0x45, 0xaa, 0x92, 0x46, 0x65, 0x76, 0xc4, 0x03, 0x27, 0xd6, 0xc7, 0xc8, 0x99, 0x35, 0x1f,
|
||||
0x2d, 0x26, 0xcb, 0x43, 0xbf, 0x9d, 0xc3, 0xc7, 0x10, 0xa1, 0x11, 0xd1, 0x5b, 0x98, 0xac, 0x79,
|
||||
0xda, 0xb8, 0x5e, 0xc1, 0x5e, 0xc1, 0x53, 0xed, 0xa9, 0xd9, 0x83, 0x2e, 0xab, 0xa5, 0x28, 0xa0,
|
||||
0x77, 0x30, 0xc5, 0xf4, 0x0d, 0x79, 0x0d, 0xb6, 0x4e, 0xf0, 0x83, 0xfe, 0x39, 0xb6, 0x56, 0xd7,
|
||||
0x1a, 0xfa, 0x00, 0x53, 0xbc, 0x72, 0x43, 0x7b, 0xe0, 0x28, 0x3d, 0xe8, 0xc5, 0x6b, 0xb9, 0x11,
|
||||
0x2d, 0xbf, 0x2c, 0xb0, 0x9f, 0xf4, 0x9c, 0xac, 0xc0, 0xa9, 0x8b, 0x21, 0xc7, 0x5d, 0xc4, 0x74,
|
||||
0x79, 0x7a, 0xd1, 0xfd, 0xd0, 0x6e, 0x92, 0x0e, 0xc8, 0x3d, 0xbe, 0x48, 0xbf, 0xc3, 0xd9, 0xae,
|
||||
0x1e, 0x7e, 0xf1, 0x47, 0xf3, 0x92, 0xfd, 0x06, 0xe7, 0xbb, 0xdb, 0x68, 0x59, 0xe0, 0x0d, 0xff,
|
||||
0x61, 0xd1, 0x2a, 0x90, 0x0e, 0x36, 0x0e, 0xfe, 0x76, 0x37, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff,
|
||||
0x76, 0x9d, 0x79, 0xec, 0xa0, 0x02, 0x00, 0x00,
|
||||
}
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ context.Context
|
||||
var _ grpc.ClientConn
|
||||
|
||||
// This is a compile-time assertion to ensure that this generated file
|
||||
// is compatible with the grpc package it is being compiled against.
|
||||
const _ = grpc.SupportPackageIsVersion4
|
||||
|
||||
// DebugClient is the client API for Debug service.
|
||||
//
|
||||
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
|
||||
type DebugClient interface {
|
||||
Health(ctx context.Context, in *Request, opts ...grpc.CallOption) (*HealthResponse, error)
|
||||
Log(ctx context.Context, in *Request, opts ...grpc.CallOption) (*LogResponse, error)
|
||||
Stats(ctx context.Context, in *Request, opts ...grpc.CallOption) (*StatsResponse, error)
|
||||
Trace(ctx context.Context, in *Request, opts ...grpc.CallOption) (*TraceResponse, error)
|
||||
}
|
||||
|
||||
type debugClient struct {
|
||||
cc *grpc.ClientConn
|
||||
}
|
||||
|
||||
func NewDebugClient(cc *grpc.ClientConn) DebugClient {
|
||||
return &debugClient{cc}
|
||||
}
|
||||
|
||||
func (c *debugClient) Health(ctx context.Context, in *Request, opts ...grpc.CallOption) (*HealthResponse, error) {
|
||||
out := new(HealthResponse)
|
||||
err := c.cc.Invoke(ctx, "/go.micro.debug.Debug/Health", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *debugClient) Log(ctx context.Context, in *Request, opts ...grpc.CallOption) (*LogResponse, error) {
|
||||
out := new(LogResponse)
|
||||
err := c.cc.Invoke(ctx, "/go.micro.debug.Debug/Log", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *debugClient) Stats(ctx context.Context, in *Request, opts ...grpc.CallOption) (*StatsResponse, error) {
|
||||
out := new(StatsResponse)
|
||||
err := c.cc.Invoke(ctx, "/go.micro.debug.Debug/Stats", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (c *debugClient) Trace(ctx context.Context, in *Request, opts ...grpc.CallOption) (*TraceResponse, error) {
|
||||
out := new(TraceResponse)
|
||||
err := c.cc.Invoke(ctx, "/go.micro.debug.Debug/Trace", in, out, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// DebugServer is the server API for Debug service.
|
||||
type DebugServer interface {
|
||||
Health(context.Context, *Request) (*HealthResponse, error)
|
||||
Log(context.Context, *Request) (*LogResponse, error)
|
||||
Stats(context.Context, *Request) (*StatsResponse, error)
|
||||
Trace(context.Context, *Request) (*TraceResponse, error)
|
||||
}
|
||||
|
||||
func RegisterDebugServer(s *grpc.Server, srv DebugServer) {
|
||||
s.RegisterService(&_Debug_serviceDesc, srv)
|
||||
}
|
||||
|
||||
func _Debug_Health_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(Request)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(DebugServer).Health(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/go.micro.debug.Debug/Health",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(DebugServer).Health(ctx, req.(*Request))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _Debug_Log_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(Request)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(DebugServer).Log(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/go.micro.debug.Debug/Log",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(DebugServer).Log(ctx, req.(*Request))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _Debug_Stats_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(Request)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(DebugServer).Stats(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/go.micro.debug.Debug/Stats",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(DebugServer).Stats(ctx, req.(*Request))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
func _Debug_Trace_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(Request)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(DebugServer).Trace(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/go.micro.debug.Debug/Trace",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(DebugServer).Trace(ctx, req.(*Request))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
var _Debug_serviceDesc = grpc.ServiceDesc{
|
||||
ServiceName: "go.micro.debug.Debug",
|
||||
HandlerType: (*DebugServer)(nil),
|
||||
Methods: []grpc.MethodDesc{
|
||||
{
|
||||
MethodName: "Health",
|
||||
Handler: _Debug_Health_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "Log",
|
||||
Handler: _Debug_Log_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "Stats",
|
||||
Handler: _Debug_Stats_Handler,
|
||||
},
|
||||
{
|
||||
MethodName: "Trace",
|
||||
Handler: _Debug_Trace_Handler,
|
||||
},
|
||||
},
|
||||
Streams: []grpc.StreamDesc{},
|
||||
Metadata: "go-debug/handler/rpc/proto/debug.proto",
|
||||
}
|
36
debug/handler/rpc/proto/debug.proto
Normal file
36
debug/handler/rpc/proto/debug.proto
Normal file
@ -0,0 +1,36 @@
|
||||
syntax = "proto3";
|
||||
|
||||
package go.micro.debug;
|
||||
|
||||
service Debug {
|
||||
rpc Health(Request) returns (HealthResponse) {};
|
||||
rpc Log(Request) returns (LogResponse) {};
|
||||
rpc Stats(Request) returns (StatsResponse) {};
|
||||
rpc Trace(Request) returns (TraceResponse) {};
|
||||
}
|
||||
|
||||
message Check {}
|
||||
message Log {}
|
||||
message Stats {}
|
||||
message Trace {}
|
||||
|
||||
message Request {
|
||||
string id = 1;
|
||||
}
|
||||
|
||||
message HealthResponse {
|
||||
string status = 1;
|
||||
repeated Check checks = 2;
|
||||
}
|
||||
|
||||
message LogResponse {
|
||||
repeated Log logs = 1;
|
||||
}
|
||||
|
||||
message StatsResponse {
|
||||
repeated Stats stats = 1;
|
||||
}
|
||||
|
||||
message TraceResponse {
|
||||
repeated Trace traces = 1;
|
||||
}
|
27
debug/handler/rpc/rpc.go
Normal file
27
debug/handler/rpc/rpc.go
Normal file
@ -0,0 +1,27 @@
|
||||
// Package rpc provides an rpc handler
|
||||
package rpc
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
proto "github.com/micro/go-micro/debug/handler/rpc/proto"
|
||||
)
|
||||
|
||||
type Debug struct {
|
||||
}
|
||||
|
||||
func (d *Debug) Health(ctx context.Context, req *proto.Request, rsp *proto.HealthResponse) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *Debug) Log(ctx context.Context, req *proto.Request, rsp *proto.LogResponse) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *Debug) Stats(ctx context.Context, req *proto.Request, rsp *proto.StatsResponse) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *Debug) Trace(ctx context.Context, req *proto.Request, rsp *proto.TraceResponse) error {
|
||||
return nil
|
||||
}
|
28
debug/health/health.go
Normal file
28
debug/health/health.go
Normal file
@ -0,0 +1,28 @@
|
||||
// Package health is for user defined health checks
|
||||
package health
|
||||
|
||||
type Health interface {
|
||||
Register([]*Check) error
|
||||
Read(...ReadOption) ([]*Check, error)
|
||||
Check(...CheckOption) ([]*Status, error)
|
||||
String() string
|
||||
}
|
||||
|
||||
type Check struct {
|
||||
Id string
|
||||
Metadata map[string]string
|
||||
Exec func() (*Status, error)
|
||||
}
|
||||
|
||||
type Status struct {
|
||||
Code int
|
||||
Detail string
|
||||
}
|
||||
|
||||
type CheckOptions struct{}
|
||||
|
||||
type CheckOption func(o *CheckOptions)
|
||||
|
||||
type ReadOptions struct{}
|
||||
|
||||
type ReadOption func(o *ReadOptions)
|
36
debug/log/log.go
Normal file
36
debug/log/log.go
Normal file
@ -0,0 +1,36 @@
|
||||
// Package log provides a logging interface
|
||||
package log
|
||||
|
||||
import (
|
||||
"time"
|
||||
)
|
||||
|
||||
// Log provides access to logs
|
||||
type Log interface {
|
||||
Read(...ReadOption) ([]*Entry, error)
|
||||
Write([]*Entry, ...WriteOption) error
|
||||
String() string
|
||||
}
|
||||
|
||||
// A single log entry
|
||||
type Entry struct {
|
||||
Id string
|
||||
Time time.Time
|
||||
Message []byte
|
||||
Metadata map[string]string
|
||||
}
|
||||
|
||||
type ReadOption func(o *ReadOptions)
|
||||
|
||||
type WriteOption func(o *WriteOptions)
|
||||
|
||||
type ReadOptions struct {
|
||||
// read the given id
|
||||
Id string
|
||||
// Number of entries to read
|
||||
Entries int
|
||||
// Filter function
|
||||
Filter func(*Entry) bool
|
||||
}
|
||||
|
||||
type WriteOptions struct{}
|
24
debug/stats/stats.go
Normal file
24
debug/stats/stats.go
Normal file
@ -0,0 +1,24 @@
|
||||
// Package stats provides process statistics
|
||||
package stats
|
||||
|
||||
// Stats provides metrics recording and retrieval
|
||||
type Stats interface {
|
||||
Read(...ReadOption) []*Metrics
|
||||
Record(*Metrics) error
|
||||
String() string
|
||||
}
|
||||
|
||||
type Metrics struct {
|
||||
// Unique id of metric
|
||||
Id string
|
||||
// Metadata
|
||||
Metadata map[string]string
|
||||
// Floating values
|
||||
Values map[string]float64
|
||||
// Counters
|
||||
Counters map[string]int64
|
||||
}
|
||||
|
||||
type ReadOptions struct{}
|
||||
|
||||
type ReadOption func(o *ReadOptions)
|
62
debug/store/buffer/buffer.go
Normal file
62
debug/store/buffer/buffer.go
Normal file
@ -0,0 +1,62 @@
|
||||
// Package buffer provides a simple ring buffer
|
||||
package buffer
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"github.com/micro/go-micro/debug/store"
|
||||
)
|
||||
|
||||
type Buffer struct {
|
||||
sync.RWMutex
|
||||
index map[string]int
|
||||
records []*store.Record
|
||||
}
|
||||
|
||||
func (b *Buffer) Read(opts ...store.ReadOption) ([]*store.Record, error) {
|
||||
var options store.ReadOptions
|
||||
for _, o := range opts {
|
||||
o(&options)
|
||||
}
|
||||
|
||||
b.RLock()
|
||||
defer b.RUnlock()
|
||||
|
||||
if len(options.Id) > 0 {
|
||||
idx, ok := b.index[options.Id]
|
||||
if !ok || len(b.records) < idx {
|
||||
return nil, store.ErrNotFound
|
||||
}
|
||||
return []*store.Record{b.records[idx]}, nil
|
||||
}
|
||||
|
||||
return b.records, nil
|
||||
}
|
||||
|
||||
func (b *Buffer) Write(records []*store.Record) error {
|
||||
b.Lock()
|
||||
defer b.Unlock()
|
||||
|
||||
if b.index == nil {
|
||||
b.index = make(map[string]int)
|
||||
}
|
||||
|
||||
i := len(b.records)
|
||||
|
||||
for _, r := range records {
|
||||
b.index[r.Id] = i
|
||||
i++
|
||||
b.records = append(b.records, r)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Buffer) String() string {
|
||||
return "buffer"
|
||||
}
|
||||
|
||||
type Record struct {
|
||||
Id string
|
||||
Value interface{}
|
||||
}
|
27
debug/store/store.go
Normal file
27
debug/store/store.go
Normal file
@ -0,0 +1,27 @@
|
||||
// Package store stores the various pieces of data
|
||||
package store
|
||||
|
||||
import (
|
||||
"errors"
|
||||
)
|
||||
|
||||
type Store interface {
|
||||
Read(...ReadOption) ([]*Record, error)
|
||||
Write([]*Record) error
|
||||
String() string
|
||||
}
|
||||
|
||||
type Record struct {
|
||||
Id string
|
||||
Value interface{}
|
||||
}
|
||||
|
||||
type ReadOptions struct {
|
||||
Id string
|
||||
}
|
||||
|
||||
type ReadOption func(o *ReadOptions)
|
||||
|
||||
var (
|
||||
ErrNotFound = errors.New("not found")
|
||||
)
|
29
debug/trace/trace.go
Normal file
29
debug/trace/trace.go
Normal file
@ -0,0 +1,29 @@
|
||||
// Package trace provides a tracing interface
|
||||
package trace
|
||||
|
||||
import (
|
||||
"time"
|
||||
)
|
||||
|
||||
// Trace is for request tracing
|
||||
type Trace interface {
|
||||
// Read the traces
|
||||
Read(...ReadOption) ([]*Span, error)
|
||||
// Collect traces
|
||||
Collect([]*Span) error
|
||||
// Name of tracer
|
||||
String() string
|
||||
}
|
||||
|
||||
type Span struct {
|
||||
Id string
|
||||
Name string
|
||||
Trace string
|
||||
Metadata map[string]string
|
||||
Start time.Time
|
||||
Finish time.Time
|
||||
}
|
||||
|
||||
type ReadOptions struct{}
|
||||
|
||||
type ReadOption func(o *ReadOptions)
|
Loading…
Reference in New Issue
Block a user