From c90e0db30d1a6916220d02a0c502126118f4e8db Mon Sep 17 00:00:00 2001 From: yusing Date: Tue, 4 Feb 2025 05:12:52 +0800 Subject: [PATCH] reverse proxy refactor and bug fixes - fix prometheus metrics for load balanced routes - route will now fail when health monitor fail to start --- internal/route/reverse_proxy.go | 35 ++++++++++++--------------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/internal/route/reverse_proxy.go b/internal/route/reverse_proxy.go index 493cc79..a0b02ee 100755 --- a/internal/route/reverse_proxy.go +++ b/internal/route/reverse_proxy.go @@ -3,7 +3,6 @@ package route import ( "net/http" - "github.com/rs/zerolog" "github.com/yusing/go-proxy/internal/api/v1/favicon" "github.com/yusing/go-proxy/internal/common" "github.com/yusing/go-proxy/internal/docker" @@ -30,13 +29,10 @@ type ( HealthMon health.HealthMonitor `json:"health,omitempty"` loadBalancer *loadbalancer.LoadBalancer - server loadbalancer.Server handler http.Handler rp *reverseproxy.ReverseProxy task *task.Task - - l zerolog.Logger } ) @@ -67,10 +63,6 @@ func NewReverseProxyRoute(base *Route) (*ReveseProxyRoute, E.Error) { r := &ReveseProxyRoute{ Route: base, rp: rp, - l: logging.With(). - Str("type", string(base.Scheme)). - Str("name", service). - Logger(), } return r, nil } @@ -125,7 +117,7 @@ func (r *ReveseProxyRoute) Start(parent task.Parent) E.Error { default: logging.Warn(). Str("route", r.TargetName()). - Msg("`path_patterns` is deprecated. Use `rules` instead.") + Msg("`path_patterns` for reverse proxy is deprecated. Use `rules` instead.") mux := gphttp.NewServeMux() patErrs := E.NewBuilder("invalid path pattern(s)") for _, p := range pathPatterns { @@ -145,10 +137,16 @@ func (r *ReveseProxyRoute) Start(parent task.Parent) E.Error { if r.HealthMon != nil { if err := r.HealthMon.Start(r.task); err != nil { - E.LogWarn("health monitor error", err, &r.l) + return err } } + if common.PrometheusEnabled { + metricsLogger := metricslogger.NewMetricsLogger(r.TargetName()) + r.handler = metricsLogger.GetHandler(r.handler) + r.task.OnCancel("reset_metrics", metricsLogger.ResetMetrics) + } + if r.UseLoadBalance() { r.addToLoadBalancer(parent) } else { @@ -158,12 +156,6 @@ func (r *ReveseProxyRoute) Start(parent task.Parent) E.Error { }) } - if common.PrometheusEnabled { - metricsLogger := metricslogger.NewMetricsLogger(r.TargetName()) - r.handler = metricsLogger.GetHandler(r.handler) - r.task.OnCancel("reset_metrics", metricsLogger.ResetMetrics) - } - r.task.OnCancel("reset_favicon", func() { favicon.PruneRouteIconCache(r) }) return nil } @@ -200,9 +192,7 @@ func (r *ReveseProxyRoute) addToLoadBalancer(parent task.Parent) { } } else { lb = loadbalancer.New(cfg) - if err := lb.Start(parent); err != nil { - panic(err) // should always return nil - } + _ = lb.Start(parent) // always return nil linked = &ReveseProxyRoute{ Route: &Route{ Alias: cfg.Link, @@ -215,9 +205,10 @@ func (r *ReveseProxyRoute) addToLoadBalancer(parent task.Parent) { routes.SetHTTPRoute(cfg.Link, linked) } r.loadBalancer = lb - r.server = loadbalance.NewServer(r.task.Name(), r.rp.TargetURL, r.LoadBalance.Weight, r.handler, r.HealthMon) - lb.AddServer(r.server) + + server := loadbalance.NewServer(r.task.Name(), r.rp.TargetURL, r.LoadBalance.Weight, r.handler, r.HealthMon) + lb.AddServer(server) r.task.OnCancel("lb_remove_server", func() { - lb.RemoveServer(r.server) + lb.RemoveServer(server) }) }