From b0b4312d8399b3933af35b88bad301a89488f353 Mon Sep 17 00:00:00 2001 From: ensiouel <ensiouel@gmail.com> Date: Tue, 19 Dec 2023 16:09:29 +0300 Subject: [PATCH] =?UTF-8?q?feature:=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20argsToLabels=20=D0=B1=D1=8B=D0=BB=D0=B0=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D0=B0=20=D0=B2=20=D0=BF=D0=B0?= =?UTF-8?q?=D0=BA=D0=B5=D1=82=20metrics=20=D0=B8=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B8=D0=BC=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B2=20GetLabelsFromKV.=20=D0=A2=D0=B5=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D1=8C=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F=20=D0=B8?= =?UTF-8?q?=D0=B3=D0=BD=D0=BE=D1=80=D0=B8=D1=80=D1=83=D0=B5=D1=82=20=D0=B7?= =?UTF-8?q?=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B1=D0=B5=D0=B7?= =?UTF-8?q?=20=D0=BA=D0=BB=D1=8E=D1=87=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/cache/metrics_middleware.go | 24 ++----------------- pkg/metrics/utils.go | 21 ++++++++++++++++ .../utils_test.go} | 10 ++++---- 3 files changed, 28 insertions(+), 27 deletions(-) create mode 100644 pkg/metrics/utils.go rename pkg/{cache/metrics_middleware_test.go => metrics/utils_test.go} (81%) diff --git a/pkg/cache/metrics_middleware.go b/pkg/cache/metrics_middleware.go index 42d7f3d8..de60dde1 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 00000000..746eb002 --- /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 3d2abf73..bfc6f101 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)) }) } -- GitLab