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 }