From c908274c8b0019ec959e26c50b70927bb96bbd21 Mon Sep 17 00:00:00 2001 From: Vasiliy Tolstov Date: Sun, 26 Feb 2023 14:51:34 +0300 Subject: [PATCH] import from main repo Signed-off-by: Vasiliy Tolstov --- go.mod | 1 + go.sum | 4 -- handler/health/generate.go | 8 +++ handler/health/health.go | 82 ++++++++++++++++++++++++++ handler/health/health.proto | 50 ++++++++++++++++ handler/health/health_micro.pb.go | 48 +++++++++++++++ handler/health/health_micro_http.pb.go | 43 ++++++++++++++ handler/meter/generate.go | 8 +++ handler/meter/meter.go | 67 +++++++++++++++++++++ handler/meter/meter.proto | 24 ++++++++ handler/meter/meter_micro.pb.go | 32 ++++++++++ handler/meter/meter_micro_http.pb.go | 33 +++++++++++ 12 files changed, 396 insertions(+), 4 deletions(-) create mode 100644 handler/health/generate.go create mode 100644 handler/health/health.go create mode 100644 handler/health/health.proto create mode 100644 handler/health/health_micro.pb.go create mode 100644 handler/health/health_micro_http.pb.go create mode 100644 handler/meter/generate.go create mode 100644 handler/meter/meter.go create mode 100644 handler/meter/meter.proto create mode 100644 handler/meter/meter_micro.pb.go create mode 100644 handler/meter/meter_micro_http.pb.go diff --git a/go.mod b/go.mod index a272f32..1dc03da 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module go.unistack.org/micro-server-http/v3 go 1.16 require ( + go.unistack.org/micro-proto/v3 v3.3.1 go.unistack.org/micro/v3 v3.10.12 golang.org/x/net v0.7.0 gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 46f708e..b2c7fad 100644 --- a/go.sum +++ b/go.sum @@ -75,8 +75,6 @@ github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5t go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.unistack.org/micro-proto/v3 v3.3.1 h1:nQ0MtWvP2G3QrpOgawVOPhpZZYkq6umTGDqs8FxJYIo= go.unistack.org/micro-proto/v3 v3.3.1/go.mod h1:cwRyv8uInM2I7EbU7O8Fx2Ls3N90Uw9UCCcq4olOdfE= -go.unistack.org/micro/v3 v3.10.11 h1:IPUEVQ5oGZ6Ft2/2zQAOIkp+Ztt6GIHxwMoG4l+eJGQ= -go.unistack.org/micro/v3 v3.10.11/go.mod h1:gI4RkJKHLPW7KV6h4+ZBOZD997MRvFRXMPQIHpozikI= go.unistack.org/micro/v3 v3.10.12 h1:M/aRNkj3FFWFivsHnm1XT4qjc9xiGxSl15BStW1SgQ4= go.unistack.org/micro/v3 v3.10.12/go.mod h1:gI4RkJKHLPW7KV6h4+ZBOZD997MRvFRXMPQIHpozikI= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -98,8 +96,6 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e h1:TsQ7F31D3bUCLeqPT0u+yjp1guoArKaNKmCr22PYgTQ= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= diff --git a/handler/health/generate.go b/handler/health/generate.go new file mode 100644 index 0000000..c783863 --- /dev/null +++ b/handler/health/generate.go @@ -0,0 +1,8 @@ +package health + +//go:generate sh -c "protoc -I./ -I$(go list -f '{{ .Dir }}' -m go.unistack.org/micro-proto/v3) --go-micro_out='components=micro|http|server',standalone=false,debug=true,paths=source_relative:./ health.proto" + +import ( + // import required packages + _ "go.unistack.org/micro-proto/v3/openapiv3" +) diff --git a/handler/health/health.go b/handler/health/health.go new file mode 100644 index 0000000..4399cf3 --- /dev/null +++ b/handler/health/health.go @@ -0,0 +1,82 @@ +package health // import "go.unistack.org/micro-server-http/v3/handler/health" + +import ( + "context" + + codecpb "go.unistack.org/micro-proto/v3/codec" + "go.unistack.org/micro/v3/errors" +) + +var _ HealthServiceServer = &Handler{} + +type Handler struct { + opts Options +} + +type CheckFunc func(context.Context) error + +type Option func(*Options) + +type Options struct { + Version string + Name string + LiveChecks []CheckFunc + ReadyChecks []CheckFunc +} + +func LiveChecks(fns ...CheckFunc) Option { + return func(o *Options) { + o.LiveChecks = append(o.LiveChecks, fns...) + } +} + +func ReadyChecks(fns ...CheckFunc) Option { + return func(o *Options) { + o.ReadyChecks = append(o.ReadyChecks, fns...) + } +} + +func Name(name string) Option { + return func(o *Options) { + o.Name = name + } +} + +func Version(version string) Option { + return func(o *Options) { + o.Version = version + } +} + +func NewHandler(opts ...Option) *Handler { + options := Options{} + for _, o := range opts { + o(&options) + } + return &Handler{opts: options} +} + +func (h *Handler) Live(ctx context.Context, req *codecpb.Frame, rsp *codecpb.Frame) error { + var err error + for _, fn := range h.opts.LiveChecks { + if err = fn(ctx); err != nil { + return errors.ServiceUnavailable(h.opts.Name, "%v", err) + } + } + return nil +} + +func (h *Handler) Ready(ctx context.Context, req *codecpb.Frame, rsp *codecpb.Frame) error { + var err error + for _, fn := range h.opts.ReadyChecks { + if err = fn(ctx); err != nil { + return errors.ServiceUnavailable(h.opts.Name, "%v", err) + } + } + return nil +} + +func (h *Handler) Version(ctx context.Context, req *codecpb.Frame, rsp *codecpb.Frame) error { + rsp.Data = []byte(h.opts.Version) + return nil +} diff --git a/handler/health/health.proto b/handler/health/health.proto new file mode 100644 index 0000000..1795501 --- /dev/null +++ b/handler/health/health.proto @@ -0,0 +1,50 @@ +syntax = "proto3"; + +package micro.server.http.v3.handler.health; +option go_package = "go.unistack.org/micro-server-http/v3/handler/health;health"; + +import "api/annotations.proto"; +import "openapiv3/annotations.proto"; +import "codec/frame.proto"; + +service HealthService { + rpc Live(micro.codec.Frame) returns (micro.codec.Frame) { + option (micro.openapiv3.openapiv3_operation) = { + operation_id: "Live"; + responses: { + default: { + reference: { + _ref: "micro.codec.Frame"; + }; + }; + }; + }; + option (micro.api.http) = { get: "/live"; }; + }; + rpc Ready(micro.codec.Frame) returns (micro.codec.Frame) { + option (micro.openapiv3.openapiv3_operation) = { + operation_id: "Ready"; + responses: { + default: { + reference: { + _ref: "micro.codec.Frame"; + }; + }; + }; + }; + option (micro.api.http) = { get: "/ready"; }; + }; + rpc Version(micro.codec.Frame) returns (micro.codec.Frame) { + option (micro.openapiv3.openapiv3_operation) = { + operation_id: "Version"; + responses: { + default: { + reference: { + _ref: "micro.codec.Frame"; + }; + }; + }; + }; + option (micro.api.http) = { get: "/version"; }; + }; +}; diff --git a/handler/health/health_micro.pb.go b/handler/health/health_micro.pb.go new file mode 100644 index 0000000..3e6f6a0 --- /dev/null +++ b/handler/health/health_micro.pb.go @@ -0,0 +1,48 @@ +// Code generated by protoc-gen-go-micro. DO NOT EDIT. +// versions: +// - protoc-gen-go-micro v3.10.2 +// - protoc v3.21.12 +// source: health.proto + +package health + +import ( + context "context" + codec "go.unistack.org/micro-proto/v3/codec" + v3 "go.unistack.org/micro-server-http/v3" +) + +var ( + HealthServiceName = "HealthService" +) +var ( + HealthServiceServerEndpoints = []v3.EndpointMetadata{ + { + Name: "HealthService.Live", + Path: "/live", + Method: "GET", + Body: "", + Stream: false, + }, + { + Name: "HealthService.Ready", + Path: "/ready", + Method: "GET", + Body: "", + Stream: false, + }, + { + Name: "HealthService.Version", + Path: "/version", + Method: "GET", + Body: "", + Stream: false, + }, + } +) + +type HealthServiceServer interface { + Live(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error + Ready(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error + Version(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error +} diff --git a/handler/health/health_micro_http.pb.go b/handler/health/health_micro_http.pb.go new file mode 100644 index 0000000..0e3c6e7 --- /dev/null +++ b/handler/health/health_micro_http.pb.go @@ -0,0 +1,43 @@ +// Code generated by protoc-gen-go-micro. DO NOT EDIT. +// protoc-gen-go-micro version: v3.10.2 +// source: health.proto + +package health + +import ( + context "context" + codec "go.unistack.org/micro-proto/v3/codec" + v3 "go.unistack.org/micro-server-http/v3" + server "go.unistack.org/micro/v3/server" +) + +type healthServiceServer struct { + HealthServiceServer +} + +func (h *healthServiceServer) Live(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error { + return h.HealthServiceServer.Live(ctx, req, rsp) +} + +func (h *healthServiceServer) Ready(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error { + return h.HealthServiceServer.Ready(ctx, req, rsp) +} + +func (h *healthServiceServer) Version(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error { + return h.HealthServiceServer.Version(ctx, req, rsp) +} + +func RegisterHealthServiceServer(s server.Server, sh HealthServiceServer, opts ...server.HandlerOption) error { + type healthService interface { + Live(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error + Ready(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error + Version(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error + } + type HealthService struct { + healthService + } + h := &healthServiceServer{sh} + var nopts []server.HandlerOption + nopts = append(nopts, v3.HandlerEndpoints(HealthServiceServerEndpoints)) + return s.Handle(s.NewHandler(&HealthService{h}, append(nopts, opts...)...)) +} diff --git a/handler/meter/generate.go b/handler/meter/generate.go new file mode 100644 index 0000000..1605764 --- /dev/null +++ b/handler/meter/generate.go @@ -0,0 +1,8 @@ +package meter + +//go:generate sh -c "protoc -I./ -I$(go list -f '{{ .Dir }}' -m go.unistack.org/micro-proto/v3) --go-micro_out='components=micro|http|server',standalone=false,debug=true,paths=source_relative:./ meter.proto" + +import ( + // import required packages + _ "go.unistack.org/micro-proto/v3/openapiv3" +) diff --git a/handler/meter/meter.go b/handler/meter/meter.go new file mode 100644 index 0000000..f92830e --- /dev/null +++ b/handler/meter/meter.go @@ -0,0 +1,67 @@ +package meter // import "go.unistack.org/micro-server-http/v3/handler/meter" + +import ( + "bytes" + "context" + + codecpb "go.unistack.org/micro-proto/v3/codec" + "go.unistack.org/micro/v3/errors" + "go.unistack.org/micro/v3/meter" +) + +// guard to fail early +var _ MeterServiceServer = &Handler{} + +type Handler struct { + opts Options +} + +type Option func(*Options) + +type Options struct { + Meter meter.Meter + Name string + MeterOptions []meter.Option +} + +func Meter(m meter.Meter) Option { + return func(o *Options) { + o.Meter = m + } +} + +func Name(name string) Option { + return func(o *Options) { + o.Name = name + } +} + +func MeterOptions(opts ...meter.Option) Option { + return func(o *Options) { + o.MeterOptions = append(o.MeterOptions, opts...) + } +} + +func NewOptions(opts ...Option) Options { + options := Options{Meter: meter.DefaultMeter} + for _, o := range opts { + o(&options) + } + return options +} + +func NewHandler(opts ...Option) *Handler { + options := NewOptions(opts...) + return &Handler{opts: options} +} + +func (h *Handler) Metrics(ctx context.Context, req *codecpb.Frame, rsp *codecpb.Frame) error { + buf := bytes.NewBuffer(nil) + if err := h.opts.Meter.Write(buf, h.opts.MeterOptions...); err != nil { + return errors.InternalServerError(h.opts.Name, "%v", err) + } + + rsp.Data = buf.Bytes() + + return nil +} diff --git a/handler/meter/meter.proto b/handler/meter/meter.proto new file mode 100644 index 0000000..7fc653e --- /dev/null +++ b/handler/meter/meter.proto @@ -0,0 +1,24 @@ +syntax = "proto3"; + +package micro.server.http.v3.handler.meter; +option go_package = "go.unistack.org/micro-server-http/v3/handler/meter;meter"; + +import "api/annotations.proto"; +import "openapiv3/annotations.proto"; +import "codec/frame.proto"; + +service MeterService { + rpc Metrics(micro.codec.Frame) returns (micro.codec.Frame) { + option (micro.openapiv3.openapiv3_operation) = { + operation_id: "Metrics"; + responses: { + default: { + reference: { + _ref: "micro.codec.Frame"; + }; + }; + }; + }; + option (micro.api.http) = { get: "/metrics"; }; + }; +}; diff --git a/handler/meter/meter_micro.pb.go b/handler/meter/meter_micro.pb.go new file mode 100644 index 0000000..d9ba8aa --- /dev/null +++ b/handler/meter/meter_micro.pb.go @@ -0,0 +1,32 @@ +// Code generated by protoc-gen-go-micro. DO NOT EDIT. +// versions: +// - protoc-gen-go-micro v3.10.2 +// - protoc v3.21.12 +// source: meter.proto + +package meter + +import ( + context "context" + codec "go.unistack.org/micro-proto/v3/codec" + v3 "go.unistack.org/micro-server-http/v3" +) + +var ( + MeterServiceName = "MeterService" +) +var ( + MeterServiceServerEndpoints = []v3.EndpointMetadata{ + { + Name: "MeterService.Metrics", + Path: "/metrics", + Method: "GET", + Body: "", + Stream: false, + }, + } +) + +type MeterServiceServer interface { + Metrics(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error +} diff --git a/handler/meter/meter_micro_http.pb.go b/handler/meter/meter_micro_http.pb.go new file mode 100644 index 0000000..e79500a --- /dev/null +++ b/handler/meter/meter_micro_http.pb.go @@ -0,0 +1,33 @@ +// Code generated by protoc-gen-go-micro. DO NOT EDIT. +// protoc-gen-go-micro version: v3.10.2 +// source: meter.proto + +package meter + +import ( + context "context" + codec "go.unistack.org/micro-proto/v3/codec" + v3 "go.unistack.org/micro-server-http/v3" + server "go.unistack.org/micro/v3/server" +) + +type meterServiceServer struct { + MeterServiceServer +} + +func (h *meterServiceServer) Metrics(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error { + return h.MeterServiceServer.Metrics(ctx, req, rsp) +} + +func RegisterMeterServiceServer(s server.Server, sh MeterServiceServer, opts ...server.HandlerOption) error { + type meterService interface { + Metrics(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error + } + type MeterService struct { + meterService + } + h := &meterServiceServer{sh} + var nopts []server.HandlerOption + nopts = append(nopts, v3.HandlerEndpoints(MeterServiceServerEndpoints)) + return s.Handle(s.NewHandler(&MeterService{h}, append(nopts, opts...)...)) +} -- 2.45.2