Landing blocker for #61 and #63: the deployment checkout is 12 commits behind and `merge --ff-only` refuses while tracked paths are dirty. Discard is not available here (workspace policy: no `checkout`/`stash` on shared state), so the dirt is committed. - `agent/APPEND_SYSTEM.md`: the point-of-use / one-work-log / PR-link doctrine, already byte-identical to `origin/main` (`cmp` against the trunk blob: no difference). No new prose — the commit exists so the trunk merge can proceed. - `agent/config.yml` and `agent/managed-skills/**`: the machine-live tier the heartbeat owns (AGENTS.md § Live-sync tiers). `ALLOW_SECRETS=1` was used, deliberately and after auditing the staged diff by hand: the only credential-shaped strings in it are two copies of `AKIA0000000000000EXAMPLE` — the inert all-zero AWS example id — and they appear inside the two skill pages that teach that exact placeholder shape. This checkout is still running the pre-#61 hook; the merged gate (value-scoped placeholder filter, `71601f7`) exempts this value, so the refusal dies with this landing. No `--no-verify` was used: the gate ran and its verdict is recorded here. Refs #61
4.8 KiB
name, description
| name | description |
|---|---|
| observability-stack-live-census | Census the Dankclaw observability stack (Prometheus/Grafana/Loki/Alloy/Alertmanager/signal-relay) live and audit per-endpoint alert coverage; reconcile against the owner page and rule-file comments, which go stale. |
Observability stack — live census + alert-coverage audit
Use when asked "status of the observability stack" on Dankclaw, or before claiming a service is/isn't monitored. Everything runs rootless on Dankclaw: ssh dankclaw bash -s <<'EOF' … EOF. Verify live; the owner page (serverAppConfigs-docs/Infrastructure/Observability.md) and shared/prometheus/rules/llm-fleet.yml comments go stale.
Loopback ports (do NOT probe the wrong one)
- Prometheus
127.0.0.1:9090· Alertmanager127.0.0.1:9093· Loki127.0.0.1:3100· Alloy127.0.0.1:12345· signal-relay192.168.0.143:18093 - Grafana host port is
127.0.0.1:3002(→ container :3000). Host:3000is arootlessportfor some other rootless container and answers 200-on-/but 404-on-/api/health. Probing :3000 and seeing 404 is a false alarm — always use 3002 for Grafana.GF_SERVER_ROOT_URL=https://grafana.franksdank.cloud.
Units + containers
for u in prometheus grafana loki alloy alertmanager node-exporter blackbox signal-relay; do systemctl --user is-active $u.service; systemctl --user is-enabled $u.service; done
- Quadlet units report
generated(healthy), notenabled; signal-relay is a real host unit (enabled). blackbox=not-found/inactive → the known gap (no blackbox exporter).podman psforUp N days (healthy).
Prometheus — targets / rules / alerts
- Targets:
GET :9090/api/v1/targets→.data.activeTargets[] | .health, .labels.job, .lastError. Expect ~8 up / 4 down. The 4 downs are structural, not outages:comfyui+ twoservices(HTML content-type, no real /metrics) andgitea(404, metrics disabled). Root remedy = deploy a blackbox exporter (not yet present). - Rules:
GET :9090/api/v1/rules→ count.data.groups[].rules. Thellm-fleetgroup is 4 alert + 2 recording (6 total). AGENTS.md saying "5 alert + 1 recording" is wrong — trust the rule file. - Firing:
GET :9090/api/v1/alerts; Alertmanager:GET :9093/api/v2/alertsand/api/v2/silences.
Alert-coverage per runtime — the sharp step (catches real blind spots)
The llm-fleet perf alerts (LlmRequestsQueueing/LlmPrefixCacheCollapse/LlmSpecDecodeOff) key on the llamacpp:* family. Which endpoints actually emit it:
GET :9090/api/v1/query?query=count by (job)({__name__=~"llamacpp:.+"})
GET :9090/api/v1/query?query=up{job=~"frank-.*"}
GET :9090/api/v1/query?query=count by (__name__)({job="frank-archon"}) # what archon really exports
Ground truth (2026-10-20):
- frank-zealot (llama.cpp) →
llamacpp:*(17 series) → perf alerts cover it. - frank-dragoon (halogen) → still emits
llamacpp:*(10 series; halogen re-uses the names) → perf alerts cover it. - frank-archon (radiance) → exports the
vllm:*family (vllm:num_requests_waiting,vllm:gpu_prefix_cache_hit_rate,vllm:num_preemptions_total,vllm:time_to_first_token_seconds_bucket= a real latency histogram), notllamacpp:*→ NO perf alert fires on archon; onlyLlmEndpointDown(up{job=~"frank-.*"}) catches it. Up/down yes, perf/queueing/prefix/p95 = collected but unalerted. - The rule-file header comment claims "frank-archon LEFT the scrape set 2026-10-05, FreeToken exports no /metrics" — stale/false: archon (radiance) is
upand exportsvllm:*.LlmEndpointDown's description repeats the same stale claim. Never assert coverage from a comment; query the families.
Log pipeline emptiness test
Loki is "configured, healthy, empty": GET :3100/loki/api/v1/labels → {"status":"success"} with no data array = 0 label names = 0 streams. Confirm: find /opt/loki/data -name '*.tsm' -o -name 'chunks-*' | wc -l → 0 chunks (≈8 WAL/bookkeeping files only). Alloy ships 0 lines (journal counter 0, both file globs refused per the page — a config bug, not capacity). No Loki datasource in Grafana. Report the log half as non-functional, not merely "healthy."
Reporting posture
- Metrics half works (up/down for all 3 endpoints + node-exporter + self-scrape); log half dead-on-arrival; blackbox + archon-perf-alerts + Loki-datasource + Alertmanager-vhost are the open gaps.
- Grafana provisioning is file-based — check
podman exec grafana ls /etc/grafana/provisioning/{datasources,dashboards}(expectprometheus.yml,llm-fleet.json) rather than fighting the API for creds. - Alertmanager has no persistence: a reboot re-stamps
startsAton long-firing alerts. - Flag stale facts (AGENTS.md rule split, archon-rejoin comments) but let the user decide whether to fix docs.