proxy-pool/internal/platform/metrics/provider_test.go
2026-08-02 13:55:23 +08:00

70 lines
3.6 KiB
Go

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)
}