| package metrics2 |
| |
| import ( |
| "strconv" |
| "testing" |
| |
| "github.com/prometheus/client_golang/prometheus" |
| "github.com/stretchr/testify/require" |
| metrics_util "go.skia.org/infra/go/metrics2/testutils" |
| "go.skia.org/infra/go/testutils/unittest" |
| ) |
| |
| func TestClean(t *testing.T) { |
| unittest.SmallTest(t) |
| require.Equal(t, "a_b_c", clean("a.b-c")) |
| } |
| |
| // getPromClient creates a fresh Prometheus Registry and |
| // a fresh Prometheus Client. This wipes out all previous metrics. |
| func getPromClient() *promClient { |
| prometheus.DefaultRegisterer = prometheus.NewRegistry() |
| return NewPromClient() |
| } |
| |
| func TestInt64(t *testing.T) { |
| unittest.SmallTest(t) |
| c := getPromClient() |
| check := func(m Int64Metric, metric string, tags map[string]string, expect float64) { |
| actual, err := strconv.ParseFloat(metrics_util.GetRecordedMetric(t, metric, tags), 64) |
| require.NoError(t, err) |
| require.Equal(t, expect, actual) |
| require.Equal(t, float64(m.Get()), expect) |
| } |
| labels := map[string]string{"some_key": "some-value"} |
| g := c.GetInt64Metric("a.b", labels) |
| require.NotNil(t, g) |
| require.NotNil(t, c.int64GaugeVecs["a_b [some_key]"]) |
| require.NotNil(t, c.int64Gauges["a_b-some_key-some-value"]) |
| require.Nil(t, c.int64GaugeVecs["a.b"]) |
| check(g, "a_b", labels, 0) |
| |
| g.Update(3) |
| check(g, "a_b", labels, 3) |
| |
| labels2 := map[string]string{"some_key": "some-new-value"} |
| g2 := c.GetInt64Metric("a.b", labels2) |
| require.NotNil(t, g2) |
| g2.Update(4) |
| |
| check(g, "a_b", labels, 3) |
| check(g2, "a_b", labels2, 4) |
| |
| g2 = c.GetInt64Metric("a.b", labels2) |
| check(g2, "a_b", labels2, 4) |
| |
| // Metric with two tags. |
| labels = map[string]string{"b": "1", "a": "2"} |
| g = c.GetInt64Metric("metric_name", labels) |
| require.NotNil(t, g) |
| require.NotNil(t, c.int64GaugeVecs["metric_name [a b]"]) |
| require.NotNil(t, c.int64Gauges["metric_name-a-2-b-1"]) |
| check(g, "metric_name", labels, 0) |
| |
| // Test delete. |
| require.NoError(t, g.Delete()) |
| require.Equal(t, `Could not find anything for metric_name{a="2",b="1"}`, metrics_util.GetRecordedMetric(t, "metric_name", labels)) |
| } |
| |
| func TestFloat64(t *testing.T) { |
| unittest.SmallTest(t) |
| c := getPromClient() |
| check := func(m Float64Metric, metric string, tags map[string]string, expect float64) { |
| actual, err := strconv.ParseFloat(metrics_util.GetRecordedMetric(t, metric, tags), 64) |
| require.NoError(t, err) |
| require.Equal(t, expect, actual) |
| require.Equal(t, m.Get(), expect) |
| } |
| labels := map[string]string{"some_key": "some-value"} |
| g := c.GetFloat64Metric("a.c", labels) |
| require.NotNil(t, g) |
| require.NotNil(t, c.float64GaugeVecs["a_c [some_key]"]) |
| require.NotNil(t, c.float64Gauges["a_c-some_key-some-value"]) |
| require.Nil(t, c.float64GaugeVecs["a.c"]) |
| check(g, "a_c", labels, 0.0) |
| |
| g.Update(3) |
| check(g, "a_c", labels, 3.0) |
| |
| labels2 := map[string]string{"some_key": "some-new-value"} |
| g2 := c.GetFloat64Metric("a.c", labels2) |
| require.NotNil(t, g2) |
| g2.Update(4) |
| |
| check(g, "a_c", labels, 3.0) |
| check(g2, "a_c", labels2, 4.0) |
| |
| g2 = c.GetFloat64Metric("a.c", labels2) |
| check(g2, "a_c", labels2, 4.0) |
| |
| // Metric with two tags. |
| labels = map[string]string{"a": "2", "b": "1"} |
| g = c.GetFloat64Metric("float_metric_name", labels) |
| require.NotNil(t, g) |
| require.NotNil(t, c.float64GaugeVecs["float_metric_name [a b]"]) |
| require.NotNil(t, c.float64Gauges["float_metric_name-a-2-b-1"]) |
| check(g, "float_metric_name", labels, 0.0) |
| |
| // Test delete. |
| require.NoError(t, g.Delete()) |
| require.Equal(t, `Could not find anything for float_metric_name{a="2",b="1"}`, metrics_util.GetRecordedMetric(t, "float_metric_name", labels)) |
| } |
| |
| func TestCounter(t *testing.T) { |
| unittest.SmallTest(t) |
| c := getPromClient() |
| check := func(m Counter, metric string, tags map[string]string, expect float64) { |
| actual, err := strconv.ParseFloat(metrics_util.GetRecordedMetric(t, metric, tags), 64) |
| require.NoError(t, err) |
| require.Equal(t, expect, actual) |
| require.Equal(t, float64(m.Get()), expect) |
| } |
| labels := map[string]string{"some_key": "some-value"} |
| g := c.GetCounter("c", labels) |
| require.NotNil(t, g) |
| |
| g.Inc(3) |
| g = c.GetCounter("c", labels) |
| check(g, "c", labels, 3) |
| require.Equal(t, int64(3), g.Get()) |
| |
| g.Dec(2) |
| check(g, "c", labels, 1) |
| require.Equal(t, int64(1), g.Get()) |
| |
| g.Reset() |
| check(g, "c", labels, 0) |
| require.Equal(t, int64(0), g.Get()) |
| |
| // Test delete. |
| require.NoError(t, g.Delete()) |
| require.Equal(t, `Could not find anything for c{some_key="some-value"}`, metrics_util.GetRecordedMetric(t, "c", labels)) |
| } |
| |
| func TestPanicOn(t *testing.T) { |
| unittest.SmallTest(t) |
| /* |
| We need a sklog stand-in that just panics on Fatal*. |
| |
| defer func() { |
| if r := recover(); r != nil { |
| fmt.Println("Recovered in f", r) |
| } |
| }() |
| p := newPromClient() |
| _ = p.GetInt64Metric("a.b", map[string]string{"some_key": "some-value"}) |
| _ = p.GetInt64Metric("a.b", map[string]string{"some_key": "some-new-value", "wrong_number_of_keys": "2"}) |
| require.Fail(t, "Should have panic'd by now.") |
| */ |
| } |