80 lines
2.7 KiB
Go
80 lines
2.7 KiB
Go
package metrics
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
dto "github.com/prometheus/client_model/go"
|
|
|
|
healthDomain "proxy-pool/internal/domain/health"
|
|
)
|
|
|
|
func TestCheckerCollectorRecordsOnlyFixedDimensions(t *testing.T) {
|
|
registry := prometheus.NewRegistry()
|
|
collector, err := NewCheckerCollector(registry)
|
|
if err != nil {
|
|
t.Fatalf("NewCheckerCollector() = %v", err)
|
|
}
|
|
collector.ObserveTaskDispatch(healthDomain.LevelBasic, 2)
|
|
collector.ObserveTaskDispatch(healthDomain.LevelTarget, 1)
|
|
collector.ObserveTaskDispatch("invalid", 99)
|
|
collector.ObserveObservation(healthDomain.LevelBasic, healthDomain.ObservationMetricAccepted)
|
|
collector.ObserveObservation(healthDomain.LevelTarget, healthDomain.ObservationMetricRejected)
|
|
collector.ObserveObservation("invalid", healthDomain.ObservationMetricAccepted)
|
|
|
|
assertMetricValue(t, registry, "proxy_pool_checker_tasks_dispatched_total", map[string]string{"level": "BASIC"}, 2)
|
|
assertMetricValue(t, registry, "proxy_pool_checker_tasks_dispatched_total", map[string]string{"level": "TARGET"}, 1)
|
|
assertMetricValue(t, registry, "proxy_pool_checker_observations_total", map[string]string{
|
|
"level": "BASIC", "result": "accepted",
|
|
}, 1)
|
|
assertMetricValue(t, registry, "proxy_pool_checker_observations_total", map[string]string{
|
|
"level": "TARGET", "result": "rejected",
|
|
}, 1)
|
|
}
|
|
|
|
func TestNewCheckerCollectorReusesRegisteredCollectors(t *testing.T) {
|
|
registry := prometheus.NewRegistry()
|
|
first, err := NewCheckerCollector(registry)
|
|
if err != nil {
|
|
t.Fatalf("first NewCheckerCollector() = %v", err)
|
|
}
|
|
second, err := NewCheckerCollector(registry)
|
|
if err != nil {
|
|
t.Fatalf("second NewCheckerCollector() = %v", err)
|
|
}
|
|
first.ObserveTaskDispatch(healthDomain.LevelEgress, 1)
|
|
second.ObserveTaskDispatch(healthDomain.LevelEgress, 1)
|
|
assertMetricValue(t, registry, "proxy_pool_checker_tasks_dispatched_total", map[string]string{"level": "EGRESS"}, 2)
|
|
}
|
|
|
|
func assertMetricValue(t *testing.T, registry *prometheus.Registry, name string, labels map[string]string, want float64) {
|
|
t.Helper()
|
|
metrics, err := registry.Gather()
|
|
if err != nil {
|
|
t.Fatalf("Gather() = %v", err)
|
|
}
|
|
for _, family := range metrics {
|
|
if family.GetName() != name {
|
|
continue
|
|
}
|
|
for _, metric := range family.GetMetric() {
|
|
if metricLabelsMatch(metric.GetLabel(), labels) && metric.GetCounter().GetValue() == want {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
t.Fatalf("metric %s labels=%v value=%v was not found", name, labels, want)
|
|
}
|
|
|
|
func metricLabelsMatch(labels []*dto.LabelPair, want map[string]string) bool {
|
|
if len(labels) != len(want) {
|
|
return false
|
|
}
|
|
for _, label := range labels {
|
|
if want[label.GetName()] != label.GetValue() {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|