micro/metrics/wrapper/metrics_wrapper.go
Prawn da4159513e
Metrics interface and Prometheus implementation (#1929)
* Metrics interface

* Prometheus implementation

* NoOp implementation

Co-authored-by: chris <chris@Profanity.local>
2020-08-18 08:27:50 +01:00

52 lines
1.1 KiB
Go

package wrapper
import (
"time"
"context"
"github.com/micro/go-micro/v3/metrics"
"github.com/micro/go-micro/v3/server"
)
// Wrapper provides a HandlerFunc for metrics.Reporter implementations:
type Wrapper struct {
reporter metrics.Reporter
}
// New returns a *Wrapper configured with the given metrics.Reporter:
func New(reporter metrics.Reporter) *Wrapper {
return &Wrapper{
reporter: reporter,
}
}
// HandlerFunc instruments handlers registered to a service:
func (w *Wrapper) HandlerFunc(handlerFunction server.HandlerFunc) server.HandlerFunc {
return func(ctx context.Context, req server.Request, rsp interface{}) error {
// Build some tags to describe the call:
tags := metrics.Tags{
"method": req.Method(),
}
// Start the clock:
callTime := time.Now()
// Run the handlerFunction:
err := handlerFunction(ctx, req, rsp)
// Add a result tag:
if err != nil {
tags["result"] = "failure"
} else {
tags["result"] = "failure"
}
// Instrument the result (if the DefaultClient has been configured):
w.reporter.Timing("service.handler", time.Since(callTime), tags)
return err
}
}