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