{
  "leansignal_demand_export": "1.0",
  "exported_at": "2026-07-17T00:00:00Z",
  "source_tenant": "leansignal-catalog",
  "catalog": {
    "slug": "host-metrics-node-exporter-otel-demand-standard",
    "integration": "host-metrics-node-exporter",
    "variant": "standard",
    "title": "Host Metrics (node_exporter) — Standard",
    "category": "Infrastructure",
    "dashboards": 1,
    "panels": 7,
    "alerts": 6,
    "docs_url": "https://docs.leansignal.io/integrations/host-metrics-node-exporter/"
  },
  "demand": {
    "ref": "demand",
    "name": "Host Metrics (node_exporter) — Standard (OpenTelemetry)",
    "description": "A well-rounded host overview: adds per-state memory, disk I/O, and network errors, with paired warning/critical alerting. The recommended default for most fleets.",
    "dashboards": [
      {
        "ref": "dash-host-metrics-node-exporter",
        "name": "Host Metrics (node_exporter) — Standard",
        "description": "Host metrics from Prometheus node_exporter — CPU, memory, disk, and network, plus the hardware sensors — temperatures, fan speeds, power draw, and ECC memory errors (standard variant).",
        "data": {
          "display": {
            "name": "Host Metrics (node_exporter) — Standard"
          },
          "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"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "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"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "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}}"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "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"
                        }
                      }
                    }
                  }
                ]
              }
            },
            "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"
                        }
                      }
                    }
                  }
                ]
              }
            }
          },
          "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"
                    }
                  }
                ]
              }
            },
            {
              "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"
                    }
                  }
                ]
              }
            },
            {
              "kind": "Grid",
              "spec": {
                "display": {
                  "title": "Filesystem",
                  "collapse": {
                    "open": true
                  }
                },
                "items": [
                  {
                    "x": 0,
                    "y": 0,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/filesystem_utilization"
                    }
                  }
                ]
              }
            },
            {
              "kind": "Grid",
              "spec": {
                "display": {
                  "title": "Disk",
                  "collapse": {
                    "open": true
                  }
                },
                "items": [
                  {
                    "x": 0,
                    "y": 0,
                    "width": 12,
                    "height": 8,
                    "content": {
                      "$ref": "#/spec/panels/disk_io"
                    }
                  }
                ]
              }
            },
            {
              "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"
                    }
                  }
                ]
              }
            }
          ],
          "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-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": []
      }
    ]
  }
}
