From 60742e1bd683a508b6e7cfdfb4d0a3fee7469ee7 Mon Sep 17 00:00:00 2001 From: Pedro Tanaka Date: Thu, 21 Apr 2022 11:43:33 +0200 Subject: [PATCH] Adding metric testing on relay Signed-off-by: Pedro Tanaka --- pkg/relay/relay_test.go | 91 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 90 insertions(+), 1 deletion(-) diff --git a/pkg/relay/relay_test.go b/pkg/relay/relay_test.go index 967b670..ea07d43 100644 --- a/pkg/relay/relay_test.go +++ b/pkg/relay/relay_test.go @@ -1,7 +1,10 @@ package relay import ( + "fmt" "github.com/go-kit/log" + "github.com/prometheus/client_golang/prometheus" + dto "github.com/prometheus/client_model/go" "github.com/prometheus/statsd_exporter/pkg/clock" "github.com/stvp/go-udp-testing" "testing" @@ -51,11 +54,97 @@ func TestRelay_RelayLine(t *testing.T) { udp.ShouldReceive(t, tt.args.expected, func() { for _, line := range tt.args.lines { r.RelayLine(line) - // Tick time forward to trigger a flush } + // Tick time forward to trigger a packet send. clock.ClockInstance.Instant = time.Unix(20000, 0) clock.ClockInstance.TickerCh <- time.Unix(20000, 0) }) + + metrics, err := prometheus.DefaultGatherer.Gather() + if err != nil { + t.Fatalf("Cannot gather from DefaultGatherer: %v", err) + } + + metricNames := map[string]float64{ + "statsd_exporter_relay_long_lines_total": 0, + } + for metricName, expectedValue := range metricNames { + firstMetric := getFloat64(metrics, metricName, prometheus.Labels{"target": "localhost:1160"}) + + if firstMetric == nil { + t.Fatalf("Could not find time series with first label set for metric: %s", metricName) + } + if *firstMetric != expectedValue { + t.Errorf("Expected metric %s to be %f, got %f", metricName, expectedValue, *firstMetric) + } + } }) } } + +// getFloat64 search for metric by name in array of MetricFamily and then search a value by labels. +// Method returns a value or nil if metric is not found. +func getFloat64(metrics []*dto.MetricFamily, name string, labels prometheus.Labels) *float64 { + var metricFamily *dto.MetricFamily + for _, m := range metrics { + if *m.Name == name { + metricFamily = m + break + } + } + if metricFamily == nil { + return nil + } + + var metric *dto.Metric + labelStr := fmt.Sprintf("%v", labels) + for _, m := range metricFamily.Metric { + l := labelPairsAsLabels(m.GetLabel()) + ls := fmt.Sprintf("%v", l) + if labelStr == ls { + metric = m + break + } + } + if metric == nil { + return nil + } + + var value float64 + if metric.Gauge != nil { + value = metric.Gauge.GetValue() + return &value + } + if metric.Counter != nil { + value = metric.Counter.GetValue() + return &value + } + if metric.Histogram != nil { + value = metric.Histogram.GetSampleSum() + return &value + } + if metric.Summary != nil { + value = metric.Summary.GetSampleSum() + return &value + } + if metric.Untyped != nil { + value = metric.Untyped.GetValue() + return &value + } + panic(fmt.Errorf("collected a non-gauge/counter/histogram/summary/untyped metric: %s", metric)) +} + +func labelPairsAsLabels(pairs []*dto.LabelPair) (labels prometheus.Labels) { + labels = prometheus.Labels{} + for _, pair := range pairs { + if pair.Name == nil { + continue + } + value := "" + if pair.Value != nil { + value = *pair.Value + } + labels[*pair.Name] = value + } + return +}