diff --git a/pkg/metrics/metrics_test.go b/pkg/metrics/metrics_test.go new file mode 100644 index 0000000000000000000000000000000000000000..0e1717353a84cc0ce58e2b38961c578eb307be75 --- /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") + }) +}