diff --git a/internal/docker/idlewatcher/waker.go b/internal/docker/idlewatcher/waker.go index c4ff23c..fefbc6b 100644 --- a/internal/docker/idlewatcher/waker.go +++ b/internal/docker/idlewatcher/waker.go @@ -22,12 +22,12 @@ type ( waker struct { _ U.NoCopy - rp *reverseproxy.ReverseProxy - stream net.Stream - hc health.HealthChecker - metric *metrics.Gauge - - ready atomic.Bool + rp *reverseproxy.ReverseProxy + stream net.Stream + hc health.HealthChecker + metric *metrics.Gauge + lastErr error + ready atomic.Bool } ) @@ -54,7 +54,7 @@ func newWaker(parent task.Parent, route route.Route, rp *reverseproxy.ReversePro switch { case route.IsAgent(): - waker.hc = monitor.NewAgentRouteMonitor(route.Agent(), hcCfg, monitor.AgentTargetFromURL(route.TargetURL())) + waker.hc = monitor.NewAgentProxiedMonitor(route.Agent(), hcCfg, monitor.AgentTargetFromURL(route.TargetURL())) case rp != nil: waker.hc = monitor.NewHTTPHealthChecker(route.TargetURL(), hcCfg) case stream != nil: @@ -145,12 +145,15 @@ func (w *Watcher) getStatusUpdateReady() health.Status { result, err := w.hc.CheckHealth() switch { case err != nil: + w.lastErr = err w.ready.Store(false) return health.StatusError case result.Healthy: + w.lastErr = nil w.ready.Store(true) return health.StatusHealthy default: + w.lastErr = nil return health.StatusStarting } } @@ -161,10 +164,15 @@ func (w *Watcher) MarshalJSON() ([]byte, error) { if w.hc.URL().Port() != "0" { url = w.hc.URL() } + var detail string + if w.lastErr != nil { + detail = w.lastErr.Error() + } return (&monitor.JSONRepresentation{ Name: w.Name(), Status: w.Status(), Config: w.hc.Config(), URL: url, + Detail: detail, }).MarshalJSON() } diff --git a/internal/route/reverse_proxy.go b/internal/route/reverse_proxy.go index 5e31db0..acff99c 100755 --- a/internal/route/reverse_proxy.go +++ b/internal/route/reverse_proxy.go @@ -207,7 +207,7 @@ func (r *ReveseProxyRoute) newHealthMonitor() interface { } { if a := r.Agent(); a != nil { target := monitor.AgentTargetFromURL(r.ProxyURL) - return monitor.NewAgentRouteMonitor(a, r.HealthCheck, target) + return monitor.NewAgentProxiedMonitor(a, r.HealthCheck, target) } return monitor.NewHTTPHealthMonitor(r.ProxyURL, r.HealthCheck) } diff --git a/internal/watcher/health/monitor/agent_route.go b/internal/watcher/health/monitor/agent_proxied.go similarity index 83% rename from internal/watcher/health/monitor/agent_route.go rename to internal/watcher/health/monitor/agent_proxied.go index 4137c3c..82ca0aa 100644 --- a/internal/watcher/health/monitor/agent_route.go +++ b/internal/watcher/health/monitor/agent_proxied.go @@ -12,7 +12,7 @@ import ( ) type ( - AgentRouteMonior struct { + AgentProxiedMonitor struct { agent *agentPkg.AgentConfig endpointURL string *monitor @@ -48,8 +48,8 @@ func (target *AgentCheckHealthTarget) displayURL() *types.URL { }) } -func NewAgentRouteMonitor(agent *agentPkg.AgentConfig, config *health.HealthCheckConfig, target *AgentCheckHealthTarget) *AgentRouteMonior { - mon := &AgentRouteMonior{ +func NewAgentProxiedMonitor(agent *agentPkg.AgentConfig, config *health.HealthCheckConfig, target *AgentCheckHealthTarget) *AgentProxiedMonitor { + mon := &AgentProxiedMonitor{ agent: agent, endpointURL: agentPkg.EndpointHealth + "?" + target.buildQuery(), } @@ -57,7 +57,7 @@ func NewAgentRouteMonitor(agent *agentPkg.AgentConfig, config *health.HealthChec return mon } -func (mon *AgentRouteMonior) CheckHealth() (result *health.HealthCheckResult, err error) { +func (mon *AgentProxiedMonitor) CheckHealth() (result *health.HealthCheckResult, err error) { result = new(health.HealthCheckResult) ctx, cancel := mon.ContextWithTimeout("timeout querying agent") defer cancel()