Skip to content

Infrastructure & Host Metrics Monitoring

Skill metadata

Name infrastructure-host-monitoring · Level mid · Tags monitoring node-exporter cadvisor infrastructure prometheus sre

"Fleet-wide infrastructure telemetry: node_exporter and cAdvisor collection with PromQL alert rules for CPU saturation, memory pressure, I/O wait, and disk-fill prediction using predict_linear. Use when standing up monitoring or dashboards across a fleet of nodes, authoring or tuning infrastructure alert rules, or arranging to be paged before a filesystem fills rather than after it is already full."

Source: skills/sre-slo-sla-observability/infrastructure-host-monitoring/SKILL.md

When to Use This Skill

Triggers — load this skill when:

  • Node, VM, or bare-metal telemetry and alert rules need to be established
  • You need proven PromQL for saturation, disk-fill, and I/O alerts
  • A node is degraded and dashboards must show why

Route elsewhere when:

  • Live hands-on-host diagnosis -> linux-sysadmin-troubleshooting
  • Application-level SLOs -> sli-slo-error-budget-design
  • Tracing and log pipelines -> prometheus-grafana-otel-tracing

1. Node Exporter & cAdvisor Essential PromQL Alerts

groups:
  - name: host_infrastructure_alerts
    rules:
      - alert: HostHighCpuSaturation
        expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: "Host CPU saturation > 85% on {{ $labels.instance }}"

      - alert: HostDiskFillingFast
        expr: (node_filesystem_avail_bytes * 100) / node_filesystem_size_bytes < 15 and predict_linear(node_filesystem_avail_bytes[1h], 8 * 3600) < 0
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "Host disk space on {{ $labels.instance }} will fill within 8 hours"

      - alert: ContainerMemoryThrottling
        expr: rate(container_cpu_cfs_throttled_periods_total[5m]) / rate(container_cpu_cfs_periods_total[5m]) > 0.25
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Container {{ $labels.container }} is experiencing > 25% CPU throttling"

2. Best Practices & Anti-Patterns

  • Do: Use linear prediction (predict_linear(...)) to detect disk fill trends hours before an actual out-of-disk incident occurs.
  • Don't: Never set static threshold alerts without an evaluation duration window (for: 5m) to avoid flapping false alarms during transient spikes.

3. Exporter Deployment & I/O Wait Alerts

# node_exporter as a DaemonSet: host namespaces are required for real host metrics
args:
  - --path.rootfs=/host/root
  - --path.procfs=/host/proc
  - --path.sysfs=/host/sys
  - --collector.systemd
  - --no-collector.wifi
hostNetwork: true
hostPID: true

Run node_exporter on every node (DaemonSet or system package) and cAdvisor/kubelet for container metrics. They answer different questions: node_exporter shows the host is saturated; cAdvisor shows which container caused it.

- alert: NodeHighIOWait
  expr: avg by (instance) (rate(node_cpu_seconds_total{mode="iowait"}[5m])) > 0.20
  for: 15m
  labels: { severity: warning }
  annotations:
    summary: "{{ $labels.instance }} spends >20% of CPU time in iowait"
    description: "Storage is the bottleneck, not CPU. Check device await via node_disk_io_time_weighted_seconds_total."

- alert: NodeDiskWillFillIn4Hours
  expr: predict_linear(node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"}[6h], 4*3600) < 0
        and node_filesystem_avail_bytes / node_filesystem_size_bytes < 0.30
  for: 30m
  labels: { severity: critical }

Alert on trajectory (predict_linear), not on a static 80% threshold: a disk at a steady 85% needs no page, and one at 40% falling fast needs one now. Every rule carries a for: duration — without it, a single scrape blip pages a human.