{ pkgs, lib }: let inherit (import ./helpers.nix { inherit pkgs lib; }) T mkRow mkStat mkGauge mkTs mkDashboard ; in mkDashboard { name = "host.json"; title = "Host"; uid = "host"; panels = [ (mkRow "Overview") (mkGauge { title = "CPU"; expr = ''100 * (1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])))''; }) (mkGauge { title = "Memory used"; expr = "100 * (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)"; }) (mkStat { title = "Load (1m)"; unit = "short"; decimals = 2; expr = "node_load1"; }) (mkStat { title = "Load (5m)"; unit = "short"; decimals = 2; expr = "node_load5"; }) (mkStat { title = "Uptime"; unit = "dtdurations"; decimals = 0; expr = "node_time_seconds - node_boot_time_seconds"; }) (mkRow "CPU") (mkTs { title = "CPU usage (%)"; unit = "percent"; targets = [ (T ''avg(rate(node_cpu_seconds_total{mode="user"}[5m])) * 100'' "user") (T ''avg(rate(node_cpu_seconds_total{mode="system"}[5m])) * 100'' "system") (T ''avg(rate(node_cpu_seconds_total{mode="iowait"}[5m])) * 100'' "iowait") (T ''avg(rate(node_cpu_seconds_total{mode="steal"}[5m])) * 100'' "steal") (T ''avg(rate(node_cpu_seconds_total{mode="softirq"}[5m])) * 100'' "softirq") ]; }) (mkTs { title = "Per-core usage (%)"; unit = "percent"; targets = [ (T ''(1 - rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100'' "cpu{{cpu}}") ]; }) (mkTs { title = "CPU temperatures"; unit = "celsius"; targets = [ (T "node_hwmon_temp_celsius" "{{chip}} {{sensor}}") ]; }) (mkTs { title = "Load average"; targets = [ (T "node_load1" "1m") (T "node_load5" "5m") (T "node_load15" "15m") ]; }) (mkRow "Memory") (mkTs { title = "Memory"; unit = "bytes"; targets = [ (T "node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes" "used") (T "node_memory_Cached_bytes + node_memory_Buffers_bytes" "cache + buffers") (T "node_memory_MemAvailable_bytes" "available") (T "node_memory_MemTotal_bytes" "total") ]; }) (mkTs { title = "Swap"; unit = "bytes"; targets = [ (T "node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes" "used") (T "node_memory_SwapTotal_bytes" "total") ]; }) (mkRow "Disk") (mkTs { title = "Filesystem usage (%)"; unit = "percent"; targets = [ (T ''100 * (1 - node_filesystem_avail_bytes{fstype=~"btrfs|ext4|xfs|vfat|f2fs"} / node_filesystem_size_bytes{fstype=~"btrfs|ext4|xfs|vfat|f2fs"})'' "{{mountpoint}}") ]; }) (mkTs { title = "Disk IO (bytes/s)"; unit = "Bps"; targets = [ (T ''rate(node_disk_read_bytes_total{device!~"loop.*"}[5m])'' "{{device}} read") (T ''rate(node_disk_written_bytes_total{device!~"loop.*"}[5m])'' "{{device}} write") ]; }) (mkTs { title = "Disk IO utilisation (%)"; unit = "percent"; targets = [ (T ''rate(node_disk_io_time_seconds_total{device!~"loop.*"}[5m]) * 100'' "{{device}}") ]; }) (mkRow "Network") (mkTs { title = "Network (bytes/s)"; unit = "Bps"; targets = [ (T ''rate(node_network_receive_bytes_total{device!~"lo|br-.*|vh-.*|vc-.*"}[5m])'' "{{device}} rx") (T ''rate(node_network_transmit_bytes_total{device!~"lo|br-.*|vh-.*|vc-.*"}[5m])'' "{{device}} tx") ]; }) (mkTs { title = "Network errors + drops (pps)"; targets = [ (T ''rate(node_network_receive_errs_total{device!~"lo|br-.*|vh-.*|vc-.*"}[5m])'' "{{device}} rx err") (T ''rate(node_network_transmit_errs_total{device!~"lo|br-.*|vh-.*|vc-.*"}[5m])'' "{{device}} tx err") (T ''rate(node_network_receive_drop_total{device!~"lo|br-.*|vh-.*|vc-.*"}[5m])'' "{{device}} rx drop") (T ''rate(node_network_transmit_drop_total{device!~"lo|br-.*|vh-.*|vc-.*"}[5m])'' "{{device}} tx drop") ]; }) (mkRow "System") (mkTs { title = "Context switches + forks (ops/s)"; targets = [ (T "rate(node_context_switches_total[5m])" "context switches") (T "rate(node_forks_total[5m])" "forks") ]; }) (mkTs { title = "File descriptors"; targets = [ (T "node_filefd_allocated" "allocated") (T "node_filefd_maximum" "limit") ]; }) (mkTs { title = "Processes"; targets = [ (T "node_procs_running" "running") (T "node_procs_blocked" "blocked on IO") ]; }) ]; }