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