From c01c1edb55d735ee1fc01030f444184d6012b734 Mon Sep 17 00:00:00 2001
From: "a.petraki" <a.petraki@perx.ru>
Date: Wed, 20 Dec 2023 14:01:05 +0300
Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?=
 =?UTF-8?q?=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=B4=D0=BB?=
 =?UTF-8?q?=D1=8F=20=D0=BC=D0=B5=D1=82=D1=80=D0=B8=D0=BA,=20=D0=BF=D0=BE?=
 =?UTF-8?q?=D0=BA=D0=B0=D0=B7=D1=8B=D0=B2=D0=B0=D1=8E=D1=89=D0=B8=D0=B5=20?=
 =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83=20=D1=81=20=D0=BB=D0=B5?=
 =?UTF-8?q?=D0=B9=D0=B1=D0=BB=D0=B0=D0=BC=D0=B8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pkg/metrics/metrics_test.go | 75 +++++++++++++++++++++++++++++++++++++
 1 file changed, 75 insertions(+)
 create mode 100644 pkg/metrics/metrics_test.go

diff --git a/pkg/metrics/metrics_test.go b/pkg/metrics/metrics_test.go
new file mode 100644
index 00000000..0e171735
--- /dev/null
+++ b/pkg/metrics/metrics_test.go
@@ -0,0 +1,75 @@
+package metrics
+
+import (
+	"context"
+	"io"
+	"net/http"
+	"testing"
+
+	"git.perx.ru/perxis/perxis-go/pkg/id"
+	"github.com/prometheus/client_golang/prometheus"
+	"github.com/prometheus/client_golang/prometheus/promhttp"
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+)
+
+func serveMetrics(t *testing.T) *http.Server {
+	mux := http.NewServeMux()
+	mux.Handle("/metrics", promhttp.Handler())
+	srv := &http.Server{Addr: "localhost:30301", Handler: mux}
+	go func() { srv.ListenAndServe() }()
+	return srv
+}
+
+func TestMetrics_Example(t *testing.T) {
+	ctx := context.Background()
+	t.Run("Metrics do not allow dynamically assigned labels", func(t *testing.T) {
+		m := prometheus.NewCounterVec(prometheus.CounterOpts{Name: "test_counter_" + id.GenerateNewID()}, nil)
+		prometheus.MustRegister(m)
+		assert.Panics(t, func() {
+			m.With(prometheus.Labels{"a": "v_a1", "b": "v_b1"}).Inc()
+		})
+	})
+
+	t.Run("Metrics allow dynamically assigned label values", func(t *testing.T) {
+		srv := serveMetrics(t)
+		defer srv.Shutdown(ctx)
+
+		name := "test_counter_" + id.GenerateNewID()
+		m := prometheus.NewCounterVec(prometheus.CounterOpts{Name: name}, []string{"a", "b"})
+		prometheus.MustRegister(m)
+		m.With(prometheus.Labels{"a": "v_a1", "b": "v_b1"}).Inc()
+
+		resp, err := http.Get("http://localhost:30301/metrics")
+		require.NoError(t, err)
+		defer resp.Body.Close()
+		b, err := io.ReadAll(resp.Body)
+		require.NoError(t, err)
+		// fmt.Println(string(b))
+		assert.Contains(t, string(b), name+"{a=\"v_a1\",b=\"v_b1\"} 1")
+	})
+
+	t.Run("Metrics with constant label values", func(t *testing.T) {
+		srv := serveMetrics(t)
+		defer srv.Shutdown(ctx)
+
+		name := "test_counter_" + id.GenerateNewID()
+		m := prometheus.NewCounterVec(prometheus.CounterOpts{
+			Namespace:   "test_namespace",
+			Subsystem:   "test_subsystem",
+			Name:        name,
+			Help:        "Test Help",
+			ConstLabels: prometheus.Labels{"const_1": "val_1"},
+		}, []string{"a", "b"})
+		prometheus.MustRegister(m)
+		m.With(prometheus.Labels{"a": "v_a1", "b": "v_b1"}).Inc()
+
+		resp, err := http.Get("http://localhost:30301/metrics")
+		require.NoError(t, err)
+		defer resp.Body.Close()
+		b, err := io.ReadAll(resp.Body)
+		require.NoError(t, err)
+		// fmt.Println(string(b))
+		assert.Contains(t, string(b), name+"{a=\"v_a1\",b=\"v_b1\",const_1=\"val_1\"} 1")
+	})
+}
-- 
GitLab