fix prometheus metrics gone after route changes

This commit is contained in:
yusing 2024-12-18 00:54:04 +08:00
parent 4ae3d5344c
commit 34858a1ba0
5 changed files with 24 additions and 8 deletions

View file

@ -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

View file

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

View file

@ -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() {

View file

@ -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

View file

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