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