From 1290c5526a7ad1ac1acf99ca3f0650faecd16f46 Mon Sep 17 00:00:00 2001 From: "a.petraki" <a.petraki@perx.ru> Date: Wed, 20 Dec 2023 14:53:51 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B5=D0=B4=D0=BB=D0=BE=D0=B6?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=20=D1=80=D0=B5=D1=84?= =?UTF-8?q?=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=D1=83=20=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D1=80=D0=B8=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/items/middleware/metrics_middleware.go | 6 ++++- pkg/metrics/request.go | 29 +++++++++++++++------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/pkg/items/middleware/metrics_middleware.go b/pkg/items/middleware/metrics_middleware.go index a9f7b8f9..a648b4ff 100644 --- a/pkg/items/middleware/metrics_middleware.go +++ b/pkg/items/middleware/metrics_middleware.go @@ -8,6 +8,7 @@ package middleware import ( "context" + "strings" "git.perx.ru/perxis/perxis-go/pkg/items" "git.perx.ru/perxis/perxis-go/pkg/metrics" @@ -17,6 +18,7 @@ import ( // metricsMiddleware implements items.Items that is instrumented with metrics type metricsMiddleware struct { + serviceName string requestMetrics *metrics.RequestMetrics next items.Items } @@ -25,6 +27,7 @@ type metricsMiddleware struct { func MetricsMiddleware(requestMetrics *metrics.RequestMetrics) Middleware { return func(next items.Items) items.Items { return &metricsMiddleware{ + serviceName: strings.ToLower("Items"), // эта строка для генерации по шаблону для всех сервисов, там ServiceName с заглавной буквы requestMetrics: requestMetrics, next: next, } @@ -35,7 +38,8 @@ func MetricsMiddleware(requestMetrics *metrics.RequestMetrics) Middleware { func (m metricsMiddleware) Aggregate(ctx context.Context, spaceId string, envId string, collectionId string, filter *items.Filter, options ...*items.AggregateOptions) (result map[string]interface{}, err error) { timer := prometheus.NewTimer(m.requestMetrics.DurationSeconds.WithLabelValues("Aggregate")) defer timer.ObserveDuration() - m.requestMetrics.Total.WithLabelValues("Aggregate").Inc() + m.requestMetrics.Total.With(prometheus.Labels{"service": m.serviceName, "method": "Aggregate"}).Inc() // тут как больше нравится. Мне нравится более явно + // m.requestMetrics.Total.WithLabelValues(m.serviceName, "Aggregate").Inc() result, err = m.next.Aggregate(ctx, spaceId, envId, collectionId, filter, options...) if err != nil { m.requestMetrics.FailedTotal.WithLabelValues("Aggregate").Inc() diff --git a/pkg/metrics/request.go b/pkg/metrics/request.go index 4c5ff719..a937d62d 100644 --- a/pkg/metrics/request.go +++ b/pkg/metrics/request.go @@ -4,12 +4,26 @@ import ( "github.com/prometheus/client_golang/prometheus" ) +var ( + RequestLabels = []string{ + "service", + "method", + } +) + type RequestMetrics struct { Total *prometheus.CounterVec FailedTotal *prometheus.CounterVec DurationSeconds *prometheus.HistogramVec } +// Пример использования: +// ... +// requestMetrics := metrics.NewRequestMetrics("content") +// s.Items = itemsMiddleware.MetricsMiddleware(requestMetrics) +// s.Collections = collectionsMiddleware.MetricsMiddleware(requestMetrics) +// ... + // NewRequestMetrics возвращает метрики для подсчета количества удачных/неудачных запросов, а так же длительности ответов. // // subsystem указывает подсистему, к которой принадлежат метрики. @@ -19,29 +33,26 @@ type RequestMetrics struct { // Значения меток должны быть уникальными в рамках одной subsystem. // // Метрики записываются в prometheus.DefaultRegisterer -func NewRequestMetrics(subsystem string, durationBuckets []float64, labels ...string) *RequestMetrics { - if len(durationBuckets) == 0 { - durationBuckets = prometheus.DefBuckets - } +func NewRequestMetrics(subsystem string) *RequestMetrics { metrics := &RequestMetrics{ Total: prometheus.NewCounterVec(prometheus.CounterOpts{ Subsystem: subsystem, Name: "service_requests_total", Help: "Количество запросов.", - }, []string{"method"}), + }, RequestLabels), FailedTotal: prometheus.NewCounterVec(prometheus.CounterOpts{ Subsystem: subsystem, Name: "service_requests_failed_total", Help: "Количество запросов, вернувших ошибку.", - }, []string{"method"}), + }, RequestLabels), DurationSeconds: prometheus.NewHistogramVec(prometheus.HistogramOpts{ Subsystem: subsystem, Name: "service_request_duration_seconds", Help: "Длительность обработки запроса.", - Buckets: durationBuckets, - }, []string{"method"}), + Buckets: prometheus.DefBuckets, + }, RequestLabels), } - prometheus.WrapRegistererWith(GetLabelsFromKV(labels), prometheus.DefaultRegisterer).MustRegister( + prometheus.MustRegister( metrics.Total, metrics.FailedTotal, metrics.DurationSeconds, -- GitLab