github.com/lingyao2333/mo-zero@v1.4.1/zrpc/internal/clientinterceptors/prometheusinterceptor.go (about) 1 package clientinterceptors 2 3 import ( 4 "context" 5 "strconv" 6 "time" 7 8 "github.com/lingyao2333/mo-zero/core/metric" 9 "github.com/lingyao2333/mo-zero/core/timex" 10 "google.golang.org/grpc" 11 "google.golang.org/grpc/status" 12 ) 13 14 const clientNamespace = "rpc_client" 15 16 var ( 17 metricClientReqDur = metric.NewHistogramVec(&metric.HistogramVecOpts{ 18 Namespace: clientNamespace, 19 Subsystem: "requests", 20 Name: "duration_ms", 21 Help: "rpc client requests duration(ms).", 22 Labels: []string{"method"}, 23 Buckets: []float64{5, 10, 25, 50, 100, 250, 500, 1000}, 24 }) 25 26 metricClientReqCodeTotal = metric.NewCounterVec(&metric.CounterVecOpts{ 27 Namespace: clientNamespace, 28 Subsystem: "requests", 29 Name: "code_total", 30 Help: "rpc client requests code count.", 31 Labels: []string{"method", "code"}, 32 }) 33 ) 34 35 // PrometheusInterceptor is an interceptor that reports to prometheus server. 36 func PrometheusInterceptor(ctx context.Context, method string, req, reply interface{}, 37 cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { 38 startTime := timex.Now() 39 err := invoker(ctx, method, req, reply, cc, opts...) 40 metricClientReqDur.Observe(int64(timex.Since(startTime)/time.Millisecond), method) 41 metricClientReqCodeTotal.Inc(method, strconv.Itoa(int(status.Code(err)))) 42 return err 43 }