70 lines
3.6 KiB
Go
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)
|
|
}
|