{
  "leansignal_demand_export": "1.0",
  "exported_at": "2026-07-17T00:00:00Z",
  "source_tenant": "leansignal-catalog",
  "catalog": {
    "slug": "host-metrics-node-exporter-otel-demand-extended",
    "integration": "host-metrics-node-exporter",
    "variant": "extended",
    "title": "Host Metrics (node_exporter) — Extended",
    "category": "Infrastructure",
    "dashboards": 2,
    "panels": 18,
    "alerts": 14,
    "docs_url": "https://docs.leansignal.io/integrations/host-metrics-node-exporter/"
  },
  "demand": {
    "ref": "demand",
    "name": "Host Metrics (node_exporter) — Extended (OpenTelemetry)",
    "description": "Deep host and hardware visibility: CPU utilization and by-mode breakdown, swap, inodes, disk operations and busy time, and dropped packets — plus a separate Hardware health dashboard with the sensors the hostmetrics receiver cannot read: temperatures, fan speeds, CPU package power, and ECC memory errors.",
    "dashboards": [
      {
        "ref": "dash-host-metrics-node-exporter-overview",
        "name": "Host Metrics (node_exporter) — Host overview — Extended",
        "description": "Host golden signals from node_exporter — load, memory, filesystem, disk, and network.",
        "data": {
          "display": {
            "name": "Host Metrics (node_exporter) — Host overview — Extended"
          },
          "panels": {
            "load_average": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Load average",
                  "description": "Runnable tasks averaged over 1/5/15 minutes — sustained load above the cores line means saturation."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "decimal"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "max by (instance) (node_load1{instance=~\"$instance\"})",
                          "seriesNameFormat": "{{instance}} · 1m"
                        }
                      }
                    }
                  },
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "max by (instance) (node_load5{instance=~\"$instance\"})",
                          "seriesNameFormat": "{{instance}} · 5m"
                        }
                      }
                    }
                  },
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "max by (instance) (node_load15{instance=~\"$instance\"})",
                          "seriesNameFormat": "{{instance}} · 15m"
                        }
                      }
                    }
                  },
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "count by (instance) (node_cpu_seconds_total{instance=~\"$instance\",mode=\"idle\"})",
                          "seriesNameFormat": "{{instance}} · cores"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "cpu_utilization": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "CPU utilization",
                  "description": "Busy (non-idle) CPU fraction per host, averaged over 5m windows. Volatile by nature — read it for diagnosis; alerting rides on load per core."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "percent-decimal"
                      },
                      "min": 0,
                      "max": 1
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "1 - avg by (instance) (rate(node_cpu_seconds_total{instance=~\"$instance\",mode=\"idle\"}[5m]))",
                          "seriesNameFormat": "{{instance}}"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "cpu_by_mode": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "CPU by mode",
                  "description": "Where CPU time goes — user, system, iowait, and friends."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "percent-decimal"
                      },
                      "min": 0,
                      "max": 1
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "avg by (instance, mode) (rate(node_cpu_seconds_total{instance=~\"$instance\",mode!=\"idle\"}[5m]))",
                          "seriesNameFormat": "{{instance}} · {{mode}}"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "memory_utilization": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Memory utilization",
                  "description": "Fraction of physical memory in use per host (1 − MemAvailable/MemTotal)."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "percent-decimal"
                      },
                      "min": 0,
                      "max": 1
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "1 - (max by (instance) (node_memory_MemAvailable_bytes{instance=~\"$instance\"}) / max by (instance) (node_memory_MemTotal_bytes{instance=~\"$instance\"}))",
                          "seriesNameFormat": "{{instance}}"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "memory_by_state": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Memory usage by state",
                  "description": "Used vs cached vs buffered vs free, per host."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "bytes"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "max by (instance) (node_memory_MemTotal_bytes{instance=~\"$instance\"} - node_memory_MemFree_bytes{instance=~\"$instance\"} - node_memory_Buffers_bytes{instance=~\"$instance\"} - node_memory_Cached_bytes{instance=~\"$instance\"})",
                          "seriesNameFormat": "{{instance}} · used"
                        }
                      }
                    }
                  },
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "max by (instance) (node_memory_Cached_bytes{instance=~\"$instance\"})",
                          "seriesNameFormat": "{{instance}} · cached"
                        }
                      }
                    }
                  },
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "max by (instance) (node_memory_Buffers_bytes{instance=~\"$instance\"})",
                          "seriesNameFormat": "{{instance}} · buffers"
                        }
                      }
                    }
                  },
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "max by (instance) (node_memory_MemFree_bytes{instance=~\"$instance\"})",
                          "seriesNameFormat": "{{instance}} · free"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "swap_usage": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Swap usage",
                  "description": "Sustained swap use signals memory pressure. Empty on hosts with no swap configured."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "bytes"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "max by (instance) (node_memory_SwapTotal_bytes{instance=~\"$instance\"} - node_memory_SwapFree_bytes{instance=~\"$instance\"})",
                          "seriesNameFormat": "{{instance}} · used"
                        }
                      }
                    }
                  },
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "max by (instance) (node_memory_SwapTotal_bytes{instance=~\"$instance\"})",
                          "seriesNameFormat": "{{instance}} · total"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "filesystem_utilization": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Filesystem utilization",
                  "description": "Fill level per mount point (RAM-backed filesystems excluded)."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "percent-decimal"
                      },
                      "min": 0,
                      "max": 1
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "max by (instance, mountpoint) (1 - node_filesystem_avail_bytes{instance=~\"$instance\",fstype!~\"tmpfs|ramfs\"} / node_filesystem_size_bytes{instance=~\"$instance\",fstype!~\"tmpfs|ramfs\"})",
                          "seriesNameFormat": "{{instance}} · {{mountpoint}}"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "filesystem_inodes": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Inode utilization",
                  "description": "Inodes used per mount — a full inode table blocks writes even with disk space left."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "percent-decimal"
                      },
                      "min": 0,
                      "max": 1
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "max by (instance, mountpoint) (1 - node_filesystem_files_free{instance=~\"$instance\",fstype!~\"tmpfs|ramfs\"} / node_filesystem_files{instance=~\"$instance\",fstype!~\"tmpfs|ramfs\"})",
                          "seriesNameFormat": "{{instance}} · {{mountpoint}}"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "disk_io": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Disk I/O",
                  "description": "Read/write throughput per device."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "decbytes/sec"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (instance, device) (rate(node_disk_read_bytes_total{instance=~\"$instance\"}[5m]))",
                          "seriesNameFormat": "{{instance}} · {{device}} read"
                        }
                      }
                    }
                  },
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (instance, device) (rate(node_disk_written_bytes_total{instance=~\"$instance\"}[5m]))",
                          "seriesNameFormat": "{{instance}} · {{device}} write"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "disk_operations": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Disk operations",
                  "description": "IOPS per device, split by read/write."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "ops/sec"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (instance, device) (rate(node_disk_reads_completed_total{instance=~\"$instance\"}[5m]))",
                          "seriesNameFormat": "{{instance}} · {{device}} read"
                        }
                      }
                    }
                  },
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (instance, device) (rate(node_disk_writes_completed_total{instance=~\"$instance\"}[5m]))",
                          "seriesNameFormat": "{{instance}} · {{device}} write"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "disk_busy": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Disk busy time",
                  "description": "Fraction of time each device spends servicing I/O — pinned near 100% means the device is the bottleneck."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "percent-decimal"
                      },
                      "min": 0,
                      "max": 1
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "max by (instance, device) (rate(node_disk_io_time_seconds_total{instance=~\"$instance\"}[5m]))",
                          "seriesNameFormat": "{{instance}} · {{device}}"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "network_io": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Network I/O",
                  "description": "Receive/transmit throughput per interface (loopback excluded)."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "decbytes/sec"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (instance, device) (rate(node_network_receive_bytes_total{instance=~\"$instance\",device!=\"lo\"}[5m]))",
                          "seriesNameFormat": "{{instance}} · {{device}} rx"
                        }
                      }
                    }
                  },
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (instance, device) (rate(node_network_transmit_bytes_total{instance=~\"$instance\",device!=\"lo\"}[5m]))",
                          "seriesNameFormat": "{{instance}} · {{device}} tx"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "network_errors": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Network errors",
                  "description": "Interface errors — zero on a healthy link."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "packets/sec"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (instance, device) (rate(node_network_receive_errs_total{instance=~\"$instance\"}[5m]))",
                          "seriesNameFormat": "{{instance}} · {{device}} rx"
                        }
                      }
                    }
                  },
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (instance, device) (rate(node_network_transmit_errs_total{instance=~\"$instance\"}[5m]))",
                          "seriesNameFormat": "{{instance}} · {{device}} tx"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "network_dropped": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Network dropped packets",
                  "description": "Drops per interface — buffer or driver pressure."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "packets/sec"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (instance, device) (rate(node_network_receive_drop_total{instance=~\"$instance\"}[5m]))",
                          "seriesNameFormat": "{{instance}} · {{device}} rx"
                        }
                      }
                    }
                  },
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (instance, device) (rate(node_network_transmit_drop_total{instance=~\"$instance\"}[5m]))",
                          "seriesNameFormat": "{{instance}} · {{device}} tx"
                        }
                      }
                    }
                  }
                ]
              }
            }
          },
          "layouts": [
            {
              "kind": "Grid",
              "spec": {
                "display": {
                  "title": "CPU",
                  "collapse": {
                    "open": true
                  }
                },
                "items": [
                  {
                    "x": 0,
                    "y": 0,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/load_average"
                    }
                  },
                  {
                    "x": 12,
                    "y": 0,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/cpu_utilization"
                    }
                  },
                  {
                    "x": 0,
                    "y": 8,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/cpu_by_mode"
                    }
                  }
                ]
              }
            },
            {
              "kind": "Grid",
              "spec": {
                "display": {
                  "title": "Memory",
                  "collapse": {
                    "open": true
                  }
                },
                "items": [
                  {
                    "x": 0,
                    "y": 0,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/memory_utilization"
                    }
                  },
                  {
                    "x": 12,
                    "y": 0,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/memory_by_state"
                    }
                  },
                  {
                    "x": 0,
                    "y": 8,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/swap_usage"
                    }
                  }
                ]
              }
            },
            {
              "kind": "Grid",
              "spec": {
                "display": {
                  "title": "Filesystem",
                  "collapse": {
                    "open": true
                  }
                },
                "items": [
                  {
                    "x": 0,
                    "y": 0,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/filesystem_utilization"
                    }
                  },
                  {
                    "x": 12,
                    "y": 0,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/filesystem_inodes"
                    }
                  }
                ]
              }
            },
            {
              "kind": "Grid",
              "spec": {
                "display": {
                  "title": "Disk",
                  "collapse": {
                    "open": true
                  }
                },
                "items": [
                  {
                    "x": 0,
                    "y": 0,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/disk_io"
                    }
                  },
                  {
                    "x": 12,
                    "y": 0,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/disk_operations"
                    }
                  },
                  {
                    "x": 0,
                    "y": 8,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/disk_busy"
                    }
                  }
                ]
              }
            },
            {
              "kind": "Grid",
              "spec": {
                "display": {
                  "title": "Network",
                  "collapse": {
                    "open": true
                  }
                },
                "items": [
                  {
                    "x": 0,
                    "y": 0,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/network_io"
                    }
                  },
                  {
                    "x": 12,
                    "y": 0,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/network_errors"
                    }
                  },
                  {
                    "x": 0,
                    "y": 8,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/network_dropped"
                    }
                  }
                ]
              }
            }
          ],
          "variables": [
            {
              "kind": "ListVariable",
              "spec": {
                "name": "instance",
                "display": {
                  "name": "Instance"
                },
                "allowAllValue": true,
                "allowMultiple": true,
                "customAllValue": ".*",
                "defaultValue": ".*",
                "plugin": {
                  "kind": "PrometheusLabelValuesVariable",
                  "spec": {
                    "labelName": "instance"
                  }
                }
              }
            }
          ],
          "duration": "1h",
          "refreshInterval": "30s",
          "datasources": {}
        }
      },
      {
        "ref": "dash-host-metrics-node-exporter-hardware",
        "name": "Host Metrics (node_exporter) — Hardware health — Extended",
        "description": "Physical-machine health from the kernel sensors — temperatures, fan speeds, CPU package power, and ECC memory errors. Bare metal only; empty on VMs.",
        "data": {
          "display": {
            "name": "Host Metrics (node_exporter) — Hardware health — Extended"
          },
          "panels": {
            "hw_temperatures": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Temperatures (°C)",
                  "description": "Every hwmon temperature sensor plus kernel thermal zones — CPU package, NVMe composite, chipset. Bare metal only; empty on most VMs."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "decimal"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "max by (instance, chip, sensor) (node_hwmon_temp_celsius{instance=~\"$instance\"})",
                          "seriesNameFormat": "{{instance}} · {{chip}} {{sensor}}"
                        }
                      }
                    }
                  },
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "max by (instance, zone, type) (node_thermal_zone_temp{instance=~\"$instance\"})",
                          "seriesNameFormat": "{{instance}} · zone {{type}}"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "hw_fan_speeds": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "Fan speeds (RPM)",
                  "description": "hwmon fan tachometers — a fan at 0 RPM under thermal load is a failure."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "decimal"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "max by (instance, chip, sensor) (node_hwmon_fan_rpm{instance=~\"$instance\"})",
                          "seriesNameFormat": "{{instance}} · {{chip}} {{sensor}}"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "hw_package_power": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "CPU package power (W)",
                  "description": "Average power draw per CPU package from RAPL energy counters. Needs a powercap-capable CPU; absent on most VMs."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "decimal"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (instance, index) (rate(node_rapl_package_joules_total{instance=~\"$instance\"}[5m]))",
                          "seriesNameFormat": "{{instance}} · package {{index}}"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "hw_ecc_errors": {
              "kind": "Panel",
              "spec": {
                "display": {
                  "name": "ECC memory errors",
                  "description": "ECC errors caught by the memory controller over the last hour — a rising correctable count is a DIMM starting to die. Needs ECC memory (EDAC)."
                },
                "plugin": {
                  "kind": "TimeSeriesChart",
                  "spec": {
                    "legend": {
                      "position": "bottom",
                      "mode": "table",
                      "values": [
                        "last-number",
                        "mean",
                        "max"
                      ]
                    },
                    "yAxis": {
                      "format": {
                        "unit": "decimal"
                      },
                      "min": 0
                    }
                  }
                },
                "queries": [
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (instance) (increase(node_edac_correctable_errors_total{instance=~\"$instance\"}[1h]))",
                          "seriesNameFormat": "{{instance}} · correctable (1h)"
                        }
                      }
                    }
                  },
                  {
                    "kind": "TimeSeriesQuery",
                    "spec": {
                      "plugin": {
                        "kind": "PrometheusTimeSeriesQuery",
                        "spec": {
                          "query": "sum by (instance) (increase(node_edac_uncorrectable_errors_total{instance=~\"$instance\"}[1h]))",
                          "seriesNameFormat": "{{instance}} · uncorrectable (1h)"
                        }
                      }
                    }
                  }
                ]
              }
            }
          },
          "layouts": [
            {
              "kind": "Grid",
              "spec": {
                "display": {
                  "title": "Hardware",
                  "collapse": {
                    "open": true
                  }
                },
                "items": [
                  {
                    "x": 0,
                    "y": 0,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/hw_temperatures"
                    }
                  },
                  {
                    "x": 12,
                    "y": 0,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/hw_fan_speeds"
                    }
                  },
                  {
                    "x": 0,
                    "y": 8,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/hw_package_power"
                    }
                  },
                  {
                    "x": 12,
                    "y": 8,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/hw_ecc_errors"
                    }
                  }
                ]
              }
            }
          ],
          "variables": [
            {
              "kind": "ListVariable",
              "spec": {
                "name": "instance",
                "display": {
                  "name": "Instance"
                },
                "allowAllValue": true,
                "allowMultiple": true,
                "customAllValue": ".*",
                "defaultValue": ".*",
                "plugin": {
                  "kind": "PrometheusLabelValuesVariable",
                  "spec": {
                    "labelName": "instance"
                  }
                }
              }
            }
          ],
          "duration": "1h",
          "refreshInterval": "30s",
          "datasources": {}
        }
      }
    ],
    "alert_rules": [
      {
        "ref": "alert-host-down",
        "name": "Host down or unreachable",
        "description": null,
        "query": "min by (instance) (up{job=\"node\"})",
        "condition_op": "lt",
        "threshold": 1,
        "interval": "1m",
        "for": "5m",
        "severity": "critical",
        "message": "node_exporter on {{labels.instance}} has stopped answering scrapes — host down, exporter down, or unreachable.",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      },
      {
        "ref": "alert-load-critical",
        "name": "Host load high (critical)",
        "description": null,
        "query": "max by (instance) (node_load5) / count by (instance) (node_cpu_seconds_total{mode=\"idle\"})",
        "condition_op": "gt",
        "threshold": 3,
        "interval": "1m",
        "for": "10m",
        "severity": "critical",
        "message": "5m load on {{labels.instance}} is {{value}}× its core count — the host is heavily saturated.",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      },
      {
        "ref": "alert-load-warning",
        "name": "Host load high (warning)",
        "description": null,
        "query": "max by (instance) (node_load5) / count by (instance) (node_cpu_seconds_total{mode=\"idle\"})",
        "condition_op": "gt",
        "threshold": 1.5,
        "interval": "1m",
        "for": "15m",
        "severity": "warning",
        "message": "5m load on {{labels.instance}} is {{value}}× its core count — runnable tasks exceed the cores.",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      },
      {
        "ref": "alert-memory-critical",
        "name": "Host memory usage high (critical)",
        "description": null,
        "query": "1 - (max by (instance) (node_memory_MemAvailable_bytes) / max by (instance) (node_memory_MemTotal_bytes))",
        "condition_op": "gt",
        "threshold": 0.9,
        "interval": "1m",
        "for": "5m",
        "severity": "critical",
        "message": "Memory utilization on {{labels.instance}} is above 90% ({{value}}).",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      },
      {
        "ref": "alert-memory-warning",
        "name": "Host memory usage high (warning)",
        "description": null,
        "query": "1 - (max by (instance) (node_memory_MemAvailable_bytes) / max by (instance) (node_memory_MemTotal_bytes))",
        "condition_op": "gt",
        "threshold": 0.8,
        "interval": "1m",
        "for": "15m",
        "severity": "warning",
        "message": "Memory utilization on {{labels.instance}} is above 80% ({{value}}).",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      },
      {
        "ref": "alert-filesystem-critical",
        "name": "Host filesystem usage high (critical)",
        "description": null,
        "query": "max by (instance, mountpoint) (1 - node_filesystem_avail_bytes{fstype!~\"tmpfs|ramfs\"} / node_filesystem_size_bytes{fstype!~\"tmpfs|ramfs\"})",
        "condition_op": "gt",
        "threshold": 0.9,
        "interval": "1m",
        "for": "10m",
        "severity": "critical",
        "message": "Filesystem {{labels.mountpoint}} on {{labels.instance}} is above 90% full ({{value}}).",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      },
      {
        "ref": "alert-filesystem-warning",
        "name": "Host filesystem usage high (warning)",
        "description": null,
        "query": "max by (instance, mountpoint) (1 - node_filesystem_avail_bytes{fstype!~\"tmpfs|ramfs\"} / node_filesystem_size_bytes{fstype!~\"tmpfs|ramfs\"})",
        "condition_op": "gt",
        "threshold": 0.8,
        "interval": "1m",
        "for": "15m",
        "severity": "warning",
        "message": "Filesystem {{labels.mountpoint}} on {{labels.instance}} is above 80% full ({{value}}).",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      },
      {
        "ref": "alert-inodes-high",
        "name": "Host filesystem inodes high",
        "description": null,
        "query": "max by (instance, mountpoint) (1 - node_filesystem_files_free{fstype!~\"tmpfs|ramfs\"} / node_filesystem_files{fstype!~\"tmpfs|ramfs\"})",
        "condition_op": "gt",
        "threshold": 0.85,
        "interval": "1m",
        "for": "15m",
        "severity": "warning",
        "message": "Inode usage on {{labels.mountpoint}} ({{labels.instance}}) is above 85% ({{value}}).",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      },
      {
        "ref": "alert-swap-high",
        "name": "Host swap usage high",
        "description": null,
        "query": "max by (instance) ((node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes) / node_memory_SwapTotal_bytes)",
        "condition_op": "gt",
        "threshold": 0.5,
        "interval": "1m",
        "for": "15m",
        "severity": "warning",
        "message": "Swap utilization on {{labels.instance}} is above 50% ({{value}}).",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      },
      {
        "ref": "alert-network-errors-high",
        "name": "Host network errors high",
        "description": null,
        "query": "sum by (instance) (rate(node_network_receive_errs_total[5m])) + sum by (instance) (rate(node_network_transmit_errs_total[5m]))",
        "condition_op": "gt",
        "threshold": 10,
        "interval": "1m",
        "for": "5m",
        "severity": "warning",
        "message": "Network error rate on {{labels.instance}} is {{value}}/s.",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      },
      {
        "ref": "alert-temperature-warning",
        "name": "Host temperature high (warning)",
        "description": null,
        "query": "max by (instance, chip, sensor) (node_hwmon_temp_celsius)",
        "condition_op": "gt",
        "threshold": 85,
        "interval": "1m",
        "for": "15m",
        "severity": "warning",
        "message": "Sensor {{labels.sensor}} ({{labels.chip}}) on {{labels.instance}} has read above 85°C for 15 minutes ({{value}}°C).",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      },
      {
        "ref": "alert-temperature-critical",
        "name": "Host temperature high (critical)",
        "description": null,
        "query": "max by (instance, chip, sensor) (node_hwmon_temp_celsius)",
        "condition_op": "gt",
        "threshold": 95,
        "interval": "1m",
        "for": "5m",
        "severity": "critical",
        "message": "Sensor {{labels.sensor}} ({{labels.chip}}) on {{labels.instance}} reads {{value}}°C — thermal throttling or shutdown imminent.",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      },
      {
        "ref": "alert-ecc-correctable",
        "name": "Host ECC memory errors (correctable)",
        "description": null,
        "query": "sum by (instance) (increase(node_edac_correctable_errors_total[1h]))",
        "condition_op": "gt",
        "threshold": 0,
        "interval": "1m",
        "for": "5m",
        "severity": "warning",
        "message": "{{labels.instance}} corrected {{value}} ECC memory errors in the last hour — a DIMM may be degrading.",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      },
      {
        "ref": "alert-ecc-uncorrectable",
        "name": "Host ECC memory errors (uncorrectable)",
        "description": null,
        "query": "sum by (instance) (increase(node_edac_uncorrectable_errors_total[1h]))",
        "condition_op": "gt",
        "threshold": 0,
        "interval": "1m",
        "for": "5m",
        "severity": "critical",
        "message": "{{labels.instance}} hit {{value}} uncorrectable ECC memory errors in the last hour — corrupted data was served; replace the DIMM.",
        "notify_on_resolve": true,
        "paused": false,
        "channels": []
      }
    ]
  }
}
