Make the debug handler an actual thing that can be set by users
This commit is contained in:
parent
66107fd304
commit
76918fc703
21
server/debug.go
Normal file
21
server/debug.go
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/micro/go-micro/server/debug"
|
||||||
|
proto "github.com/micro/go-micro/server/debug/proto"
|
||||||
|
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
)
|
||||||
|
|
||||||
|
// We use this to wrap any debug handlers so we preserve the signature Debug.{Method}
|
||||||
|
type Debug struct {
|
||||||
|
debug.DebugHandler
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *Debug) Health(ctx context.Context, req *proto.HealthRequest, rsp *proto.HealthResponse) error {
|
||||||
|
return d.DebugHandler.Health(ctx, req, rsp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func registerDebugHandler(s Server) {
|
||||||
|
s.Handle(s.NewHandler(&Debug{s.Options().DebugHandler}))
|
||||||
|
}
|
27
server/debug/debug.go
Normal file
27
server/debug/debug.go
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package debug
|
||||||
|
|
||||||
|
import (
|
||||||
|
proto "github.com/micro/go-micro/server/debug/proto"
|
||||||
|
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
)
|
||||||
|
|
||||||
|
// The debug handler represents an internal server handler
|
||||||
|
// used to determine health, status and env info about
|
||||||
|
// a service node. It's akin to Google's /statusz, /healthz,
|
||||||
|
// and /varz
|
||||||
|
type DebugHandler interface {
|
||||||
|
Health(ctx context.Context, req *proto.HealthRequest, rsp *proto.HealthResponse) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// Our own internal handler
|
||||||
|
type debug struct{}
|
||||||
|
|
||||||
|
var (
|
||||||
|
DefaultDebugHandler = new(debug)
|
||||||
|
)
|
||||||
|
|
||||||
|
func (d *debug) Health(ctx context.Context, req *proto.HealthRequest, rsp *proto.HealthResponse) error {
|
||||||
|
rsp.Status = "ok"
|
||||||
|
return nil
|
||||||
|
}
|
57
server/debug/proto/debug.pb.go
Normal file
57
server/debug/proto/debug.pb.go
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
// Code generated by protoc-gen-go.
|
||||||
|
// source: go-micro/server/debug/proto/debug.proto
|
||||||
|
// DO NOT EDIT!
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package debug is a generated protocol buffer package.
|
||||||
|
|
||||||
|
It is generated from these files:
|
||||||
|
go-micro/server/debug/proto/debug.proto
|
||||||
|
|
||||||
|
It has these top-level messages:
|
||||||
|
HealthRequest
|
||||||
|
HealthResponse
|
||||||
|
*/
|
||||||
|
package debug
|
||||||
|
|
||||||
|
import proto "github.com/golang/protobuf/proto"
|
||||||
|
import fmt "fmt"
|
||||||
|
import math "math"
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
type HealthRequest struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *HealthRequest) Reset() { *m = HealthRequest{} }
|
||||||
|
func (m *HealthRequest) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*HealthRequest) ProtoMessage() {}
|
||||||
|
func (*HealthRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
|
||||||
|
|
||||||
|
type HealthResponse struct {
|
||||||
|
Status string `protobuf:"bytes,1,opt,name=status" json:"status,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *HealthResponse) Reset() { *m = HealthResponse{} }
|
||||||
|
func (m *HealthResponse) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*HealthResponse) ProtoMessage() {}
|
||||||
|
func (*HealthResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterType((*HealthRequest)(nil), "HealthRequest")
|
||||||
|
proto.RegisterType((*HealthResponse)(nil), "HealthResponse")
|
||||||
|
}
|
||||||
|
|
||||||
|
var fileDescriptor0 = []byte{
|
||||||
|
// 107 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x52, 0x4f, 0xcf, 0xd7, 0xcd,
|
||||||
|
0xcd, 0x4c, 0x2e, 0xca, 0xd7, 0x2f, 0x4e, 0x2d, 0x2a, 0x4b, 0x2d, 0xd2, 0x4f, 0x49, 0x4d, 0x2a,
|
||||||
|
0x4d, 0xd7, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x87, 0xb0, 0xf5, 0xc0, 0x6c, 0x25, 0x7e, 0x2e, 0x5e,
|
||||||
|
0x8f, 0xd4, 0xc4, 0x9c, 0x92, 0x8c, 0xa0, 0xd4, 0xc2, 0xd2, 0xd4, 0xe2, 0x12, 0x25, 0x05, 0x2e,
|
||||||
|
0x3e, 0x98, 0x40, 0x71, 0x41, 0x7e, 0x5e, 0x71, 0xaa, 0x10, 0x1f, 0x17, 0x5b, 0x71, 0x49, 0x62,
|
||||||
|
0x49, 0x69, 0xb1, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x67, 0x12, 0x1b, 0x58, 0xa7, 0x31, 0x20, 0x00,
|
||||||
|
0x00, 0xff, 0xff, 0x1c, 0xef, 0x98, 0xac, 0x64, 0x00, 0x00, 0x00,
|
||||||
|
}
|
16
server/debug/proto/debug.proto
Normal file
16
server/debug/proto/debug.proto
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
// This is commented out due to import cycles.
|
||||||
|
// But its what we expect the RPC service to
|
||||||
|
// return.
|
||||||
|
//
|
||||||
|
// service Debug {
|
||||||
|
// rpc Health(HealthRequest) returns (HealthResponse) {}
|
||||||
|
// }
|
||||||
|
|
||||||
|
message HealthRequest {
|
||||||
|
}
|
||||||
|
|
||||||
|
message HealthResponse {
|
||||||
|
string status = 1;
|
||||||
|
}
|
@ -1,25 +0,0 @@
|
|||||||
package server
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/micro/go-micro/server/proto/health"
|
|
||||||
"golang.org/x/net/context"
|
|
||||||
)
|
|
||||||
|
|
||||||
type (
|
|
||||||
HealthChecker interface {
|
|
||||||
Health(ctx context.Context, req *health.Request, rsp *health.Response) error
|
|
||||||
}
|
|
||||||
|
|
||||||
Debug struct{}
|
|
||||||
)
|
|
||||||
|
|
||||||
var DefaultHealthChecker HealthChecker = new(Debug)
|
|
||||||
|
|
||||||
func (d *Debug) Health(ctx context.Context, req *health.Request, rsp *health.Response) error {
|
|
||||||
rsp.Status = "ok"
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func registerHealthChecker(s Server) {
|
|
||||||
s.Handle(s.NewHandler(DefaultHealthChecker))
|
|
||||||
}
|
|
@ -4,6 +4,7 @@ import (
|
|||||||
"github.com/micro/go-micro/broker"
|
"github.com/micro/go-micro/broker"
|
||||||
"github.com/micro/go-micro/codec"
|
"github.com/micro/go-micro/codec"
|
||||||
"github.com/micro/go-micro/registry"
|
"github.com/micro/go-micro/registry"
|
||||||
|
"github.com/micro/go-micro/server/debug"
|
||||||
"github.com/micro/go-micro/transport"
|
"github.com/micro/go-micro/transport"
|
||||||
|
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
@ -23,6 +24,9 @@ type Options struct {
|
|||||||
HdlrWrappers []HandlerWrapper
|
HdlrWrappers []HandlerWrapper
|
||||||
SubWrappers []SubscriberWrapper
|
SubWrappers []SubscriberWrapper
|
||||||
|
|
||||||
|
// Debug Handler which can be set by a user
|
||||||
|
DebugHandler debug.DebugHandler
|
||||||
|
|
||||||
// Other options for implementations of the interface
|
// Other options for implementations of the interface
|
||||||
// can be stored in a context
|
// can be stored in a context
|
||||||
Context context.Context
|
Context context.Context
|
||||||
@ -50,6 +54,10 @@ func newOptions(opt ...Option) Options {
|
|||||||
opts.Transport = transport.DefaultTransport
|
opts.Transport = transport.DefaultTransport
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if opts.DebugHandler == nil {
|
||||||
|
opts.DebugHandler = debug.DefaultDebugHandler
|
||||||
|
}
|
||||||
|
|
||||||
if len(opts.Address) == 0 {
|
if len(opts.Address) == 0 {
|
||||||
opts.Address = DefaultAddress
|
opts.Address = DefaultAddress
|
||||||
}
|
}
|
||||||
@ -132,6 +140,13 @@ func Transport(t transport.Transport) Option {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DebugHandler for this server
|
||||||
|
func DebugHandler(d debug.DebugHandler) Option {
|
||||||
|
return func(o *Options) {
|
||||||
|
o.DebugHandler = d
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Metadata associated with the server
|
// Metadata associated with the server
|
||||||
func Metadata(md map[string]string) Option {
|
func Metadata(md map[string]string) Option {
|
||||||
return func(o *Options) {
|
return func(o *Options) {
|
||||||
|
@ -1,57 +0,0 @@
|
|||||||
// Code generated by protoc-gen-go.
|
|
||||||
// source: micro/go-micro/server/proto/health/health.proto
|
|
||||||
// DO NOT EDIT!
|
|
||||||
|
|
||||||
/*
|
|
||||||
Package health is a generated protocol buffer package.
|
|
||||||
|
|
||||||
It is generated from these files:
|
|
||||||
micro/go-micro/server/proto/health/health.proto
|
|
||||||
|
|
||||||
It has these top-level messages:
|
|
||||||
Request
|
|
||||||
Response
|
|
||||||
*/
|
|
||||||
package health
|
|
||||||
|
|
||||||
import proto "github.com/golang/protobuf/proto"
|
|
||||||
import fmt "fmt"
|
|
||||||
import math "math"
|
|
||||||
|
|
||||||
// Reference imports to suppress errors if they are not otherwise used.
|
|
||||||
var _ = proto.Marshal
|
|
||||||
var _ = fmt.Errorf
|
|
||||||
var _ = math.Inf
|
|
||||||
|
|
||||||
type Request struct {
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Request) Reset() { *m = Request{} }
|
|
||||||
func (m *Request) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*Request) ProtoMessage() {}
|
|
||||||
func (*Request) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
|
|
||||||
|
|
||||||
type Response struct {
|
|
||||||
Status string `protobuf:"bytes,1,opt,name=status" json:"status,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Response) Reset() { *m = Response{} }
|
|
||||||
func (m *Response) String() string { return proto.CompactTextString(m) }
|
|
||||||
func (*Response) ProtoMessage() {}
|
|
||||||
func (*Response) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
proto.RegisterType((*Request)(nil), "Request")
|
|
||||||
proto.RegisterType((*Response)(nil), "Response")
|
|
||||||
}
|
|
||||||
|
|
||||||
var fileDescriptor0 = []byte{
|
|
||||||
// 104 bytes of a gzipped FileDescriptorProto
|
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0xd2, 0xcf, 0xcd, 0x4c, 0x2e,
|
|
||||||
0xca, 0xd7, 0x4f, 0xcf, 0xd7, 0x85, 0x30, 0x8a, 0x53, 0x8b, 0xca, 0x52, 0x8b, 0xf4, 0x0b, 0x8a,
|
|
||||||
0xf2, 0x4b, 0xf2, 0xf5, 0x33, 0x52, 0x13, 0x73, 0x4a, 0x32, 0xa0, 0x94, 0x1e, 0x58, 0x4c, 0x89,
|
|
||||||
0x93, 0x8b, 0x3d, 0x28, 0xb5, 0xb0, 0x34, 0xb5, 0xb8, 0x44, 0x49, 0x8a, 0x8b, 0x23, 0x28, 0xb5,
|
|
||||||
0xb8, 0x20, 0x3f, 0xaf, 0x38, 0x55, 0x88, 0x8f, 0x8b, 0xad, 0xb8, 0x24, 0xb1, 0xa4, 0xb4, 0x58,
|
|
||||||
0x82, 0x51, 0x81, 0x51, 0x83, 0x33, 0x89, 0x0d, 0xac, 0xda, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff,
|
|
||||||
0x2c, 0x7c, 0x5d, 0x9d, 0x60, 0x00, 0x00, 0x00,
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
syntax = "proto3";
|
|
||||||
|
|
||||||
message Request {
|
|
||||||
}
|
|
||||||
|
|
||||||
message Response {
|
|
||||||
string status = 1;
|
|
||||||
}
|
|
@ -290,7 +290,7 @@ func (s *rpcServer) Deregister() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *rpcServer) Start() error {
|
func (s *rpcServer) Start() error {
|
||||||
registerHealthChecker(s)
|
registerDebugHandler(s)
|
||||||
config := s.Options()
|
config := s.Options()
|
||||||
|
|
||||||
ts, err := config.Transport.Listen(config.Address)
|
ts, err := config.Transport.Listen(config.Address)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user