package app import ( "strings" "time" ) func buildTransportHealthResponse(it TransportClient, now time.Time) TransportClientHealthResponse { health := it.Health if strings.TrimSpace(health.LastCheck) == "" { if strings.TrimSpace(it.UpdatedAt) != "" { health.LastCheck = it.UpdatedAt } else { health.LastCheck = now.Format(time.RFC3339) } } if strings.TrimSpace(health.LastError) == "" { health.LastError = strings.TrimSpace(it.Runtime.LastError.Message) } rt := transportRuntimeSnapshot(it, now) code := "" if it.Status == TransportClientDegraded || strings.TrimSpace(health.LastError) != "" { code = "TRANSPORT_CLIENT_DEGRADED" } return TransportClientHealthResponse{ OK: true, Message: "ok", Code: code, ClientID: it.ID, Kind: it.Kind, Status: it.Status, Latency: health.LatencyMS, LastErr: health.LastError, Health: health, Runtime: rt, } } func buildTransportMetricsResponse(it TransportClient, now time.Time) TransportClientMetricsResponse { rt := transportRuntimeSnapshot(it, now) return TransportClientMetricsResponse{ OK: true, Message: "ok", ClientID: it.ID, Kind: it.Kind, Status: it.Status, Metrics: rt.Metrics, Runtime: rt, } } func applyTransportHealthProbeSnapshot(it TransportClient, backendID string, probe transportBackendHealthResult, now time.Time) TransportClient { snapshot := it ts := now.Format(time.RFC3339) if strings.TrimSpace(backendID) != "" { snapshot.Runtime.Backend = backendID } snapshot.Health.LastCheck = ts if probe.LatencyMS > 0 { snapshot.Health.LatencyMS = probe.LatencyMS } if probe.Status != "" { snapshot.Status = normalizeTransportStatus(probe.Status) } if probe.OK { if snapshot.Status != TransportClientDegraded { snapshot.Health.LastError = "" } snapshot.Runtime.LastError = TransportClientError{} } else { msg := strings.TrimSpace(probe.Message) if msg == "" { msg = "transport health probe failed" } snapshot.Health.LastError = msg snapshot.Runtime.LastError = TransportClientError{ Code: strings.TrimSpace(probe.Code), Message: msg, Retryable: probe.Retryable, At: ts, } } snapshot.Runtime = transportRuntimeSnapshot(snapshot, now) return snapshot }