Skip to content
Snippets Groups Projects
Commit 0eca5f27 authored by Alena Petraki's avatar Alena Petraki :nail_care_tone1:
Browse files

Доработка теста-примера

parent 9c2a11da
No related branches found
No related tags found
No related merge requests found
package metrics package metrics
import ( import (
"context" "fmt"
"io" "io"
"net"
"net/http" "net/http"
"testing" "testing"
...@@ -15,36 +16,33 @@ import ( ...@@ -15,36 +16,33 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
func serveMetrics(t *testing.T) *http.Server { func serveMetricsHTTP(t *testing.T) net.Listener {
mux := http.NewServeMux() mux := http.NewServeMux()
mux.Handle("/metrics", promhttp.Handler()) mux.Handle("/metrics", promhttp.Handler())
srv := &http.Server{Addr: "localhost:30301", Handler: mux} srv := &http.Server{Addr: "localhost:30341", Handler: mux}
go func() { _ = srv.ListenAndServe() }() listener, err := net.Listen("tcp", "localhost:0")
return srv require.NoError(t, err)
go func() { _ = srv.Serve(listener) }()
return listener
} }
func TestMetrics_Example(t *testing.T) { func TestMetrics_Example(t *testing.T) {
ctx := context.Background()
t.Run("Metrics do not allow dynamically assigned labels", func(t *testing.T) { t.Run("Metrics do not allow dynamically assigned labels", func(t *testing.T) {
m := prometheus.NewCounterVec(prometheus.CounterOpts{Name: "test_counter_" + id.GenerateNewID()}, nil) m := prometheus.NewCounterVec(prometheus.CounterOpts{Name: "test_counter_" + id.GenerateNewID()}, nil)
prometheus.MustRegister(m) prometheus.MustRegister(m)
assert.Panics(t, func() { assert.Panics(t, func() { m.With(prometheus.Labels{"a": "v_a1", "b": "v_b1"}).Inc() })
m.With(prometheus.Labels{"a": "v_a1", "b": "v_b1"}).Inc()
})
}) })
t.Run("Metrics allow dynamically assigned label values", func(t *testing.T) { t.Run("Metrics allow dynamically assigned label values", func(t *testing.T) {
srv := serveMetrics(t) l := serveMetricsHTTP(t)
defer func() { defer func() { _ = l.Close() }()
_ = srv.Shutdown(ctx)
}()
name := "test_counter_" + id.GenerateNewID() name := "test_counter_" + id.GenerateNewID()
m := prometheus.NewCounterVec(prometheus.CounterOpts{Name: name}, []string{"a", "b"}) m := prometheus.NewCounterVec(prometheus.CounterOpts{Name: name}, []string{"a", "b"})
prometheus.MustRegister(m) prometheus.MustRegister(m)
m.With(prometheus.Labels{"a": "v_a1", "b": "v_b1"}).Inc() 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) require.NoError(t, err)
defer resp.Body.Close() defer resp.Body.Close()
b, err := io.ReadAll(resp.Body) b, err := io.ReadAll(resp.Body)
...@@ -54,10 +52,8 @@ func TestMetrics_Example(t *testing.T) { ...@@ -54,10 +52,8 @@ func TestMetrics_Example(t *testing.T) {
}) })
t.Run("Metrics with constant label values", func(t *testing.T) { t.Run("Metrics with constant label values", func(t *testing.T) {
srv := serveMetrics(t) l := serveMetricsHTTP(t)
defer func() { defer func() { _ = l.Close() }()
_ = srv.Shutdown(ctx)
}()
name := "test_counter_" + id.GenerateNewID() name := "test_counter_" + id.GenerateNewID()
m := prometheus.NewCounterVec(prometheus.CounterOpts{ m := prometheus.NewCounterVec(prometheus.CounterOpts{
...@@ -70,7 +66,7 @@ func TestMetrics_Example(t *testing.T) { ...@@ -70,7 +66,7 @@ func TestMetrics_Example(t *testing.T) {
prometheus.MustRegister(m) prometheus.MustRegister(m)
m.With(prometheus.Labels{"a": "v_a1", "b": "v_b1"}).Inc() 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) require.NoError(t, err)
defer resp.Body.Close() defer resp.Body.Close()
b, err := io.ReadAll(resp.Body) b, err := io.ReadAll(resp.Body)
...@@ -79,17 +75,23 @@ func TestMetrics_Example(t *testing.T) { ...@@ -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") 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() name := "test_counter_" + id.GenerateNewID()
m1 := prometheus.NewCounterVec(prometheus.CounterOpts{Name: name, ConstLabels: prometheus.Labels{"const_1": "val_1"}}, []string{"a1", "b1"}) 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(m1)
registry.MustRegister(m2)
m1.With(prometheus.Labels{"a1": "v_a1", "b1": "v_b1"}).Inc() 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() 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() metricsFamily, err := registry.Gather()
require.NoError(t, err) require.NoError(t, err)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment