diff --git a/pkg/cache/metrics_middleware.go b/pkg/cache/metrics_middleware.go
index 42d7f3d8d37356b784d93f175c2bbc00f9b65b13..de60dde1c0fa9200f0a7f29829505bb1b7831c33 100644
--- a/pkg/cache/metrics_middleware.go
+++ b/pkg/cache/metrics_middleware.go
@@ -1,11 +1,10 @@
 package cache
 
 import (
+	"git.perx.ru/perxis/perxis-go/pkg/metrics"
 	"github.com/prometheus/client_golang/prometheus"
 )
 
-const badKey = "BADKEY"
-
 type metricsMiddleware struct {
 	cache            Cache
 	hitsTotal        prometheus.Counter
@@ -44,7 +43,7 @@ func MetricsMiddleware(cache Cache, subsystem string, labels ...string) Cache {
 			Help:      "Количество инвалидаций кэша.",
 		}),
 	}
-	prometheus.WrapRegistererWith(argsToLabels(labels), prometheus.DefaultRegisterer).MustRegister(
+	prometheus.WrapRegistererWith(metrics.GetLabelsFromKV(labels), prometheus.DefaultRegisterer).MustRegister(
 		middleware.hitsTotal,
 		middleware.missesTotal,
 		middleware.invalidatesTotal,
@@ -70,22 +69,3 @@ func (c *metricsMiddleware) Remove(key any) error {
 	c.invalidatesTotal.Inc()
 	return c.cache.Remove(key)
 }
-
-// argsToLabels преобразует массив строк args в метки типа prometheus.Labels.
-//
-// Функция ожидает, что каждое значение будет следовать за соответствующим ключом в массиве args,
-// и возвращает метки, соответствующие парам ключ-значение.
-func argsToLabels(args []string) prometheus.Labels {
-	labels := make(prometheus.Labels, len(args)/2)
-	for len(args) > 0 {
-		// если в массиве args остался только один элемент, он будет рассмотрен как значение с недопустимым ключом.
-		if len(args) == 1 {
-			labels[badKey] = args[0]
-			break
-		}
-
-		labels[args[0]] = args[1]
-		args = args[2:]
-	}
-	return labels
-}
diff --git a/pkg/metrics/utils.go b/pkg/metrics/utils.go
new file mode 100644
index 0000000000000000000000000000000000000000..746eb002f10e5ca2d8c26e87f728f8f15925a34e
--- /dev/null
+++ b/pkg/metrics/utils.go
@@ -0,0 +1,21 @@
+package metrics
+
+import "github.com/prometheus/client_golang/prometheus"
+
+// GetLabelsFromKV преобразует массив строк args в метки типа prometheus.Labels.
+//
+// Функция ожидает, что каждое значение будет следовать за соответствующим ключом в массиве args,
+// и возвращает метки, соответствующие парам ключ-значение.
+func GetLabelsFromKV(args []string) prometheus.Labels {
+	labels := make(prometheus.Labels, len(args)/2)
+	for len(args) > 0 {
+		// если в массиве args остался только один элемент, он будет проигнорирован
+		if len(args) == 1 {
+			break
+		}
+
+		labels[args[0]] = args[1]
+		args = args[2:]
+	}
+	return labels
+}
diff --git a/pkg/cache/metrics_middleware_test.go b/pkg/metrics/utils_test.go
similarity index 81%
rename from pkg/cache/metrics_middleware_test.go
rename to pkg/metrics/utils_test.go
index 3d2abf739477c04a4c0a80149748324ea73e713d..bfc6f101d83425a00fff6b395e0350dcaaae28c2 100644
--- a/pkg/cache/metrics_middleware_test.go
+++ b/pkg/metrics/utils_test.go
@@ -1,4 +1,4 @@
-package cache
+package metrics
 
 import (
 	"reflect"
@@ -8,7 +8,7 @@ import (
 	"github.com/stretchr/testify/require"
 )
 
-func TestMetricsMiddleware_argsToLabels(t *testing.T) {
+func TestArgsToLabels(t *testing.T) {
 	testcases := []struct {
 		name  string
 		input []string
@@ -37,18 +37,18 @@ func TestMetricsMiddleware_argsToLabels(t *testing.T) {
 		{
 			name:  "bad key",
 			input: []string{"value"},
-			want:  prometheus.Labels{badKey: "value"},
+			want:  prometheus.Labels{},
 		},
 		{
 			name:  "multi bad key",
 			input: []string{"key", "value", "value1"},
-			want:  prometheus.Labels{"key": "value", badKey: "value1"},
+			want:  prometheus.Labels{"key": "value"},
 		},
 	}
 
 	for _, tc := range testcases {
 		t.Run(tc.name, func(t *testing.T) {
-			got := argsToLabels(tc.input)
+			got := GetLabelsFromKV(tc.input)
 			require.True(t, reflect.DeepEqual(tc.want, got))
 		})
 	}