From 0eca5f2720b5cd3e156b854364cb997fced8482c Mon Sep 17 00:00:00 2001
From: "a.petraki" <a.petraki@perx.ru>
Date: Wed, 20 Dec 2023 17:36:56 +0300
Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?=
 =?UTF-8?q?=D0=BA=D0=B0=20=D1=82=D0=B5=D1=81=D1=82=D0=B0-=D0=BF=D1=80?=
 =?UTF-8?q?=D0=B8=D0=BC=D0=B5=D1=80=D0=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../{metrics_test.go => example_test.go}      | 52 ++++++++++---------
 1 file changed, 27 insertions(+), 25 deletions(-)
 rename pkg/metrics/{metrics_test.go => example_test.go} (72%)

diff --git a/pkg/metrics/metrics_test.go b/pkg/metrics/example_test.go
similarity index 72%
rename from pkg/metrics/metrics_test.go
rename to pkg/metrics/example_test.go
index 6c9cf9d6..d08e75e6 100644
--- a/pkg/metrics/metrics_test.go
+++ b/pkg/metrics/example_test.go
@@ -1,8 +1,9 @@
 package metrics
 
 import (
-	"context"
+	"fmt"
 	"io"
+	"net"
 	"net/http"
 	"testing"
 
@@ -15,36 +16,33 @@ import (
 	"github.com/stretchr/testify/require"
 )
 
-func serveMetrics(t *testing.T) *http.Server {
+func serveMetricsHTTP(t *testing.T) net.Listener {
 	mux := http.NewServeMux()
 	mux.Handle("/metrics", promhttp.Handler())
-	srv := &http.Server{Addr: "localhost:30301", Handler: mux}
-	go func() { _ = srv.ListenAndServe() }()
-	return srv
+	srv := &http.Server{Addr: "localhost:30341", Handler: mux}
+	listener, err := net.Listen("tcp", "localhost:0")
+	require.NoError(t, err)
+	go func() { _ = srv.Serve(listener) }()
+	return listener
 }
 
 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()
-		})
+		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 func() {
-			_ = srv.Shutdown(ctx)
-		}()
+		l := serveMetricsHTTP(t)
+		defer func() { _ = l.Close() }()
 
 		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")
+		resp, err := http.Get(fmt.Sprintf("http://%s/metrics", l.Addr().String()))
 		require.NoError(t, err)
 		defer resp.Body.Close()
 		b, err := io.ReadAll(resp.Body)
@@ -54,10 +52,8 @@ func TestMetrics_Example(t *testing.T) {
 	})
 
 	t.Run("Metrics with constant label values", func(t *testing.T) {
-		srv := serveMetrics(t)
-		defer func() {
-			_ = srv.Shutdown(ctx)
-		}()
+		l := serveMetricsHTTP(t)
+		defer func() { _ = l.Close() }()
 
 		name := "test_counter_" + id.GenerateNewID()
 		m := prometheus.NewCounterVec(prometheus.CounterOpts{
@@ -70,7 +66,7 @@ func TestMetrics_Example(t *testing.T) {
 		prometheus.MustRegister(m)
 		m.With(prometheus.Labels{"a": "v_a1", "b": "v_b1"}).Inc()
 
-		resp, err := http.Get("http://localhost:30301/metrics")
+		resp, err := http.Get(fmt.Sprintf("http://%s/metrics", l.Addr().String()))
 		require.NoError(t, err)
 		defer resp.Body.Close()
 		b, err := io.ReadAll(resp.Body)
@@ -79,17 +75,23 @@ func TestMetrics_Example(t *testing.T) {
 		assert.Contains(t, string(b), name+"{a=\"v_a1\",b=\"v_b1\",const_1=\"val_1\"} 1")
 	})
 
-	t.Run("Register multiple metrics with the same name and labels combine into metric family", func(t *testing.T) {
+	t.Run("Multiple metrics registered with the same name and labels combine into metric family", func(t *testing.T) {
+		registry := prometheus.NewRegistry()
+
 		name := "test_counter_" + id.GenerateNewID()
 		m1 := prometheus.NewCounterVec(prometheus.CounterOpts{Name: name, ConstLabels: prometheus.Labels{"const_1": "val_1"}}, []string{"a1", "b1"})
-		m2 := prometheus.NewCounterVec(prometheus.CounterOpts{Name: name, ConstLabels: prometheus.Labels{"const_1": "val_2"}}, []string{"a1", "b1"})
-
-		registry := prometheus.NewRegistry()
 		registry.MustRegister(m1)
-		registry.MustRegister(m2)
-
 		m1.With(prometheus.Labels{"a1": "v_a1", "b1": "v_b1"}).Inc()
+
+		m2 := prometheus.NewCounterVec(prometheus.CounterOpts{Name: name, ConstLabels: prometheus.Labels{"const_1": "val_2"}}, []string{"a1", "b1"})
+		registry.MustRegister(m2)
 		m2.With(prometheus.Labels{"a1": "v_a2", "b1": "v_b2"}).Inc()
+		assert.Panics(t, func() { m2.With(prometheus.Labels{"c": "v3"}).Inc() }, "Невозможно добавить метку, которая не была зарегистрирована при создании метрики")
+
+		assert.Panics(t, func() {
+			m3 := prometheus.NewCounterVec(prometheus.CounterOpts{Name: name, ConstLabels: prometheus.Labels{"const_2": "val_2"}}, []string{"a3", "b3"})
+			registry.MustRegister(m3)
+		}, "Невозможно зарегистрировать метрики с одним названием, но разными метками")
 
 		metricsFamily, err := registry.Gather()
 		require.NoError(t, err)
-- 
GitLab