From 34858a1ba0284e1d60454939a19a7d4c4a17bdee Mon Sep 17 00:00:00 2001 From: yusing Date: Wed, 18 Dec 2024 00:54:04 +0800 Subject: [PATCH] fix prometheus metrics gone after route changes --- internal/docker/idlewatcher/waker.go | 3 +-- internal/metrics/metric.go | 16 ++++++++++++++++ internal/metrics/metrics.go | 8 ++++---- internal/route/http.go | 2 ++ internal/watcher/health/monitor/monitor.go | 3 +-- 5 files changed, 24 insertions(+), 8 deletions(-) diff --git a/internal/docker/idlewatcher/waker.go b/internal/docker/idlewatcher/waker.go index 93c5091e..0104d88e 100644 --- a/internal/docker/idlewatcher/waker.go +++ b/internal/docker/idlewatcher/waker.go @@ -4,7 +4,6 @@ import ( "sync/atomic" "time" - "github.com/prometheus/client_golang/prometheus" "github.com/yusing/go-proxy/internal/common" "github.com/yusing/go-proxy/internal/docker/idlewatcher/types" E "github.com/yusing/go-proxy/internal/error" @@ -86,7 +85,7 @@ func (w *Watcher) Start(routeSubTask *task.Task) E.Error { w.task.OnCancel("stop route and cleanup", func() { routeSubTask.Parent().Finish(w.task.FinishCause()) if w.metric != nil { - prometheus.Unregister(w.metric) + w.metric.Reset() } }) return nil diff --git a/internal/metrics/metric.go b/internal/metrics/metric.go index 5b5b295d..dc027597 100644 --- a/internal/metrics/metric.go +++ b/internal/metrics/metric.go @@ -56,6 +56,14 @@ func (c *Counter) With(l Labels) *Counter { return &Counter{mv: c.mv, collector: c.mv.With(l.toPromLabels())} } +func (c *Counter) Delete(l Labels) { + c.mv.Delete(l.toPromLabels()) +} + +func (c *Counter) Reset() { + c.mv.Reset() +} + func (g *Gauge) Collect(ch chan<- prometheus.Metric) { g.mv.Collect(ch) } @@ -71,3 +79,11 @@ func (g *Gauge) Set(v float64) { func (g *Gauge) With(l Labels) *Gauge { return &Gauge{mv: g.mv, collector: g.mv.With(l.toPromLabels())} } + +func (g *Gauge) Delete(l Labels) { + g.mv.Delete(l.toPromLabels()) +} + +func (g *Gauge) Reset() { + g.mv.Reset() +} diff --git a/internal/metrics/metrics.go b/internal/metrics/metrics.go index 12178ab6..4cabe2f7 100644 --- a/internal/metrics/metrics.go +++ b/internal/metrics/metrics.go @@ -43,10 +43,10 @@ func GetServiceMetrics() *ServiceMetrics { func (rm *RouteMetrics) UnregisterService(service string) { lbls := &HTTPRouteMetricLabels{Service: service} - prometheus.Unregister(rm.HTTP2xx3xx.With(lbls)) - prometheus.Unregister(rm.HTTP4xx.With(lbls)) - prometheus.Unregister(rm.HTTP5xx.With(lbls)) - prometheus.Unregister(rm.HTTPReqElapsed.With(lbls)) + rm.HTTP2xx3xx.Delete(lbls) + rm.HTTP4xx.Delete(lbls) + rm.HTTP5xx.Delete(lbls) + rm.HTTPReqElapsed.Delete(lbls) } func init() { diff --git a/internal/route/http.go b/internal/route/http.go index 4e32e423..13c8335d 100755 --- a/internal/route/http.go +++ b/internal/route/http.go @@ -86,6 +86,7 @@ func (r *HTTPRoute) Start(providerSubtask *task.Task) E.Error { wakerTask := providerSubtask.Parent().Subtask("waker for " + r.TargetName()) waker, err := idlewatcher.NewHTTPWaker(wakerTask, r.ReverseProxyEntry, r.rp) if err != nil { + r.task.Finish(err) return err } r.handler = waker @@ -118,6 +119,7 @@ func (r *HTTPRoute) Start(providerSubtask *task.Task) E.Error { patErrs.Add(mux.HandleFunc(p, r.rp.HandlerFunc)) } if err := patErrs.Error(); err != nil { + r.task.Finish(err) return err } r.handler = mux diff --git a/internal/watcher/health/monitor/monitor.go b/internal/watcher/health/monitor/monitor.go index b2d4d1fa..9f6ed154 100644 --- a/internal/watcher/health/monitor/monitor.go +++ b/internal/watcher/health/monitor/monitor.go @@ -7,7 +7,6 @@ import ( "strings" "time" - "github.com/prometheus/client_golang/prometheus" "github.com/yusing/go-proxy/internal/common" E "github.com/yusing/go-proxy/internal/error" "github.com/yusing/go-proxy/internal/logging" @@ -82,7 +81,7 @@ func (mon *monitor) Start(routeSubtask *task.Task) E.Error { } mon.task.Finish(nil) if mon.metric != nil { - prometheus.Unregister(mon.metric) + mon.metric.Reset() } }()