From 4e4b445ef86bbd67016cd9eb3837c955b64d9a49 Mon Sep 17 00:00:00 2001 From: TeCHiScy <741195+TeCHiScy@users.noreply.github.com> Date: Mon, 21 Oct 2024 14:34:31 +0800 Subject: [PATCH] Update 05-metrics.md (#222) * Update 05-metrics.md upgrade to mention how to export metrics to prometheus in kratos >= 2.8.0 * Update 05-metrics.md upgrade to mention how to export metrics to prometheus in kratos >= 2.8.0 --- docs/component/middleware/05-metrics.md | 97 ++++++++++++++++++- .../component/middleware/05-metrics.md | 96 +++++++++++++++++- 2 files changed, 184 insertions(+), 9 deletions(-) diff --git a/docs/component/middleware/05-metrics.md b/docs/component/middleware/05-metrics.md index 26d3aa4ba..e85c4b894 100644 --- a/docs/component/middleware/05-metrics.md +++ b/docs/component/middleware/05-metrics.md @@ -40,11 +40,11 @@ func WithRequests(c metrics.Counter) Option { 用于设置 metrics 中间件统计请求计数的 `Counter` 计数器。 -### 使用方式 +### 使用方式 (kratos < 2.8.0) #### 使用 prometheus ```go -// Detailed reference https://github.com/go-kratos/examples/tree/main/metrics +// 详见 https://github.com/go-kratos/examples/tree/main/metrics _metricSeconds = prometheus.NewHistogramVec(prometheus.HistogramOpts{ Namespace: "server", @@ -62,8 +62,6 @@ _metricRequests = prometheus.NewCounterVec(prometheus.CounterOpts{ }, []string{"kind", "operation", "code", "reason"}) prometheus.MustRegister(_metricSeconds, _metricRequests) - -httpSrv.Handle("/metrics", promhttp.Handler()) ``` #### Server 中使用 metrics @@ -93,6 +91,7 @@ httpSrv := http.NewServer( ), ), ) +httpSrv.Handle("/metrics", promhttp.Handler()) ``` #### Client 中使用 metrics @@ -123,9 +122,97 @@ conn, err := http.NewClient( ) ``` +### 使用方式 (kratos >= 2.8.0) +kratos 从 [v2.8.0](https://github.com/go-kratos/kratos/releases/tag/v2.8.0) 开始使用 otel.Metrics,需要用以下方法 export 数据到 prometheus。 +#### 使用 prometheus +```go +import ( + "github.com/go-kratos/kratos/v2/middleware/metrics" + "go.opentelemetry.io/otel/exporters/prometheus" + "go.opentelemetry.io/otel/metric" + sdkmetric "go.opentelemetry.io/otel/sdk/metric" +) -### References +// Detailed reference https://github.com/go-kratos/examples/tree/main/metrics +func init() { + exporter, err := prometheus.New() + if err != nil { + panic(err) + } + provider := sdkmetric.NewMeterProvider(sdkmetric.WithReader(exporter)) + meter := provider.Meter(Name) + + _metricRequests, err = metrics.DefaultRequestsCounter(meter, metrics.DefaultServerRequestsCounterName) + if err != nil { + panic(err) + } + + _metricSeconds, err = metrics.DefaultSecondsHistogram(meter, metrics.DefaultServerSecondsHistogramName) + if err != nil { + panic(err) + } +} +``` + +#### Server 中使用 metrics +```go +import ( + "github.com/prometheus/client_golang/prometheus/promhttp" +) + +// grpc service +grpcSrv := grpc.NewServer( + grpc.Address(":9000"), + grpc.Middleware( + metrics.Server( + metrics.WithSeconds(_metricSeconds), + metrics.WithRequests(_metricRequests), + ), + ), +) + +// http service +httpSrv := http.NewServer( + http.Address(":8000"), + http.Middleware( + metrics.Server( + metrics.WithSeconds(_metricSeconds), + metrics.WithRequests(_metricRequests), + ), + ), +) +httpSrv.Handle("/metrics", promhttp.Handler()) +``` +#### Client 中使用 metrics +```go +// grpc client +conn, err := grpc.DialInsecure( + context.Background(), + grpc.WithEndpoint("127.0.0.1:9000"), + grpc.WithMiddleware( + metrics.Client( + metrics.WithSeconds(_metricSeconds), + metrics.WithRequests(_metricRequests), + ), + ), +) + +// http client +conn, err := http.NewClient( + context.Background(), + http.WithEndpoint("127.0.0.1:8000"), + http.WithMiddleware( + metrics.Client( + metrics.WithSeconds(_metricSeconds), + metrics.WithRequests(_metricRequests), + ), + ), +) +``` + +### References * https://prometheus.io/docs/concepts/metric_types/ * https://github.com/go-kratos/examples/tree/main/metrics +* https://pkg.go.dev/go.opentelemetry.io/otel/exporters/prometheus diff --git a/i18n/en/docusaurus-plugin-content-docs/current/component/middleware/05-metrics.md b/i18n/en/docusaurus-plugin-content-docs/current/component/middleware/05-metrics.md index fde70d04f..4d81ba26a 100644 --- a/i18n/en/docusaurus-plugin-content-docs/current/component/middleware/05-metrics.md +++ b/i18n/en/docusaurus-plugin-content-docs/current/component/middleware/05-metrics.md @@ -40,7 +40,7 @@ func WithRequests(c metrics.Counter) Option { The `Counter` counter used to set the metrics middleware statistics request count. -### Usage +### Usage (kratos < 2.8.0) #### Prometheus ```go @@ -62,8 +62,6 @@ _metricRequests = prometheus.NewCounterVec(prometheus.CounterOpts{ }, []string{"kind", "operation", "code", "reason"}) prometheus.MustRegister(_metricSeconds, _metricRequests) - -httpSrv.Handle("/metrics", promhttp.Handler()) ``` #### To configure metrics in servers @@ -93,6 +91,7 @@ httpSrv := http.NewServer( ), ), ) +httpSrv.Handle("/metrics", promhttp.Handler()) ``` #### To configure metrics in clients @@ -123,9 +122,98 @@ conn, err := http.NewClient( ) ``` +### Usage (kratos >= 2.8.0) +Since version [v2.8.0](https://github.com/go-kratos/kratos/releases/tag/v2.8.0), kratos uses otel.Metrics. Way to export metrics to prometheus is as follows: -### References +#### Prometheus +```go +import ( + "github.com/go-kratos/kratos/v2/middleware/metrics" + "go.opentelemetry.io/otel/exporters/prometheus" + "go.opentelemetry.io/otel/metric" + sdkmetric "go.opentelemetry.io/otel/sdk/metric" +) + +// Detailed reference https://github.com/go-kratos/examples/tree/main/metrics +func init() { + exporter, err := prometheus.New() + if err != nil { + panic(err) + } + provider := sdkmetric.NewMeterProvider(sdkmetric.WithReader(exporter)) + meter := provider.Meter(Name) + + _metricRequests, err = metrics.DefaultRequestsCounter(meter, metrics.DefaultServerRequestsCounterName) + if err != nil { + panic(err) + } + + _metricSeconds, err = metrics.DefaultSecondsHistogram(meter, metrics.DefaultServerSecondsHistogramName) + if err != nil { + panic(err) + } +} +``` + +#### To configure metrics in servers +```go +import ( + "github.com/prometheus/client_golang/prometheus/promhttp" +) + +// grpc service +grpcSrv := grpc.NewServer( + grpc.Address(":9000"), + grpc.Middleware( + metrics.Server( + metrics.WithSeconds(_metricSeconds), + metrics.WithRequests(_metricRequests), + ), + ), +) + +// http service +httpSrv := http.NewServer( + http.Address(":8000"), + http.Middleware( + metrics.Server( + metrics.WithSeconds(_metricSeconds), + metrics.WithRequests(_metricRequests), + ), + ), +) +httpSrv.Handle("/metrics", promhttp.Handler()) +``` +#### To configure metrics in clients +```go +// grpc client +conn, err := grpc.DialInsecure( + context.Background(), + grpc.WithEndpoint("127.0.0.1:9000"), + grpc.WithMiddleware( + metrics.Client( + metrics.WithSeconds(_metricSeconds), + metrics.WithRequests(_metricRequests), + ), + ), +) + +// http client +conn, err := http.NewClient( + context.Background(), + http.WithEndpoint("127.0.0.1:8000"), + http.WithMiddleware( + metrics.Client( + metrics.WithSeconds(_metricSeconds), + metrics.WithRequests(_metricRequests), + ), + ), +) +``` + +### References * https://prometheus.io/docs/concepts/metric_types/ * https://github.com/go-kratos/examples/tree/main/metrics +* https://pkg.go.dev/go.opentelemetry.io/otel/exporters/prometheus \ No newline at end of file