blob: 94f47c6504715233bebf22242d649f4f14c30fc0 [file] [log] [blame]
package metrics
import (
"fmt"
"math"
"sync"
"testing"
"github.com/prometheus/client_golang/prometheus"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.skia.org/infra/go/metrics2"
)
func newClient() metrics2.Client {
// This wipes out all previous metrics.
prometheus.DefaultRegisterer = prometheus.NewRegistry()
return metrics2.GetDefaultClient()
}
func TestHandler_NewHandler_AppendTags(t *testing.T) {
tag1 := map[string]string{
"some-key1": "some-value1",
}
tag2 := map[string]string{
"some-key2": "some-value2",
}
all := map[string]string{
"some-key1": "some-value1",
"some-key2": "some-value2",
}
c := newClient()
h1 := NewMetricsHandler(tag1, c)
h2 := h1.WithTags(tag2)
require.EqualValues(t, tag1, h1.tags)
require.EqualValues(t, all, h2.(*metricsHandler).tags)
}
func TestHandler_WithSameCounter_ReturnSameCounter(t *testing.T) {
const cn = "some_counter"
h := NewMetricsHandler(map[string]string{}, newClient())
require.Equal(t, h.Counter(cn), h.Counter(cn))
require.NotEqual(t, h.Counter("other"), h.Counter(cn))
}
func TestHandler_WithSameGauge_ReturnSameGauge(t *testing.T) {
const gn = "some_gauge"
h := NewMetricsHandler(map[string]string{}, newClient())
require.Equal(t, h.Gauge(gn), h.Gauge(gn))
require.NotEqual(t, h.Gauge("other"), h.Gauge(gn))
}
func TestHandler_OnSameTimer_ReturnSameTimer(t *testing.T) {
const tn = "some_timer"
h := NewMetricsHandler(map[string]string{}, newClient())
require.Equal(t, h.Timer(tn), h.Timer(tn))
require.NotEqual(t, h.Timer("other"), h.Timer(tn))
}
func TestHandler_WithCounter_RecordMetric(t *testing.T) {
const cn = "some_counter"
h := NewMetricsHandler(map[string]string{}, newClient())
h.Counter(cn).Inc(1)
require.EqualValues(t, 1, h.Counter(cn).(metrics2.Counter).Get())
require.NotEqualValues(t, 1, h.Counter("other").(metrics2.Counter).Get())
}
func TestHandler_WithGauge_RecordMetric(t *testing.T) {
const gn = "some_gauge"
h := NewMetricsHandler(map[string]string{}, newClient())
h.Gauge(gn).Update(2.2)
require.InDelta(t, 2.2, h.Gauge(gn).(metrics2.Float64Metric).Get(), 1e-9)
require.Greater(t, math.Abs(2.2-h.Gauge("other").(metrics2.Float64Metric).Get()), 1e-9)
}
func TestHanlder_RecordMetrics_InParallel(t *testing.T) {
var wg sync.WaitGroup
const count = 500
// Spawn many goroutines for 4 different transactions
wg.Add(count * 4)
h := NewMetricsHandler(map[string]string{}, newClient())
// Read & Updates the metrics forward and backward.
for i := 0; i < count; i++ {
counter_forward := fmt.Sprintf("counter_%d", i)
counter_backward := fmt.Sprintf("counter_%d", count-i-1)
gauge_forward := fmt.Sprintf("gauge_%d", i)
gauge_backward := fmt.Sprintf("gauge_%d", count-i-1)
go func() {
h.Counter(counter_forward).Inc(1)
wg.Done()
}()
go func() {
h.Counter(counter_backward).Inc(1)
wg.Done()
}()
go func() {
h.Gauge(gauge_forward).Update(2.0)
wg.Done()
}()
go func() {
h.Gauge(gauge_backward).Update(2.0)
wg.Done()
}()
}
wg.Wait()
for i := 0; i < count; i++ {
counter := fmt.Sprintf("counter_%d", i)
gauge := fmt.Sprintf("gauge_%d", i)
// Each counter gets increased twice.
assert.EqualValues(t, 2, h.Counter(counter).(metrics2.Counter).Get(), "counter %d", i)
assert.InDelta(t, 2.0, h.Gauge(gauge).(metrics2.Float64Metric).Get(), 1e-9, "gauge %d", i)
}
}