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"}),
-	}
-}