104 lines
3.1 KiB
Go
104 lines
3.1 KiB
Go
package metrics
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
"testing"
|
|
|
|
"github.com/containous/traefik/types"
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
dto "github.com/prometheus/client_model/go"
|
|
)
|
|
|
|
func TestPrometheus(t *testing.T) {
|
|
prometheusRegistry := RegisterPrometheus(&types.Prometheus{})
|
|
|
|
if !prometheusRegistry.IsEnabled() {
|
|
t.Errorf("PrometheusRegistry should return true for IsEnabled()")
|
|
}
|
|
prometheusRegistry.ReqsCounter().With("service", "test", "code", strconv.Itoa(http.StatusOK), "method", http.MethodGet).Add(1)
|
|
prometheusRegistry.ReqsCounter().With("service", "test", "code", strconv.Itoa(http.StatusOK), "method", http.MethodGet).Add(1)
|
|
prometheusRegistry.ReqDurationHistogram().With("service", "test", "code", strconv.Itoa(http.StatusOK)).Observe(10000)
|
|
prometheusRegistry.ReqDurationHistogram().With("service", "test", "code", strconv.Itoa(http.StatusOK)).Observe(10000)
|
|
prometheusRegistry.RetriesCounter().With("service", "test").Add(1)
|
|
|
|
metricsFamilies, err := prometheus.DefaultGatherer.Gather()
|
|
if err != nil {
|
|
t.Fatalf("could not gather metrics families: %s", err)
|
|
}
|
|
|
|
tests := []struct {
|
|
name string
|
|
labels map[string]string
|
|
assert func(*dto.MetricFamily)
|
|
}{
|
|
{
|
|
name: reqsTotalName,
|
|
labels: map[string]string{
|
|
"code": "200",
|
|
"method": http.MethodGet,
|
|
"service": "test",
|
|
},
|
|
assert: func(family *dto.MetricFamily) {
|
|
cv := family.Metric[0].Counter.GetValue()
|
|
expectedCv := float64(2)
|
|
if cv != expectedCv {
|
|
t.Errorf("gathered metrics do not contain correct value for total requests, got %f expected %f", cv, expectedCv)
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: reqDurationName,
|
|
labels: map[string]string{
|
|
"service": "test",
|
|
"code": "200",
|
|
},
|
|
assert: func(family *dto.MetricFamily) {
|
|
sc := family.Metric[0].Histogram.GetSampleCount()
|
|
expectedSc := uint64(2)
|
|
if sc != expectedSc {
|
|
t.Errorf("gathered metrics do not contain correct sample count for request duration, got %d expected %d", sc, expectedSc)
|
|
}
|
|
},
|
|
},
|
|
{
|
|
name: retriesTotalName,
|
|
labels: map[string]string{
|
|
"service": "test",
|
|
},
|
|
assert: func(family *dto.MetricFamily) {
|
|
cv := family.Metric[0].Counter.GetValue()
|
|
expectedCv := float64(1)
|
|
if cv != expectedCv {
|
|
t.Errorf("gathered metrics do not contain correct value for total retries, got %f expected %f", cv, expectedCv)
|
|
}
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
family := findMetricFamily(test.name, metricsFamilies)
|
|
if family == nil {
|
|
t.Errorf("gathered metrics do not contain %q", test.name)
|
|
continue
|
|
}
|
|
for _, label := range family.Metric[0].Label {
|
|
val, ok := test.labels[*label.Name]
|
|
if !ok {
|
|
t.Errorf("%q metric contains unexpected label %q", test.name, *label.Name)
|
|
} else if val != *label.Value {
|
|
t.Errorf("label %q in metric %q has wrong value %q, expected %q", *label.Name, test.name, *label.Value, val)
|
|
}
|
|
}
|
|
test.assert(family)
|
|
}
|
|
}
|
|
|
|
func findMetricFamily(name string, families []*dto.MetricFamily) *dto.MetricFamily {
|
|
for _, family := range families {
|
|
if family.GetName() == name {
|
|
return family
|
|
}
|
|
}
|
|
return nil
|
|
}
|