Files
felhom-controller/REPORT.md
T

70 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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:
1. the `LogBuffer` ring only EXISTED at `logging.level=debug` (setupLogger) → now always built;
stdout respects the level via `LevelFilterWriter` (docker logs unchanged);
2. the new flows emitted few lines → the leveled `internal/logx` sweep (phases, verdicts, durations);
3. **the `/debug` page + `/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); legacy `isDebug()` emission sites untouched.
- **Report self-log pull** (`report/selftail.go`): ACK `controller_log_requested` → next report ships
`controller_log_tail` (128 KB, consume-once, the v0.111.0 logtail.go shape; the customer-visible
`operator log pull served` INFO rides IN the tail). App-tail wire byte-compatible (schema-tested).
- **Debug page tabs**: `Vezérlő | Ügynök`; the agent tab proxies agent `GET /debug/logs` via the new
`Client.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 (`SetLogger` on 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) → job
`failed` with `category=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 gate
`netstorage_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/<demo host> 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,
offbox `UpdateOffboxStatus` ×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.