package metrics import ( "testing" "github.com/prometheus/client_golang/prometheus" controllerProvider "proxy-pool/internal/controller/provider" "proxy-pool/internal/domain/upstream" ) func TestProviderCollectorRecordsOnlyFixedResultClasses(t *testing.T) { registry := prometheus.NewRegistry() collector, err := NewProviderCollector(registry) if err != nil { t.Fatalf("NewProviderCollector() error = %v", err) } collector.ObserveProviderResult(controllerProvider.Result{Class: upstream.FetchValid, ValidCount: 5, NewCount: 2}) collector.ObserveProviderResult(controllerProvider.Result{Class: upstream.FetchDuplicateOnly, ValidCount: 3}) collector.ObserveProviderResult(controllerProvider.Result{Class: upstream.FetchEmpty}) collector.ObserveProviderResult(controllerProvider.Result{Class: upstream.FetchError}) collector.ObserveProviderResult(controllerProvider.Result{Class: "invalid", ValidCount: 9, NewCount: 9}) assertMetricValue(t, registry, "proxy_pool_controller_provider_fetch_results_total", map[string]string{"class": "valid"}, 1) assertMetricValue(t, registry, "proxy_pool_controller_provider_fetch_results_total", map[string]string{"class": "duplicate_only"}, 1) assertMetricValue(t, registry, "proxy_pool_controller_provider_fetch_results_total", map[string]string{"class": "empty"}, 1) assertMetricValue(t, registry, "proxy_pool_controller_provider_fetch_results_total", map[string]string{"class": "error"}, 1) assertMetricValue(t, registry, "proxy_pool_controller_provider_valid_candidates_total", nil, 8) assertMetricValue(t, registry, "proxy_pool_controller_provider_new_proxies_total", nil, 2) } func TestNewProviderCollectorReusesRegisteredCollectors(t *testing.T) { registry := prometheus.NewRegistry() first, err := NewProviderCollector(registry) if err != nil { t.Fatalf("first NewProviderCollector() error = %v", err) } second, err := NewProviderCollector(registry) if err != nil { t.Fatalf("second NewProviderCollector() error = %v", err) } first.ObserveProviderResult(controllerProvider.Result{Class: upstream.FetchValid, ValidCount: 1, NewCount: 1}) second.ObserveProviderResult(controllerProvider.Result{Class: upstream.FetchValid, ValidCount: 2, NewCount: 2}) assertMetricValue(t, registry, "proxy_pool_controller_provider_fetch_results_total", map[string]string{"class": "valid"}, 2) assertMetricValue(t, registry, "proxy_pool_controller_provider_valid_candidates_total", nil, 3) assertMetricValue(t, registry, "proxy_pool_controller_provider_new_proxies_total", nil, 3) } func TestProviderCollectorObservesSharedStatsRecorder(t *testing.T) { registry := prometheus.NewRegistry() collector, err := NewProviderCollector(registry) if err != nil { t.Fatalf("NewProviderCollector() error = %v", err) } recorder, err := controllerProvider.NewStatsRecorder(1) if err != nil { t.Fatalf("NewStatsRecorder() error = %v", err) } recorder.AddResultObserver(collector) recorder.Record(controllerProvider.Result{UpstreamID: "provider-a", Class: upstream.FetchValid, ValidCount: 2, NewCount: 1}) // The bounded Admin-status map has no room for provider-b, but metrics must // retain the process-wide fetch observation. recorder.Record(controllerProvider.Result{UpstreamID: "provider-b", Class: upstream.FetchEmpty}) assertMetricValue(t, registry, "proxy_pool_controller_provider_fetch_results_total", map[string]string{"class": "valid"}, 1) assertMetricValue(t, registry, "proxy_pool_controller_provider_fetch_results_total", map[string]string{"class": "empty"}, 1) assertMetricValue(t, registry, "proxy_pool_controller_provider_valid_candidates_total", nil, 2) assertMetricValue(t, registry, "proxy_pool_controller_provider_new_proxies_total", nil, 1) }