diff --git a/pkg/cache/metrics_cache.go b/pkg/cache/metrics_cache.go new file mode 100644 index 0000000000000000000000000000000000000000..0c5472dcaffc9e6cc81132c1ad71423f20c29b1f --- /dev/null +++ b/pkg/cache/metrics_cache.go @@ -0,0 +1,54 @@ +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"}) +) + +type metricsCache struct { + cache Cache + cacheID string +} + +// WithMetrics возвращает обертку над кэшем, которая используется для отслеживания количества хитов и промахов в кэше. +// Помимо этого, в функцию WithMetrics передается параметр cacheID, который используется в метке метрик для идентификации конкретного кэша. +// +// Метрики записываются в prometheus.DefaultRegisterer +func WithMetrics(cache Cache, cacheID string) Cache { + 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/items/middleware/caching_middleware.go b/pkg/items/middleware/caching_middleware.go index 4ddeb97e9dce5f38564fd6af91e326bd3bc193a3..6b11851381fb9dc13b630477052f05d4148bc765 100644 --- a/pkg/items/middleware/caching_middleware.go +++ b/pkg/items/middleware/caching_middleware.go @@ -7,19 +7,17 @@ import ( "git.perx.ru/perxis/perxis-go/pkg/cache" envService "git.perx.ru/perxis/perxis-go/pkg/environments" service "git.perx.ru/perxis/perxis-go/pkg/items" - "git.perx.ru/perxis/perxis-go/pkg/metrics" ) func makeKey(ss ...string) string { return strings.Join(ss, "-") } -func CachingMiddleware(cache, cachePublished cache.Cache, cacheMetrics *metrics.CacheMetrics, envs envService.Environments) Middleware { +func CachingMiddleware(cache, cachePublished cache.Cache, envs envService.Environments) Middleware { return func(next service.Items) service.Items { return &cachingMiddleware{ cache: cache, cachePublished: cachePublished, - cacheMetrics: cacheMetrics, Items: next, envs: envs, } @@ -29,7 +27,6 @@ func CachingMiddleware(cache, cachePublished cache.Cache, cacheMetrics *metrics. type cachingMiddleware struct { cache cache.Cache cachePublished cache.Cache - cacheMetrics *metrics.CacheMetrics envs envService.Environments service.Items } @@ -38,11 +35,8 @@ func (m cachingMiddleware) Get(ctx context.Context, spaceId, envId, collectionId value, e := m.cache.Get(makeKey(spaceId, envId, collectionId, itemId)) if e == nil { - m.cacheMetrics.HitsTotal.WithLabelValues("Items").Inc() return value.(*service.Item), err } - m.cacheMetrics.MissesTotal.WithLabelValues("Items").Inc() - itm, err = m.Items.Get(ctx, spaceId, envId, collectionId, itemId, options...) if err == nil { env, err := m.envs.Get(ctx, itm.SpaceID, itm.EnvID) @@ -138,11 +132,9 @@ func (m cachingMiddleware) GetPublished(ctx context.Context, spaceId, envId, col if e == nil { value := val.(map[string]*service.Item) if i, ok := value[opts.LocaleID]; ok { - m.cacheMetrics.HitsTotal.WithLabelValues("Items").Inc() return i, nil } } - m.cacheMetrics.MissesTotal.WithLabelValues("Items").Inc() itm, err = m.Items.GetPublished(ctx, spaceId, envId, collectionId, itemId, opts) diff --git a/pkg/metrics/cache.go b/pkg/metrics/cache.go deleted file mode 100644 index 559731b2f3af25ba00bc47f5a4348f131c9dbd8d..0000000000000000000000000000000000000000 --- a/pkg/metrics/cache.go +++ /dev/null @@ -1,25 +0,0 @@ -package metrics - -import ( - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" -) - -// CacheMetrics предоставляет метрики для отслеживания попаданий и промахов в кэш. -type CacheMetrics struct { - HitsTotal *prometheus.CounterVec - MissesTotal *prometheus.CounterVec -} - -func NewCacheMetrics(registry prometheus.Registerer) *CacheMetrics { - return &CacheMetrics{ - HitsTotal: promauto.With(registry).NewCounterVec(prometheus.CounterOpts{ - Name: "cache_hits_total", - Help: "Количество попаданий в кэш.", - }, []string{"cache_id"}), - MissesTotal: promauto.With(registry).NewCounterVec(prometheus.CounterOpts{ - Name: "cache_misses_total", - Help: "Количество пропусков в кэш.", - }, []string{"cache_id"}), - } -}