diff --git a/meter/handler/handler.go b/meter/handler/handler.go index 0120e3b5..19f40bd9 100644 --- a/meter/handler/handler.go +++ b/meter/handler/handler.go @@ -5,6 +5,7 @@ import ( "context" "github.com/unistack-org/micro/v3/codec" + "github.com/unistack-org/micro/v3/errors" "github.com/unistack-org/micro/v3/meter" ) @@ -14,18 +15,52 @@ var ( ) type handler struct { - meter meter.Meter - opts []meter.Option + opts Options } -func NewHandler(meter meter.Meter, opts ...meter.Option) *handler { - return &handler{meter: meter, opts: opts} +type Option func(*Options) + +type Options struct { + Meter meter.Meter + MeterOptions []meter.Option + Name string +} + +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 *codec.Frame, rsp *codec.Frame) error { buf := bytes.NewBuffer(nil) - if err := h.meter.Write(buf, h.opts...); err != nil { - return err + if err := h.opts.Meter.Write(buf, h.opts.MeterOptions...); err != nil { + return errors.InternalServerError(h.opts.Name, "%v", err) } rsp.Data = buf.Bytes()