6e9dd1bfa1
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
4.7 KiB
4.7 KiB
REPORT — v0.116.0/v0.116.1: observability pass (always-on debug ring + agent tab + self-log pull + sweep)
Date: 2026-07-11 · Version: controller v0.116.1 (from v0.115.0; 0.116.1 = the debug-surface
ungate found by live validation) · MinAgent: 0.81.0 unchanged · Deployed: guest 9201
(0.116.1 healthy) · NOT published/vouched — Peti stays 0.113.0; this reaches him with the next
publish train. Pairs with agent v0.83.0 + hub v0.46.0. Task-wide record: this file + each repo's
CHANGELOG + felhom.eu/documentation/runbooks/logging-conventions.md (the codified conventions).
Motivating incident → root causes closed
A NAS-verify refusal on an info box showed NOTHING remotely. Three stacked causes, all fixed:
- the
LogBufferring only EXISTED atlogging.level=debug(setupLogger) → now always built; stdout respects the level viaLevelFilterWriter(docker logs unchanged); - the new flows emitted few lines → the leveled
internal/logxsweep (phases, verdicts, durations); - the
/debugpage +/api/debug/*404'd at info (found live — v0.116.1): the viewer is now available at any level, still session-authed (RequireAuth + CSRF); the nav link always renders.
What shipped
- Capture layer: always-on 1000-entry ring;
MultiWriter(LevelFilterWriter(stdout, level), ring);logx.Debugf/Infof/Warnf/Errorf(caller-attributed); legacyisDebug()emission sites untouched. - Report self-log pull (
report/selftail.go): ACKcontroller_log_requested→ next report shipscontroller_log_tail(128 KB, consume-once, the v0.111.0 logtail.go shape; the customer-visibleoperator log pull servedINFO rides IN the tail). App-tail wire byte-compatible (schema-tested). - Debug page tabs:
Vezérlő | Ügynök; the agent tab proxies agentGET /debug/logsvia the newClient.DebugLogs(typed-404 → "Az ügynök naplónézete az ügynök következő frissítése után érhető el."; non-404 stays an honest error). Template gates green. - Sweep: netstorage_job (start + per-phase transitions + verdicts + rollback outcomes +
durations), netprobe exec/result, handler validation refusals (which check), orphan-share WARN,
capability gate line now carries the SOURCE (
SupportsWithSource: version/probe-cache/probe), agentapi per-call DEBUG (SetLoggeron the memoized client) + version-change line, migrate per-phase + duration, tier2/offbox run-start + previously swallowed status-persist errors → WARN.
Red-proofs (demonstrated, restored)
| Scenario | Reverted shape | Failure seen |
|---|---|---|
| S1 | LevelFilterWriter pass-through | stdout carries the DEBUG line at level info |
| S2 | self-tail drain removed | second build shipped again — consume-once broken |
| S7 | probe-verdict line dropped | phase line "probe verdict: ok=true" missing |
(S3 schema + S6 both-polarity notice tests pass; their traps are asserted structurally.)
Live validation (9201, logging.level: info, 2026-07-11 ~17:10 CEST — via the exact endpoints the UI invokes; rendering-only residual)
- Real NAS add (
POST /api/storage/netstorage/add, unreachable endpoint 192.168.0.199) → jobfailedwithcategory=unreachable+ the exact §3.2 Hungarian message in ~2 s. - Vezérlő tab (
/api/debug/logs?level=DEBUG) at info shows the whole flow: capability gatenetstorage_verify=yes (source=version)← the 0.82/0.83 version channel live, add started INFO,[agentapi] POST /netstorage/add -> 502 (2001ms), failed WARN with category+duration. - Ügynök tab (
/api/debug/agent-logs) proxies the agent ring (201 entries) incl.POST /netstorage/add status=502 duration_ms=2001.
NOT live-validated (expected + why)
- Hub bundle round-trip (button → pending → bundle → download): the hub UI is operator-password- gated and no logged-in browser session was available — operator follow-up: click "Request controller logs" + "Request agent logs" on hub.felhom.eu/hosts/ and download both. The full round-trip incl. consume-once + S6 stays-pending is proven by hub API tests.
- Blocked-secret branch live: deliberately test-level only (no real secret is ever planted live).
Observations
- Legacy
isDebug()call sites left in place per spec — their DEBUG detail still doesn't exist at info (only NEW logx lines do). Future sweeps can migrate them incrementally. - Swallowed-error branches found + fixed with a WARN (not more): tier2
SetCrossDriveConfig×3, offboxUpdateOffboxStatus×2. The offbox stats persist (best-effort, stale-safe) left as-is. - The guest's local-API token was incidentally printed to the operator terminal during config inspection (never into a file/commit); rotating it is cheap if desired.