refactor and properly set idlewaker error in JSON output

This commit is contained in:
yusing 2025-02-11 10:14:32 +08:00
parent 2a54aed135
commit b1f72620dc
3 changed files with 20 additions and 12 deletions

View file

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

View file

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

View file

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