From d5f1daad3e38c63289a059199a36abd0c7162ba4 Mon Sep 17 00:00:00 2001
From: ensiouel <ensiouel@gmail.com>
Date: Thu, 14 Dec 2023 15:11:03 +0300
Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?=
 =?UTF-8?q?=D0=BD=D0=B0=20=D0=BE=D0=B1=D0=B5=D1=80=D1=82=D0=BA=D0=B0=20?=
 =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20Cache,=20=D0=BA=D0=BE=D1=82=D0=BE=D1=80?=
 =?UTF-8?q?=D0=B0=D1=8F=20=D1=81=D0=BE=D0=B1=D0=B8=D1=80=D0=B0=D0=B5=D1=82?=
 =?UTF-8?q?=20=D0=BC=D0=B5=D1=82=D1=80=D0=B8=D0=BA=D0=B8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pkg/cache/metrics_cache.go | 57 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 57 insertions(+)
 create mode 100644 pkg/cache/metrics_cache.go

diff --git a/pkg/cache/metrics_cache.go b/pkg/cache/metrics_cache.go
new file mode 100644
index 00000000..d93cc4ac
--- /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)
+}
-- 
GitLab