diff --git a/pkg/items/middleware/metrics_middleware.go b/pkg/items/middleware/metrics_middleware.go index a9f7b8f9099750db9dca96a06442f594cd3e0681..a648b4ff16d27924bc48e0eb824ee984a3c26d44 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 4c5ff719e4fa85dd33a1a270e2079ae99d644d98..a937d62d801269995357b61f235b423fd35b1725 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,