From 340d55e16f263b482216e4ce2f1784e79b3bf596 Mon Sep 17 00:00:00 2001 From: ensiouel <ensiouel@gmail.com> Date: Sat, 16 Dec 2023 16:51:36 +0300 Subject: [PATCH] =?UTF-8?q?refactor(items):=20CacheMetrics=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=20=D0=B2=20CachingMi?= =?UTF-8?q?ddleware?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/cache/metrics_cache.go | 54 ---------------------- pkg/items/middleware/caching_middleware.go | 10 +++- pkg/metrics/cache.go | 25 ++++++++++ 3 files changed, 34 insertions(+), 55 deletions(-) delete mode 100644 pkg/cache/metrics_cache.go create mode 100644 pkg/metrics/cache.go diff --git a/pkg/cache/metrics_cache.go b/pkg/cache/metrics_cache.go deleted file mode 100644 index 0c5472dc..00000000 --- a/pkg/cache/metrics_cache.go +++ /dev/null @@ -1,54 +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"}) -) - -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 6b118513..4ddeb97e 100644 --- a/pkg/items/middleware/caching_middleware.go +++ b/pkg/items/middleware/caching_middleware.go @@ -7,17 +7,19 @@ 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, envs envService.Environments) Middleware { +func CachingMiddleware(cache, cachePublished cache.Cache, cacheMetrics *metrics.CacheMetrics, envs envService.Environments) Middleware { return func(next service.Items) service.Items { return &cachingMiddleware{ cache: cache, cachePublished: cachePublished, + cacheMetrics: cacheMetrics, Items: next, envs: envs, } @@ -27,6 +29,7 @@ func CachingMiddleware(cache, cachePublished cache.Cache, envs envService.Enviro type cachingMiddleware struct { cache cache.Cache cachePublished cache.Cache + cacheMetrics *metrics.CacheMetrics envs envService.Environments service.Items } @@ -35,8 +38,11 @@ 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) @@ -132,9 +138,11 @@ 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 new file mode 100644 index 00000000..559731b2 --- /dev/null +++ b/pkg/metrics/cache.go @@ -0,0 +1,25 @@ +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"}), + } +} -- GitLab