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)
+}