Skip to main content

监控

Metrics 中间件用于实现服务的性能指标监控,统计了请求耗时和请求计数。

配置#

Metrics 中间件中提供了两个配置方法 WithSeconds()WithRequests()

WithSeconds()#

func WithSeconds(c metrics.Observer) Option {    return func(o *options) {        o.seconds = c    }}

用于设置 metrics 中间件统计请求耗时的 Observer 直方图。

WithRequests()#

func WithRequests(c metrics.Counter) Option {    return func(o *options) {        o.requests = c    }}

用于设置 metrics 中间件统计请求计数的 Counter 计数器。

使用方式#

使用 prometheus#

// https://github.com/go-kratos/kratos/tree/main/examples/metrics_metricSeconds = prometheus.NewHistogramVec(prometheus.HistogramOpts{    Namespace: "server",    Subsystem: "requests",    Name:      "duration_ms",    Help:      "server requests duration(ms).",    Buckets:   []float64{5, 10, 25, 50, 100, 250, 500, 1000},}, []string{"kind", "operation"})
_metricRequests = prometheus.NewCounterVec(prometheus.CounterOpts{    Namespace: "client",    Subsystem: "requests",    Name:      "code_total",    Help:      "The total number of processed requests",}, []string{"kind", "operation", "code", "reason"})    prometheus.MustRegister(_metricSeconds, _metricRequests)
httpSrv.Handle("/metrics", promhttp.Handler())

Server 中使用 metrics#

// grpc severgrpcSrv := grpc.NewServer(    grpc.Address(":9000"),    grpc.Middleware(        metrics.Server(            metrics.WithSeconds(prom.NewHistogram(_metricSeconds)),            metrics.WithRequests(prom.NewCounter(_metricRequests)),        ),    ),)
// http serverhttpSrv := http.NewServer(    http.Address(":8000"),    http.Middleware(        metrics.Server(            metrics.WithSeconds(prom.NewHistogram(_metricSeconds)),            metrics.WithRequests(prom.NewCounter(_metricRequests)),        ),    ),)

Client 中使用 metrics#

// grpc clientconn, err := grpc.DialInsecure(    context.Background(),    grpc.WithEndpoint("127.0.0.1:9000"),    grpc.WithMiddleware(        metrics.Client(            metrics.WithSeconds(prom.NewHistogram(_metricSeconds)),            metrics.WithRequests(prom.NewCounter(_metricRequests)),        ),    ),)
// http clientconn, err := http.NewClient(    context.Background(),    http.WithEndpoint("127.0.0.1:8000"),    http.WithMiddleware(        metrics.Client(            metrics.WithSeconds(prom.NewHistogram(_metricSeconds)),            metrics.WithRequests(prom.NewCounter(_metricRequests)),        ),    ),)

References#