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  }