diff --git a/pkg/cache/metrics_cache.go b/pkg/cache/metrics_cache.go deleted file mode 100644 index 12e8fd27f084c7df96461813f1c5cdf13df34a5f..0000000000000000000000000000000000000000 --- a/pkg/cache/metrics_cache.go +++ /dev/null @@ -1,56 +0,0 @@ -package cache - -import ( - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" -) - -var ( - cacheHitsTotal = promauto.With(prometheus.DefaultRegisterer).NewCounterVec(prometheus.CounterOpts{ - Name: "cache_hits_total", - Help: "Количество попаданий в кэш.", - }, []string{"cache_id"}) - cacheMissesTotal = promauto.With(prometheus.DefaultRegisterer).NewCounterVec(prometheus.CounterOpts{ - Name: "cache_misses_total", - Help: "Количество пропусков в кэш.", - }, []string{"cache_id"}) -) - -var _ Cache = &MetricsCache{} - -type MetricsCache struct { - cache Cache - cacheID string -} - -// WithMetrics возвращает обертку над кэшем, которая используется для отслеживания количества хитов и промахов в кэше. -// Помимо этого, в функцию WithMetrics передается параметр cacheID, который используется в метке метрик для идентификации конкретного кэша. -// -// Метрики записываются в prometheus.DefaultRegisterer -func WithMetrics(cache Cache, cacheID string) *MetricsCache { - if cache == nil { - panic("cannot wrap metrics in cache, cache is nil") - } - return &MetricsCache{ - cacheID: cacheID, - cache: cache, - } -} - -func (c *MetricsCache) Set(key, value any) error { - return c.cache.Set(key, value) -} - -func (c *MetricsCache) Get(key any) (any, error) { - value, err := c.cache.Get(key) - if err != nil { - cacheMissesTotal.WithLabelValues(c.cacheID).Inc() - return nil, err - } - cacheHitsTotal.WithLabelValues(c.cacheID).Inc() - return value, nil -} - -func (c *MetricsCache) Remove(key any) error { - return c.cache.Remove(key) -} diff --git a/pkg/cache/metrics_middleware.go b/pkg/cache/metrics_middleware.go new file mode 100644 index 0000000000000000000000000000000000000000..90966127655faffca96dae0e5703528dcade9ff6 --- /dev/null +++ b/pkg/cache/metrics_middleware.go @@ -0,0 +1,56 @@ +package cache + +import ( + "github.com/prometheus/client_golang/prometheus" +) + +type metricsMiddleware struct { + cache Cache + hitsTotal prometheus.Counter + missesTotal prometheus.Counter +} + +// MetricsMiddleware возвращает обертку над кэшем, которая используется для отслеживания количества хитов и промахов в кэше. +// +// Метрики записываются в prometheus.DefaultRegisterer +func MetricsMiddleware(cache Cache, serviceName string) Cache { + if cache == nil { + panic("cannot wrap metrics in cache, cache is nil") + } + middleware := &metricsMiddleware{ + cache: cache, + hitsTotal: prometheus.NewCounter(prometheus.CounterOpts{ + Name: "cache_hits_total", + Help: "Количество попаданий в кэш.", + ConstLabels: prometheus.Labels{"service_name": serviceName}, + }), + missesTotal: prometheus.NewCounter(prometheus.CounterOpts{ + Name: "cache_misses_total", + Help: "Количество пропусков в кэш.", + ConstLabels: prometheus.Labels{"service_name": serviceName}, + }), + } + prometheus.MustRegister( + middleware.hitsTotal, + middleware.missesTotal, + ) + return middleware +} + +func (c *metricsMiddleware) Set(key, value any) error { + return c.cache.Set(key, value) +} + +func (c *metricsMiddleware) Get(key any) (any, error) { + value, err := c.cache.Get(key) + if err != nil { + c.missesTotal.Inc() + return nil, err + } + c.hitsTotal.Inc() + return value, nil +} + +func (c *metricsMiddleware) Remove(key any) error { + return c.cache.Remove(key) +}