Host WAN visibility gap: node-exporter's network metrics are container-netns only #176
Labels
No labels
audit-work
bug
docs
general-admin
major-upgrade
needs-vps-sync
new-service
on-hold
outside-work
post-podman
renovate
upstream
vps
No milestone
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
mysticalsoap/docker#176
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Hit while diagnosing aqomui#118 (tunnel UDP loss windows): node-exporter runs on a bridge network, so
node_network_*only covers its own container eth0/lo — enp5s0 and tunnel interfaces were never collected, and no dashboard can answer 'was the uplink saturated at time X'. cadvisor covers per-container NICs (that's how gluetun egress history was recovered), but direct host egress (Jellyfin streams, host tunnels) is invisible; the Traefik access log was the only witness for public-service egress.Fix candidates: run node-exporter with
network_mode: host(the usual deployment for it — also fixes any other netns-scoped collectors like sockstat attribution), or a second minimal exporter on host network for network counters only. While at it, consider a persistent WAN-health probe that deliberately bypasses any host VPN (ICMP/UDP loss+latency to a fixed target from the physical interface) — every tunnel-loss investigation so far has had zero baseline for 'was the raw uplink healthy at that moment'.🤖 Generated with Claude Code
Value, what others do, plan
Value. Continuous host NIC counters for enp5s0 and any tunnel interface, with history.
What others do. node_exporter's README gives
network_mode: host+pid: host+/:/host:ro,rslaveas the container deployment, with "deploying in containers requires extra care in order to avoid monitoring the container itself". kube-prometheus's DaemonSet ishostNetwork: true,hostPID: true, listener bound to loopback behind a proxy, and--collector.netdev.device-exclude=^(veth.*|[a-f0-9]{15})$plus the same regex for netclass. The prometheus.io guide runs the binary on the host. Host netns is the standard; the bridge placement here is the deviation.Plan.
network_mode: host; drop theinternalnetwork attachment (compose rejects both).--web.listen-address=172.19.1.1:9100, the monitoring_internal gateway: reachable from Prometheus, no new 0.0.0.0 listener, nothing on the LAN side.172.19.1.1:9100. The dashboard selects instance through a$nodevariable from node_uname_info, so the rename is absorbed; no alert rule references the instance.--collector.netdev.device-exclude=^(veth.*|br-.*|docker0)$and the same fornetclass.ignored-devices. ~150 veth and bridge interfaces today, each a full series set; cadvisor already covers per-container NICs.Verify.
node_network_receive_bytes_total{device="enp5s0"}exists (andtun_aqomuiwhile connected);node_sockstat_TCP_inusematchesss -son the host;ss -tlnshows 9100 only on 172.19.1.1.Not in this change. The WAN health probe that bypasses the host VPN. blackbox-exporter exists but sits on bridges and is captured by aqomui's /1 routes, so it needs its own aqomui bypass entry first. Separate issue once this lands.