feat(server): slog request log + log dropped Lidarr ping errors
Two debuggability gaps surfaced by the /api/admin route shadowing investigation: 1. handleTestLidarrConnection swallowed client.Ping's error — only the bucket code (lidarr_unreachable) reached the response, the underlying *net.DNSError / *net.OpError / TLS error never reached the logs. Operators couldn't tell a typo'd hostname from a wrong port from a refused TLS handshake. Now logged at Warn (expected-when-misconfigured) with the base_url for diagnostic context. The api_key is never logged. 2. The chi router had no access-log middleware — every 4xx/5xx was silent, making it impossible to tell whether a request even reached the server. chi's middleware.Logger writes to the standard log package not slog, so a small slog wrapper handles it instead. /healthz is skipped (the compose healthcheck hits it every 5s; would be ~17k log lines/day of noise). Severity is keyed off response status: 5xx -> Error, 4xx -> Warn, else Info — so 4xx/5xx surface even when the operator's logger level is set above Info. Tests cover both the severity routing and the /healthz skip. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -147,6 +147,14 @@ func (h *handlers) handleTestLidarrConnection(w http.ResponseWriter, r *http.Req
|
||||
result, err := client.Ping(r.Context())
|
||||
if err != nil {
|
||||
errCode := lidarrErrCode(err)
|
||||
// Warn (not Error): a failed connection test is expected when the
|
||||
// admin is configuring the integration and may have a typo'd URL
|
||||
// or wrong key. Without this log line the underlying *net.DNSError
|
||||
// / *net.OpError / TLS error is invisible to operators — they only
|
||||
// see the bucket code in the UI. base_url is safe to log; api_key
|
||||
// must NEVER be logged.
|
||||
h.logger.Warn("admin: test lidarr ping failed",
|
||||
"err", err, "base_url", baseURL, "code", errCode)
|
||||
writeJSON(w, http.StatusOK, map[string]any{"ok": false, "error": errCode})
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user