// Package metrics предоставляет Prometheus-метрики DNS Autoresolver. package metrics import ( "net/http" "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/collectors" "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promhttp" ) // Metrics агрегирует Prometheus-метрики приложения на собственном реестре. type Metrics struct { Registry *prometheus.Registry ChecksTotal *prometheus.CounterVec CheckDuration prometheus.Histogram DriftDomains prometheus.Gauge NotificationsTotal *prometheus.CounterVec } // New создаёт реестр метрик, регистрирует стандартные Go/Process-коллекторы // и все метрики приложения. func New() *Metrics { reg := prometheus.NewRegistry() reg.MustRegister( collectors.NewGoCollector(), collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}), ) f := promauto.With(reg) return &Metrics{ Registry: reg, ChecksTotal: f.NewCounterVec(prometheus.CounterOpts{ Name: "dns_ar_checks_total", Help: "Общее количество выполненных проверок доменов по статусу.", }, []string{"status"}), CheckDuration: f.NewHistogram(prometheus.HistogramOpts{ Name: "dns_ar_check_duration_seconds", Help: "Длительность выполнения проверки домена в секундах.", }), DriftDomains: f.NewGauge(prometheus.GaugeOpts{ Name: "dns_ar_drift_domains", Help: "Текущее количество доменов в состоянии drift.", }), NotificationsTotal: f.NewCounterVec(prometheus.CounterOpts{ Name: "dns_ar_notifications_total", Help: "Общее количество отправленных уведомлений по каналу и статусу.", }, []string{"channel", "status"}), } } // Handler возвращает HTTP-обработчик для отдачи метрик реестра. func (m *Metrics) Handler() http.Handler { return promhttp.HandlerFor(m.Registry, promhttp.HandlerOpts{}) } // ObserveCheck фиксирует результат проверки: статус и длительность. func (m *Metrics) ObserveCheck(status string, dur time.Duration) { m.ChecksTotal.WithLabelValues(status).Inc() m.CheckDuration.Observe(dur.Seconds()) } // SetDrift устанавливает текущее количество доменов в состоянии drift. func (m *Metrics) SetDrift(n int) { m.DriftDomains.Set(float64(n)) } // IncNotification фиксирует отправку уведомления по каналу и статусу. func (m *Metrics) IncNotification(channel, status string) { m.NotificationsTotal.WithLabelValues(channel, status).Inc() }