Monitoring¶
etcfuse-meta exposes Prometheus metrics when started with --metrics-addr
(e.g. --metrics-addr=:9090); unset, the endpoint doesn't exist. The C
daemon (etcfuse) has no metrics of its own — everything observable is on
the Go side, since that's where etcd, the block device and fencing all live.
The same address also serves /healthz and /readyz for orchestrators:
/healthz answers 200 for as long as the process runs, /readyz answers 503
with a reason while the daemon cannot serve I/O — still starting, membership
lease not live, or self-fenced. Probe readiness to decide where to send work,
liveness to decide whether to restart; a fenced node is unready but perfectly
healthy, and restarting it fixes nothing. See
Observability.
Prometheus¶
Point Prometheus at every node's metrics port:
scrape_configs:
- job_name: etcfs
static_configs:
- targets:
- node1:9090
- node2:9090
- node3:9090
deploy/prometheus/etcfs-alerts.yml — the alert rules, load as a
rule_files entry:
rule_files:
- etcfs-alerts.yml
| Alert | Fires when | Severity |
|---|---|---|
EtcFSScrubAnomalies |
A non-routine scrub finding (not orphan/dead, which auto-remediate) in the last 5m |
critical |
EtcFSNodeFenced |
A node's fencing generation stepped in the last 10m | warning |
EtcFSFenceFailed |
A fence attempt could not be confirmed, leaving the target in limbo | critical |
EtcFSArenaUtilizationHigh |
A node's arena utilization stayed above 90% for 10m | warning |
EtcFSScrubStalled |
No completed scrub pass in over 5m | warning |
EtcFSScrubStalled exists because the anomaly counters can't show a stalled
scrubber on their own — they just stop rising, which looks identical to a
healthy filesystem with nothing wrong.
Grafana¶
Import deploy/grafana/etcfs-dashboard.json (Dashboards → Import → Upload
JSON) against a Prometheus data source scraping the job above. Panels:
- FUSE ops/s, error rate and p99 latency, all by operation
- etcd transaction round-trip latency (p50/p99) and txns/s by outcome
- Block I/O throughput
- Arena utilization and arenas owned, per node
- Membership count
- Scrub anomalies by type, time since last scrub pass
- Fencing generation, nodes fenced by outcome
Quick local check¶
docker run -d --name etcfs-prometheus -p 9091:9090 \
-v "$(pwd)/deploy/prometheus/etcfs-alerts.yml:/etc/prometheus/etcfs-alerts.yml" \
prom/prometheus
docker run -d --name etcfs-grafana -p 3000:3000 grafana/grafana
Then add a scrape_configs entry pointing at your nodes' --metrics-addr
ports and reload Prometheus, and import the dashboard JSON into Grafana at
localhost:3000 (default login admin/admin).