aboutsummaryrefslogtreecommitdiffstats
path: root/dashboards/zfs-pools.json
diff options
context:
space:
mode:
Diffstat (limited to 'dashboards/zfs-pools.json')
-rw-r--r--dashboards/zfs-pools.json4372
1 files changed, 4372 insertions, 0 deletions
diff --git a/dashboards/zfs-pools.json b/dashboards/zfs-pools.json
new file mode 100644
index 0000000..0721bb8
--- /dev/null
+++ b/dashboards/zfs-pools.json
@@ -0,0 +1,4372 @@
+{
+ "title": "ZFS Pools",
+ "uid": "zfs-pools",
+ "description": "ZFS capacity, health, integrity, snapshot retention, dataset properties and performance. Fed by node_exporter's zfs and systemd collectors plus collectors/zfs-metrics.py from lgtm.nix.",
+ "tags": [
+ "zfs",
+ "storage"
+ ],
+ "timezone": "browser",
+ "schemaVersion": 41,
+ "version": 1,
+ "editable": true,
+ "graphTooltip": 1,
+ "refresh": "1m",
+ "time": {
+ "from": "now-24h",
+ "to": "now"
+ },
+ "templating": {
+ "list": [
+ {
+ "name": "pool",
+ "label": "Pool",
+ "type": "query",
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "query": {
+ "qryType": 1,
+ "query": "label_values(zfs_pool_health_code, pool)",
+ "refId": "PrometheusVariableQueryEditor-VariableQuery"
+ },
+ "refresh": 1,
+ "includeAll": true,
+ "allValue": ".*",
+ "multi": true,
+ "current": {
+ "text": [
+ "All"
+ ],
+ "value": [
+ "$__all"
+ ]
+ },
+ "options": [],
+ "sort": 1
+ }
+ ]
+ },
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": {
+ "type": "datasource",
+ "uid": "grafana"
+ },
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "type": "dashboard"
+ }
+ ]
+ },
+ "panels": [
+ {
+ "type": "row",
+ "title": "Pool Overview",
+ "id": 1,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 0
+ },
+ "collapsed": false,
+ "panels": []
+ },
+ {
+ "type": "stat",
+ "title": "Pool Health",
+ "description": "Health as reported by `zpool list -o health`.",
+ "id": 2,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 0,
+ "y": 1
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [
+ {
+ "type": "value",
+ "options": {
+ "0": {
+ "text": "ONLINE",
+ "color": "green",
+ "index": 0
+ },
+ "1": {
+ "text": "DEGRADED",
+ "color": "orange",
+ "index": 1
+ },
+ "2": {
+ "text": "FAULTED",
+ "color": "red",
+ "index": 2
+ },
+ "3": {
+ "text": "OFFLINE",
+ "color": "text",
+ "index": 3
+ },
+ "4": {
+ "text": "UNAVAIL",
+ "color": "red",
+ "index": 4
+ },
+ "5": {
+ "text": "REMOVED",
+ "color": "purple",
+ "index": 5
+ },
+ "6": {
+ "text": "SUSPENDED",
+ "color": "red",
+ "index": 6
+ },
+ "7": {
+ "text": "AVAIL",
+ "color": "blue",
+ "index": 7
+ },
+ "8": {
+ "text": "UNKNOWN",
+ "color": "text",
+ "index": 8
+ }
+ }
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "options": {
+ "colorMode": "background",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "textMode": "auto",
+ "wideLayout": true,
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_pool_health_code{pool=~\"$pool\"}",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "legendFormat": "{{pool}}"
+ }
+ ]
+ },
+ {
+ "type": "stat",
+ "title": "Data Errors",
+ "description": "Permanent, unrepairable errors from `zpool status`. Anything above zero means data has been lost and the affected files need restoring.",
+ "id": 3,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 4,
+ "y": 1
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 1
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "options": {
+ "colorMode": "background",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "textMode": "auto",
+ "wideLayout": true,
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "sum(zfs_pool_data_errors{pool=~\"$pool\"}) or vector(0)",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "legendFormat": "errors"
+ }
+ ]
+ },
+ {
+ "type": "stat",
+ "title": "vdev Errors",
+ "description": "Total read + write + checksum errors across all vdevs. Cleared by `zpool clear`.",
+ "id": 4,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 8,
+ "y": 1
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 1
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "options": {
+ "colorMode": "background",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "textMode": "auto",
+ "wideLayout": true,
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "sum(zfs_pool_vdev_errors_total{pool=~\"$pool\"}) or vector(0)",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "legendFormat": "errors"
+ }
+ ]
+ },
+ {
+ "type": "stat",
+ "title": "Last Scrub",
+ "description": "Time since the most recent completed scrub. Turns amber past ~5 weeks, which is a monthly scrub schedule having missed a run.",
+ "id": 5,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 12,
+ "y": 1
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "yellow",
+ "value": 3024000
+ },
+ {
+ "color": "red",
+ "value": 6048000
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "options": {
+ "colorMode": "background",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "textMode": "auto",
+ "wideLayout": true,
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "time() - max(zfs_pool_last_scrub_end_timestamp_seconds{pool=~\"$pool\"})",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "legendFormat": "ago"
+ }
+ ]
+ },
+ {
+ "type": "stat",
+ "title": "Scrub / Resilver",
+ "description": "",
+ "id": 6,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 16,
+ "y": 1
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [
+ {
+ "type": "value",
+ "options": {
+ "0": {
+ "text": "idle",
+ "color": "green",
+ "index": 0
+ },
+ "1": {
+ "text": "RUNNING",
+ "color": "blue",
+ "index": 1
+ }
+ }
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "options": {
+ "colorMode": "background",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "textMode": "auto",
+ "wideLayout": true,
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "max(zfs_pool_scrub_in_progress{pool=~\"$pool\"})",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "legendFormat": "scrub"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "max(zfs_pool_resilver_in_progress{pool=~\"$pool\"})",
+ "refId": "B",
+ "instant": true,
+ "range": false,
+ "legendFormat": "resilver"
+ }
+ ]
+ },
+ {
+ "type": "stat",
+ "title": "Locked Datasets",
+ "description": "Encrypted datasets whose key is not loaded. These are unreadable and are silently skipped by anything that walks the filesystem, including backups.",
+ "id": 7,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 20,
+ "y": 1
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 1
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "options": {
+ "colorMode": "background",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "textMode": "auto",
+ "wideLayout": true,
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "count(zfs_dataset_encrypted{pool=~\"$pool\"} == 1 and zfs_dataset_key_available{pool=~\"$pool\"} == 0) or vector(0)",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "legendFormat": "locked"
+ }
+ ]
+ },
+ {
+ "type": "gauge",
+ "title": "Space Used",
+ "description": "How full the pool is: allocated / total. ZFS write performance degrades sharply past ~80%, and the pool becomes effectively read-only near 100%. The byte figures behind this are in 'Capacity by Pool' below.",
+ "id": 8,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 5,
+ "x": 0,
+ "y": 5
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "min": 0,
+ "max": 1,
+ "unit": "percentunit",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "yellow",
+ "value": 0.8
+ },
+ {
+ "color": "red",
+ "value": 0.9
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "options": {
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true,
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_pool_capacity_ratio{pool=~\"$pool\"}",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "legendFormat": "{{pool}}"
+ }
+ ]
+ },
+ {
+ "type": "gauge",
+ "title": "Fragmentation",
+ "description": "Free-space fragmentation.",
+ "id": 9,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 5,
+ "x": 5,
+ "y": 5
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "min": 0,
+ "max": 1,
+ "unit": "percentunit",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "yellow",
+ "value": 0.5
+ },
+ {
+ "color": "red",
+ "value": 0.75
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "options": {
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true,
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_pool_fragmentation_ratio{pool=~\"$pool\"}",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "legendFormat": "{{pool}}"
+ }
+ ]
+ },
+ {
+ "type": "stat",
+ "title": "Free Space",
+ "description": "",
+ "id": 10,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 5,
+ "x": 10,
+ "y": 5
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "bytes"
+ },
+ "overrides": []
+ },
+ "options": {
+ "colorMode": "value",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "textMode": "auto",
+ "wideLayout": true,
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_pool_free_bytes{pool=~\"$pool\"}",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "legendFormat": "{{pool}}"
+ }
+ ]
+ },
+ {
+ "type": "stat",
+ "title": "Snapshots Overdue",
+ "description": "Dataset/label pairs whose newest snapshot is more than two intervals old \u2014 i.e. the auto-snapshot timer has missed at least one run.",
+ "id": 11,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 4,
+ "x": 15,
+ "y": 5
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 1
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "options": {
+ "colorMode": "background",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "textMode": "auto",
+ "wideLayout": true,
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "count((time() - zfs_snapshot_newest_timestamp_seconds{pool=~\"$pool\"}) > on(label) group_left() (2 * zfs_snapshot_interval_seconds)) or vector(0)",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "legendFormat": "overdue"
+ }
+ ]
+ },
+ {
+ "type": "stat",
+ "title": "Retention Depth",
+ "description": "Age of the oldest snapshot on the pool \u2014 how far back you can actually restore from.",
+ "id": 12,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 4,
+ "w": 5,
+ "x": 19,
+ "y": 5
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "options": {
+ "colorMode": "value",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "textMode": "auto",
+ "wideLayout": true,
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "time() - min(zfs_pool_snapshot_oldest_timestamp_seconds{pool=~\"$pool\"})",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "legendFormat": "oldest"
+ }
+ ]
+ },
+ {
+ "type": "timeseries",
+ "title": "Pool Space Used / Free",
+ "description": "Stacked, so the top of each pool's band is its total size and the split between the bands is the usage fraction the gauge above shows.",
+ "id": 13,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 9
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "drawStyle": "line",
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "fillOpacity": 40,
+ "showPoints": "never",
+ "spanNulls": true,
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "gradientMode": "none",
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "stacking": {
+ "group": "A",
+ "mode": "normal"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "bytes",
+ "min": 0
+ },
+ "overrides": []
+ },
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_pool_allocated_bytes{pool=~\"$pool\"}",
+ "refId": "A",
+ "instant": false,
+ "range": true,
+ "legendFormat": "{{pool}} used"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_pool_free_bytes{pool=~\"$pool\"}",
+ "refId": "B",
+ "instant": false,
+ "range": true,
+ "legendFormat": "{{pool}} free"
+ }
+ ]
+ },
+ {
+ "type": "timeseries",
+ "title": "Fragmentation",
+ "description": "Free-space fragmentation \u2014 how scattered the pool's remaining free space is, not how scattered the data is. It rises as a pool fills and stays high afterwards; only rewriting data (send/recv, or deleting a lot) brings it down. Kept on its own axis because it is unrelated to space used, and plotting the two together invites reading one as the other.",
+ "id": 14,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 9
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "drawStyle": "line",
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "fillOpacity": 15,
+ "showPoints": "never",
+ "spanNulls": true,
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "gradientMode": "none",
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "percentunit",
+ "min": 0,
+ "max": 1
+ },
+ "overrides": []
+ },
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_pool_fragmentation_ratio{pool=~\"$pool\"}",
+ "refId": "A",
+ "instant": false,
+ "range": true,
+ "legendFormat": "{{pool}}"
+ }
+ ]
+ },
+ {
+ "type": "table",
+ "title": "Capacity by Pool",
+ "description": "Per-pool space in bytes. 'Size' is the raw pool size zpool reports, which for raidz is before parity overhead \u2014 so 'Free' is the number to trust for how much you can still write. 'Snapshots' is space held only by snapshots.",
+ "id": 15,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 24,
+ "x": 0,
+ "y": 17
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "custom": {
+ "align": "auto",
+ "cellOptions": {
+ "type": "auto"
+ },
+ "inspect": false,
+ "filterable": true
+ },
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "^(Size|Used|Free|Snapshots)$"
+ },
+ "properties": [
+ {
+ "id": "unit",
+ "value": "bytes"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Used %"
+ },
+ "properties": [
+ {
+ "id": "unit",
+ "value": "percentunit"
+ },
+ {
+ "id": "max",
+ "value": 1
+ },
+ {
+ "id": "thresholds",
+ "value": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "yellow",
+ "value": 0.8
+ },
+ {
+ "color": "red",
+ "value": 0.9
+ }
+ ]
+ }
+ },
+ {
+ "id": "custom.cellOptions",
+ "value": {
+ "type": "gauge",
+ "mode": "gradient"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Fragmentation"
+ },
+ "properties": [
+ {
+ "id": "unit",
+ "value": "percentunit"
+ }
+ ]
+ }
+ ]
+ },
+ "options": {
+ "showHeader": true,
+ "cellHeight": "sm",
+ "footer": {
+ "show": false,
+ "reducer": [
+ "sum"
+ ],
+ "countRows": false,
+ "fields": ""
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_pool_size_bytes{pool=~\"$pool\"}",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "max by (pool) (zfs_pool_allocated_bytes{pool=~\"$pool\"})",
+ "refId": "B",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "max by (pool) (zfs_pool_free_bytes{pool=~\"$pool\"})",
+ "refId": "C",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "max by (pool) (zfs_pool_capacity_ratio{pool=~\"$pool\"})",
+ "refId": "D",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "max by (pool) (zfs_pool_fragmentation_ratio{pool=~\"$pool\"})",
+ "refId": "E",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "max by (pool) (zfs_pool_snapshot_used_bytes{pool=~\"$pool\"})",
+ "refId": "F",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "max by (pool) (zfs_pool_dedup_ratio{pool=~\"$pool\"})",
+ "refId": "G",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ }
+ ],
+ "transformations": [
+ {
+ "id": "filterFieldsByName",
+ "options": {
+ "include": {
+ "pattern": "pool|Value.*"
+ }
+ }
+ },
+ {
+ "id": "joinByField",
+ "options": {
+ "byField": "pool",
+ "mode": "outer"
+ }
+ },
+ {
+ "id": "organize",
+ "options": {
+ "excludeByName": {},
+ "indexByName": {
+ "pool": 0,
+ "Value #A": 1,
+ "Value #B": 2,
+ "Value #C": 3,
+ "Value #D": 4,
+ "Value #E": 5,
+ "Value #F": 6,
+ "Value #G": 7
+ },
+ "renameByName": {
+ "pool": "Pool",
+ "Value #A": "Size",
+ "Value #B": "Used",
+ "Value #C": "Free",
+ "Value #D": "Used %",
+ "Value #E": "Fragmentation",
+ "Value #F": "Snapshots",
+ "Value #G": "Dedup"
+ }
+ }
+ },
+ {
+ "id": "sortBy",
+ "options": {
+ "fields": {},
+ "sort": [
+ {
+ "field": "Used %",
+ "desc": true
+ }
+ ]
+ }
+ }
+ ]
+ },
+ {
+ "type": "row",
+ "title": "Integrity & Errors",
+ "id": 16,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 25
+ },
+ "collapsed": false,
+ "panels": []
+ },
+ {
+ "type": "table",
+ "title": "vdev State",
+ "description": "Every vdev and leaf device in the selected pool(s).",
+ "id": 17,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 9,
+ "w": 12,
+ "x": 0,
+ "y": 26
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [
+ {
+ "type": "value",
+ "options": {
+ "0": {
+ "text": "ONLINE",
+ "color": "green",
+ "index": 0
+ },
+ "1": {
+ "text": "DEGRADED",
+ "color": "orange",
+ "index": 1
+ },
+ "2": {
+ "text": "FAULTED",
+ "color": "red",
+ "index": 2
+ },
+ "3": {
+ "text": "OFFLINE",
+ "color": "text",
+ "index": 3
+ },
+ "4": {
+ "text": "UNAVAIL",
+ "color": "red",
+ "index": 4
+ },
+ "5": {
+ "text": "REMOVED",
+ "color": "purple",
+ "index": 5
+ },
+ "6": {
+ "text": "SUSPENDED",
+ "color": "red",
+ "index": 6
+ },
+ "7": {
+ "text": "AVAIL",
+ "color": "blue",
+ "index": 7
+ },
+ "8": {
+ "text": "UNKNOWN",
+ "color": "text",
+ "index": 8
+ }
+ }
+ }
+ ],
+ "custom": {
+ "align": "auto",
+ "cellOptions": {
+ "type": "auto"
+ },
+ "inspect": false,
+ "filterable": true
+ },
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "State"
+ },
+ "properties": [
+ {
+ "id": "custom.cellOptions",
+ "value": {
+ "type": "color-background",
+ "mode": "basic"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "options": {
+ "showHeader": true,
+ "cellHeight": "sm",
+ "footer": {
+ "show": false,
+ "reducer": [
+ "sum"
+ ],
+ "countRows": false,
+ "fields": ""
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_pool_vdev_state_code{pool=~\"$pool\"}",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ }
+ ],
+ "transformations": [
+ {
+ "id": "filterFieldsByName",
+ "options": {
+ "include": {
+ "pattern": "pool|vdev|Value"
+ }
+ }
+ },
+ {
+ "id": "organize",
+ "options": {
+ "excludeByName": {},
+ "indexByName": {},
+ "renameByName": {
+ "pool": "Pool",
+ "vdev": "vdev",
+ "Value": "State"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "timeseries",
+ "title": "vdev Error Counters",
+ "description": "Cumulative per-vdev errors. A counter that climbs is a disk on its way out.",
+ "id": 18,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 9,
+ "w": 12,
+ "x": 12,
+ "y": 26
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "drawStyle": "line",
+ "lineInterpolation": "linear",
+ "lineWidth": 2,
+ "fillOpacity": 0,
+ "showPoints": "auto",
+ "spanNulls": true,
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "gradientMode": "none",
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "min": 0
+ },
+ "overrides": []
+ },
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_pool_vdev_errors_total{pool=~\"$pool\"}",
+ "refId": "A",
+ "instant": false,
+ "range": true,
+ "legendFormat": "{{pool}}/{{vdev}} {{type}}"
+ }
+ ]
+ },
+ {
+ "type": "table",
+ "title": "Scrub & Resilver History",
+ "description": "Result of the last completed scrub per pool. Errors here are blocks that could not be repaired from redundancy.",
+ "id": 19,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 0,
+ "y": 35
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "custom": {
+ "align": "auto",
+ "cellOptions": {
+ "type": "auto"
+ },
+ "inspect": false,
+ "filterable": true
+ },
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Scrub Finished"
+ },
+ "properties": [
+ {
+ "id": "unit",
+ "value": "dateTimeAsIso"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Resilver Finished"
+ },
+ "properties": [
+ {
+ "id": "unit",
+ "value": "dateTimeAsIso"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Duration"
+ },
+ "properties": [
+ {
+ "id": "unit",
+ "value": "s"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Repaired"
+ },
+ "properties": [
+ {
+ "id": "unit",
+ "value": "bytes"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Errors"
+ },
+ "properties": [
+ {
+ "id": "custom.cellOptions",
+ "value": {
+ "type": "color-background",
+ "mode": "basic"
+ }
+ },
+ {
+ "id": "thresholds",
+ "value": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 1
+ }
+ ]
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "options": {
+ "showHeader": true,
+ "cellHeight": "sm",
+ "footer": {
+ "show": false,
+ "reducer": [
+ "sum"
+ ],
+ "countRows": false,
+ "fields": ""
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_pool_last_scrub_end_timestamp_seconds{pool=~\"$pool\"} * 1000",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_pool_last_scrub_duration_seconds{pool=~\"$pool\"}",
+ "refId": "B",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_pool_last_scrub_errors{pool=~\"$pool\"}",
+ "refId": "C",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_pool_last_scrub_repaired_bytes{pool=~\"$pool\"}",
+ "refId": "D",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_pool_last_resilver_end_timestamp_seconds{pool=~\"$pool\"} * 1000",
+ "refId": "E",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ }
+ ],
+ "transformations": [
+ {
+ "id": "filterFieldsByName",
+ "options": {
+ "include": {
+ "pattern": "pool|Value.*"
+ }
+ }
+ },
+ {
+ "id": "joinByField",
+ "options": {
+ "byField": "pool",
+ "mode": "outer"
+ }
+ },
+ {
+ "id": "organize",
+ "options": {
+ "excludeByName": {},
+ "indexByName": {},
+ "renameByName": {
+ "pool": "Pool",
+ "Value #A": "Scrub Finished",
+ "Value #B": "Duration",
+ "Value #C": "Errors",
+ "Value #D": "Repaired",
+ "Value #E": "Resilver Finished"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "timeseries",
+ "title": "Pool Data Errors",
+ "description": "Permanent data errors over time.",
+ "id": 20,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 7,
+ "w": 12,
+ "x": 12,
+ "y": 35
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "drawStyle": "line",
+ "lineInterpolation": "linear",
+ "lineWidth": 2,
+ "fillOpacity": 10,
+ "showPoints": "auto",
+ "spanNulls": true,
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "gradientMode": "none",
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "min": 0
+ },
+ "overrides": []
+ },
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_pool_data_errors{pool=~\"$pool\"}",
+ "refId": "A",
+ "instant": false,
+ "range": true,
+ "legendFormat": "{{pool}}"
+ }
+ ]
+ },
+ {
+ "type": "row",
+ "title": "Snapshots & Retention",
+ "id": 21,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 42
+ },
+ "collapsed": false,
+ "panels": []
+ },
+ {
+ "type": "bargauge",
+ "title": "Time Since Last Snapshot",
+ "description": "Age of the newest snapshot of each label. Compare against the label's own cadence \u2014 'frequent' is every 15 minutes, 'monthly' every month, so the colour thresholds here are only a coarse hint.",
+ "id": 22,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 8,
+ "x": 0,
+ "y": 43
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "yellow",
+ "value": 7200
+ },
+ {
+ "color": "red",
+ "value": 172800
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "options": {
+ "displayMode": "basic",
+ "orientation": "horizontal",
+ "showUnfilled": true,
+ "valueMode": "color",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "time() - max by (label) (zfs_pool_snapshot_newest_timestamp_seconds{pool=~\"$pool\"})",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "legendFormat": "{{label}}"
+ }
+ ]
+ },
+ {
+ "type": "bargauge",
+ "title": "Snapshots vs Retention Target",
+ "description": "Worst dataset's snapshot count as a fraction of the configured services.zfs.autoSnapshot retention. 100% means the full set is on disk; a freshly-created dataset legitimately sits below target until it fills up.",
+ "id": 23,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 8,
+ "x": 8,
+ "y": 43
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "red",
+ "value": null
+ },
+ {
+ "color": "yellow",
+ "value": 0.5
+ },
+ {
+ "color": "green",
+ "value": 0.9
+ }
+ ]
+ },
+ "unit": "percentunit",
+ "max": 1.2
+ },
+ "overrides": []
+ },
+ "options": {
+ "displayMode": "basic",
+ "orientation": "horizontal",
+ "showUnfilled": true,
+ "valueMode": "color",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "min by (label) (zfs_snapshot_count{pool=~\"$pool\"} / on(label) group_left() zfs_snapshot_retention_target)",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "legendFormat": "{{label}}"
+ }
+ ]
+ },
+ {
+ "type": "bargauge",
+ "title": "Oldest Snapshot",
+ "description": "How far back each label reaches.",
+ "id": 24,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 8,
+ "x": 16,
+ "y": 43
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "options": {
+ "displayMode": "basic",
+ "orientation": "horizontal",
+ "showUnfilled": true,
+ "valueMode": "color",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "time() - min by (label) (zfs_pool_snapshot_oldest_timestamp_seconds{pool=~\"$pool\"})",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "legendFormat": "{{label}}"
+ }
+ ]
+ },
+ {
+ "type": "timeseries",
+ "title": "Snapshot Count by Label",
+ "description": "Total snapshots per label. A steady sawtooth is healthy rotation; a monotonic decline means snapshots are expiring but not being replaced.",
+ "id": 25,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 51
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "drawStyle": "line",
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "fillOpacity": 15,
+ "showPoints": "never",
+ "spanNulls": true,
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "gradientMode": "none",
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "min": 0
+ },
+ "overrides": []
+ },
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "sum by (label) (zfs_snapshot_count{pool=~\"$pool\"})",
+ "refId": "A",
+ "instant": false,
+ "range": true,
+ "legendFormat": "{{label}}"
+ }
+ ]
+ },
+ {
+ "type": "timeseries",
+ "title": "Snapshot Space by Label",
+ "description": "Space held down by snapshots \u2014 the cost of your retention policy.",
+ "id": 26,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 51
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "drawStyle": "line",
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "fillOpacity": 40,
+ "showPoints": "never",
+ "spanNulls": true,
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "gradientMode": "none",
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "stacking": {
+ "group": "A",
+ "mode": "normal"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "bytes",
+ "min": 0
+ },
+ "overrides": []
+ },
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "sum by (label) (zfs_pool_snapshot_used_bytes{pool=~\"$pool\"})",
+ "refId": "A",
+ "instant": false,
+ "range": true,
+ "legendFormat": "{{label}}"
+ }
+ ]
+ },
+ {
+ "type": "stat",
+ "title": "Snapshot / Scrub Job Failures",
+ "description": "systemd units for the auto-snapshot and auto-scrub timers currently in a failed state.",
+ "id": 27,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 6,
+ "x": 0,
+ "y": 59
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 1
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "options": {
+ "colorMode": "background",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "textMode": "auto",
+ "wideLayout": true,
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "sum(node_systemd_unit_state{name=~\"zfs-(snapshot|scrub).*\",state=\"failed\"}) or vector(0)",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "legendFormat": "failed units"
+ }
+ ]
+ },
+ {
+ "type": "bargauge",
+ "title": "Time Since Timer Last Fired",
+ "description": "When each zfs-* systemd timer last triggered. This is the job side of the picture; the snapshot ages above are the result side.",
+ "id": 28,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 6,
+ "w": 18,
+ "x": 6,
+ "y": 59
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s"
+ },
+ "overrides": []
+ },
+ "options": {
+ "displayMode": "basic",
+ "orientation": "horizontal",
+ "showUnfilled": true,
+ "valueMode": "color",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "time() - node_systemd_timer_last_trigger_seconds{name=~\"zfs-.*\"}",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "legendFormat": "{{name}}"
+ }
+ ]
+ },
+ {
+ "type": "row",
+ "title": "Datasets",
+ "id": 29,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 65
+ },
+ "collapsed": false,
+ "panels": []
+ },
+ {
+ "type": "timeseries",
+ "title": "Dataset Usage Over Time",
+ "description": "Space each dataset is responsible for, including its snapshots and descendants \u2014 so a parent's line contains its children's. Unstacked and unfilled so a single dataset's growth is readable against the others rather than riding on top of them. The legend carries last and max per dataset; the instant breakdown is in 'Capacity by Dataset' below.",
+ "id": 30,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 9,
+ "w": 24,
+ "x": 0,
+ "y": 66
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "drawStyle": "line",
+ "lineInterpolation": "linear",
+ "lineWidth": 2,
+ "fillOpacity": 0,
+ "showPoints": "auto",
+ "spanNulls": true,
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "gradientMode": "none",
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "bytes",
+ "min": 0
+ },
+ "overrides": []
+ },
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_dataset_used_bytes{pool=~\"$pool\"}",
+ "refId": "A",
+ "instant": false,
+ "range": true,
+ "legendFormat": "{{dataset}}"
+ }
+ ]
+ },
+ {
+ "type": "table",
+ "title": "Capacity by Dataset",
+ "description": "Per-dataset space, separate from the per-pool figures above. 'Used' is the total a dataset is responsible for; 'Own Data' and 'Snapshots' are the two halves of that. 'Logical' is the size before compression, so Logical / Referenced is where the compression ratio comes from. 'Available' is shared with every sibling dataset unless a quota says otherwise.",
+ "id": 31,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 24,
+ "x": 0,
+ "y": 75
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "custom": {
+ "align": "auto",
+ "cellOptions": {
+ "type": "auto"
+ },
+ "inspect": false,
+ "filterable": true
+ },
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "^(Used|Own Data|Snapshots|Referenced|Logical|Available|Quota)$"
+ },
+ "properties": [
+ {
+ "id": "unit",
+ "value": "bytes"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Quota"
+ },
+ "properties": [
+ {
+ "id": "noValue",
+ "value": "none"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Ratio"
+ },
+ "properties": [
+ {
+ "id": "decimals",
+ "value": 2
+ }
+ ]
+ }
+ ]
+ },
+ "options": {
+ "showHeader": true,
+ "cellHeight": "sm",
+ "footer": {
+ "show": false,
+ "reducer": [
+ "sum"
+ ],
+ "countRows": false,
+ "fields": ""
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_dataset_used_bytes{pool=~\"$pool\"}",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "max by (dataset) (zfs_dataset_used_by_dataset_bytes{pool=~\"$pool\"})",
+ "refId": "B",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "max by (dataset) (zfs_dataset_used_by_snapshots_bytes{pool=~\"$pool\"})",
+ "refId": "C",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "max by (dataset) (zfs_dataset_referenced_bytes{pool=~\"$pool\"})",
+ "refId": "D",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "max by (dataset) (zfs_dataset_logical_used_bytes{pool=~\"$pool\"})",
+ "refId": "E",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "max by (dataset) (zfs_dataset_available_bytes{pool=~\"$pool\"})",
+ "refId": "F",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "max by (dataset) (zfs_dataset_compression_ratio{pool=~\"$pool\"})",
+ "refId": "G",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "max by (dataset) (zfs_dataset_quota_bytes{pool=~\"$pool\"} > 0)",
+ "refId": "H",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ }
+ ],
+ "transformations": [
+ {
+ "id": "filterFieldsByName",
+ "options": {
+ "include": {
+ "pattern": "pool|dataset|Value.*"
+ }
+ }
+ },
+ {
+ "id": "joinByField",
+ "options": {
+ "byField": "dataset",
+ "mode": "outer"
+ }
+ },
+ {
+ "id": "organize",
+ "options": {
+ "excludeByName": {},
+ "indexByName": {
+ "pool": 0,
+ "dataset": 1,
+ "Value #A": 2,
+ "Value #B": 3,
+ "Value #C": 4,
+ "Value #D": 5,
+ "Value #E": 6,
+ "Value #F": 7,
+ "Value #G": 8,
+ "Value #H": 9
+ },
+ "renameByName": {
+ "dataset": "Dataset",
+ "pool": "Pool",
+ "Value #A": "Used",
+ "Value #B": "Own Data",
+ "Value #C": "Snapshots",
+ "Value #D": "Referenced",
+ "Value #E": "Logical",
+ "Value #F": "Available",
+ "Value #G": "Ratio",
+ "Value #H": "Quota"
+ }
+ }
+ },
+ {
+ "id": "sortBy",
+ "options": {
+ "fields": {},
+ "sort": [
+ {
+ "field": "Used",
+ "desc": true
+ }
+ ]
+ }
+ }
+ ]
+ },
+ {
+ "type": "table",
+ "title": "Compression",
+ "description": "group_left() attaches the algorithm label from the info metric onto the ratio, so this needs only one query and no join transformation.",
+ "id": 32,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 83
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "custom": {
+ "align": "auto",
+ "cellOptions": {
+ "type": "auto"
+ },
+ "inspect": false,
+ "filterable": true
+ },
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "options": {
+ "showHeader": true,
+ "cellHeight": "sm",
+ "footer": {
+ "show": false,
+ "reducer": [
+ "sum"
+ ],
+ "countRows": false,
+ "fields": ""
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_dataset_compression_ratio{pool=~\"$pool\"} * on(pool, dataset) group_left(compression) zfs_dataset_compression{pool=~\"$pool\"}",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ }
+ ],
+ "transformations": [
+ {
+ "id": "filterFieldsByName",
+ "options": {
+ "include": {
+ "pattern": "pool|dataset|compression|Value"
+ }
+ }
+ },
+ {
+ "id": "organize",
+ "options": {
+ "excludeByName": {},
+ "indexByName": {
+ "pool": 0,
+ "dataset": 1,
+ "compression": 2,
+ "Value": 3
+ },
+ "renameByName": {
+ "pool": "Pool",
+ "dataset": "Dataset",
+ "compression": "Algorithm",
+ "Value": "Ratio"
+ }
+ }
+ },
+ {
+ "id": "sortBy",
+ "options": {
+ "fields": {},
+ "sort": [
+ {
+ "field": "Ratio",
+ "desc": true
+ }
+ ]
+ }
+ }
+ ]
+ },
+ {
+ "type": "table",
+ "title": "Encryption",
+ "description": "Encryption suite per dataset and the state of its key. Datasets that are not encrypted show suite 'off' and a dash \u2014 only an encrypted dataset can be locked.",
+ "id": 33,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 83
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [
+ {
+ "type": "value",
+ "options": {
+ "0": {
+ "text": "\u2014",
+ "color": "text",
+ "index": 0
+ },
+ "1": {
+ "text": "unlocked",
+ "color": "green",
+ "index": 1
+ },
+ "2": {
+ "text": "LOCKED",
+ "color": "red",
+ "index": 2
+ },
+ "3": {
+ "text": "unknown",
+ "color": "orange",
+ "index": 3
+ }
+ }
+ }
+ ],
+ "custom": {
+ "align": "auto",
+ "cellOptions": {
+ "type": "auto"
+ },
+ "inspect": false,
+ "filterable": true
+ },
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Key"
+ },
+ "properties": [
+ {
+ "id": "custom.cellOptions",
+ "value": {
+ "type": "color-background",
+ "mode": "basic"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "options": {
+ "showHeader": true,
+ "cellHeight": "sm",
+ "footer": {
+ "show": false,
+ "reducer": [
+ "sum"
+ ],
+ "countRows": false,
+ "fields": ""
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_dataset_keystatus_code{pool=~\"$pool\"} * on(pool, dataset) group_left(encryption) zfs_dataset_encryption{pool=~\"$pool\"}",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ }
+ ],
+ "transformations": [
+ {
+ "id": "filterFieldsByName",
+ "options": {
+ "include": {
+ "pattern": "pool|dataset|encryption|Value"
+ }
+ }
+ },
+ {
+ "id": "organize",
+ "options": {
+ "excludeByName": {},
+ "indexByName": {
+ "pool": 0,
+ "dataset": 1,
+ "encryption": 2,
+ "Value": 3
+ },
+ "renameByName": {
+ "pool": "Pool",
+ "dataset": "Dataset",
+ "encryption": "Suite",
+ "Value": "Key"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "type": "row",
+ "title": "Performance",
+ "id": 34,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 91
+ },
+ "collapsed": false,
+ "panels": []
+ },
+ {
+ "type": "timeseries",
+ "title": "Dataset Throughput",
+ "description": "Per-dataset throughput from node_exporter's objset kstats. Writes are drawn negative.",
+ "id": 35,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 92
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "drawStyle": "line",
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "fillOpacity": 15,
+ "showPoints": "never",
+ "spanNulls": true,
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "gradientMode": "none",
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "Bps"
+ },
+ "overrides": []
+ },
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "rate(node_zfs_zpool_dataset_nread{zpool=~\"$pool\"}[$__rate_interval])",
+ "refId": "A",
+ "instant": false,
+ "range": true,
+ "legendFormat": "{{zpool}}/{{dataset}} read"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "-rate(node_zfs_zpool_dataset_nwritten{zpool=~\"$pool\"}[$__rate_interval])",
+ "refId": "B",
+ "instant": false,
+ "range": true,
+ "legendFormat": "{{zpool}}/{{dataset}} write"
+ }
+ ]
+ },
+ {
+ "type": "timeseries",
+ "title": "Dataset IOPS",
+ "description": "Writes are drawn negative.",
+ "id": 36,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 92
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "drawStyle": "line",
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "fillOpacity": 15,
+ "showPoints": "never",
+ "spanNulls": true,
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "gradientMode": "none",
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "iops"
+ },
+ "overrides": []
+ },
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "rate(node_zfs_zpool_dataset_reads{zpool=~\"$pool\"}[$__rate_interval])",
+ "refId": "A",
+ "instant": false,
+ "range": true,
+ "legendFormat": "{{zpool}}/{{dataset}} read"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "-rate(node_zfs_zpool_dataset_writes{zpool=~\"$pool\"}[$__rate_interval])",
+ "refId": "B",
+ "instant": false,
+ "range": true,
+ "legendFormat": "{{zpool}}/{{dataset}} write"
+ }
+ ]
+ },
+ {
+ "type": "timeseries",
+ "title": "ARC Size",
+ "description": "",
+ "id": 37,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 8,
+ "x": 0,
+ "y": 100
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "drawStyle": "line",
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "fillOpacity": 15,
+ "showPoints": "never",
+ "spanNulls": true,
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "gradientMode": "none",
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "bytes",
+ "min": 0
+ },
+ "overrides": []
+ },
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "node_zfs_arc_size",
+ "refId": "A",
+ "instant": false,
+ "range": true,
+ "legendFormat": "size"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "node_zfs_arc_c_max",
+ "refId": "B",
+ "instant": false,
+ "range": true,
+ "legendFormat": "target max (c_max)"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "node_zfs_arc_c_min",
+ "refId": "C",
+ "instant": false,
+ "range": true,
+ "legendFormat": "target min (c_min)"
+ }
+ ]
+ },
+ {
+ "type": "timeseries",
+ "title": "ARC Hit Ratio",
+ "description": "clamp_min avoids a divide-by-zero while the pool is idle.",
+ "id": 38,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 8,
+ "x": 8,
+ "y": 100
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "drawStyle": "line",
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "fillOpacity": 15,
+ "showPoints": "never",
+ "spanNulls": true,
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "gradientMode": "none",
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "percentunit",
+ "min": 0
+ },
+ "overrides": []
+ },
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "rate(node_zfs_arc_hits[$__rate_interval]) / clamp_min(rate(node_zfs_arc_hits[$__rate_interval]) + rate(node_zfs_arc_misses[$__rate_interval]), 1)",
+ "refId": "A",
+ "instant": false,
+ "range": true,
+ "legendFormat": "hit ratio"
+ }
+ ]
+ },
+ {
+ "type": "timeseries",
+ "title": "ARC Hits / Misses",
+ "description": "",
+ "id": 39,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 8,
+ "x": 16,
+ "y": 100
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "drawStyle": "line",
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "fillOpacity": 15,
+ "showPoints": "never",
+ "spanNulls": true,
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "gradientMode": "none",
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "ops",
+ "min": 0
+ },
+ "overrides": []
+ },
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "rate(node_zfs_arc_hits[$__rate_interval])",
+ "refId": "A",
+ "instant": false,
+ "range": true,
+ "legendFormat": "hits"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "rate(node_zfs_arc_misses[$__rate_interval])",
+ "refId": "B",
+ "instant": false,
+ "range": true,
+ "legendFormat": "misses"
+ }
+ ]
+ },
+ {
+ "type": "row",
+ "title": "Pool Internals",
+ "id": 44,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 108
+ },
+ "collapsed": true,
+ "panels": [
+ {
+ "type": "timeseries",
+ "title": "Reclaim & Leaks",
+ "description": "`freeing` is space still being reclaimed in the background after a delete. `leaked` should always be zero.",
+ "id": 40,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 7,
+ "w": 8,
+ "x": 0,
+ "y": 109
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "drawStyle": "line",
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "fillOpacity": 15,
+ "showPoints": "never",
+ "spanNulls": true,
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "gradientMode": "none",
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "bytes",
+ "min": 0
+ },
+ "overrides": []
+ },
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_pool_freeing_bytes{pool=~\"$pool\"}",
+ "refId": "A",
+ "instant": false,
+ "range": true,
+ "legendFormat": "{{pool}} freeing"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_pool_leaked_bytes{pool=~\"$pool\"}",
+ "refId": "B",
+ "instant": false,
+ "range": true,
+ "legendFormat": "{{pool}} leaked"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_pool_checkpoint_bytes{pool=~\"$pool\"}",
+ "refId": "C",
+ "instant": false,
+ "range": true,
+ "legendFormat": "{{pool}} checkpoint"
+ }
+ ]
+ },
+ {
+ "type": "timeseries",
+ "title": "Dedup Ratio",
+ "description": "1.00 unless deduplication is enabled, which it usually should not be.",
+ "id": 41,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 7,
+ "w": 8,
+ "x": 8,
+ "y": 109
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "drawStyle": "line",
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "fillOpacity": 15,
+ "showPoints": "never",
+ "spanNulls": true,
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "gradientMode": "none",
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "min": 0
+ },
+ "overrides": []
+ },
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_pool_dedup_ratio{pool=~\"$pool\"}",
+ "refId": "A",
+ "instant": false,
+ "range": true,
+ "legendFormat": "{{pool}}"
+ }
+ ]
+ },
+ {
+ "type": "timeseries",
+ "title": "Pool Health History",
+ "description": "Health code over time \u2014 useful for spotting a pool that briefly degraded and recovered. zfs_pool_scan_state is also collected if you want to plot scrub/resilver phases alongside it.",
+ "id": 42,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 7,
+ "w": 8,
+ "x": 16,
+ "y": 109
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "drawStyle": "line",
+ "lineInterpolation": "stepAfter",
+ "lineWidth": 2,
+ "fillOpacity": 0,
+ "showPoints": "never",
+ "spanNulls": true,
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "gradientMode": "none",
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [
+ {
+ "type": "value",
+ "options": {
+ "0": {
+ "text": "ONLINE",
+ "color": "green",
+ "index": 0
+ },
+ "1": {
+ "text": "DEGRADED",
+ "color": "orange",
+ "index": 1
+ },
+ "2": {
+ "text": "FAULTED",
+ "color": "red",
+ "index": 2
+ },
+ "3": {
+ "text": "OFFLINE",
+ "color": "text",
+ "index": 3
+ },
+ "4": {
+ "text": "UNAVAIL",
+ "color": "red",
+ "index": 4
+ },
+ "5": {
+ "text": "REMOVED",
+ "color": "purple",
+ "index": 5
+ },
+ "6": {
+ "text": "SUSPENDED",
+ "color": "red",
+ "index": 6
+ },
+ "7": {
+ "text": "AVAIL",
+ "color": "blue",
+ "index": 7
+ },
+ "8": {
+ "text": "UNKNOWN",
+ "color": "text",
+ "index": 8
+ }
+ }
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "min": 0,
+ "max": 8
+ },
+ "overrides": []
+ },
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_pool_health_code{pool=~\"$pool\"}",
+ "refId": "A",
+ "instant": false,
+ "range": true,
+ "legendFormat": "{{pool}}"
+ }
+ ]
+ },
+ {
+ "type": "table",
+ "title": "Dataset Properties",
+ "description": "A quota of 0 means unlimited. Auto-snapshot reflects the com.sun:auto-snapshot property that zfs-auto-snapshot honours.",
+ "id": 43,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 24,
+ "x": 0,
+ "y": 116
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "custom": {
+ "align": "auto",
+ "cellOptions": {
+ "type": "auto"
+ },
+ "inspect": false,
+ "filterable": true
+ },
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Record Size"
+ },
+ "properties": [
+ {
+ "id": "unit",
+ "value": "bytes"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Quota"
+ },
+ "properties": [
+ {
+ "id": "unit",
+ "value": "bytes"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Ref Quota"
+ },
+ "properties": [
+ {
+ "id": "unit",
+ "value": "bytes"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Auto-snapshot"
+ },
+ "properties": [
+ {
+ "id": "mappings",
+ "value": [
+ {
+ "type": "value",
+ "options": {
+ "0": {
+ "text": "no",
+ "color": "orange",
+ "index": 0
+ },
+ "1": {
+ "text": "yes",
+ "color": "green",
+ "index": 1
+ }
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ "options": {
+ "showHeader": true,
+ "cellHeight": "sm",
+ "footer": {
+ "show": false,
+ "reducer": [
+ "sum"
+ ],
+ "countRows": false,
+ "fields": ""
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_dataset_recordsize_bytes{pool=~\"$pool\"}",
+ "refId": "A",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_dataset_quota_bytes{pool=~\"$pool\"}",
+ "refId": "B",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_dataset_refquota_bytes{pool=~\"$pool\"}",
+ "refId": "C",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_dataset_autosnapshot_enabled{pool=~\"$pool\"}",
+ "refId": "D",
+ "instant": true,
+ "range": false,
+ "format": "table"
+ }
+ ],
+ "transformations": [
+ {
+ "id": "filterFieldsByName",
+ "options": {
+ "include": {
+ "pattern": "dataset|Value.*"
+ }
+ }
+ },
+ {
+ "id": "joinByField",
+ "options": {
+ "byField": "dataset",
+ "mode": "outer"
+ }
+ },
+ {
+ "id": "organize",
+ "options": {
+ "excludeByName": {},
+ "indexByName": {},
+ "renameByName": {
+ "dataset": "Dataset",
+ "Value #A": "Record Size",
+ "Value #B": "Quota",
+ "Value #C": "Ref Quota",
+ "Value #D": "Auto-snapshot"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "row",
+ "title": "Collector Health",
+ "id": 48,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 109
+ },
+ "collapsed": true,
+ "panels": [
+ {
+ "type": "timeseries",
+ "title": "ZFS Collector Duration",
+ "description": "How long collectors/zfs-metrics.py takes. Listing every snapshot is the slow part; if this approaches the 1 minute timer interval, raise OnUnitActiveSec.",
+ "id": 45,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 7,
+ "w": 8,
+ "x": 0,
+ "y": 110
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "drawStyle": "line",
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "fillOpacity": 15,
+ "showPoints": "never",
+ "spanNulls": true,
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "gradientMode": "none",
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s",
+ "min": 0
+ },
+ "overrides": []
+ },
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "zfs_metrics_collection_duration_seconds",
+ "refId": "A",
+ "instant": false,
+ "range": true,
+ "legendFormat": "collection"
+ }
+ ]
+ },
+ {
+ "type": "timeseries",
+ "title": "Textfile Age",
+ "description": "Age of each .prom file. If this climbs without bound the collector has stopped writing and every ZFS metric above is stale.",
+ "id": 46,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 7,
+ "w": 8,
+ "x": 8,
+ "y": 110
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "drawStyle": "line",
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "fillOpacity": 15,
+ "showPoints": "never",
+ "spanNulls": true,
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "gradientMode": "none",
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "unit": "s",
+ "min": 0
+ },
+ "overrides": []
+ },
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "time() - node_textfile_mtime_seconds",
+ "refId": "A",
+ "instant": false,
+ "range": true,
+ "legendFormat": "{{file}}"
+ }
+ ]
+ },
+ {
+ "type": "timeseries",
+ "title": "Scrape Health",
+ "description": "node_textfile_scrape_error goes to 1 if a .prom file is malformed, in which case node_exporter drops it entirely.",
+ "id": 47,
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "gridPos": {
+ "h": 7,
+ "w": 8,
+ "x": 16,
+ "y": 110
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "drawStyle": "line",
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "fillOpacity": 15,
+ "showPoints": "never",
+ "spanNulls": true,
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "gradientMode": "none",
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ },
+ "min": 0
+ },
+ "overrides": []
+ },
+ "options": {
+ "legend": {
+ "calcs": [
+ "lastNotNull",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "up{job=\"node\"}",
+ "refId": "A",
+ "instant": false,
+ "range": true,
+ "legendFormat": "node exporter up"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "prometheus"
+ },
+ "editorMode": "code",
+ "expr": "node_textfile_scrape_error",
+ "refId": "B",
+ "instant": false,
+ "range": true,
+ "legendFormat": "textfile parse error"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}