diff --git a/pkg/cache/metrics_cache.go b/pkg/cache/metrics_cache.go new file mode 100644 index 0000000000000000000000000000000000000000..d93cc4ac4141c3c4c0ae97ec2740d4acca5010f8 --- /dev/null +++ b/pkg/cache/metrics_cache.go @@ -0,0 +1,57 @@ +package cache + +import ( + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" +) + +var ( + cacheRequestsTotal = promauto.With(prometheus.DefaultRegisterer).NewCounterVec(prometheus.CounterOpts{ + Name: "cache_requests_total", + Help: "Количество обращений к кэшу", + }, []string{"cache_id"}) + 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 { + cacheID string + cache Cache +} + +func WrapMetrics(cacheID string, cache Cache) *MetricsCache { + 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) { + cacheRequestsTotal.WithLabelValues(c.cacheID).Inc() + + 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) +}