diff --git a/pkg/items/middleware/caching_middleware_test.go b/pkg/items/middleware/caching_middleware_test.go
index b7ea569db094e7905b6aae2ce8bebfb381849f95..ce8bd3d30ceb76853f5a1e64433d5d4107697693 100644
--- a/pkg/items/middleware/caching_middleware_test.go
+++ b/pkg/items/middleware/caching_middleware_test.go
@@ -11,6 +11,8 @@ import (
 	"git.perx.ru/perxis/perxis-go/pkg/errors"
 	"git.perx.ru/perxis/perxis-go/pkg/items"
 	itmsmocks "git.perx.ru/perxis/perxis-go/pkg/items/mocks"
+	"git.perx.ru/perxis/perxis-go/pkg/metrics"
+	"github.com/prometheus/client_golang/prometheus"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
 	"github.com/stretchr/testify/require"
@@ -32,12 +34,13 @@ func TestItemsCache(t *testing.T) {
 	errNotFound := errors.NotFound(errors.New("not found"))
 
 	ctx := context.Background()
+	cacheMetrics := metrics.NewCacheMetrics(prometheus.DefaultRegisterer)
 
 	t.Run("Get from cache", func(t *testing.T) {
 		itms := &itmsmocks.Items{}
 		env := &envmocks.Environments{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+		svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), cacheMetrics, env)(itms)
 
 		env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 		itms.On("Get", mock.Anything, spaceID, envID, colID, itemID).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StateDraft}, nil).Once()
@@ -61,7 +64,7 @@ func TestItemsCache(t *testing.T) {
 		itms := &itmsmocks.Items{}
 		env := &envmocks.Environments{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+		svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), cacheMetrics, env)(itms)
 
 		env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 		itms.On("Get", mock.Anything, spaceID, envAlias, colID, itemID).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StateDraft}, nil).Once()
@@ -85,7 +88,7 @@ func TestItemsCache(t *testing.T) {
 		itms := &itmsmocks.Items{}
 		env := &envmocks.Environments{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+		svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), cacheMetrics, env)(itms)
 
 		env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 		itms.On("GetPublished", mock.Anything, spaceID, envID, colID, itemID, mock.Anything).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StateDraft}, nil).Once()
@@ -109,7 +112,7 @@ func TestItemsCache(t *testing.T) {
 		itms := &itmsmocks.Items{}
 		env := &envmocks.Environments{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+		svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), cacheMetrics, env)(itms)
 
 		env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 		itms.On("GetPublished", mock.Anything, spaceID, envAlias, colID, itemID, mock.Anything).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StateDraft}, nil).Once()
@@ -138,7 +141,7 @@ func TestItemsCache(t *testing.T) {
 		itms := &itmsmocks.Items{}
 		env := &envmocks.Environments{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+		svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), cacheMetrics, env)(itms)
 
 		env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Twice()
 		itms.On("GetPublished", mock.Anything, spaceID, envAlias, colID, itemID, mock.Anything).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StateDraft}, nil).Once()
@@ -176,7 +179,7 @@ func TestItemsCache(t *testing.T) {
 			env := &envmocks.Environments{}
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), cacheMetrics, env)(itms)
 
 			itms.On("Get", mock.Anything, spaceID, envID, colID, itemID).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, Data: map[string]interface{}{"f1": "d1"}}, nil).Once()
 
@@ -208,7 +211,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), cacheMetrics, env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("Get", mock.Anything, spaceID, envID, colID, itemID).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StateDraft}, nil).Once()
@@ -241,7 +244,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), cacheMetrics, env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("Get", mock.Anything, spaceID, envID, colID, itemID).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StateDraft}, nil).Once()
@@ -273,7 +276,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), cacheMetrics, env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("Get", mock.Anything, spaceID, envID, colID, itemID).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StatePublished}, nil).Once()
@@ -313,7 +316,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), cacheMetrics, env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("Get", mock.Anything, spaceID, envID, colID, itemID).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StatePublished}, nil).Once()
@@ -346,7 +349,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), cacheMetrics, env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("Get", mock.Anything, spaceID, envID, colID, itemID).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StateDraft}, nil).Once()
@@ -379,7 +382,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), cacheMetrics, env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("Get", mock.Anything, spaceID, envID, colID, itemID).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, Data: map[string]interface{}{"f1": "d1"}}, nil).Once()
@@ -412,7 +415,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), cacheMetrics, env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("Get", mock.Anything, spaceID, envID, colID, itemID).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StatePublished}, nil).Once()
@@ -445,7 +448,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), cacheMetrics, env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("GetPublished", mock.Anything, spaceID, envID, colID, itemID, mock.Anything).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StatePublished, Data: map[string]interface{}{"f1": "d1"}}, nil).Once()
@@ -486,7 +489,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), cacheMetrics, env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("GetPublished", mock.Anything, spaceID, envID, colID, itemID, mock.Anything).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StateDraft}, nil).Once()
@@ -527,7 +530,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), cacheMetrics, env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("GetPublished", mock.Anything, spaceID, envID, colID, itemID, mock.Anything).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StatePublished}, nil).Once()
@@ -568,7 +571,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), cacheMetrics, env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("GetPublished", mock.Anything, spaceID, envID, colID, itemID, mock.Anything).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StatePublished}, nil).Once()
@@ -609,7 +612,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), cacheMetrics, env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
@@ -657,7 +660,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), cacheMetrics, env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("Get", mock.Anything, spaceID, envID, colID, itemID).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StateDraft}, nil).Once()