aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--flake.lock269
-rw-r--r--flake.nix91
-rw-r--r--hosts/by-name/server2/configuration.nix23
-rw-r--r--hosts/by-name/server2/secrets/grafana/adminPassword.age17
-rw-r--r--hosts/by-name/server2/secrets/grafana/secretKey.age18
-rw-r--r--hosts/by-name/server3/configuration.nix50
-rw-r--r--hosts/by-name/server3/secrets/rocie/login.age16
-rw-r--r--hosts/by-name/server3/websites.nix8
-rw-r--r--hosts/default.nix14
-rw-r--r--modules/by-name/gi/git-back/module.nix33
-rw-r--r--modules/default.nix8
-rw-r--r--modules/vhack/an/anubis/module.nix (renamed from modules/by-name/an/anubis/module.nix)0
-rw-r--r--modules/vhack/at/atuin-sync/module.nix (renamed from modules/by-name/at/atuin-sync/module.nix)11
-rw-r--r--modules/vhack/ba/backup/module.nix (renamed from modules/by-name/ba/backup/module.nix)0
-rw-r--r--modules/vhack/co/constants/module.nix (renamed from modules/by-name/co/constants/module.nix)12
-rw-r--r--modules/vhack/co/coredump/module.nix (renamed from modules/by-name/co/coredump/module.nix)0
-rw-r--r--modules/vhack/dh/dhcpcd/module.nix (renamed from modules/by-name/dh/dhcpcd/module.nix)0
-rw-r--r--modules/vhack/di/disko/module.nix (renamed from modules/by-name/di/disko/module.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/default.nix (renamed from modules/by-name/dn/dns/dns/default.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/default.nix (renamed from modules/by-name/dn/dns/dns/types/default.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/record.nix (renamed from modules/by-name/dn/dns/dns/types/record.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/A.nix (renamed from modules/by-name/dn/dns/dns/types/records/A.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/AAAA.nix (renamed from modules/by-name/dn/dns/dns/types/records/AAAA.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/CAA.nix (renamed from modules/by-name/dn/dns/dns/types/records/CAA.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/CNAME.nix (renamed from modules/by-name/dn/dns/dns/types/records/CNAME.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/DKIM.nix (renamed from modules/by-name/dn/dns/dns/types/records/DKIM.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/DMARC.nix (renamed from modules/by-name/dn/dns/dns/types/records/DMARC.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/DNAME.nix (renamed from modules/by-name/dn/dns/dns/types/records/DNAME.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/DNSKEY.nix (renamed from modules/by-name/dn/dns/dns/types/records/DNSKEY.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/DS.nix (renamed from modules/by-name/dn/dns/dns/types/records/DS.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/HTTPS.nix (renamed from modules/by-name/dn/dns/dns/types/records/HTTPS.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/MTA-STS.nix (renamed from modules/by-name/dn/dns/dns/types/records/MTA-STS.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/MX.nix (renamed from modules/by-name/dn/dns/dns/types/records/MX.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/NS.nix (renamed from modules/by-name/dn/dns/dns/types/records/NS.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/OPENPGPKEY.nix (renamed from modules/by-name/dn/dns/dns/types/records/OPENPGPKEY.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/PTR.nix (renamed from modules/by-name/dn/dns/dns/types/records/PTR.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/SOA.nix (renamed from modules/by-name/dn/dns/dns/types/records/SOA.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/SRV.nix (renamed from modules/by-name/dn/dns/dns/types/records/SRV.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/SSHFP.nix (renamed from modules/by-name/dn/dns/dns/types/records/SSHFP.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/SVCB.nix (renamed from modules/by-name/dn/dns/dns/types/records/SVCB.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/TLSA.nix (renamed from modules/by-name/dn/dns/dns/types/records/TLSA.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/TXT.nix (renamed from modules/by-name/dn/dns/dns/types/records/TXT.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/default.nix (renamed from modules/by-name/dn/dns/dns/types/records/default.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/records/dnssec.nix (renamed from modules/by-name/dn/dns/dns/types/records/dnssec.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/simple.nix (renamed from modules/by-name/dn/dns/dns/types/simple.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/types/zone.nix (renamed from modules/by-name/dn/dns/dns/types/zone.nix)0
-rw-r--r--modules/vhack/dn/dns/dns/util/default.nix (renamed from modules/by-name/dn/dns/dns/util/default.nix)0
-rw-r--r--modules/vhack/dn/dns/module.nix (renamed from modules/by-name/dn/dns/module.nix)0
-rw-r--r--modules/vhack/et/etesync/module.nix (renamed from modules/by-name/et/etesync/module.nix)0
-rw-r--r--modules/vhack/fa/fail2ban/module.nix (renamed from modules/by-name/fa/fail2ban/module.nix)0
-rw-r--r--modules/vhack/ga/gallery/module.nix (renamed from modules/by-name/ga/gallery/module.nix)0
-rw-r--r--modules/vhack/gi/git-back/module.nix33
-rw-r--r--modules/vhack/gi/git-server/css.nix (renamed from modules/by-name/gi/git-server/css.nix)0
-rw-r--r--modules/vhack/gi/git-server/module.nix (renamed from modules/by-name/gi/git-server/module.nix)11
-rw-r--r--modules/vhack/gr/grocy/module.nix (renamed from modules/by-name/gr/grocy/module.nix)0
-rw-r--r--modules/vhack/im/impermanence/module.nix (renamed from modules/by-name/im/impermanence/module.nix)0
-rw-r--r--modules/vhack/in/invidious-router/module.nix (renamed from modules/by-name/in/invidious-router/module.nix)4
-rw-r--r--modules/vhack/ma/mail/module.nix (renamed from modules/by-name/ma/mail/module.nix)40
-rw-r--r--modules/vhack/ma/mastodon/module.nix (renamed from modules/by-name/ma/mastodon/module.nix)0
-rw-r--r--modules/vhack/ma/mastodon/patches/0001-feat-treewide-Increase-character-limit-to-5000-in-me.patch (renamed from modules/by-name/ma/mastodon/patches/0001-feat-treewide-Increase-character-limit-to-5000-in-me.patch)28
-rw-r--r--modules/vhack/ma/matrix/module.nix (renamed from modules/by-name/ma/matrix/module.nix)10
-rw-r--r--modules/vhack/mi/miniflux/module.nix (renamed from modules/by-name/mi/miniflux/module.nix)0
-rw-r--r--modules/vhack/mo/monitoring/components/grafana.nix309
-rw-r--r--modules/vhack/mo/monitoring/components/loki.nix170
-rw-r--r--modules/vhack/mo/monitoring/components/perses.nix17
-rw-r--r--modules/vhack/mo/monitoring/components/prometheus.nix272
-rw-r--r--modules/vhack/mo/monitoring/components/scrutiny.nix100
-rw-r--r--modules/vhack/mo/monitoring/dashboards/node_exporter.json21817
-rw-r--r--modules/vhack/mo/monitoring/dashboards/performance.json1606
-rw-r--r--modules/vhack/mo/monitoring/dashboards/scraping_jobs.json334
-rw-r--r--modules/vhack/mo/monitoring/dashboards/systemd_exporter.json2870
-rw-r--r--modules/vhack/mo/monitoring/module.nix31
-rw-r--r--modules/vhack/mo/monitoring/rules.json386
-rw-r--r--modules/vhack/mu/murmur/module.nix (renamed from modules/by-name/mu/murmur/module.nix)7
-rw-r--r--modules/vhack/ne/nextcloud/module.nix (renamed from modules/by-name/ne/nextcloud/module.nix)12
-rw-r--r--modules/vhack/ng/nginx/module.nix (renamed from modules/by-name/ng/nginx/module.nix)41
-rw-r--r--modules/vhack/ni/nix-sync/internal_module.nix (renamed from modules/by-name/ni/nix-sync/internal_module.nix)0
-rw-r--r--modules/vhack/ni/nix-sync/module.nix (renamed from modules/by-name/ni/nix-sync/module.nix)0
-rw-r--r--modules/vhack/ni/nixconfig/module.nix (renamed from modules/by-name/ni/nixconfig/module.nix)0
-rw-r--r--modules/vhack/ns/nscd/module.nix (renamed from modules/by-name/ns/nscd/module.nix)0
-rw-r--r--modules/vhack/oo/oomd/module.nix (renamed from modules/by-name/oo/oomd/module.nix)0
-rw-r--r--modules/vhack/op/openssh/module.nix (renamed from modules/by-name/op/openssh/module.nix)0
-rw-r--r--modules/vhack/pe/peertube/module.nix (renamed from modules/by-name/pe/peertube/module.nix)0
-rw-r--r--modules/vhack/po/postgresql/module.nix (renamed from modules/by-name/po/postgresql/module.nix)0
-rw-r--r--modules/vhack/re/redlib/module.nix (renamed from modules/by-name/re/redlib/module.nix)0
-rw-r--r--modules/vhack/re/resolvconf/module.nix (renamed from modules/by-name/re/resolvconf/module.nix)0
-rw-r--r--modules/vhack/ro/rocie/module.nix59
-rw-r--r--modules/vhack/ru/rust-motd/module.nix (renamed from modules/by-name/ru/rust-motd/module.nix)0
-rw-r--r--modules/vhack/sh/sharkey/module.nix (renamed from modules/by-name/sh/sharkey/module.nix)3
-rw-r--r--modules/vhack/st/stalwart-mail/module.nix (renamed from modules/by-name/st/stalwart-mail/module.nix)0
-rw-r--r--modules/vhack/st/stalwart-mail/settings.nix (renamed from modules/by-name/st/stalwart-mail/settings.nix)2
-rw-r--r--modules/vhack/sy/system-info/module.nix (renamed from modules/by-name/sy/system-info/module.nix)4
-rw-r--r--modules/vhack/ta/taskchampion-sync/module.nix (renamed from modules/by-name/ta/taskchampion-sync/module.nix)15
-rw-r--r--modules/vhack/us/users/module.nix (renamed from modules/by-name/us/users/module.nix)2
-rw-r--r--pkgs/by-name/at/atuin-server-only/package.nix22
-rw-r--r--pkgs/by-name/st/stalwart-mail-patched/spam-filter.nix4
-rwxr-xr-xpkgs/by-name/st/stalwart-mail-patched/update.sh5
-rwxr-xr-xpkgs/by-name/st/stalwart-mail-patched/update.sh.ignored5
-rwxr-xr-xscripts/build.sh36
-rwxr-xr-xscripts/check.sh54
-rw-r--r--scripts/check_get_tests.nix16
-rwxr-xr-xscripts/ping_hosts.sh12
-rw-r--r--scripts/update_hosts.remote48
-rwxr-xr-xscripts/update_hosts.sh86
-rw-r--r--secrets.nix1
-rw-r--r--tests/by-name/at/atuin-sync/test.nix158
-rw-r--r--tests/by-name/ba/back/test.nix46
-rw-r--r--tests/by-name/em/email-dns/test.nix3
-rw-r--r--tests/by-name/em/email-http/test.nix3
-rw-r--r--tests/by-name/em/email-ip/test.nix3
-rw-r--r--tests/by-name/gi/git-server/test.nix57
-rw-r--r--tests/by-name/mo/monitoring-basic/test.nix67
-rw-r--r--tests/by-name/mo/monitoring-federation/test.nix109
-rw-r--r--tests/by-name/ro/rocie/secrets/login.age16
-rw-r--r--tests/by-name/ro/rocie/test.nix47
-rw-r--r--tests/by-name/ru/rust-motd/test.nix47
-rw-r--r--tests/by-name/sh/sharkey-cpu/test.nix59
-rw-r--r--tests/by-name/sh/sharkey/test.nix87
-rw-r--r--tests/by-name/ta/taskchampion-sync/test.nix69
-rw-r--r--tests/common/acme/default.nix7
-rw-r--r--tests/default.nix258
-rwxr-xr-xupdate.sh5
-rw-r--r--zones/default.nix3
-rw-r--r--zones/j-schoeffel.de/zone.nix149
-rw-r--r--zones/jaki-schoeffel.de/zone.nix149
-rw-r--r--zones/jaki.li/zone.nix149
-rw-r--r--zones/vhack.eu/zone.nix7
127 files changed, 29824 insertions, 716 deletions
diff --git a/flake.lock b/flake.lock
index 8f28118..b60e6e8 100644
--- a/flake.lock
+++ b/flake.lock
@@ -3,7 +3,9 @@
"agenix": {
"inputs": {
"darwin": "darwin",
- "home-manager": "home-manager",
+ "home-manager": [
+ "home-manager"
+ ],
"nixpkgs": [
"nixpkgs"
],
@@ -12,11 +14,11 @@
]
},
"locked": {
- "lastModified": 1762618334,
- "narHash": "sha256-wyT7Pl6tMFbFrs8Lk/TlEs81N6L+VSybPfiIgzU8lbQ=",
+ "lastModified": 1770165109,
+ "narHash": "sha256-9VnK6Oqai65puVJ4WYtCTvlJeXxMzAp/69HhQuTdl/I=",
"owner": "ryantm",
"repo": "agenix",
- "rev": "fcdea223397448d35d9b31f798479227e80183f6",
+ "rev": "b027ee29d959fda4b60b57566d64c98a202e0feb",
"type": "github"
},
"original": {
@@ -25,36 +27,6 @@
"type": "github"
}
},
- "back": {
- "inputs": {
- "flake-utils": [
- "flake-utils"
- ],
- "nixpkgs": [
- "nixpkgs"
- ],
- "systems": [
- "systems"
- ],
- "treefmt-nix": [
- "treefmt-nix"
- ]
- },
- "locked": {
- "lastModified": 1749285532,
- "narHash": "sha256-F3uPg5oVt2h3qIii98C9WiAK0USc8XHftV3rxJASp/o=",
- "ref": "prime",
- "rev": "0ab592d0ede24460c665db3d3e052aa80fb298f6",
- "revCount": 24,
- "type": "git",
- "url": "https://git.foss-syndicate.org/vhack.eu/git_bug/back"
- },
- "original": {
- "ref": "prime",
- "type": "git",
- "url": "https://git.foss-syndicate.org/vhack.eu/git_bug/back"
- }
- },
"blobs": {
"flake": false,
"locked": {
@@ -73,11 +45,11 @@
},
"crane": {
"locked": {
- "lastModified": 1765739568,
- "narHash": "sha256-gQYx35Of4UDKUjAYvmxjUEh/DdszYeTtT6MDin4loGE=",
+ "lastModified": 1787326676,
+ "narHash": "sha256-lWhBbBvC05/xwivKBBiM2YNizpmgqCgyOIzomvRuwxs=",
"owner": "ipetkov",
"repo": "crane",
- "rev": "67d2baff0f9f677af35db61b32b5df6863bcc075",
+ "rev": "692f7e9ef2ece8125b466f66f2af532b3edaed0d",
"type": "github"
},
"original": {
@@ -108,32 +80,6 @@
"type": "github"
}
},
- "deploy-rs": {
- "inputs": {
- "flake-compat": [
- "flake-compat"
- ],
- "nixpkgs": [
- "nixpkgs"
- ],
- "utils": [
- "flake-utils"
- ]
- },
- "locked": {
- "lastModified": 1762286984,
- "narHash": "sha256-9I2H9x5We6Pl+DBYHjR1s3UT8wgwcpAH03kn9CqtdQc=",
- "owner": "serokell",
- "repo": "deploy-rs",
- "rev": "9c870f63e28ec1e83305f7f6cb73c941e699f74f",
- "type": "github"
- },
- "original": {
- "owner": "serokell",
- "repo": "deploy-rs",
- "type": "github"
- }
- },
"disko": {
"inputs": {
"nixpkgs": [
@@ -141,11 +87,11 @@
]
},
"locked": {
- "lastModified": 1765794845,
- "narHash": "sha256-YD5QWlGnusNbZCqR3pxG8tRxx9yUXayLZfAJRWspq2s=",
+ "lastModified": 1781152676,
+ "narHash": "sha256-RxWs5ND31KzTG7wvMM+PMfUjyNpmIEr999lqNARaM5o=",
"owner": "nix-community",
"repo": "disko",
- "rev": "7194cfe5b7a3660726b0fe7296070eaef601cae9",
+ "rev": "ff8702b4de27f72b4c78573dfb89ec74e36abdf1",
"type": "github"
},
"original": {
@@ -157,11 +103,11 @@
"flake-compat": {
"flake": false,
"locked": {
- "lastModified": 1765121682,
- "narHash": "sha256-4VBOP18BFeiPkyhy9o4ssBNQEvfvv1kXkasAYd0+rrA=",
+ "lastModified": 1767039857,
+ "narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
"owner": "edolstra",
"repo": "flake-compat",
- "rev": "65f23138d8d09a92e30f1e5c87611b23ef451bf3",
+ "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
"type": "github"
},
"original": {
@@ -203,11 +149,11 @@
]
},
"locked": {
- "lastModified": 1763319842,
- "narHash": "sha256-YG19IyrTdnVn0l3DvcUYm85u3PaqBt6tI6VvolcuHnA=",
+ "lastModified": 1778507602,
+ "narHash": "sha256-kTwur1wV+01SdqskVMSo6JMEpg71ps3HpbFY2GsflKs=",
"owner": "cachix",
"repo": "git-hooks.nix",
- "rev": "7275fa67fbbb75891c16d9dee7d88e58aea2d761",
+ "rev": "61ab0e80d9c7ab14c256b5b453d8b3fb0189ba0a",
"type": "github"
},
"original": {
@@ -241,31 +187,39 @@
"home-manager": {
"inputs": {
"nixpkgs": [
- "agenix",
"nixpkgs"
]
},
"locked": {
- "lastModified": 1745494811,
- "narHash": "sha256-YZCh2o9Ua1n9uCvrvi5pRxtuVNml8X2a03qIFfRKpFs=",
+ "lastModified": 1787377438,
+ "narHash": "sha256-Sxu1NLTD/Ern6hFGLlZmtKCSct3YQXZI/lls8RE1XeM=",
"owner": "nix-community",
"repo": "home-manager",
- "rev": "abfad3d2958c9e6300a883bd443512c55dfeb1be",
+ "rev": "65258d5c65a250189fde2e35f490d15e064c4c62",
"type": "github"
},
"original": {
"owner": "nix-community",
+ "ref": "release-26.05",
"repo": "home-manager",
"type": "github"
}
},
"impermanence": {
+ "inputs": {
+ "home-manager": [
+ "home-manager"
+ ],
+ "nixpkgs": [
+ "nixpkgs"
+ ]
+ },
"locked": {
- "lastModified": 1737831083,
- "narHash": "sha256-LJggUHbpyeDvNagTUrdhe/pRVp4pnS6wVKALS782gRI=",
+ "lastModified": 1769548169,
+ "narHash": "sha256-03+JxvzmfwRu+5JafM0DLbxgHttOQZkUtDWBmeUkN8Y=",
"owner": "nix-community",
"repo": "impermanence",
- "rev": "4b3e914cdf97a5b536a889e939fb2fd2b043a170",
+ "rev": "7b1d382faf603b6d264f58627330f9faa5cba149",
"type": "github"
},
"original": {
@@ -292,27 +246,27 @@
},
"nixpkgs": {
"locked": {
- "lastModified": 1765984163,
- "narHash": "sha256-RNFlX1Dj0DuvXkbwtglNKFxYxhwh20m/oUN0Le54UXY=",
+ "lastModified": 1787457369,
+ "narHash": "sha256-4r1TqYC5uVPLWSJcN3zHeUOYz1RCgCAC38j88+BALag=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "e5c822e4a0e21274ec0b53bdb5c73ac3c470c263",
+ "rev": "095b629f2eecc83f0f27373093e336600e886674",
"type": "github"
},
"original": {
"owner": "NixOS",
- "ref": "nixos-25.11-small",
+ "ref": "nixos-26.05-small",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-unstable": {
"locked": {
- "lastModified": 1765949210,
- "narHash": "sha256-DKHDrCurTyA7np6pvXd9JMwweAvmJeJ5vWBwRsx9Zi4=",
+ "lastModified": 1787441254,
+ "narHash": "sha256-/7oA/UPfrk0ubngvJjDleROuiNdA7y4d+5qNcDeQuCA=",
"owner": "NixOS",
"repo": "nixpkgs",
- "rev": "c92a2155af41ff104cc97a805998eab8f8514ba9",
+ "rev": "ae9396d21aa0dcfe9419f6bdc3bf415eba30a8b7",
"type": "github"
},
"original": {
@@ -322,23 +276,116 @@
"type": "github"
}
},
+ "rocie": {
+ "inputs": {
+ "crane": [
+ "crane"
+ ],
+ "nixpkgs": [
+ "nixpkgs"
+ ],
+ "rocie-mobile": "rocie-mobile",
+ "rocie-server": "rocie-server",
+ "rust-overlay": [
+ "rust-overlay"
+ ],
+ "treefmt-nix": [
+ "treefmt-nix"
+ ]
+ },
+ "locked": {
+ "lastModified": 1784410502,
+ "narHash": "sha256-clYdP0jhpcNzKjphgF8t4zAgwl303+EgLFXHHQivSjU=",
+ "ref": "prime",
+ "rev": "0aa914e6b1dd0db0a8e86e2849ae9f8951d431db",
+ "revCount": 10,
+ "type": "git",
+ "url": "https://git.foss-syndicate.org/bpeetz/rocie/nix"
+ },
+ "original": {
+ "ref": "prime",
+ "type": "git",
+ "url": "https://git.foss-syndicate.org/bpeetz/rocie/nix"
+ }
+ },
+ "rocie-mobile": {
+ "inputs": {
+ "crane": [
+ "rocie",
+ "crane"
+ ],
+ "nixpkgs": [
+ "rocie",
+ "nixpkgs"
+ ],
+ "rust-overlay": [
+ "rocie",
+ "rust-overlay"
+ ],
+ "treefmt-nix": [
+ "rocie",
+ "treefmt-nix"
+ ]
+ },
+ "locked": {
+ "lastModified": 1784399261,
+ "narHash": "sha256-aLsD1F3yQrp3ojlLWi5PpqCQ0+R+g4PhjXZcHUdG5Qo=",
+ "ref": "prime",
+ "rev": "64ebbcc28795b7a683a856ae9d97b618dfde24e3",
+ "revCount": 19,
+ "type": "git",
+ "url": "https://git.foss-syndicate.org/bpeetz/rocie/web-client"
+ },
+ "original": {
+ "ref": "prime",
+ "type": "git",
+ "url": "https://git.foss-syndicate.org/bpeetz/rocie/web-client"
+ }
+ },
+ "rocie-server": {
+ "inputs": {
+ "nixpkgs": [
+ "rocie",
+ "nixpkgs"
+ ],
+ "treefmt-nix": [
+ "rocie",
+ "treefmt-nix"
+ ]
+ },
+ "locked": {
+ "lastModified": 1784410124,
+ "narHash": "sha256-krTtnKWMciPVQxKGzeIkHv36BfhA87vGrrgshPoD/s8=",
+ "ref": "prime",
+ "rev": "d9e6dae43477a5c16e7983153f12aa94c674c7dd",
+ "revCount": 53,
+ "type": "git",
+ "url": "https://git.foss-syndicate.org/bpeetz/rocie/server"
+ },
+ "original": {
+ "ref": "prime",
+ "type": "git",
+ "url": "https://git.foss-syndicate.org/bpeetz/rocie/server"
+ }
+ },
"root": {
"inputs": {
"agenix": "agenix",
- "back": "back",
"crane": "crane",
- "deploy-rs": "deploy-rs",
"disko": "disko",
"flake-compat": "flake-compat",
"flake-utils": "flake-utils",
+ "home-manager": "home-manager",
"impermanence": "impermanence",
"library": "library",
"nixpkgs": "nixpkgs",
"nixpkgs-unstable": "nixpkgs-unstable",
+ "rocie": "rocie",
"rust-overlay": "rust-overlay",
"simple-nixos-mailserver": "simple-nixos-mailserver",
"systems": "systems",
- "treefmt-nix": "treefmt-nix"
+ "treefmt-nix": "treefmt-nix",
+ "turtle": "turtle"
}
},
"rust-overlay": {
@@ -348,11 +395,11 @@
]
},
"locked": {
- "lastModified": 1765939271,
- "narHash": "sha256-7F/d+ZrTYyOxnBZcleQZjOOEWc1IMXR/CLLRLLsVtHo=",
+ "lastModified": 1787454509,
+ "narHash": "sha256-r4LDUF+zmJnkftvCVkCrUhSJazsf6EVJF+V2l4/MYbI=",
"owner": "oxalica",
"repo": "rust-overlay",
- "rev": "8028944c1339469124639da276d403d8ab7929a8",
+ "rev": "f60c1b57ff805a46b5175c76fc981fb4f81efbcc",
"type": "github"
},
"original": {
@@ -373,16 +420,16 @@
]
},
"locked": {
- "lastModified": 1764185122,
- "narHash": "sha256-+HUOwSIFLoyett2cvRjuFIbhobpHallfP9J2cia1apo=",
+ "lastModified": 1785198005,
+ "narHash": "sha256-falBPi+PJtMx0vwII8L24wjDGXNZMwRiVXsw8WTXLEo=",
"owner": "simple-nixos-mailserver",
"repo": "nixos-mailserver",
- "rev": "a14fe3b293ec2720e5b7fc72ad136d22967e12ba",
+ "rev": "d357b9f048c5532ec81b0e0034c0b8463d5ddd46",
"type": "gitlab"
},
"original": {
"owner": "simple-nixos-mailserver",
- "ref": "nixos-25.11",
+ "ref": "nixos-26.05",
"repo": "nixos-mailserver",
"type": "gitlab"
}
@@ -409,11 +456,11 @@
]
},
"locked": {
- "lastModified": 1766000401,
- "narHash": "sha256-+cqN4PJz9y0JQXfAK5J1drd0U05D5fcAGhzhfVrDlsI=",
+ "lastModified": 1786901030,
+ "narHash": "sha256-WSFCsDSE5ffgD2MqzkM2CYjeFiKhRF/dJUN8uedb6YE=",
"owner": "numtide",
"repo": "treefmt-nix",
- "rev": "42d96e75aa56a3f70cab7e7dc4a32868db28e8fd",
+ "rev": "27b3b12a8e6375f28ebe122f07d230ca5459bbfa",
"type": "github"
},
"original": {
@@ -421,6 +468,30 @@
"repo": "treefmt-nix",
"type": "github"
}
+ },
+ "turtle": {
+ "inputs": {
+ "crane": [
+ "crane"
+ ],
+ "nixpkgs": [
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1787507226,
+ "narHash": "sha256-BGhcURdG+B4Lm7iZUaZDReBuHCNWEWUG5/aM3gDQitw=",
+ "ref": "main",
+ "rev": "d5a9a76c0755e668ddefaa65edd4543898646678",
+ "revCount": 1858,
+ "type": "git",
+ "url": "https://git.foss-syndicate.org/bpeetz/forks/atuin"
+ },
+ "original": {
+ "ref": "main",
+ "type": "git",
+ "url": "https://git.foss-syndicate.org/bpeetz/forks/atuin"
+ }
}
},
"root": "root",
diff --git a/flake.nix b/flake.nix
index 4c847b6..e9a543d 100644
--- a/flake.nix
+++ b/flake.nix
@@ -1,9 +1,15 @@
{
- description = "Nixos server config";
+ description = "NixOS server config";
inputs = {
- nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11-small";
+ nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05-small";
nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable-small";
+ home-manager = {
+ url = "github:nix-community/home-manager/release-26.05";
+ inputs = {
+ nixpkgs.follows = "nixpkgs";
+ };
+ };
library.url = "git+https://git.foss-syndicate.org/vhack.eu/nix-library?ref=prime";
@@ -13,14 +19,6 @@
nixpkgs.follows = "nixpkgs";
};
};
- deploy-rs = {
- url = "github:serokell/deploy-rs";
- inputs = {
- flake-compat.follows = "flake-compat";
- nixpkgs.follows = "nixpkgs";
- utils.follows = "flake-utils";
- };
- };
# inputs for following
systems = {
@@ -53,15 +51,14 @@
inputs = {
nixpkgs.follows = "nixpkgs";
systems.follows = "systems";
+ home-manager.follows = "home-manager";
};
};
- back = {
- url = "git+https://git.foss-syndicate.org/vhack.eu/git_bug/back?ref=prime";
+ turtle = {
+ url = "git+https://git.foss-syndicate.org/bpeetz/forks/atuin?ref=main";
inputs = {
+ crane.follows = "crane";
nixpkgs.follows = "nixpkgs";
- systems.follows = "systems";
- flake-utils.follows = "flake-utils";
- treefmt-nix.follows = "treefmt-nix";
};
};
disko = {
@@ -72,10 +69,22 @@
};
impermanence = {
url = "github:nix-community/impermanence";
- inputs = {};
+ inputs = {
+ nixpkgs.follows = "nixpkgs";
+ home-manager.follows = "home-manager";
+ };
+ };
+ rocie = {
+ url = "git+https://git.foss-syndicate.org/bpeetz/rocie/nix?ref=prime";
+ inputs = {
+ nixpkgs.follows = "nixpkgs";
+ treefmt-nix.follows = "treefmt-nix";
+ crane.follows = "crane";
+ rust-overlay.follows = "rust-overlay";
+ };
};
simple-nixos-mailserver = {
- url = "gitlab:simple-nixos-mailserver/nixos-mailserver/nixos-25.11";
+ url = "gitlab:simple-nixos-mailserver/nixos-mailserver/nixos-26.05";
inputs = {
flake-compat.follows = "flake-compat";
nixpkgs.follows = "nixpkgs-unstable";
@@ -89,63 +98,55 @@
nixpkgs-unstable,
library,
treefmt-nix,
- deploy-rs,
# modules
agenix,
- back,
+ turtle,
disko,
impermanence,
simple-nixos-mailserver,
+ rocie,
...
} @ attrs: let
system = "x86_64-linux";
nixos-lib = import (nixpkgs + "/nixos/lib") {};
pkgs = nixpkgs.legacyPackages.${system};
pkgsUnstable = nixpkgs-unstable.legacyPackages.${system};
- deployPackage =
- (import nixpkgs {
- inherit system;
- overlays = [
- deploy-rs.overlays.default
- (self: super: {
- deploy-rs = {
- inherit (pkgs) deploy-rs;
- inherit (super.deploy-rs) lib;
- };
- })
- ];
- })
- .deploy-rs;
specialArgs =
attrs
// {
- inherit pkgsUnstable vhackPackages nixpkgs-unstable nixos-lib extraModules nixLib;
+ inherit
+ pkgsUnstable
+ vhackPackages
+ nixpkgs-unstable
+ nixos-lib
+ extraModules
+ nixLib
+ turtle
+ ;
};
extraModules = [
agenix.nixosModules.default
- back.nixosModules.default
+ turtle.nixosModules.default
disko.nixosModules.default
impermanence.nixosModules.impermanence
simple-nixos-mailserver.nixosModule
+ rocie.nixosModules.default
];
tests = import ./tests {inherit pkgs specialArgs nixLib;};
vhackPackages = import ./pkgs {inherit pkgs nixLib pkgsUnstable;};
- hosts = import ./hosts {inherit pkgs nixLib nixpkgs specialArgs extraModules deployPackage;};
+ hosts = import ./hosts {inherit pkgs nixLib nixpkgs specialArgs extraModules;};
inherit (library) nixLib;
treefmtEval = import ./treefmt.nix {inherit treefmt-nix pkgs;};
in {
- checks."${system}" =
- nixLib.warnMerge (nixLib.warnMerge tests {
- formatting =
- treefmtEval.config.build.check self;
- } "the flake checks and formatting")
- (deployPackage.lib.deployChecks self.deploy)
- "the flake checks and deploy-rs";
+ checks."${system}" = nixLib.warnMerge tests {
+ formatting =
+ treefmtEval.config.build.check self;
+ } "the flake checks and formatting";
packages."${system}" = vhackPackages;
formatter."${system}" = treefmtEval.config.build.wrapper;
@@ -153,8 +154,6 @@
devShells."${system}" = {
default = pkgs.mkShell {
packages = [
- pkgs.deploy-rs
-
pkgs.git-bug
# Used to update the stalwart-mail spamfilter
@@ -166,6 +165,6 @@
};
};
- inherit (hosts) nixosConfigurations deploy;
+ inherit (hosts) nixosConfigurations;
};
}
diff --git a/hosts/by-name/server2/configuration.nix b/hosts/by-name/server2/configuration.nix
index 65e3b24..c26b896 100644
--- a/hosts/by-name/server2/configuration.nix
+++ b/hosts/by-name/server2/configuration.nix
@@ -1,6 +1,6 @@
{
- config,
lib,
+ pkgs,
...
}: {
imports = [
@@ -20,16 +20,27 @@
enable = true;
fqdn = "atuin-sync.vhack.eu";
};
- git-back = {
- enable = true;
- domain = "issues.foss-syndicate.org";
- };
backup = {
enable = true;
privateSshKey = ./secrets/backup/backupssh.age;
privatePassword = ./secrets/backup/backuppass.age;
user = "u384702-sub3";
};
+
+ monitoring = {
+ enable = true;
+ prometheus = {
+ remoteWriteReceiver = "prometheus-server2.vhack.eu";
+ };
+ grafana = {
+ fqdn = "grafana.vhack.eu";
+
+ contactPoints = ["admin@vhack.eu"];
+ adminPassword = ./secrets/grafana/adminPassword.age;
+ secretKey = ./secrets/grafana/secretKey.age;
+ };
+ };
+
dns = {
enable = true;
openFirewall = true;
@@ -63,9 +74,11 @@
};
nextcloud = {
enable = true;
+ package = pkgs.nextcloud33;
hostname = "nextcloud.vhack.eu";
adminpassFile = ./secrets/nextcloud/adminpassFile.age;
};
+
nginx = {
enable = true;
redirects = {
diff --git a/hosts/by-name/server2/secrets/grafana/adminPassword.age b/hosts/by-name/server2/secrets/grafana/adminPassword.age
new file mode 100644
index 0000000..ff072fc
--- /dev/null
+++ b/hosts/by-name/server2/secrets/grafana/adminPassword.age
@@ -0,0 +1,17 @@
+-----BEGIN AGE ENCRYPTED FILE-----
+YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA5bi9zRm5RRmU0YjJ4N3pi
+S2lNNGZRNUpycnUrZ3VRdFBsdkdIRjVTakRFCkxtVG1VbUFTbHpBZlYxV2pMSU5p
+a0lRcGVPWUUwMWpKdm5oYktWRklyWEUKLT4gWDI1NTE5IHNzN2NXRWYxdjladFF6
+ejk4eW43eUFsSStIV3FpWVJZREhLVEpjRkkvWFkKdlZtOG5pbDVvd0hwUEdMZnVn
+WFAvYWJDUEVBckc3M3NVQUdvdFVqNDB0QQotPiBzc2gtZWQyNTUxOSBYUG94RFEg
+RkpweWRJQklNUHVRWUhicXdDUVc3cXhyRi9KOS9wYWxDYnNNcjIzWmhERQpZZnpr
+eHRWbnI0cFd1T3h3TTVGZ1JiUzUrNUpSNkUwM2UyWTVYZ2VHVHBnCi0+IC5eKT0+
+eS1ncmVhc2Ugc0YvI25zZyAub3YgPDNtbmsKejExd2NBV0E2Q1pLSVhyQTRLaWZ6
+dmZSZHhidjBqeW10RnIxNStVTGIyY1RMS25xaUlxRDVxMlpKQQotLS0gc3BER0to
+dGdicEd3d1QzWWdoTmpkM1V5L0VvVG82cnNGY0hJTWUwVVBmTQpRQwKmFmQj10Z1
+AXllRSWcTSCzcM7fCVjCRcTF2lsxtXiXUkTS59yfNih02myuYCFIUG/MDl3A3pur
+WckFpQVHTdvQ9ilYORI/zi9LTmPy8TZYYcdmXnNRelfZ3fAqiR8ScIEG3P0smNyP
+9h6BcfiWYG2ppANLOeZxHz/UoG/LORXJyXoTCuiG8KJ714jX8f3CMX3+m9q/GmAX
+VZiYvvbGgrN5T5QrZE+8quRM1laAXmnmbDynODfhNFNw4/I0Opi0CF5MSObmvzKN
+z6vsc/kTGMqbip6k/LKvzea+jXMc8b8BeO0Y
+-----END AGE ENCRYPTED FILE-----
diff --git a/hosts/by-name/server2/secrets/grafana/secretKey.age b/hosts/by-name/server2/secrets/grafana/secretKey.age
new file mode 100644
index 0000000..bfe4afe
--- /dev/null
+++ b/hosts/by-name/server2/secrets/grafana/secretKey.age
@@ -0,0 +1,18 @@
+-----BEGIN AGE ENCRYPTED FILE-----
+YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBsYlhkcFdwL2NDUllGVko3
+bTEwVE00MjRoZUpXMGFWZFFSMXNBUkpFRVU4CkJwSU5RUnlITnRSZklVZjNBN3Ix
+NDdUS0ZpWVNBWEY3MVZYVlBkZkM3VlUKLT4gWDI1NTE5IHdsSm55NCtIT0Z4cUhx
+dE9pM0RmSHUrUGZTYXhuQlM4TGVKcm5MWGZNekkKQXZmZ05JVmZYdzJIYlN5WmxV
+Zlh0TWlxWWZucldweHpjdFM5TGJKZnprOAotPiBzc2gtZWQyNTUxOSBYUG94RFEg
+SjVTVXVJRjQrc0RIenVIVmNmZEtQS1lWbVNhSzY5QjJXRUxNY1JvVGdIOAo5V0Y5
+SGhTRlZUcFE3eU1iazBwYzh0Q2UxTnA2UTJQQ2VhaW1INnBGTTQwCi0+IGdeazN5
+ZmstZ3JlYXNlIGpZSGUgTUYja2N5RCAhICNaeT8KVnFRWjJXQ1lMekJQZG5jbGk4
+KzB5YVVmMGRFT1pUZzF3dkJBby94NXZjbkFOYlQ1dy9VWUFnaVRlTHpkUXdZaQox
+R1BMN3RjVXFwbitqU1pETzdlc0VqOFZhbVBrRlFiOWl3TWZkNzlCSS9kNkhBVUcw
+Zk5UbFRrZXhWQ2QrZwotLS0gbFV3MXRoYjZ4QVo0UU9iMmpGVllNcDdJZFQvUEFR
+UXpWYmptWmdWSllLVQrTggsrW+giXmbRL6Jq3VqT8uXhqHs5ZTCnPQSpKth04fzr
+mNLKMIi2kRJm3hJCaSPBrLpDuop+08hjGe0l0CxvuRlnFUOZkh+C/kFWOI3ecaWt
+TYVDkKNLXjrhyfw/rVHy03czluQncFYHFKib8djDqYTUa0ORj+M5cIgAzWODyCWB
+IGftRRjhDMHhQzq0GRwwu6jNA+ovT1cN1aMmafQFmqTR7BqO18HqKsGdtirFLV3o
+qrvHjqz1cJNKYEU89ogLJydTJHyuPhuPeHBl
+-----END AGE ENCRYPTED FILE-----
diff --git a/hosts/by-name/server3/configuration.nix b/hosts/by-name/server3/configuration.nix
index 1736a32..f7ee7d3 100644
--- a/hosts/by-name/server3/configuration.nix
+++ b/hosts/by-name/server3/configuration.nix
@@ -20,10 +20,22 @@
];
zones = import ../../../zones {inherit lib;};
};
+
+ monitoring = {
+ prometheus = {
+ enable = true;
+ remoteWriteTo = {
+ url = "https://prometheus-server2.vhack.eu";
+ };
+ };
+ # TODO: Also provide something for Loki <2026-07-19>
+ };
+
fail2ban.enable = true;
- grocy = {
+ rocie = {
enable = true;
- domain = "grocy.vhack.eu";
+ domain = "rocie.vhack.eu";
+ loginSecret = ./secrets/rocie/login.age;
};
nix-sync = {
enable = true;
@@ -72,23 +84,23 @@
];
};
stalwart-mail = {
- enable = true;
- fqdn = "mail.vhack.eu";
- admin = "admin@vhack.eu";
- security = {
- dkimKeys = let
- loadKey = name: {
- dkimPublicKey = builtins.readFile (./secrets/dkim + "/${name}-public");
- dkimPrivateKeyPath = ./secrets/dkim + "/${name}-private.age";
- keyAlgorithm = "ed25519-sha256";
- };
- in {
- "mail.vhack.eu" = loadKey "mail.vhack.eu";
- };
- verificationMode = "strict";
- };
- openFirewall = true;
- principals = null;
+ # enable = false;
+ # fqdn = "mail.vhack.eu";
+ # admin = "admin@vhack.eu";
+ # security = {
+ # dkimKeys = let
+ # loadKey = name: {
+ # dkimPublicKey = builtins.readFile (./secrets/dkim + "/${name}-public");
+ # dkimPrivateKeyPath = ./secrets/dkim + "/${name}-private.age";
+ # keyAlgorithm = "ed25519-sha256";
+ # };
+ # in {
+ # "mail.vhack.eu" = loadKey "mail.vhack.eu";
+ # };
+ # verificationMode = "strict";
+ # };
+ # openFirewall = true;
+ # principals = null;
};
postgresql.enable = true;
rust-motd.enable = true;
diff --git a/hosts/by-name/server3/secrets/rocie/login.age b/hosts/by-name/server3/secrets/rocie/login.age
new file mode 100644
index 0000000..0a6b8d3
--- /dev/null
+++ b/hosts/by-name/server3/secrets/rocie/login.age
@@ -0,0 +1,16 @@
+-----BEGIN AGE ENCRYPTED FILE-----
+YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBWN3ZFdjMyNjBvQXQ1YVYz
+OTBHMWYvbk5xK1ArVDYvMmZEUFF5dHRSajFNCkFXSCtPV2VVdW50amVVMVYxYXBK
+SHd4bXRXSEw0ZnJ3TTMvbmZGTStFbEUKLT4gWDI1NTE5IDZYMFJKWVBPVmc5QmFK
+M0xGNGNJZHNnRWxBcytaZXU3VWlqMzQvdDdhbm8KcVlIZTlRYVBZNEx1djZJbURD
+Qy9NUTEwYVN0VjhZbkc3TTNuUWd0QTFjcwotPiBzc2gtZWQyNTUxOSBweXU5Ymcg
+SnZ0czg2OUszeFJIbmNpU2RDV2tnMVRlUUVvMk5BTWcwbFFibDVzQXZUbwpJbkVC
+bFFqYzJZQTFQWDM4Zk42ZzE4Q2kzQlh4aTRtMHUyRlgrWlc1WUtjCi0+IFFELWdy
+ZWFzZQpCMDVUczNTa01KS2hFREhpM0k5L3ZHT0NDUEtVck1iZE13cnVkSi9Kdk80
+WXU1M3A0V1pZbGxZaVNGanZRUnE4CmYwUlo4QlVFTjc4YlFaQjZyU3BybTAwaTVP
+WHc2K1FyYzduT0RBYWtEa0xSREEKLS0tIExFSThrd2xGT3lEU1p6VXE0eWpZUG5z
+ZlVXMWJFS0NxczhycXl1VWc1bmsK4Dq740IgQP9CnGtkUrwWxM4QUOnQTgWe1YbI
+LtC471ykB4YlPIbMiqUdnBuFZQ9cBAOT2YuicxbI+/2Rb/mSRV0l8dGKpc2fqOVy
+zLLcX8A48NfmcbPeUtlv/HnVfu6Fe7X91V0bw6eMjWSvvcpQXsaIAd7TEPTpexCs
+gfAWd+brZMq6VzwslklxO4S5ZIu0jUSz4q6covAuxfEW3hdSbIg=
+-----END AGE ENCRYPTED FILE-----
diff --git a/hosts/by-name/server3/websites.nix b/hosts/by-name/server3/websites.nix
index 466f1e9..ece6247 100644
--- a/hosts/by-name/server3/websites.nix
+++ b/hosts/by-name/server3/websites.nix
@@ -1,7 +1,7 @@
{...}: let
mkWkd = domain: {
domain = "openpgpkey.${domain}";
- repositoryUrl = "https://git.foss-syndicate.org/vhack.eu/pgp-wkd.git";
+ repositoryUrl = "https://git.foss-syndicate.org/vhack.eu/pgp-wkd";
extraSettings = {
locations."/.well-known/openpgpkey/".extraConfig = ''
default_type application/octet-stream;
@@ -15,17 +15,17 @@
in [
{
domain = "vhack.eu";
- repositoryUrl = "https://codeberg.org/vhack.eu/website.git";
+ repositoryUrl = "https://codeberg.org/vhack.eu/website";
}
{
domain = "b-peetz.de";
- repositoryUrl = "https://git.foss-syndicate.org/bpeetz/b-peetz.de.git";
+ repositoryUrl = "https://git.foss-syndicate.org/bpeetz/b-peetz.de";
}
# Trinitrix
{
domain = "trinitrix.vhack.eu";
- repositoryUrl = "https://codeberg.org/trinitrix/website.git";
+ repositoryUrl = "https://codeberg.org/trinitrix/website";
}
# WKD
diff --git a/hosts/default.nix b/hosts/default.nix
index 664c376..651569d 100644
--- a/hosts/default.nix
+++ b/hosts/default.nix
@@ -4,10 +4,7 @@
nixpkgs,
specialArgs,
extraModules,
- deployPackage,
}: let
- hostnames = builtins.fromTOML (builtins.readFile ./host-names.toml);
-
hosts = nixLib.mkByName {
useShards = false;
baseDirectory = ./by-name;
@@ -26,15 +23,6 @@
];
};
nixosConfigurations = builtins.mapAttrs mkNixosConfiguration hosts;
-
- mkDeploy = name: _: {
- hostname = hostnames."${name}";
- profiles.system = {
- user = "root";
- path = deployPackage.lib.activate.nixos nixosConfigurations."${name}";
- };
- };
- deploy = {nodes = builtins.mapAttrs mkDeploy hosts;};
in {
- inherit nixosConfigurations deploy;
+ inherit nixosConfigurations;
}
diff --git a/modules/by-name/gi/git-back/module.nix b/modules/by-name/gi/git-back/module.nix
deleted file mode 100644
index 7df1bac..0000000
--- a/modules/by-name/gi/git-back/module.nix
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- config,
- lib,
- ...
-}: let
- cfg = config.vhack.git-back;
-in {
- options.vhack.git-back = {
- enable = lib.mkEnableOption "Back integration into git-server";
-
- domain = lib.mkOption {
- type = lib.types.str;
- description = "The domain where to deploy back";
- };
- };
-
- config = lib.mkIf cfg.enable {
- vhack.back = {
- enable = true;
-
- user = "git";
- group = "git";
-
- settings = {
- scan_path = "${config.services.gitolite.dataDir}/repositories";
- project_list = "${config.services.gitolite.dataDir}/projects.list";
- root_url = "https://${cfg.domain}";
- };
- };
-
- vhack.anubis.instances."${cfg.domain}".target = "http://127.0.0.1:8000";
- };
-}
diff --git a/modules/default.nix b/modules/default.nix
index 0618f90..bcafc53 100644
--- a/modules/default.nix
+++ b/modules/default.nix
@@ -1,10 +1,14 @@
{nixLib, ...}: let
- files = builtins.attrValues (
+ vhack = builtins.attrValues (
nixLib.mkByName {
- baseDirectory = ./by-name;
+ baseDirectory = ./vhack;
fileName = "module.nix";
}
);
+
+ files =
+ []
+ ++ vhack;
in {
imports = files;
}
diff --git a/modules/by-name/an/anubis/module.nix b/modules/vhack/an/anubis/module.nix
index 4e70e4f..4e70e4f 100644
--- a/modules/by-name/an/anubis/module.nix
+++ b/modules/vhack/an/anubis/module.nix
diff --git a/modules/by-name/at/atuin-sync/module.nix b/modules/vhack/at/atuin-sync/module.nix
index e0d75bb..4295697 100644
--- a/modules/by-name/at/atuin-sync/module.nix
+++ b/modules/vhack/at/atuin-sync/module.nix
@@ -1,13 +1,12 @@
{
config,
lib,
- vhackPackages,
...
}: let
cfg = config.vhack.atuin-sync;
in {
options.vhack.atuin-sync = {
- enable = lib.mkEnableOption "atuin sync server";
+ enable = lib.mkEnableOption "atuin (turtle) sync server";
fqdn = lib.mkOption {
description = "The fully qualified domain name of this instance.";
@@ -19,17 +18,13 @@ in {
config = lib.mkIf cfg.enable {
vhack.nginx.enable = true;
- vhack.anubis.instances."${cfg.fqdn}".target = "http://127.0.0.1:${toString config.services.atuin.port}";
+ vhack.anubis.instances."${cfg.fqdn}".target = "http://127.0.0.1:${toString config.services.turtle.port}";
services = {
- atuin = {
+ turtle = {
enable = true;
- package = vhackPackages.atuin-server-only;
host = "127.0.0.1";
- # Nobody knows about the fqdn and even if, they can only upload encrypted blobs.
- openRegistration = true;
-
database.createLocally = true;
};
};
diff --git a/modules/by-name/ba/backup/module.nix b/modules/vhack/ba/backup/module.nix
index 856a1c3..856a1c3 100644
--- a/modules/by-name/ba/backup/module.nix
+++ b/modules/vhack/ba/backup/module.nix
diff --git a/modules/by-name/co/constants/module.nix b/modules/vhack/co/constants/module.nix
index 3de9608..9127488 100644
--- a/modules/by-name/co/constants/module.nix
+++ b/modules/vhack/co/constants/module.nix
@@ -55,6 +55,12 @@
grocy = 341;
anubis = 342;
postfix-tlspol = 343;
+ rocie = 344;
+ fluent-bit = 345;
+ loki = 346;
+ grafana = 347;
+ node-exporter = 348;
+ smartctl-exporter-access = 349;
# As per the NixOS file, the uids should not be greater or equal to 400;
};
@@ -94,6 +100,12 @@
systemd-coredump # matches systemd-coredump user
resolvconf # This group is not matched to an user?
stalwart-mail-certificates # This group is used to connect nginx and stalwart-mail
+ rocie
+ fluent-bit
+ loki
+ grafana
+ node-exporter
+ smartctl-exporter-access
;
# The gid should match the uid. Thus should not be >= 400;
diff --git a/modules/by-name/co/coredump/module.nix b/modules/vhack/co/coredump/module.nix
index ce28ed9..ce28ed9 100644
--- a/modules/by-name/co/coredump/module.nix
+++ b/modules/vhack/co/coredump/module.nix
diff --git a/modules/by-name/dh/dhcpcd/module.nix b/modules/vhack/dh/dhcpcd/module.nix
index 0e35af3..0e35af3 100644
--- a/modules/by-name/dh/dhcpcd/module.nix
+++ b/modules/vhack/dh/dhcpcd/module.nix
diff --git a/modules/by-name/di/disko/module.nix b/modules/vhack/di/disko/module.nix
index b4fc3c8..b4fc3c8 100644
--- a/modules/by-name/di/disko/module.nix
+++ b/modules/vhack/di/disko/module.nix
diff --git a/modules/by-name/dn/dns/dns/default.nix b/modules/vhack/dn/dns/dns/default.nix
index 4ce07d8..4ce07d8 100644
--- a/modules/by-name/dn/dns/dns/default.nix
+++ b/modules/vhack/dn/dns/dns/default.nix
diff --git a/modules/by-name/dn/dns/dns/types/default.nix b/modules/vhack/dn/dns/dns/types/default.nix
index ece315f..ece315f 100644
--- a/modules/by-name/dn/dns/dns/types/default.nix
+++ b/modules/vhack/dn/dns/dns/types/default.nix
diff --git a/modules/by-name/dn/dns/dns/types/record.nix b/modules/vhack/dn/dns/dns/types/record.nix
index e992bf9..e992bf9 100644
--- a/modules/by-name/dn/dns/dns/types/record.nix
+++ b/modules/vhack/dn/dns/dns/types/record.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/A.nix b/modules/vhack/dn/dns/dns/types/records/A.nix
index 296943e..296943e 100644
--- a/modules/by-name/dn/dns/dns/types/records/A.nix
+++ b/modules/vhack/dn/dns/dns/types/records/A.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/AAAA.nix b/modules/vhack/dn/dns/dns/types/records/AAAA.nix
index 4717176..4717176 100644
--- a/modules/by-name/dn/dns/dns/types/records/AAAA.nix
+++ b/modules/vhack/dn/dns/dns/types/records/AAAA.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/CAA.nix b/modules/vhack/dn/dns/dns/types/records/CAA.nix
index 4b40510..4b40510 100644
--- a/modules/by-name/dn/dns/dns/types/records/CAA.nix
+++ b/modules/vhack/dn/dns/dns/types/records/CAA.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/CNAME.nix b/modules/vhack/dn/dns/dns/types/records/CNAME.nix
index 095b078..095b078 100644
--- a/modules/by-name/dn/dns/dns/types/records/CNAME.nix
+++ b/modules/vhack/dn/dns/dns/types/records/CNAME.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/DKIM.nix b/modules/vhack/dn/dns/dns/types/records/DKIM.nix
index 31b2f67..31b2f67 100644
--- a/modules/by-name/dn/dns/dns/types/records/DKIM.nix
+++ b/modules/vhack/dn/dns/dns/types/records/DKIM.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/DMARC.nix b/modules/vhack/dn/dns/dns/types/records/DMARC.nix
index 0f10f2c..0f10f2c 100644
--- a/modules/by-name/dn/dns/dns/types/records/DMARC.nix
+++ b/modules/vhack/dn/dns/dns/types/records/DMARC.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/DNAME.nix b/modules/vhack/dn/dns/dns/types/records/DNAME.nix
index 042ce95..042ce95 100644
--- a/modules/by-name/dn/dns/dns/types/records/DNAME.nix
+++ b/modules/vhack/dn/dns/dns/types/records/DNAME.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/DNSKEY.nix b/modules/vhack/dn/dns/dns/types/records/DNSKEY.nix
index 86ce3a1..86ce3a1 100644
--- a/modules/by-name/dn/dns/dns/types/records/DNSKEY.nix
+++ b/modules/vhack/dn/dns/dns/types/records/DNSKEY.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/DS.nix b/modules/vhack/dn/dns/dns/types/records/DS.nix
index 76fac9a..76fac9a 100644
--- a/modules/by-name/dn/dns/dns/types/records/DS.nix
+++ b/modules/vhack/dn/dns/dns/types/records/DS.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/HTTPS.nix b/modules/vhack/dn/dns/dns/types/records/HTTPS.nix
index 6e2ef3d..6e2ef3d 100644
--- a/modules/by-name/dn/dns/dns/types/records/HTTPS.nix
+++ b/modules/vhack/dn/dns/dns/types/records/HTTPS.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/MTA-STS.nix b/modules/vhack/dn/dns/dns/types/records/MTA-STS.nix
index 030490e..030490e 100644
--- a/modules/by-name/dn/dns/dns/types/records/MTA-STS.nix
+++ b/modules/vhack/dn/dns/dns/types/records/MTA-STS.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/MX.nix b/modules/vhack/dn/dns/dns/types/records/MX.nix
index c25b89c..c25b89c 100644
--- a/modules/by-name/dn/dns/dns/types/records/MX.nix
+++ b/modules/vhack/dn/dns/dns/types/records/MX.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/NS.nix b/modules/vhack/dn/dns/dns/types/records/NS.nix
index ea60a91..ea60a91 100644
--- a/modules/by-name/dn/dns/dns/types/records/NS.nix
+++ b/modules/vhack/dn/dns/dns/types/records/NS.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/OPENPGPKEY.nix b/modules/vhack/dn/dns/dns/types/records/OPENPGPKEY.nix
index 1f39cb9..1f39cb9 100644
--- a/modules/by-name/dn/dns/dns/types/records/OPENPGPKEY.nix
+++ b/modules/vhack/dn/dns/dns/types/records/OPENPGPKEY.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/PTR.nix b/modules/vhack/dn/dns/dns/types/records/PTR.nix
index 075f82e..075f82e 100644
--- a/modules/by-name/dn/dns/dns/types/records/PTR.nix
+++ b/modules/vhack/dn/dns/dns/types/records/PTR.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/SOA.nix b/modules/vhack/dn/dns/dns/types/records/SOA.nix
index db7436e..db7436e 100644
--- a/modules/by-name/dn/dns/dns/types/records/SOA.nix
+++ b/modules/vhack/dn/dns/dns/types/records/SOA.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/SRV.nix b/modules/vhack/dn/dns/dns/types/records/SRV.nix
index 5f558ed..5f558ed 100644
--- a/modules/by-name/dn/dns/dns/types/records/SRV.nix
+++ b/modules/vhack/dn/dns/dns/types/records/SRV.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/SSHFP.nix b/modules/vhack/dn/dns/dns/types/records/SSHFP.nix
index 1409860..1409860 100644
--- a/modules/by-name/dn/dns/dns/types/records/SSHFP.nix
+++ b/modules/vhack/dn/dns/dns/types/records/SSHFP.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/SVCB.nix b/modules/vhack/dn/dns/dns/types/records/SVCB.nix
index 62cbc3d..62cbc3d 100644
--- a/modules/by-name/dn/dns/dns/types/records/SVCB.nix
+++ b/modules/vhack/dn/dns/dns/types/records/SVCB.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/TLSA.nix b/modules/vhack/dn/dns/dns/types/records/TLSA.nix
index d92a29b..d92a29b 100644
--- a/modules/by-name/dn/dns/dns/types/records/TLSA.nix
+++ b/modules/vhack/dn/dns/dns/types/records/TLSA.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/TXT.nix b/modules/vhack/dn/dns/dns/types/records/TXT.nix
index d605ce8..d605ce8 100644
--- a/modules/by-name/dn/dns/dns/types/records/TXT.nix
+++ b/modules/vhack/dn/dns/dns/types/records/TXT.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/default.nix b/modules/vhack/dn/dns/dns/types/records/default.nix
index 76a86cd..76a86cd 100644
--- a/modules/by-name/dn/dns/dns/types/records/default.nix
+++ b/modules/vhack/dn/dns/dns/types/records/default.nix
diff --git a/modules/by-name/dn/dns/dns/types/records/dnssec.nix b/modules/vhack/dn/dns/dns/types/records/dnssec.nix
index 648f676..648f676 100644
--- a/modules/by-name/dn/dns/dns/types/records/dnssec.nix
+++ b/modules/vhack/dn/dns/dns/types/records/dnssec.nix
diff --git a/modules/by-name/dn/dns/dns/types/simple.nix b/modules/vhack/dn/dns/dns/types/simple.nix
index fece2c9..fece2c9 100644
--- a/modules/by-name/dn/dns/dns/types/simple.nix
+++ b/modules/vhack/dn/dns/dns/types/simple.nix
diff --git a/modules/by-name/dn/dns/dns/types/zone.nix b/modules/vhack/dn/dns/dns/types/zone.nix
index 44ccb15..44ccb15 100644
--- a/modules/by-name/dn/dns/dns/types/zone.nix
+++ b/modules/vhack/dn/dns/dns/types/zone.nix
diff --git a/modules/by-name/dn/dns/dns/util/default.nix b/modules/vhack/dn/dns/dns/util/default.nix
index 59e661d..59e661d 100644
--- a/modules/by-name/dn/dns/dns/util/default.nix
+++ b/modules/vhack/dn/dns/dns/util/default.nix
diff --git a/modules/by-name/dn/dns/module.nix b/modules/vhack/dn/dns/module.nix
index 8f4ad37..8f4ad37 100644
--- a/modules/by-name/dn/dns/module.nix
+++ b/modules/vhack/dn/dns/module.nix
diff --git a/modules/by-name/et/etesync/module.nix b/modules/vhack/et/etesync/module.nix
index 4dc8575..4dc8575 100644
--- a/modules/by-name/et/etesync/module.nix
+++ b/modules/vhack/et/etesync/module.nix
diff --git a/modules/by-name/fa/fail2ban/module.nix b/modules/vhack/fa/fail2ban/module.nix
index c619ef9..c619ef9 100644
--- a/modules/by-name/fa/fail2ban/module.nix
+++ b/modules/vhack/fa/fail2ban/module.nix
diff --git a/modules/by-name/ga/gallery/module.nix b/modules/vhack/ga/gallery/module.nix
index a5237e6..a5237e6 100644
--- a/modules/by-name/ga/gallery/module.nix
+++ b/modules/vhack/ga/gallery/module.nix
diff --git a/modules/vhack/gi/git-back/module.nix b/modules/vhack/gi/git-back/module.nix
new file mode 100644
index 0000000..90be345
--- /dev/null
+++ b/modules/vhack/gi/git-back/module.nix
@@ -0,0 +1,33 @@
+{
+ config,
+ lib,
+ ...
+}: let
+ cfg = config.vhack.git-back;
+in {
+ options.vhack.git-back = {
+ enable = lib.mkEnableOption "Back integration into git-server";
+
+ domain = lib.mkOption {
+ type = lib.types.str;
+ description = "The domain where to deploy back";
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ # vhack.back = {
+ # enable = true;
+ #
+ # user = "git";
+ # group = "git";
+ #
+ # settings = {
+ # scan_path = "${config.services.gitolite.dataDir}/repositories";
+ # project_list = "${config.services.gitolite.dataDir}/projects.list";
+ # root_url = "https://${cfg.domain}";
+ # };
+ # };
+ #
+ # vhack.anubis.instances."${cfg.domain}".target = "http://127.0.0.1:8000";
+ };
+}
diff --git a/modules/by-name/gi/git-server/css.nix b/modules/vhack/gi/git-server/css.nix
index 7d0ad06..7d0ad06 100644
--- a/modules/by-name/gi/git-server/css.nix
+++ b/modules/vhack/gi/git-server/css.nix
diff --git a/modules/by-name/gi/git-server/module.nix b/modules/vhack/gi/git-server/module.nix
index db35897..3e2c848 100644
--- a/modules/by-name/gi/git-server/module.nix
+++ b/modules/vhack/gi/git-server/module.nix
@@ -8,8 +8,7 @@
cgitCss = import ./css.nix {
inherit pkgs;
- cgitPkg =
- config.services.cgit."${cfg.domain}".package;
+ cgitPkg = config.services.cgit."${cfg.domain}".package;
};
in {
options.vhack.git-server = {
@@ -84,10 +83,16 @@ in {
cgit."${cfg.domain}" = {
enable = true;
- package = pkgs.cgit-pink;
+ package = pkgs.cgit;
scanPath = "${config.services.gitolite.dataDir}/repositories";
user = "git";
group = "git";
+
+ # Don't bypass `cgit` when performing a http only clone.
+ # This is slightly slower, but we don't need to worry about the access
+ # restrictions also being by-passed.
+ gitHttpBackend.enable = false;
+
settings = {
branch-sort = "age";
diff --git a/modules/by-name/gr/grocy/module.nix b/modules/vhack/gr/grocy/module.nix
index 28107f2..28107f2 100644
--- a/modules/by-name/gr/grocy/module.nix
+++ b/modules/vhack/gr/grocy/module.nix
diff --git a/modules/by-name/im/impermanence/module.nix b/modules/vhack/im/impermanence/module.nix
index 1c916e2..1c916e2 100644
--- a/modules/by-name/im/impermanence/module.nix
+++ b/modules/vhack/im/impermanence/module.nix
diff --git a/modules/by-name/in/invidious-router/module.nix b/modules/vhack/in/invidious-router/module.nix
index f85a06c..750f852 100644
--- a/modules/by-name/in/invidious-router/module.nix
+++ b/modules/vhack/in/invidious-router/module.nix
@@ -1,7 +1,7 @@
{
config,
lib,
- pkgsUnstable,
+ pkgs,
...
}: let
cfg = config.vhack.invidious-router;
@@ -21,7 +21,7 @@ in {
config = lib.mkIf cfg.enable {
services.invidious-router = {
enable = true;
- package = pkgsUnstable.invidious-router;
+ package = pkgs.invidious-router;
settings = {
app = {
listen = "127.0.0.1:8050";
diff --git a/modules/by-name/ma/mail/module.nix b/modules/vhack/ma/mail/module.nix
index 500abd0..62ff684 100644
--- a/modules/by-name/ma/mail/module.nix
+++ b/modules/vhack/ma/mail/module.nix
@@ -27,12 +27,6 @@ in {
mode = "0700";
}
{
- directory = "/var/lib/mail/sieve";
- user = "virtualMail";
- group = "virtualMail";
- mode = "0700";
- }
- {
directory = "/var/lib/mail/vmail";
user = "virtualMail";
group = "virtualMail";
@@ -63,29 +57,32 @@ in {
mode = "0700";
}
];
+
vhack.nginx.enable = true;
security.acme.certs = {
"${cfg.fqdn}" = {
domain = cfg.fqdn;
};
};
+
mailserver = {
enable = true;
inherit (cfg) fqdn;
- stateVersion = 3;
+ stateVersion = 5;
- useFsLayout = true;
-
- extraVirtualAliases = {
+ aliases = {
"abuse@vhack.eu" = all_admins;
"postmaster@vhack.eu" = all_admins;
"admin@vhack.eu" = all_admins;
};
- mailDirectory = "/var/lib/mail/vmail";
- dkimKeyDirectory = "/var/lib/mail/dkim";
- sieveDirectory = "/var/lib/mail/sieve";
+ storage = {
+ directoryLayout = "fs";
+ path = "/var/lib/mail/vmail";
+ };
+
+ dkim.keyDirectory = "/var/lib/mail/dkim";
backup.snapshotRoot = "/var/lib/mail/backup";
enableImap = false;
@@ -97,9 +94,8 @@ in {
enableSubmissionSsl = true;
openFirewall = true;
- keyFile = "/var/lib/acme/${cfg.fqdn}/key.pem";
- certificateScheme = "acme";
- certificateFile = "/var/lib/acme/${cfg.fqdn}/fullchain.pem";
+ # Reference the existing ACME configuration created by nginx
+ x509.useACMEHost = cfg.fqdn;
domains = [
"vhack.eu"
@@ -110,9 +106,11 @@ in {
"sils.li"
"nightingale.sils.li"
"sils.sils.li"
+
+ "jaki.li"
];
- loginAccounts = {
+ accounts = {
"sils@vhack.eu" = {
hashedPassword = "$2b$05$RW/Svgk7iGxvP5W7ZwUZ1e.a3fj4fteevb2MtfFYYD0d1DQ17y9Fm";
};
@@ -142,6 +140,14 @@ in {
"@sils.li"
];
};
+ "mail@jaki.li" = {
+ hashedPassword = "$y$j9T$jaG/lkAOfYXUNiJt11DoE.$ZKTeev6b5TCBEXZzNLH12hOmy5mL.Fitp0V6saWXR73";
+ aliases = [
+ "postmaster@jaki.li"
+ "abuse@jaki.li"
+ "admin@jaki.li"
+ ];
+ };
# Mail-Account used by hosted software
"mastodon@vhack.eu" = {
diff --git a/modules/by-name/ma/mastodon/module.nix b/modules/vhack/ma/mastodon/module.nix
index 84f3ec8..84f3ec8 100644
--- a/modules/by-name/ma/mastodon/module.nix
+++ b/modules/vhack/ma/mastodon/module.nix
diff --git a/modules/by-name/ma/mastodon/patches/0001-feat-treewide-Increase-character-limit-to-5000-in-me.patch b/modules/vhack/ma/mastodon/patches/0001-feat-treewide-Increase-character-limit-to-5000-in-me.patch
index 35dc809..870492a 100644
--- a/modules/by-name/ma/mastodon/patches/0001-feat-treewide-Increase-character-limit-to-5000-in-me.patch
+++ b/modules/vhack/ma/mastodon/patches/0001-feat-treewide-Increase-character-limit-to-5000-in-me.patch
@@ -1,6 +1,6 @@
-From ab67426c53d343eee349de501767ecbbf5d211ad Mon Sep 17 00:00:00 2001
+From 265bc7b12ab8229225b13565a361051b9e120792 Mon Sep 17 00:00:00 2001
From: Benedikt Peetz <benedikt.peetz@b-peetz.de>
-Date: Sat, 21 Dec 2024 20:07:11 +0100
+Date: Tue, 7 Jul 2026 11:34:50 +0200
Subject: [PATCH] feat(treewide): Increase character limit to 5000 in messages
The default of 500 was just not enough.
@@ -10,31 +10,31 @@ The default of 500 was just not enough.
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/javascript/mastodon/features/compose/containers/compose_form_container.js b/app/javascript/mastodon/features/compose/containers/compose_form_container.js
-index bda2edba6..76ac65bf3 100644
+index c5cffff10d..2172a0ad8f 100644
--- a/app/javascript/mastodon/features/compose/containers/compose_form_container.js
+++ b/app/javascript/mastodon/features/compose/containers/compose_form_container.js
-@@ -28,7 +28,7 @@ const mapStateToProps = state => ({
- anyMedia: state.getIn(['compose', 'media_attachments']).size > 0,
+@@ -58,7 +58,7 @@ const mapStateToProps = state => ({
+ && !state.getIn(['settings', 'dismissed_banners', PRIVATE_QUOTE_MODAL_ID]),
isInReply: state.getIn(['compose', 'in_reply_to']) !== null,
lang: state.getIn(['compose', 'language']),
-- maxChars: state.getIn(['server', 'server', 'configuration', 'statuses', 'max_characters'], 500),
-+ maxChars: state.getIn(['server', 'server', 'configuration', 'statuses', 'max_characters'], 5000),
+- maxChars: state.getIn(['server', 'server', 'item', 'configuration', 'statuses', 'max_characters'], 500),
++ maxChars: state.getIn(['server', 'server', 'item', 'configuration', 'statuses', 'max_characters'], 5000),
});
-
- const mapDispatchToProps = (dispatch) => ({
+
+ const mapDispatchToProps = (dispatch, props) => ({
diff --git a/app/validators/status_length_validator.rb b/app/validators/status_length_validator.rb
-index dc841ded3..9cb1ec94b 100644
+index 575aaf1869..ecefca6fe9 100644
--- a/app/validators/status_length_validator.rb
+++ b/app/validators/status_length_validator.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
-
+
class StatusLengthValidator < ActiveModel::Validator
- MAX_CHARS = 500
+ MAX_CHARS = 5000
URL_PLACEHOLDER_CHARS = 23
URL_PLACEHOLDER = 'x' * 23
-
---
-2.47.0
+
+--
+2.54.0
diff --git a/modules/by-name/ma/matrix/module.nix b/modules/vhack/ma/matrix/module.nix
index ae3f04e..39631ef 100644
--- a/modules/by-name/ma/matrix/module.nix
+++ b/modules/vhack/ma/matrix/module.nix
@@ -62,10 +62,12 @@ in {
tmpfiles.rules = [
"d /etc/matrix 0755 matrix-synapse matrix-synapse"
];
- services.postgresql.postStart = ''
- $PSQL -tAc "ALTER ROLE \"matrix-synapse\" WITH PASSWORD 'synapse';"
- $PSQL -tAc "ALTER ROLE \"mautrix-whatsapp\" WITH PASSWORD 'whatsapp';"
- '';
+ # TODO: Do we still need this? <2025-12-18>
+ # The `$PSQL` env var seemed to go away between the 25.05 -> 25.11 update
+ # services.postgresql.postStart = ''
+ # $PSQL -tAc "ALTER ROLE \"matrix-synapse\" WITH PASSWORD 'synapse';"
+ # $PSQL -tAc "ALTER ROLE \"mautrix-whatsapp\" WITH PASSWORD 'whatsapp';"
+ # '';
};
services = {
diff --git a/modules/by-name/mi/miniflux/module.nix b/modules/vhack/mi/miniflux/module.nix
index 0075bca..0075bca 100644
--- a/modules/by-name/mi/miniflux/module.nix
+++ b/modules/vhack/mi/miniflux/module.nix
diff --git a/modules/vhack/mo/monitoring/components/grafana.nix b/modules/vhack/mo/monitoring/components/grafana.nix
new file mode 100644
index 0000000..6fe5b70
--- /dev/null
+++ b/modules/vhack/mo/monitoring/components/grafana.nix
@@ -0,0 +1,309 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}: let
+ cfg = config.vhack.monitoring.grafana;
+in {
+ options.vhack.monitoring.grafana = {
+ enable = lib.mkEnableOption "grafana";
+
+ orgId = lib.mkOption {
+ type = lib.types.int;
+ description = "Org ID where all vhack related config will be stored.";
+ default = 1;
+ };
+
+ contactPoints = lib.mkOption {
+ type = lib.types.listOf lib.types.str;
+ description = "List of email addresses to send alerts to";
+ default = [];
+ };
+
+ dashboards = lib.mkOption {
+ type = lib.types.listOf lib.types.path;
+ description = "dashboards to provision under 'Vhack' folder.";
+ default = [];
+ };
+
+ fqdn = lib.mkOption {
+ type = lib.types.str;
+ description = "Domain under which Grafana will be served.";
+ example = "grafana.example.org";
+ };
+
+ adminPassword = lib.mkOption {
+ type = lib.types.path;
+ description = "The age-encrypted initial admin password; passed to agenix";
+ };
+
+ secretKey = lib.mkOption {
+ type = lib.types.path;
+ description = "The age-encrypted secret key, used for signing; passed to agenix";
+ };
+
+ port = lib.mkOption {
+ type = lib.types.port;
+ description = "Port where Grafana listens to HTTP requests.";
+ default = 3000;
+ };
+
+ debugLog = lib.mkOption {
+ type = lib.types.bool;
+ description = "Set to true to enable debug logging of the infrastructure serving Grafana.";
+ default = false;
+ example = true;
+ };
+
+ smtp = lib.mkOption {
+ description = "SMTP options.";
+ default = null;
+ type = lib.types.nullOr (
+ lib.types.submodule {
+ options = {
+ from_address = lib.mkOption {
+ type = lib.types.str;
+ description = "SMTP address from which the emails originate.";
+ example = "vaultwarden@mydomain.com";
+ };
+ from_name = lib.mkOption {
+ type = lib.types.str;
+ description = "SMTP name from which the emails originate.";
+ default = "Grafana";
+ };
+ host = lib.mkOption {
+ type = lib.types.str;
+ description = "SMTP host to send the emails to.";
+ };
+ port = lib.mkOption {
+ type = lib.types.port;
+ description = "SMTP port to send the emails to.";
+ default = 25;
+ };
+ username = lib.mkOption {
+ type = lib.types.str;
+ description = "Username to connect to the SMTP host.";
+ };
+ passwordFile = lib.mkOption {
+ type = lib.types.str;
+ description = "File containing the password to connect to the SMTP host.";
+ };
+ };
+ }
+ );
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ assertions = [
+ {
+ assertion = builtins.length cfg.contactPoints > 0;
+ message = "Must have at least one contact point for alerting";
+ }
+ ];
+
+ age.secrets = {
+ grafanaInitialAdminPw = {
+ file = cfg.adminPassword;
+ mode = "0700";
+ owner = "grafana";
+ group = "grafana";
+ };
+ grafanaSecretKey = {
+ file = cfg.secretKey;
+ mode = "0700";
+ owner = "grafana";
+ group = "grafana";
+ };
+ };
+
+ users = {
+ groups = {
+ grafana = {
+ gid = config.vhack.constants.ids.gids.grafana;
+ };
+ };
+ users = {
+ grafana = {
+ isSystemUser = true;
+ group = "grafana";
+ uid = lib.mkForce config.vhack.constants.ids.uids.grafana;
+ };
+ };
+ };
+
+ vhack = {
+ postgresql.enable = true;
+
+ persist.directories = [
+ {
+ directory = "/var/lib/grafana/";
+ user = "grafana";
+ group = "grafana";
+ mode = "0700";
+ }
+ ];
+
+ monitoring.grafana.dashboards = [
+ ../dashboards/node_exporter.json
+ ../dashboards/performance.json
+ ../dashboards/scraping_jobs.json
+ ../dashboards/systemd_exporter.json
+ ];
+
+ anubis.instances."${cfg.fqdn}".target = "http://${config.services.grafana.settings.server.http_addr}:${toString cfg.port}";
+ };
+
+ services = {
+ postgresql = {
+ ensureUsers = [
+ {
+ name = "grafana";
+ ensureDBOwnership = true;
+ }
+ ];
+ ensureDatabases = [
+ "grafana"
+ ];
+ };
+
+ grafana = {
+ enable = true;
+
+ settings = {
+ database = {
+ host = "/run/postgresql";
+ user = "grafana";
+ name = "grafana";
+ type = "postgres";
+ };
+
+ security = {
+ secret_key = "$__file{${config.age.secrets.grafanaSecretKey.path}}";
+
+ disable_initial_admin_creation = false;
+ admin_password = "$__file{${config.age.secrets.grafanaInitialAdminPw.path}}";
+ };
+
+ server = {
+ http_addr = "127.0.0.1";
+ http_port = cfg.port;
+ domain = cfg.fqdn;
+ root_url = "https://${cfg.fqdn}";
+ router_logging = cfg.debugLog;
+ };
+
+ smtp = lib.mkIf (!(isNull cfg.smtp)) {
+ enabled = true;
+ inherit (cfg.smtp) from_address from_name;
+ host = "${cfg.smtp.host}:${toString cfg.smtp.port}";
+ user = cfg.smtp.username;
+ password = "$__file{${cfg.smtp.passwordFile}}";
+ };
+ };
+
+ provision = {
+ dashboards.settings = lib.mkIf (cfg.dashboards != []) {
+ apiVersion = 1;
+ providers = [
+ {
+ folder = "Vhack";
+ options.path = pkgs.symlinkJoin {
+ name = "dashboards";
+ paths = map (p: pkgs.runCommand "dashoard" {} "mkdir $out; cp ${p} $out") cfg.dashboards;
+ };
+ allowUiUpdates = true;
+ disableDeletion = true;
+ }
+ ];
+ };
+ datasources.settings = {
+ apiVersion = 1;
+ datasources = [
+ {
+ inherit (cfg) orgId;
+ name = "Prometheus";
+ type = "prometheus";
+ url = "http://127.0.0.1:${toString config.services.prometheus.port}";
+ uid = "df80f9f5-97d7-4112-91d8-72f523a02b09";
+ isDefault = true;
+ version = 1;
+ }
+ {
+ inherit (cfg) orgId;
+ name = "Loki";
+ type = "loki";
+ url = "http://127.0.0.1:${toString config.services.loki.configuration.server.http_listen_port}";
+ uid = "cd6cc53e-840c-484d-85f7-96fede324006";
+ version = 1;
+ }
+ ];
+ deleteDatasources = [
+ {
+ inherit (cfg) orgId;
+ name = "Prometheus";
+ }
+ {
+ inherit (cfg) orgId;
+ name = "Loki";
+ }
+ ];
+ };
+ alerting = {
+ contactPoints.settings = {
+ apiVersion = 1;
+ contactPoints = [
+ {
+ inherit (cfg) orgId;
+ name = "grafana-default-email";
+ receivers = lib.optionals ((builtins.length cfg.contactPoints) > 0) [
+ {
+ uid = "sysadmin";
+ type = "email";
+ settings.addresses = lib.concatStringsSep ";" cfg.contactPoints;
+ }
+ ];
+ }
+ ];
+ };
+ policies.settings = {
+ apiVersion = 1;
+ policies = [
+ {
+ inherit (cfg) orgId;
+ receiver = "grafana-default-email";
+ group_by = [
+ "grafana_folder"
+ "alertname"
+ ];
+ group_wait = "30s";
+ group_interval = "5m";
+ repeat_interval = "4h";
+ }
+ ];
+ # resetPolicies seems to happen after setting the above policies, effectively rolling back
+ # any updates.
+ };
+ rules.settings = let
+ rules = builtins.fromJSON (builtins.readFile ../rules.json);
+ in {
+ apiVersion = 1;
+ groups = [
+ {
+ inherit (cfg) orgId;
+ name = "SysAdmin";
+ folder = "Vhack";
+ interval = "10m";
+ inherit rules;
+ }
+ ];
+ # deleteRules seems to happen after creating the above rules, effectively rolling back
+ # any updates.
+ };
+ };
+ };
+ };
+ };
+ };
+}
diff --git a/modules/vhack/mo/monitoring/components/loki.nix b/modules/vhack/mo/monitoring/components/loki.nix
new file mode 100644
index 0000000..149e577
--- /dev/null
+++ b/modules/vhack/mo/monitoring/components/loki.nix
@@ -0,0 +1,170 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}: let
+ cfg = config.vhack.monitoring.loki;
+in {
+ options.vhack.monitoring.loki = {
+ enable = lib.mkEnableOption "loki";
+
+ port = lib.mkOption {
+ type = lib.types.port;
+ description = "Port where Loki listens to HTTP requests.";
+ default = 3002;
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ vhack = {
+ persist.directories = [
+ {
+ directory = "/var/lib/loki";
+ user = "loki";
+ group = "loki";
+ mode = "0700";
+ }
+ {
+ directory = "/var/lib/fluent-bit";
+ user = "fluent-bit";
+ group = "fluent-bit";
+ mode = "0700";
+ }
+ ];
+ };
+
+ users = {
+ groups = {
+ fluent-bit = {
+ gid = config.vhack.constants.ids.gids.fluent-bit;
+ };
+ loki = {
+ gid = config.vhack.constants.ids.gids.loki;
+ };
+ };
+ users = {
+ fluent-bit = {
+ isSystemUser = true;
+ group = "fluent-bit";
+ uid = config.vhack.constants.ids.uids.fluent-bit;
+ };
+ loki = {
+ isSystemUser = true;
+ group = "loki";
+ uid = config.vhack.constants.ids.uids.loki;
+ };
+ };
+ };
+
+ # I decided to switch to fluent-bit because it can be tested locally https://docs.fluentbit.io/manual/local-testing/logging-pipeline
+ systemd.services.fluent-bit = {
+ serviceConfig = {
+ StateDirectory = "fluent-bit";
+ User = "fluent-bit";
+ Group = "fluent-bit";
+ DynamicUser = lib.mkForce false;
+ };
+ };
+ services = {
+ fluent-bit = {
+ enable = true;
+ settings = {
+ service = {
+ flush = 1;
+ log_level = "info";
+ http_server = "true";
+ http_listen = "127.0.0.1";
+ http_port = 9080;
+ grace = 30;
+ };
+
+ pipeline = {
+ inputs = [
+ {
+ name = "systemd";
+
+ # The asterisk appends the _SYSTEMD_UNIT to the prefix.
+ tag = "systemd.*";
+
+ # Read logs from this systemd journal directory.
+ path = "/var/log/journal";
+
+ # Database file to keep track of the journald cursor.
+ db = "/var/lib/fluent-bit/systemd.db";
+
+ # Start reading new entries. Skip entries already stored in journald.
+ read_from_tail = true;
+
+ # Max entries to lookback on start.
+ max_entries = 10000;
+ }
+ ];
+
+ outputs = [
+ {
+ name = "loki";
+
+ match = "systemd.*";
+
+ host = "localhost";
+ port = config.services.loki.configuration.server.http_listen_port;
+
+ labels = lib.concatMapAttrsStringSep ", " (n: v: "${n}=${v}") {
+ job = "systemd-journal";
+ inherit (config.vhack.monitoring.grafana) fqdn;
+ hostname = config.networking.hostName;
+ };
+
+ label_keys = "$unit";
+ }
+ ];
+ };
+ };
+ graceLimit = "1m";
+ };
+
+ loki = {
+ enable = true;
+ dataDir = "/var/lib/loki";
+ package = pkgs.grafana-loki;
+ configuration = {
+ auth_enabled = false;
+
+ server.http_listen_port = cfg.port;
+
+ common = {
+ ring = {
+ instance_addr = "127.0.0.1";
+ kvstore = {
+ store = "inmemory";
+ };
+ };
+
+ replication_factor = 1;
+ path_prefix = "/tmp/loki";
+ };
+
+ schema_config = {
+ configs = [
+ {
+ from = "2020-05-15";
+ store = "tsdb";
+ object_store = "filesystem";
+ schema = "v13";
+ index = {
+ prefix = "index_";
+ period = "24h";
+ };
+ }
+ ];
+ };
+
+ storage_config = {
+ filesystem.directory = "/tmp/loki/chunks";
+ };
+ };
+ };
+ };
+ };
+}
diff --git a/modules/vhack/mo/monitoring/components/perses.nix b/modules/vhack/mo/monitoring/components/perses.nix
new file mode 100644
index 0000000..b0f1ab6
--- /dev/null
+++ b/modules/vhack/mo/monitoring/components/perses.nix
@@ -0,0 +1,17 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}: let
+ cfg = config.vhack.monitoring.perses;
+in {
+ options.vhack.monitoring.perses = {
+ enable = lib.mkEnableOption "perses";
+ };
+ config = lib.mkIf cfg.enable {
+ services.perses = {
+ enable = true;
+ };
+ };
+}
diff --git a/modules/vhack/mo/monitoring/components/prometheus.nix b/modules/vhack/mo/monitoring/components/prometheus.nix
new file mode 100644
index 0000000..ca947d3
--- /dev/null
+++ b/modules/vhack/mo/monitoring/components/prometheus.nix
@@ -0,0 +1,272 @@
+{
+ lib,
+ config,
+ nixLib,
+ ...
+}: let
+ cfg = config.vhack.monitoring.prometheus;
+
+ commonLabels = {
+ hostname = config.networking.hostName;
+ };
+
+ prom_cfg = config.services.prometheus;
+in {
+ options.vhack.monitoring.prometheus = {
+ enable = lib.mkEnableOption "prometheus";
+
+ port = lib.mkOption {
+ type = lib.types.port;
+ description = "Port where Prometheus listens to HTTP requests.";
+ default = 3001;
+ };
+
+ remoteWriteReceiver = lib.mkOption {
+ example = "https://prometheus.server2.vhack.eu";
+ type = lib.types.nullOr lib.types.str;
+ default = null;
+ description = ''
+ If not null, this prometheus server will be exposed via a reverse proxy and allow
+ other prometheus servers to write metrics to it.
+ '';
+ };
+ remoteWriteTo = lib.mkOption {
+ example = "https://prometheus.server3.vhack.eu";
+ type = lib.types.nullOr (lib.types.submodule {
+ options = {
+ port = lib.mkOption {
+ type = lib.types.nullOr lib.types.port;
+ default = null;
+ };
+ url = lib.mkOption {
+ type = lib.types.str;
+ };
+ };
+ });
+ default = null;
+ description = ''
+ If not null, this prometheus server will run in agent mode, writing all recived
+ metrics to the specified remote prometheus server.
+ '';
+ };
+
+ sources = lib.mkOption {
+ type = lib.types.listOf (lib.types.submodule {
+ options = {
+ name = lib.mkOption {
+ type = lib.types.str;
+ };
+ target = lib.mkOption {
+ type = lib.types.str;
+ description = "The target url to scrape from.";
+ };
+ extra = lib.mkOption {
+ type = lib.types.attrsOf lib.types.anything;
+ };
+ };
+ });
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ vhack = {
+ nginx.enable = true;
+
+ persist.directories = [
+ {
+ directory = "/var/lib/prometheus2";
+ user = "prometheus";
+ group = "prometheus";
+ mode = "0700";
+ }
+ ];
+
+ monitoring.prometheus.sources = [
+ {
+ name = "node";
+ target = "127.0.0.1:${toString prom_cfg.exporters.node.port}";
+ }
+ {
+ name = "prometheus_internal";
+ target = "127.0.0.1:${toString prom_cfg.port}";
+ }
+ {
+ name = "systemd";
+ target = "127.0.0.1:${toString prom_cfg.exporters.systemd.port}";
+ }
+ ];
+ };
+
+ services.nginx = lib.mkIf (cfg.remoteWriteReceiver != null) {
+ virtualHosts.${cfg.remoteWriteReceiver} = {
+ locations."/" = {
+ proxyPass = "http://127.0.0.1:${toString cfg.port}/api/v1/write";
+
+ recommendedProxySettings = true;
+ proxyWebsockets = true;
+ };
+
+ enableACME = true;
+ forceSSL = true;
+ };
+ };
+
+ users = {
+ groups = {
+ node-exporter.gid = config.vhack.constants.ids.gids.node-exporter;
+ };
+ users = {
+ node-exporter = {
+ isSystemUser = true;
+ group = "node-exporter";
+ uid = config.vhack.constants.ids.uids.node-exporter;
+ };
+ };
+ };
+
+ services = {
+ prometheus = {
+ enable = true;
+ inherit (cfg) port;
+
+ globalConfig = {
+ scrape_interval = "15s";
+ };
+ remoteWrite = lib.optionals (cfg.remoteWriteTo != null) [
+ {
+ url = let
+ port =
+ if (cfg.remoteWriteTo.port != null)
+ then ":${toString cfg.remoteWriteTo.port}"
+ else "";
+ in "${cfg.remoteWriteTo.url}${port}";
+ # TODO: Needs RFC42 for prometheus <2026-07-19>
+ # protobuf_message = "io.prometheus.write.v2.Request";
+ }
+ ];
+
+ enableAgentMode = cfg.remoteWriteTo != null;
+ extraFlags = lib.mkMerge [
+ (
+ lib.mkIf (cfg.remoteWriteReceiver != null) [
+ "--web.enable-remote-write-receiver"
+ # "--web.remote-write-receiver.accepted-protobuf-messages=io.prometheus.write.v2.Request"
+ ]
+ )
+ ];
+
+ scrapeConfigs = builtins.map (attr:
+ nixLib.warnMerge {
+ job_name = attr.name;
+ static_configs = [
+ {
+ targets = [attr.target];
+ labels = commonLabels;
+ }
+ ];
+ }
+ attr.extra "prometheus scrapeConfig '${attr.name}'")
+ cfg.sources;
+ # ++ (lib.optional (builtins.length (lib.attrNames config.services.redis.servers) > 0) {
+ # job_name = "redis";
+ # static_configs = [
+ # {
+ # targets = ["127.0.0.1:${toString config.services.prometheus.exporters.redis.port}"];
+ # }
+ # ];
+ # }) ++ (lib.optional (builtins.length (lib.attrNames config.services.openvpn.servers) > 0) {
+ # job_name = "openvpn";
+ # static_configs = [
+ # {
+ # targets = ["127.0.0.1:${toString config.services.prometheus.exporters.openvpn.port}"];
+ # }
+ # ];
+ # })
+ # ++ (lib.optional config.services.dnsmasq.enable {
+ # job_name = "dnsmasq";
+ # static_configs = [
+ # {
+ # targets = ["127.0.0.1:${toString config.services.prometheus.exporters.dnsmasq.port}"];
+ # labels = commonLabels;
+ # }
+ # ];
+ # });
+
+ exporters = {
+ node = {
+ enable = true;
+ # https://github.com/prometheus/node_exporter#collectors
+ enabledCollectors = [
+ "arp"
+ "cpu"
+ "cpufreq"
+ "diskstats"
+ "dmi"
+ "edac"
+ "entropy"
+ "filefd"
+ "filesystem"
+ "hwmon"
+ "loadavg"
+ "meminfo"
+ "netclass"
+ "netdev"
+ "netstat"
+ "nvme"
+ "os"
+ "pressure"
+ "rapl"
+ "schedstat"
+ "stat"
+ "thermal_zone"
+ "time"
+ "uname"
+ "vmstat"
+ "zfs"
+
+ # Disabled by default
+ "cgroups"
+ "drm"
+ "ethtool"
+ "logind"
+ "wifi"
+ ];
+ port = 9112;
+ listenAddress = "127.0.0.1";
+ };
+ # services.prometheus.exporters.redis = lib.mkIf (builtins.length (lib.attrNames config.services.redis.servers) > 0) {
+ # enable = true;
+ # port = 9119;
+ # listenAddress = "127.0.0.1";
+ # };
+ # services.prometheus.exporters.openvpn = lib.mkIf (builtins.length (lib.attrNames config.services.openvpn.servers) > 0) {
+ # enable = true;
+ # port = 9121;
+ # listenAddress = "127.0.0.1";
+ # statusPaths = lib.mapAttrsToList (name: _config: "/tmp/openvpn/${name}.status") config.services.openvpn.servers;
+ # };
+ # dnsmasq = lib.mkIf config.services.dnsmasq.enable {
+ # enable = true;
+ # port = 9211;
+ # listenAddress = "127.0.0.1";
+ # };
+ systemd = {
+ enable = true;
+ port = 9116;
+ listenAddress = "127.0.0.1";
+ extraFlags = [
+ "--log.level=info"
+ "--web.disable-exporter-metrics"
+ # "--systemd.collector.enable-resolved"
+ "--systemd.collector.enable-restart-count"
+ # "--systemd.collector.enable-file-descriptor-size"
+ "--systemd.collector.enable-ip-accounting"
+ "--systemd.collector.unit-include=\".+\""
+ "--systemd.collector.unit-exclude=\".+\\\\.(device)\""
+ ];
+ };
+ };
+ };
+ };
+ };
+}
diff --git a/modules/vhack/mo/monitoring/components/scrutiny.nix b/modules/vhack/mo/monitoring/components/scrutiny.nix
new file mode 100644
index 0000000..adb515e
--- /dev/null
+++ b/modules/vhack/mo/monitoring/components/scrutiny.nix
@@ -0,0 +1,100 @@
+{
+ config,
+ pkgs,
+ lib,
+ ...
+}: let
+ cfg = config.vhack.monitoring.scrutiny;
+in {
+ options.vhack.monitoring.scrutiny = {
+ enable = lib.mkEnableOption "scrutiny service";
+ };
+
+ # We don't currently _care_ about the health of the hardware, because hetzner does
+ # this for us (nor can we care, because it's not exposed in the VPS)
+ config = lib.mkIf false {
+ vhack.monitoring = {
+ prometheus.sources = [
+ {
+ name = "scrutiny";
+ extra.metrics_path = "/api/metrics";
+ target = "127.0.0.1:${toString config.services.scrutiny.settings.web.listen.port}";
+ }
+ {
+ name = "smartctl";
+ target = "127.0.0.1:${toString config.services.prometheus.exporters.smartctl.port}";
+ }
+ ];
+ grafana.dashboards = [
+ ../dashboards/Health.json
+ ];
+ };
+
+ users = {
+ groups = {
+ smartctl-exporter-access.gid = config.vhack.constants.ids.gids.smartctl-exporter-access;
+ };
+ users = {
+ smartctl-exporter-access = {
+ isSystemUser = true;
+ group = "smartctl-exporter-access";
+ uid = config.vhack.constants.ids.uids.smartctl-exporter-access;
+ };
+ };
+ };
+
+ services = {
+ scrutiny = {
+ enable = true;
+
+ openFirewall = false;
+
+ # This src includes Prometheus metrics exporter.
+ package = pkgs.scrutiny.overrideAttrs {
+ src = pkgs.fetchFromGitHub {
+ owner = "ibizaman";
+ repo = "scrutiny";
+ rev = "74faf06f77df83f29e7e1806cd88b2fafc0bbb82";
+ hash = "sha256-r0AVWL+E046xHxitwMPfRNTOpjuOk+W6tB41YgmLTPg=";
+ };
+
+ vendorHash = "sha256-kAlnlWnBMFCdgdak5L5hRquRtyLi5MTmDa/kxwqPs4E=";
+ };
+
+ settings = {
+ web = {
+ metrics.enabled = true; # Enables Prometheus exporter
+ listenHost = "127.0.0.1";
+ };
+ };
+
+ collector = {
+ enable = true;
+ };
+ };
+ prometheus = {
+ exporters.smartctl = {
+ enable = true;
+ port = 9115;
+ listenAddress = "127.0.0.1";
+ };
+ };
+ };
+
+ # nixpkgs.overlays = [
+ # (final: prev: {
+ # prometheus-systemd-exporter = prev.prometheus-systemd-exporter.overrideAttrs {
+ # src = final.fetchFromGitHub {
+ # owner = "ibizaman";
+ # repo = prev.prometheus-systemd-exporter.pname;
+ # # rev = "v${prev.prometheus-systemd-exporter.version}";
+ # rev = "next_timer";
+ # sha256 = "sha256-jzkh/616tsJbNxFtZ0xbdBQc16TMIYr9QOkPaeQw8xA=";
+ # };
+ #
+ # vendorHash = "sha256-4hsQ1417jLNOAqGkfCkzrmEtYR4YLLW2j0CiJtPg6GI=";
+ # };
+ # })
+ # ];
+ };
+}
diff --git a/modules/vhack/mo/monitoring/dashboards/node_exporter.json b/modules/vhack/mo/monitoring/dashboards/node_exporter.json
new file mode 100644
index 0000000..1666125
--- /dev/null
+++ b/modules/vhack/mo/monitoring/dashboards/node_exporter.json
@@ -0,0 +1,21817 @@
+{
+ "apiVersion": "dashboard.grafana.app/v2",
+ "kind": "Dashboard",
+ "metadata": {
+ "name": "rYdddlPWk",
+ "namespace": "default",
+ "uid": "b3cd6890-d44d-45c4-8b59-b822bf2ff401",
+ "resourceVersion": "1784467637439232",
+ "generation": 1,
+ "creationTimestamp": "2026-07-19T13:27:17Z",
+ "labels": {
+ "grafana.app/deprecatedInternalID": "2674631701774336"
+ },
+ "annotations": {
+ "grafana.app/createdBy": "user:dfsj9uc3855oga",
+ "grafana.app/folder": "",
+ "grafana.app/saved-from-ui": "Grafana v13.0.3 (NA)"
+ }
+ },
+ "spec": {
+ "annotations": [
+ {
+ "kind": "AnnotationQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "datasource",
+ "version": "v0",
+ "datasource": {
+ "name": "grafana"
+ },
+ "spec": {
+ "limit": 100,
+ "matchAny": false,
+ "tags": [],
+ "type": "dashboard"
+ }
+ },
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "builtIn": true,
+ "legacyOptions": {
+ "type": "dashboard"
+ }
+ }
+ }
+ ],
+ "cursorSync": "Crosshair",
+ "editable": true,
+ "elements": {
+ "panel-104": {
+ "kind": "Panel",
+ "spec": {
+ "id": 104,
+ "title": "TCP Errors",
+ "description": "Tracks various TCP error and congestion-related events, including retransmissions, timeouts, dropped connections, and buffer issues",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_TcpExt_ListenOverflows{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Listen Overflows",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_TcpExt_ListenDrops{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Listen Drops",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_TcpExt_TCPSynRetrans{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "SYN Retransmits",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_Tcp_RetransSegs{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "Segment Retransmits",
+ "range": true
+ }
+ },
+ "refId": "D",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_Tcp_InErrs{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "Receive Errors",
+ "range": true
+ }
+ },
+ "refId": "E",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_Tcp_OutRsts{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "RST Sent",
+ "range": true
+ }
+ },
+ "refId": "F",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_TcpExt_TCPRcvQDrop{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "Receive Queue Drops",
+ "range": true
+ }
+ },
+ "refId": "G",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_TcpExt_TCPOFOQueue{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "Out-of-order Queued",
+ "range": true
+ }
+ },
+ "refId": "H",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_TcpExt_TCPTimeouts{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "TCP Timeouts",
+ "range": true
+ }
+ },
+ "refId": "I",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "pps",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-109": {
+ "kind": "Panel",
+ "spec": {
+ "id": 109,
+ "title": "UDP Errors",
+ "description": "Rate of UDP and UDPLite datagram delivery errors, including missing listeners, buffer overflows, and protocol-specific issues",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_Udp_InErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "UDP Rx in Errors",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_Udp_NoPorts{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "UDP No Listener",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_UdpLite_InErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "UDPLite Rx in Errors",
+ "range": true
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_Udp_RcvbufErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "UDP Rx in Buffer Errors",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "D",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_Udp_SndbufErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "UDP Tx out Buffer Errors",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "E",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "pps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-115": {
+ "kind": "Panel",
+ "spec": {
+ "id": 115,
+ "title": "ICMP In / Out",
+ "description": "Number of ICMP messages sent and received per second, including error and control messages",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_Icmp_InMsgs{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "ICMP Rx in",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_Icmp_OutMsgs{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "ICMP Tx out",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "pps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "out (-) / in (+)",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*out.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-124": {
+ "kind": "Panel",
+ "spec": {
+ "id": 124,
+ "title": "Sockstat UDP",
+ "description": "Number of UDP and UDPLite sockets currently in use",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_sockstat_UDPLITE_inuse{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "UDPLite - In-Use Sockets",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_sockstat_UDP_inuse{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "UDP - In-Use Sockets",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-125": {
+ "kind": "Panel",
+ "spec": {
+ "id": 125,
+ "title": "Sockstat FRAG / RAW",
+ "description": "Number of FRAG and RAW sockets currently in use. RAW sockets are used for custom protocols or tools like ping; FRAG sockets are used internally for IP packet defragmentation",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_sockstat_FRAG_inuse{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "FRAG - In-Use Sockets",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_sockstat_RAW_inuse{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "RAW - In-Use Sockets",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-126": {
+ "kind": "Panel",
+ "spec": {
+ "id": 126,
+ "title": "Sockstat Used",
+ "description": "Total number of sockets currently in use across all protocols (TCP, UDP, UNIX, etc.), as reported by /proc/net/sockstat",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_sockstat_sockets_used{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Total sockets",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-127": {
+ "kind": "Panel",
+ "spec": {
+ "id": 127,
+ "title": "Disk I/O Utilization",
+ "description": "Percentage of time the disk was actively processing I/O operations",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_disk_io_time_seconds_total{instance=\"$node\",job=\"$job\",device=~\"[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+\"} [$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "{{device}}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "percentunit",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 40,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-128": {
+ "kind": "Panel",
+ "spec": {
+ "id": 128,
+ "title": "Memory DirectMap",
+ "description": "How much memory is directly mapped in the kernel using different page sizes (4K, 2M, 1G). Helps monitor large page utilization in the direct map region",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_DirectMap1G_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "DirectMap 1G – Memory mapped with 1GB pages",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_DirectMap2M_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "DirectMap 2M – Memory mapped with 2MB pages",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_DirectMap4k_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "DirectMap 4K – Memory mapped with 4KB pages",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-129": {
+ "kind": "Panel",
+ "spec": {
+ "id": 129,
+ "title": "Memory Anonymous",
+ "description": "Memory used by anonymous pages (not backed by files), including standard and huge page allocations. Includes heap, stack, and memory-mapped anonymous regions",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_AnonHugePages_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "AnonHugePages – Anonymous memory using HugePages",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_AnonPages_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "AnonPages – Anonymous memory (non-file-backed)",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-130": {
+ "kind": "Panel",
+ "spec": {
+ "id": 130,
+ "title": "Memory Writeback and Dirty",
+ "description": "Memory currently dirty (modified but not yet written to disk), being actively written back, or held by writeback buffers. High dirty or writeback memory may indicate disk I/O pressure or delayed flushing",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_Writeback_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Writeback – Memory currently being flushed to disk",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_WritebackTmp_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "WritebackTmp – FUSE temporary writeback buffers",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_Dirty_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Dirty – Memory marked dirty (pending write to disk)",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_NFS_Unstable_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "NFS Unstable – Pages sent to NFS server, awaiting storage commit",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "D",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-131": {
+ "kind": "Panel",
+ "spec": {
+ "id": 131,
+ "title": "Memory Slab",
+ "description": "Kernel slab memory usage, separated into reclaimable and non-reclaimable categories. Reclaimable memory can be freed under memory pressure (e.g., caches), while unreclaimable memory is locked by the kernel for core functions",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_SUnreclaim_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "SUnreclaim – Non-reclaimable slab memory (kernel objects)",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_SReclaimable_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "SReclaimable – Potentially reclaimable slab memory (e.g., inode cache)",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "normal"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-133": {
+ "kind": "Panel",
+ "spec": {
+ "id": 133,
+ "title": "Disk R/W Merged",
+ "description": "Number of read and write requests merged per second that were queued to the device",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_disk_reads_merged_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "legendFormat": "{{device}} - Read",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_disk_writes_merged_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "legendFormat": "{{device}} - Write",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "iops",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "read (–) / write (+)",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*Read.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/sda.*/"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "orange",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-135": {
+ "kind": "Panel",
+ "spec": {
+ "id": 135,
+ "title": "Memory Committed",
+ "description": "Displays committed memory usage versus the system's commit limit. Exceeding the limit is allowed under Linux overcommit policies but may increase OOM risks under high load",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_Committed_AS_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Committed_AS – Memory promised to processes (not necessarily used)",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_CommitLimit_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "CommitLimit - Max allowable committed memory",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 350
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*CommitLimit - *./"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#BF1B00",
+ "mode": "fixed"
+ }
+ },
+ {
+ "id": "custom.fillOpacity",
+ "value": 0
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-136": {
+ "kind": "Panel",
+ "spec": {
+ "id": 136,
+ "title": "Memory LRU Active / Inactive (%)",
+ "description": "Proportion of memory pages in the kernel's active and inactive LRU lists relative to total RAM. Active pages have been recently used, while inactive pages are less recently accessed but still resident in memory",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "(node_memory_Inactive_bytes{instance=\"$node\",job=\"$job\"}) \n/ \n(node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"})",
+ "format": "time_series",
+ "legendFormat": "Inactive – Less recently used memory, more likely to be reclaimed",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "(node_memory_Active_bytes{instance=\"$node\",job=\"$job\"}) \n/ \n(node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"})\n",
+ "format": "time_series",
+ "legendFormat": "Active – Recently used memory, retained unless under pressure",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 350
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "percentunit",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "normal"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*Active.*/"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "green",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*Inactive.*/"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "dark-blue",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-137": {
+ "kind": "Panel",
+ "spec": {
+ "id": 137,
+ "title": "Memory Unevictable and MLocked",
+ "description": "Memory that is locked in RAM and cannot be swapped out. Includes both kernel-unevictable memory and user-level memory locked with mlock()",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_Unevictable_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Unevictable – Kernel-pinned memory (not swappable)",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_Mlocked_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Mlocked – Application-locked memory via mlock()",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 350
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-138": {
+ "kind": "Panel",
+ "spec": {
+ "id": 138,
+ "title": "Memory Shared and Mapped",
+ "description": "Memory used for mapped files (such as libraries) and shared memory (shmem and tmpfs), including variants backed by huge pages",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_Mapped_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Mapped – Memory mapped from files (e.g., libraries, mmap)",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_Shmem_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Shmem – Shared memory used by processes and tmpfs",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_ShmemHugePages_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "ShmemHugePages – Shared memory (shmem/tmpfs) allocated with HugePages",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_ShmemPmdMapped_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "PMD Mapped – Shmem/tmpfs backed by Transparent HugePages (PMD)",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "D",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 350
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-14": {
+ "kind": "Panel",
+ "spec": {
+ "id": 14,
+ "title": "CPU Cores",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu))",
+ "instant": true,
+ "legendFormat": "__auto",
+ "range": false
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {
+ "maxDataPoints": 100
+ }
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "stat",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "colorMode": "none",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "mappings": [
+ {
+ "type": "special",
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ }
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "thresholds"
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-140": {
+ "kind": "Panel",
+ "spec": {
+ "id": 140,
+ "title": "Memory HugePages",
+ "description": "Displays HugePages memory usage in bytes, including allocated, free, reserved, and surplus memory. All values are calculated based on the number of huge pages multiplied by their configured size",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "(node_memory_HugePages_Total{instance=\"$node\",job=\"$job\"} - node_memory_HugePages_Free{instance=\"$node\",job=\"$job\"}) * node_memory_Hugepagesize_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "HugePages Used – Currently allocated",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_HugePages_Rsvd{instance=\"$node\",job=\"$job\"} * node_memory_Hugepagesize_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "HugePages Reserved – Promised but unused",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_HugePages_Surp{instance=\"$node\",job=\"$job\"} * node_memory_Hugepagesize_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "HugePages Surplus – Dynamic pool extension",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_HugePages_Total{instance=\"$node\",job=\"$job\"} * node_memory_Hugepagesize_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "HugePages Total – Reserved memory",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "D",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-141": {
+ "kind": "Panel",
+ "spec": {
+ "id": 141,
+ "title": "Network Traffic Compressed",
+ "description": "Rate of compressed network packets received and transmitted per interface. These are common in low-bandwidth or special interfaces like PPP or SLIP",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_network_receive_compressed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "{{device}} - Rx in",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_network_transmit_compressed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "{{device}} - Tx out",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "pps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "out (-) / in (+)",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*out.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-142": {
+ "kind": "Panel",
+ "spec": {
+ "id": 142,
+ "title": "Network Traffic Errors",
+ "description": "Rate of packet-level errors for each network interface. Receive errors may indicate physical or driver issues; transmit errors may reflect collisions or hardware faults",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_network_receive_errs_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "{{device}} - Rx in",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_network_transmit_errs_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "{{device}} - Tx out",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "pps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "out (-) / in (+)",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*out.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-143": {
+ "kind": "Panel",
+ "spec": {
+ "id": 143,
+ "title": "Network Traffic Drop",
+ "description": "Rate of dropped packets per network interface. Receive drops can indicate buffer overflow or driver issues; transmit drops may result from outbound congestion or queuing limits",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_network_receive_drop_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "{{device}} - Rx in",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_network_transmit_drop_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "{{device}} - Tx out",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "pps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "out (-) / in (+)",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*out.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-144": {
+ "kind": "Panel",
+ "spec": {
+ "id": 144,
+ "title": "Network Traffic Fifo",
+ "description": "Tracks FIFO buffer overrun errors on network interfaces. These occur when incoming or outgoing packets are dropped due to queue or buffer overflows, often indicating congestion or hardware limits",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_network_receive_fifo_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "{{device}} - Rx in",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_network_transmit_fifo_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "{{device}} - Tx out",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "pps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "out (-) / in (+)",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*out.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-145": {
+ "kind": "Panel",
+ "spec": {
+ "id": 145,
+ "title": "Network Traffic Frame",
+ "description": "Rate of frame errors on received packets, typically caused by physical layer issues such as bad cables, duplex mismatches, or hardware problems",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_network_receive_frame_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "{{device}} - Rx in",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "pps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-146": {
+ "kind": "Panel",
+ "spec": {
+ "id": 146,
+ "title": "Network Traffic Multicast",
+ "description": "Rate of incoming multicast packets received per network interface. Multicast is used by protocols such as mDNS, SSDP, and some streaming or cluster services",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_network_receive_multicast_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "{{device}} - Rx in",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "pps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-148": {
+ "kind": "Panel",
+ "spec": {
+ "id": 148,
+ "title": "Processes Forks",
+ "description": "Rate of new processes being created on the system (forks/sec).",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_forks_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "Process Forks per second",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "ops",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-149": {
+ "kind": "Panel",
+ "spec": {
+ "id": 149,
+ "title": "Exporter Processes Memory",
+ "description": "Tracks the memory usage of the process exposing this metric (e.g., node_exporter), including current virtual memory and maximum virtual memory limit",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "process_virtual_memory_bytes{instance=\"$node\",job=\"$job\"}",
+ "interval": "",
+ "legendFormat": "Virtual Memory",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "process_virtual_memory_max_bytes{instance=\"$node\",job=\"$job\"}",
+ "interval": "",
+ "legendFormat": "Virtual Memory Limit",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Virtual Memory Limit"
+ },
+ "properties": [
+ {
+ "id": "custom.fillOpacity",
+ "value": 0
+ },
+ {
+ "id": "custom.lineStyle",
+ "value": {
+ "dash": [
+ 10,
+ 10
+ ],
+ "fill": "dash"
+ }
+ },
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "dark-red",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "__systemRef": "hideSeriesFrom",
+ "matcher": {
+ "id": "byNames",
+ "options": {
+ "mode": "exclude",
+ "names": [
+ "Virtual Memory"
+ ],
+ "prefix": "All except:",
+ "readOnly": true
+ }
+ },
+ "properties": [
+ {
+ "id": "custom.hideFrom",
+ "value": {
+ "legend": false,
+ "tooltip": true,
+ "viz": true
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-15": {
+ "kind": "Panel",
+ "spec": {
+ "id": 15,
+ "title": "Uptime",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "node_time_seconds{instance=\"$node\",job=\"$job\"} - node_boot_time_seconds{instance=\"$node\",job=\"$job\"}",
+ "instant": true,
+ "range": false,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {
+ "maxDataPoints": 100
+ }
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "stat",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "colorMode": "none",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "s",
+ "decimals": 1,
+ "mappings": [
+ {
+ "type": "special",
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ }
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "thresholds"
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-151": {
+ "kind": "Panel",
+ "spec": {
+ "id": 151,
+ "title": "Entropy",
+ "description": "Number of bits of entropy currently available to the system's random number generators (e.g., /dev/random). Low values may indicate that random number generation could block or degrade performance of cryptographic operations",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_entropy_available_bits{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Entropy available",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_entropy_pool_size_bits{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Entropy pool max",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "decbits",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Entropy pool max"
+ },
+ "properties": [
+ {
+ "id": "custom.fillOpacity",
+ "value": 0
+ },
+ {
+ "id": "custom.lineStyle",
+ "value": {
+ "dash": [
+ 10,
+ 10
+ ],
+ "fill": "dash"
+ }
+ },
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "dark-red",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-152": {
+ "kind": "Panel",
+ "spec": {
+ "id": 152,
+ "title": "Disk Space Used Basic",
+ "description": "Percentage of filesystem space used for each mounted device",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "((node_filesystem_size_bytes{instance=\"$node\", job=\"$job\", device!~'rootfs'} - node_filesystem_avail_bytes{instance=\"$node\", job=\"$job\", device!~'rootfs'}) / node_filesystem_size_bytes{instance=\"$node\", job=\"$job\", device!~'rootfs'}) * 100",
+ "format": "time_series",
+ "legendFormat": "{{mountpoint}}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "percent",
+ "min": 0,
+ "max": 100,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 40,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-154": {
+ "kind": "Panel",
+ "spec": {
+ "id": 154,
+ "title": "Root FS Used",
+ "description": "Used Root FS",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "(\n (node_filesystem_size_bytes{instance=\"$node\", job=\"$job\", mountpoint=\"/\", fstype!=\"rootfs\"}\n - node_filesystem_avail_bytes{instance=\"$node\", job=\"$job\", mountpoint=\"/\", fstype!=\"rootfs\"})\n / node_filesystem_size_bytes{instance=\"$node\", job=\"$job\", mountpoint=\"/\", fstype!=\"rootfs\"}\n) * 100\n",
+ "format": "time_series",
+ "instant": true,
+ "range": false,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "gauge",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "minVizHeight": 75,
+ "minVizWidth": 75,
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true,
+ "sizing": "auto"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "percent",
+ "decimals": 1,
+ "min": 0,
+ "max": 100,
+ "mappings": [
+ {
+ "type": "special",
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ }
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "rgba(50, 172, 45, 0.97)"
+ },
+ {
+ "value": 80,
+ "color": "rgba(237, 129, 40, 0.89)"
+ },
+ {
+ "value": 90,
+ "color": "rgba(245, 54, 54, 0.9)"
+ }
+ ]
+ },
+ "color": {
+ "mode": "thresholds"
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-155": {
+ "kind": "Panel",
+ "spec": {
+ "id": 155,
+ "title": "Sys Load",
+ "description": "System load over all CPU cores together",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "scalar(node_load1{instance=\"$node\",job=\"$job\"}) * 100 / count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu))",
+ "format": "time_series",
+ "instant": true,
+ "range": false,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "gauge",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "minVizHeight": 75,
+ "minVizWidth": 75,
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true,
+ "sizing": "auto"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "percent",
+ "decimals": 1,
+ "min": 0,
+ "max": 100,
+ "mappings": [
+ {
+ "type": "special",
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ }
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "rgba(50, 172, 45, 0.97)"
+ },
+ {
+ "value": 85,
+ "color": "rgba(237, 129, 40, 0.89)"
+ },
+ {
+ "value": 95,
+ "color": "rgba(245, 54, 54, 0.9)"
+ }
+ ]
+ },
+ "color": {
+ "mode": "thresholds"
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-156": {
+ "kind": "Panel",
+ "spec": {
+ "id": 156,
+ "title": "Filesystem Used",
+ "description": "Disk usage (used = total - available) per mountpoint",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'} - node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}",
+ "format": "time_series",
+ "legendFormat": "{{mountpoint}}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-157": {
+ "kind": "Panel",
+ "spec": {
+ "id": 157,
+ "title": "Node Exporter Scrape",
+ "description": "Shows whether each Node Exporter collector scraped successfully (1 = success, 0 = failure), and whether the textfile collector returned an error.",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_scrape_collector_success{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "{{collector}}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "1 - node_textfile_scrape_error{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "textfile",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "bargauge",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "displayMode": "basic",
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "maxVizHeight": 300,
+ "minVizHeight": 16,
+ "minVizWidth": 8,
+ "namePlacement": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true,
+ "sizing": "auto",
+ "valueMode": "color"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bool",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ },
+ {
+ "value": 0,
+ "color": "dark-red"
+ },
+ {
+ "value": 1,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "thresholds"
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-158": {
+ "kind": "Panel",
+ "spec": {
+ "id": 158,
+ "title": "Hardware Temperature Monitor",
+ "description": "Monitors hardware sensor temperatures and critical thresholds as exposed by Linux hwmon. Includes CPU, GPU, and motherboard sensors where available",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_hwmon_temp_celsius{instance=\"$node\",job=\"$job\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "{{ chip_name }} {{ sensor }}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "expr": "node_hwmon_temp_crit_alarm_celsius{instance=\"$node\",job=\"$job\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "{{ chip_name }} {{ sensor }} Critical Alarm",
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": true
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_hwmon_temp_crit_celsius{instance=\"$node\",job=\"$job\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "{{ chip_name }} {{ sensor }} Critical",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "expr": "node_hwmon_temp_crit_hyst_celsius{instance=\"$node\",job=\"$job\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "{{ chip_name }} {{ sensor }} Critical Hysteresis",
+ "step": 240
+ }
+ },
+ "refId": "D",
+ "hidden": true
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "expr": "node_hwmon_temp_max_celsius{instance=\"$node\",job=\"$job\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "{{ chip_name }} {{ sensor }} Max",
+ "step": 240
+ }
+ },
+ "refId": "E",
+ "hidden": true
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "celsius",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*Critical.*/"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#E24D42",
+ "mode": "fixed"
+ }
+ },
+ {
+ "id": "custom.fillOpacity",
+ "value": 0
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-16": {
+ "kind": "Panel",
+ "spec": {
+ "id": 16,
+ "title": "RAM Used",
+ "description": "Real RAM usage excluding cache and reclaimable memory",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "clamp_min((1 - (node_memory_MemAvailable_bytes{instance=\"$node\", job=\"$job\"} / node_memory_MemTotal_bytes{instance=\"$node\", job=\"$job\"})) * 100, 0)",
+ "format": "time_series",
+ "instant": true,
+ "range": false,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "gauge",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "minVizHeight": 75,
+ "minVizWidth": 75,
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true,
+ "sizing": "auto"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "percent",
+ "decimals": 1,
+ "min": 0,
+ "max": 100,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "rgba(50, 172, 45, 0.97)"
+ },
+ {
+ "value": 80,
+ "color": "rgba(237, 129, 40, 0.89)"
+ },
+ {
+ "value": 90,
+ "color": "rgba(245, 54, 54, 0.9)"
+ }
+ ]
+ },
+ "color": {
+ "mode": "thresholds"
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-160": {
+ "kind": "Panel",
+ "spec": {
+ "id": 160,
+ "title": "Memory Kernel / CPU / IO",
+ "description": "Tracks kernel memory used for CPU-local structures, per-thread stacks, and bounce buffers used for I/O on DMA-limited devices. These areas are typically small but critical for low-level operations",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_KernelStack_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "KernelStack – Kernel stack memory (per-thread, non-reclaimable)",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_Percpu_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "PerCPU – Dynamically allocated per-CPU memory (used by kernel modules)",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_Bounce_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Bounce Memory – I/O buffer for DMA-limited devices",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 350
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-168": {
+ "kind": "Panel",
+ "spec": {
+ "id": 168,
+ "title": "Time Synchronized Status",
+ "description": "Shows whether the system clock is synchronized to a reliable time source, and the current frequency correction ratio applied by the kernel to maintain synchronization",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_timex_sync_status{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Sync status (1 = ok)",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_timex_frequency_adjustment_ratio{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Frequency Adjustment",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_timex_tick_seconds{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Tick Interval",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": true
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_timex_tai_offset_seconds{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "TAI Offset",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "D",
+ "hidden": true
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-175": {
+ "kind": "Panel",
+ "spec": {
+ "id": 175,
+ "title": "Memory Page Faults",
+ "description": "Rate of memory page faults, split into total, major (disk-backed), and derived minor (non-disk) faults. High major fault rates may indicate memory pressure or insufficient RAM",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_vmstat_pgfault{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "Pgfault - Page major and minor fault ops",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_vmstat_pgmajfault{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "Pgmajfault - Major page fault ops",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_vmstat_pgfault{instance=\"$node\",job=\"$job\"}[$__rate_interval]) - rate(node_vmstat_pgmajfault{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "Pgminfault - Minor page fault ops",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 350
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "ops",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "normal"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Pgfault - Page major and minor fault ops"
+ },
+ "properties": [
+ {
+ "id": "custom.fillOpacity",
+ "value": 0
+ },
+ {
+ "id": "custom.stacking",
+ "value": {
+ "group": false,
+ "mode": "none"
+ }
+ },
+ {
+ "id": "custom.lineStyle",
+ "value": {
+ "dash": [
+ 10,
+ 10
+ ],
+ "fill": "dash"
+ }
+ },
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "dark-red",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-176": {
+ "kind": "Panel",
+ "spec": {
+ "id": 176,
+ "title": "Memory Pages In / Out",
+ "description": "Rate of memory pages being read from or written to disk (page-in and page-out operations). High page-out may indicate memory pressure or swapping activity",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_vmstat_pgpgin{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "Pagesin - Page in ops",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_vmstat_pgpgout{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "Pagesout - Page out ops",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "ops",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "out (-) / in (+)",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*out.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-18": {
+ "kind": "Panel",
+ "spec": {
+ "id": 18,
+ "title": "SWAP Total",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"}",
+ "instant": true,
+ "range": false,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {
+ "maxDataPoints": 100
+ }
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "stat",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "colorMode": "none",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "decimals": 0,
+ "mappings": [
+ {
+ "type": "special",
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ }
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "thresholds"
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-191": {
+ "kind": "Panel",
+ "spec": {
+ "id": 191,
+ "title": "Memory LRU Active / Inactive Detail",
+ "description": "Breakdown of memory pages in the kernel's active and inactive LRU lists, separated by anonymous (heap, tmpfs) and file-backed (caches, mmap) pages.",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_Inactive_file_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Inactive_file - File-backed memory on inactive LRU list",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_Inactive_anon_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Inactive_anon – Anonymous memory on inactive LRU (incl. tmpfs & swap cache)",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_Active_file_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Active_file - File-backed memory on active LRU list",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_Active_anon_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Active_anon – Anonymous memory on active LRU (incl. tmpfs & swap cache)",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "D",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 350
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "normal"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-20": {
+ "kind": "Panel",
+ "spec": {
+ "id": 20,
+ "title": "CPU Busy",
+ "description": "Overall CPU busy percentage (averaged across all cores)",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "100 * (1 - avg(rate(node_cpu_seconds_total{mode=\"idle\",instance=\"$node\",job=\"$job\"}[$__rate_interval])))",
+ "instant": true,
+ "legendFormat": "",
+ "range": false,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "gauge",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "minVizHeight": 75,
+ "minVizWidth": 75,
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true,
+ "sizing": "auto"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "percent",
+ "decimals": 1,
+ "min": 0,
+ "max": 100,
+ "mappings": [
+ {
+ "type": "special",
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ }
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "rgba(50, 172, 45, 0.97)"
+ },
+ {
+ "value": 85,
+ "color": "rgba(237, 129, 40, 0.89)"
+ },
+ {
+ "value": 95,
+ "color": "rgba(245, 54, 54, 0.9)"
+ }
+ ]
+ },
+ "color": {
+ "mode": "thresholds"
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-21": {
+ "kind": "Panel",
+ "spec": {
+ "id": 21,
+ "title": "SWAP Used",
+ "description": "Percentage of swap space currently used by the system",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "(node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} > bool 0) * ((node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapFree_bytes{instance=\"$node\",job=\"$job\"}) / (node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"})) * 100",
+ "instant": true,
+ "range": false,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "gauge",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "minVizHeight": 75,
+ "minVizWidth": 75,
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true,
+ "sizing": "auto"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "percent",
+ "decimals": 1,
+ "min": 0,
+ "max": 100,
+ "mappings": [
+ {
+ "type": "special",
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ }
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "rgba(50, 172, 45, 0.97)"
+ },
+ {
+ "value": 10,
+ "color": "rgba(237, 129, 40, 0.89)"
+ },
+ {
+ "value": 25,
+ "color": "rgba(245, 54, 54, 0.9)"
+ }
+ ]
+ },
+ "color": {
+ "mode": "thresholds"
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-219": {
+ "kind": "Panel",
+ "spec": {
+ "id": 219,
+ "title": "File Nodes Size",
+ "description": "Number of file nodes (inodes) available per mounted filesystem. Reflects maximum file capacity regardless of disk size",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_filesystem_files{instance=\"$node\",job=\"$job\",device!~'rootfs'}",
+ "format": "time_series",
+ "legendFormat": "{{mountpoint}}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-22": {
+ "kind": "Panel",
+ "spec": {
+ "id": 22,
+ "title": "Memory Pages Swap In / Out",
+ "description": "Rate at which memory pages are being swapped in from or out to disk. High swap-out activity may indicate memory pressure",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_vmstat_pswpin{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "Pswpin - Pages swapped in",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_vmstat_pswpout{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "Pswpout - Pages swapped out",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "ops",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "out (-) / in (+)",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*out.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-220": {
+ "kind": "Panel",
+ "spec": {
+ "id": 220,
+ "title": "Sockstat Memory Size",
+ "description": "Kernel memory used by TCP, UDP, and IP fragmentation buffers",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_sockstat_TCP_mem_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "TCP",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_sockstat_UDP_mem_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "UDP",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_sockstat_FRAG_memory{instance=\"$node\",job=\"$job\"}",
+ "interval": "",
+ "legendFormat": "Fragmentation",
+ "range": true
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-221": {
+ "kind": "Panel",
+ "spec": {
+ "id": 221,
+ "title": "Netstat IP In / Out Octets",
+ "description": "Rate of octets sent and received at the IP layer, as reported by /proc/net/netstat",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_IpExt_InOctets{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "IP Rx in",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_IpExt_OutOctets{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "IP Tx out",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "Bps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "out (-) / in (+)",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*out.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-229": {
+ "kind": "Panel",
+ "spec": {
+ "id": 229,
+ "title": "Disk IOps",
+ "description": "Disk I/O operations per second for each device",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_disk_reads_completed_total{instance=\"$node\",job=\"$job\",device=~\"[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+\"}[$__rate_interval])",
+ "legendFormat": "{{device}} - Read",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_disk_writes_completed_total{instance=\"$node\",job=\"$job\",device=~\"[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+\"}[$__rate_interval])",
+ "legendFormat": "{{device}} - Write",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "iops",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "read (-) / write (+)",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*Read.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-23": {
+ "kind": "Panel",
+ "spec": {
+ "id": 23,
+ "title": "RootFS Total",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",mountpoint=\"/\",fstype!=\"rootfs\"}",
+ "format": "time_series",
+ "instant": true,
+ "range": false,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {
+ "maxDataPoints": 100
+ }
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "stat",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "colorMode": "none",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "decimals": 0,
+ "mappings": [
+ {
+ "type": "special",
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ }
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "rgba(50, 172, 45, 0.97)"
+ },
+ {
+ "value": 70,
+ "color": "rgba(237, 129, 40, 0.89)"
+ },
+ {
+ "value": 90,
+ "color": "rgba(245, 54, 54, 0.9)"
+ }
+ ]
+ },
+ "color": {
+ "mode": "thresholds"
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-230": {
+ "kind": "Panel",
+ "spec": {
+ "id": 230,
+ "title": "ARP Entries",
+ "description": "Number of ARP entries per interface. Useful for detecting excessive ARP traffic or table growth due to scanning or misconfiguration",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_arp_entries{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "{{ device }} ARP Table",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-231": {
+ "kind": "Panel",
+ "spec": {
+ "id": 231,
+ "title": "Network Traffic Carrier Errors",
+ "description": "Rate of carrier errors during transmission. These typically indicate physical layer issues like faulty cabling or duplex mismatches",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_network_transmit_carrier_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "{{device}} - Tx out",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "pps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-232": {
+ "kind": "Panel",
+ "spec": {
+ "id": 232,
+ "title": "Network Traffic Collision",
+ "description": "Rate of packet collisions detected during transmission. Mostly relevant on half-duplex or legacy Ethernet networks",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_network_transmit_colls_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "{{device}} - Tx out",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "pps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*out.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-24": {
+ "kind": "Panel",
+ "spec": {
+ "id": 24,
+ "title": "Memory",
+ "description": "Breakdown of physical memory and swap usage. Hardware-detected memory errors are also displayed",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"} - node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"} - node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"} - node_memory_Slab_bytes{instance=\"$node\",job=\"$job\"} - node_memory_PageTables_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapCached_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Apps - Memory used by user-space applications",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_PageTables_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "PageTables - Memory used to map between virtual and physical memory addresses",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_SwapCached_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "SwapCache - Memory that keeps track of pages that have been fetched from swap but not yet been modified",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_Slab_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Slab - Memory used by the kernel to cache data structures for its own use (caches like inode, dentry, etc)",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "D",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Cache - Parked file data (file content) cache",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "E",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Buffers - Block device (e.g. harddisk) cache",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "F",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Unused - Free memory unassigned",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "G",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "(node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapFree_bytes{instance=\"$node\",job=\"$job\"})",
+ "format": "time_series",
+ "legendFormat": "Swap - Swap space used",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "H",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_HardwareCorrupted_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "I",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 350
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 40,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "normal"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Apps"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#629E51",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Buffers"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#614D93",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Cache"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#6D1F62",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Free"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#0A437C",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#CFFAFF",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "PageTables"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#0A50A1",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Slab"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#806EB7",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Swap"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#BF1B00",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Unused"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#EAB839",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Unused - Free memory unassigned"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#052B51",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*Hardware Corrupted - *./"
+ },
+ "properties": [
+ {
+ "id": "custom.stacking",
+ "value": {
+ "group": false,
+ "mode": "normal"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-259": {
+ "kind": "Panel",
+ "spec": {
+ "id": 259,
+ "title": "IRQ Detail",
+ "description": "Breaks down hardware interrupts by type and device. Useful for diagnosing IRQ load on network, disk, or CPU interfaces. Requires --collector.interrupts to be enabled in node_exporter",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_interrupts_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "{{ type }} - {{ info }}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "ops",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-260": {
+ "kind": "Panel",
+ "spec": {
+ "id": 260,
+ "title": "Time Synchronized Drift",
+ "description": "Tracks the system clock's estimated and maximum error, as well as its offset from the reference clock (e.g., via NTP). Useful for detecting synchronization drift",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_timex_estimated_error_seconds{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Estimated error",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_timex_offset_seconds{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Offset local vs reference",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_timex_maxerror_seconds{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Maximum error",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "s",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-28": {
+ "kind": "Panel",
+ "spec": {
+ "id": 28,
+ "title": "File Descriptor",
+ "description": "Number of file descriptors currently allocated system-wide versus the system limit. Important for detecting descriptor exhaustion risks",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_filefd_maximum{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Max open files",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_filefd_allocated{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Open files",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*Max.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.fillOpacity",
+ "value": 0
+ },
+ {
+ "id": "custom.lineStyle",
+ "value": {
+ "dash": [
+ 10,
+ 10
+ ],
+ "fill": "dash"
+ }
+ },
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "dark-red",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-280": {
+ "kind": "Panel",
+ "spec": {
+ "id": 280,
+ "title": "Speed",
+ "description": "Maximum speed of each network interface as reported by the operating system. This is a static hardware capability, not current throughput",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_network_speed_bytes{instance=\"$node\",job=\"$job\"} * 8",
+ "format": "time_series",
+ "legendFormat": "{{ device }}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "bargauge",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "displayMode": "basic",
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "maxVizHeight": 30,
+ "minVizHeight": 16,
+ "minVizWidth": 8,
+ "namePlacement": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true,
+ "sizing": "manual",
+ "valueMode": "color"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bps",
+ "decimals": 0,
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "thresholds"
+ },
+ "fieldMinMax": false
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-288": {
+ "kind": "Panel",
+ "spec": {
+ "id": 288,
+ "title": "MTU",
+ "description": "MTU (Maximum Transmission Unit) in bytes for each network interface. Affects packet size and transmission efficiency",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_network_mtu_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "{{ device }}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "bargauge",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "displayMode": "basic",
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "maxVizHeight": 30,
+ "minVizHeight": 16,
+ "minVizWidth": 8,
+ "namePlacement": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true,
+ "sizing": "manual",
+ "valueMode": "color"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "none",
+ "decimals": 0,
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "thresholds"
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-290": {
+ "kind": "Panel",
+ "spec": {
+ "id": 290,
+ "title": "Softnet Packets",
+ "description": "Packets processed and dropped by the softnet network stack per CPU. Drops may indicate CPU saturation or network driver limitations",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_softnet_processed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "CPU {{cpu}} - Processed",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_softnet_dropped_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "CPU {{cpu}} - Dropped",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "pps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "drop (-) / process (+)",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*Dropped.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-291": {
+ "kind": "Panel",
+ "spec": {
+ "id": 291,
+ "title": "Time PLL Adjust",
+ "description": "NTP phase-locked loop (PLL) time constant used by the kernel to control time adjustments. Lower values mean faster correction but less stability",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_timex_loop_time_constant{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "PLL Time Constant",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-297": {
+ "kind": "Panel",
+ "spec": {
+ "id": 297,
+ "title": "Systemd Sockets Accepted",
+ "description": "Rate of accepted connections per second for each systemd socket",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_systemd_socket_accepted_connections_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "{{ name }}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "eps",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-298": {
+ "kind": "Panel",
+ "spec": {
+ "id": 298,
+ "title": "Systemd Units State",
+ "description": "Current number of systemd units in each operational state, such as active, failed, inactive, or transitioning",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"activating\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Activating",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"active\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Active",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"deactivating\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Deactivating",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"failed\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Failed",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "D",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"inactive\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Inactive",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "E",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "normal"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Failed"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#F2495C",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Active"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#73BF69",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Activating"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#C8F2C2",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Deactivating"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "orange",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Inactive"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "dark-blue",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-299": {
+ "kind": "Panel",
+ "spec": {
+ "id": 299,
+ "title": "TCP In / Out",
+ "description": "Rate of TCP segments sent and received per second, including data and control segments",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_Tcp_InSegs{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "instant": false,
+ "interval": "",
+ "legendFormat": "TCP Rx in",
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_Tcp_OutSegs{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "TCP Tx out",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "pps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "out (-) / in (+)",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*out.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-3": {
+ "kind": "Panel",
+ "spec": {
+ "id": 3,
+ "title": "CPU",
+ "description": "CPU time usage split by state, normalized across all CPU cores",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "sum(rate(node_cpu_seconds_total{mode=\"system\",instance=\"$node\",job=\"$job\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "System - Processes executing in kernel mode",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "sum(rate(node_cpu_seconds_total{mode=\"user\",instance=\"$node\",job=\"$job\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))",
+ "format": "time_series",
+ "legendFormat": "User - Normal processes executing in user mode",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "sum(rate(node_cpu_seconds_total{mode=\"nice\",instance=\"$node\",job=\"$job\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))",
+ "format": "time_series",
+ "legendFormat": "Nice - Niced processes executing in user mode",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "sum(rate(node_cpu_seconds_total{mode=\"iowait\",instance=\"$node\",job=\"$job\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))",
+ "format": "time_series",
+ "legendFormat": "Iowait - Waiting for I/O to complete",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "D",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "sum(rate(node_cpu_seconds_total{mode=\"irq\",instance=\"$node\",job=\"$job\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))",
+ "format": "time_series",
+ "legendFormat": "Irq - Servicing interrupts",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "E",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "sum(rate(node_cpu_seconds_total{mode=\"softirq\",instance=\"$node\",job=\"$job\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))",
+ "format": "time_series",
+ "legendFormat": "Softirq - Servicing softirqs",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "F",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "sum(rate(node_cpu_seconds_total{mode=\"steal\",instance=\"$node\",job=\"$job\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))",
+ "format": "time_series",
+ "legendFormat": "Steal - Time spent in other operating systems when running in a virtualized environment",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "G",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "sum(rate(node_cpu_seconds_total{mode=\"idle\",instance=\"$node\",job=\"$job\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))",
+ "format": "time_series",
+ "legendFormat": "Idle - Waiting for something to happen",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "H",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "sum by(instance) (rate(node_cpu_guest_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])) / on(instance) group_left sum by (instance)((rate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]))) > 0",
+ "format": "time_series",
+ "legendFormat": "Guest CPU usage",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "I",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 250
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "percentunit",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 70,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "smooth",
+ "lineWidth": 2,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "percent"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Idle - Waiting for something to happen"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#052B51",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Iowait - Waiting for I/O to complete"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#EAB839",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Irq - Servicing interrupts"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#BF1B00",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Nice - Niced processes executing in user mode"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#C15C17",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Softirq - Servicing softirqs"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#E24D42",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Steal - Time spent in other operating systems when running in a virtualized environment"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#FCE2DE",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "System - Processes executing in kernel mode"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#508642",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "User - Normal processes executing in user mode"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#5195CE",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Guest CPU usage"
+ },
+ "properties": [
+ {
+ "id": "custom.fillOpacity",
+ "value": 0
+ },
+ {
+ "id": "custom.lineStyle",
+ "value": {
+ "dash": [
+ 10,
+ 10
+ ],
+ "fill": "dash"
+ }
+ },
+ {
+ "id": "custom.stacking",
+ "value": {
+ "group": "A",
+ "mode": "none"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-300": {
+ "kind": "Panel",
+ "spec": {
+ "id": 300,
+ "title": "Cooling Device Utilization",
+ "description": "Shows how hard each cooling device (fan/throttle) is working relative to its maximum capacity",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "(node_cooling_device_max_state{instance=\"$node\",job=\"$job\"} > bool 0) * (100 * node_cooling_device_cur_state{instance=\"$node\",job=\"$job\"} / node_cooling_device_max_state{instance=\"$node\",job=\"$job\"})",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "{{name}} - {{type}}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "percent",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*Max.*/"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#EF843C",
+ "mode": "fixed"
+ }
+ },
+ {
+ "id": "custom.fillOpacity",
+ "value": 0
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-301": {
+ "kind": "Panel",
+ "spec": {
+ "id": 301,
+ "title": "Disk Ops Discards / Flush",
+ "description": "Per-second rate of discard (TRIM) and flush (write cache) operations. Useful for monitoring low-level disk activity on SSDs and advanced storage",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_disk_discards_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "{{device}} - Discards completed",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_disk_discards_merged_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "{{device}} - Discards merged",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_disk_flush_requests_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "{{device}} - Flush",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "ops",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/sda.*/"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "orange",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-302": {
+ "kind": "Panel",
+ "spec": {
+ "id": 302,
+ "title": "Power Supply",
+ "description": "Shows the online status of power supplies (e.g., AC, battery). A value of 1-Yes indicates the power supply is active/online",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_power_supply_online{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "{{ power_supply }} online",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bool_yes_no",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-305": {
+ "kind": "Panel",
+ "spec": {
+ "id": 305,
+ "title": "CPU Saturation per Core",
+ "description": "Shows CPU saturation per core, calculated as the proportion of time spent waiting to run relative to total time demanded (running + waiting).",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_schedstat_running_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "CPU {{ cpu }} - Running",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": true
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_schedstat_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "CPU {{cpu}} - Waiting Queue",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": true
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "((rate(node_schedstat_running_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]) + rate(node_schedstat_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])) > bool 0) * (rate(node_schedstat_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]) / (rate(node_schedstat_running_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]) + rate(node_schedstat_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])))",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "CPU {{cpu}}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "percentunit",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*waiting.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-306": {
+ "kind": "Panel",
+ "spec": {
+ "id": 306,
+ "title": "CPU Schedule Timeslices",
+ "description": "Rate of scheduling timeslices executed per CPU. Reflects how frequently the scheduler switches tasks on each core",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_schedstat_timeslices_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "CPU {{ cpu }}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "ops",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-307": {
+ "kind": "Panel",
+ "spec": {
+ "id": 307,
+ "title": "OOM Killer",
+ "description": "Rate of Out-of-Memory (OOM) kill events. A non-zero value indicates the kernel has terminated one or more processes due to memory exhaustion",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_vmstat_oom_kill{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "OOM Kills",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "ops",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "OOM Kills"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "dark-red",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-308": {
+ "kind": "Panel",
+ "spec": {
+ "id": 308,
+ "title": "Exporter Process CPU Usage",
+ "description": "Rate of CPU time used by the process exposing this metric (user + system mode)",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(process_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Process CPU Usage",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "percentunit",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-309": {
+ "kind": "Panel",
+ "spec": {
+ "id": 309,
+ "title": "Network Operational Status",
+ "description": "Operational and physical link status of each network interface. Values are Yes for 'up' or link present, and No for 'down' or no carrier.",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_network_up{operstate=\"up\",instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "{{interface}} - Operational state UP",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": true
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_network_carrier{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "instant": false,
+ "legendFormat": "{{device}} - Physical link"
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bool_yes_no",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-310": {
+ "kind": "Panel",
+ "spec": {
+ "id": 310,
+ "title": "Softnet Out of Quota",
+ "description": "How often the kernel was unable to process all packets in the softnet queue before time ran out. Frequent squeezes may indicate CPU contention or driver inefficiency",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_softnet_times_squeezed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "CPU {{cpu}} - Times Squeezed",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "eps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-313": {
+ "kind": "Panel",
+ "spec": {
+ "id": 313,
+ "title": "PIDs Number and Limit",
+ "description": "Number of active PIDs on the system and the configured maximum allowed. Useful for detecting PID exhaustion risk. Requires --collector.processes in node_exporter",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_processes_pids{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Number of PIDs",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_processes_max_processes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "PIDs limit",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "PIDs limit"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#F2495C",
+ "mode": "fixed"
+ }
+ },
+ {
+ "id": "custom.fillOpacity",
+ "value": 0
+ },
+ {
+ "id": "custom.lineStyle",
+ "value": {
+ "dash": [
+ 10,
+ 10
+ ],
+ "fill": "dash"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-314": {
+ "kind": "Panel",
+ "spec": {
+ "id": 314,
+ "title": "Threads Number and Limit",
+ "description": "Number of active threads on the system and the configured thread limit. Useful for monitoring thread pressure. Requires --collector.processes in node_exporter",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_processes_threads{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Allocated threads",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_processes_max_threads{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Threads limit",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Threads limit"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#F2495C",
+ "mode": "fixed"
+ }
+ },
+ {
+ "id": "custom.fillOpacity",
+ "value": 0
+ },
+ {
+ "id": "custom.lineStyle",
+ "value": {
+ "dash": [
+ 10,
+ 10
+ ],
+ "fill": "dash"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-315": {
+ "kind": "Panel",
+ "spec": {
+ "id": 315,
+ "title": "Processes Detailed States",
+ "description": "Current number of processes in each state (e.g., running, sleeping, zombie). Requires --collector.processes to be enabled in node_exporter",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_processes_state{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "{{ state }}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "normal"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "D"
+ },
+ "properties": [
+ {
+ "id": "displayName",
+ "value": "Uninterruptible Sleeping"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "I"
+ },
+ "properties": [
+ {
+ "id": "displayName",
+ "value": "Idle Kernel Thread"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "R"
+ },
+ "properties": [
+ {
+ "id": "displayName",
+ "value": "Running"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "S"
+ },
+ "properties": [
+ {
+ "id": "displayName",
+ "value": "Interruptible Sleeping"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "T"
+ },
+ "properties": [
+ {
+ "id": "displayName",
+ "value": "Stopped"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "X"
+ },
+ "properties": [
+ {
+ "id": "displayName",
+ "value": "Dead"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Z"
+ },
+ "properties": [
+ {
+ "id": "displayName",
+ "value": "Zombie"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-320": {
+ "kind": "Panel",
+ "spec": {
+ "id": 320,
+ "title": "TCP Stat Persistent",
+ "description": "Number of TCP sockets in key connection states. Requires the --collector.tcpstat flag on node_exporter",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_tcp_connection_states{state=\"established\",instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Established",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_tcp_connection_states{state=\"fin_wait2\",instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "FIN_WAIT2",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_tcp_connection_states{state=\"listen\",instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Listen",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_tcp_connection_states{state=\"time_wait\",instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "TIME_WAIT",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "D",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_tcp_connection_states{state=\"close_wait\", instance=\"$node\", job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "CLOSE_WAIT",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "E",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "noValue": "0",
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-321": {
+ "kind": "Panel",
+ "spec": {
+ "id": 321,
+ "title": "CPU Frequency Scaling",
+ "description": "Real-time CPU frequency scaling per core, including average minimum and maximum allowed scaling frequencies",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_cpu_scaling_frequency_hertz{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "CPU {{ cpu }}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "avg(node_cpu_scaling_frequency_max_hertz{instance=\"$node\",job=\"$job\"})",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Max",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "avg(node_cpu_scaling_frequency_min_hertz{instance=\"$node\",job=\"$job\"})",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Min",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "hertz",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Max"
+ },
+ "properties": [
+ {
+ "id": "custom.lineStyle",
+ "value": {
+ "dash": [
+ 10,
+ 10
+ ],
+ "fill": "dash"
+ }
+ },
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "dark-red",
+ "mode": "fixed"
+ }
+ },
+ {
+ "id": "custom.hideFrom",
+ "value": {
+ "legend": true,
+ "tooltip": false,
+ "viz": false
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Min"
+ },
+ "properties": [
+ {
+ "id": "custom.lineStyle",
+ "value": {
+ "dash": [
+ 10,
+ 10
+ ],
+ "fill": "dash"
+ }
+ },
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "blue",
+ "mode": "fixed"
+ }
+ },
+ {
+ "id": "custom.hideFrom",
+ "value": {
+ "legend": true,
+ "tooltip": false,
+ "viz": false
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-322": {
+ "kind": "Panel",
+ "spec": {
+ "id": 322,
+ "title": "Pressure Stall Information",
+ "description": "How often tasks experience CPU, memory, or I/O delays. 'Some' indicates partial slowdown; 'Full' indicates all tasks are stalled. Based on Linux PSI metrics:\nhttps://docs.kernel.org/accounting/psi.html",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_pressure_cpu_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "CPU - Some",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "CPU some",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_pressure_memory_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "Memory - Some",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "Memory some",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_pressure_memory_stalled_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "Memory - Full",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "Memory full",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_pressure_io_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "I/O - Some",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "I/O some",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_pressure_io_stalled_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "I/O - Full",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "I/O full",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_pressure_irq_stalled_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "IRQ - Full",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "percentunit",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "some (-) / full (+)",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*Some.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.fillOpacity",
+ "value": 0
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*Some.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-323": {
+ "kind": "Panel",
+ "spec": {
+ "id": 323,
+ "title": "Pressure",
+ "description": "Resource pressure via PSI",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "rate(node_pressure_cpu_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "instant": true,
+ "legendFormat": "CPU",
+ "range": false,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "rate(node_pressure_memory_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "instant": true,
+ "legendFormat": "Mem",
+ "range": false,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "rate(node_pressure_io_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "instant": true,
+ "legendFormat": "I/O",
+ "range": false,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "rate(node_pressure_irq_stalled_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "instant": true,
+ "legendFormat": "Irq",
+ "range": false,
+ "step": 240
+ }
+ },
+ "refId": "D",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "bargauge",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "displayMode": "basic",
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "maxVizHeight": 300,
+ "minVizHeight": 10,
+ "minVizWidth": 0,
+ "namePlacement": "auto",
+ "orientation": "horizontal",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showUnfilled": true,
+ "sizing": "auto",
+ "text": {},
+ "valueMode": "color"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "percentunit",
+ "decimals": 1,
+ "min": 0,
+ "max": 1,
+ "thresholds": {
+ "mode": "percentage",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ },
+ {
+ "value": 70,
+ "color": "dark-yellow"
+ },
+ {
+ "value": 90,
+ "color": "dark-red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "thresholds"
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-325": {
+ "kind": "Panel",
+ "spec": {
+ "id": 325,
+ "title": "Hardware Fan Speed",
+ "description": "Displays the current fan speeds (RPM) from hardware sensors via the hwmon interface",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_hwmon_fan_rpm{instance=\"$node\",job=\"$job\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "{{ chip_name }} {{ sensor }}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_hwmon_fan_min_rpm{instance=\"$node\",job=\"$job\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "{{ chip_name }} {{ sensor }} rpm min",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": true
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "rotrpm",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-326": {
+ "kind": "Panel",
+ "spec": {
+ "id": 326,
+ "title": "Disk Sectors Discarded Successfully",
+ "description": "Shows how many disk sectors are discarded (TRIMed) per second. Useful for monitoring SSD behavior and storage efficiency",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_disk_discarded_sectors_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "{{device}}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/sda.*/"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "orange",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-327": {
+ "kind": "Panel",
+ "spec": {
+ "id": 327,
+ "title": "Network Traffic NoHandler",
+ "description": "Rate of received packets that could not be processed due to missing protocol or handler in the kernel. May indicate unsupported traffic or misconfiguration",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_network_receive_nohandler_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "{{device}} - Rx in",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "pps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-33": {
+ "kind": "Panel",
+ "spec": {
+ "id": 33,
+ "title": "Disk Read/Write Data",
+ "description": "Number of bytes read from or written to the device per second",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_disk_read_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "{{device}} - Read",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "rate(node_disk_written_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "instant": false,
+ "legendFormat": "{{device}} - Write",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "Bps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "read (–) / write (+)",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*Read.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/sda.*/"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "orange",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-330": {
+ "kind": "Panel",
+ "spec": {
+ "id": 330,
+ "title": "Softnet RPS",
+ "description": "Tracks the number of packets processed or dropped by Receive Packet Steering (RPS), a mechanism to distribute packet processing across CPUs",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_softnet_received_rps_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "CPU {{cpu}} - Processed",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_softnet_flow_limit_count_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "CPU {{cpu}} - Dropped",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "pps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*Dropped.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ },
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "dark-red",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-331": {
+ "kind": "Panel",
+ "spec": {
+ "id": 331,
+ "title": "Systemd Sockets Current",
+ "description": "Current number of active connections per systemd socket, as reported by the Node Exporter systemd collector",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_systemd_socket_current_connections{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "{{ name }}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-332": {
+ "kind": "Panel",
+ "spec": {
+ "id": 332,
+ "title": "Systemd Sockets Refused",
+ "description": "Rate of systemd socket connection refusals per second, typically due to service unavailability or backlog overflow",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_systemd_socket_refused_connections_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "{{ name }}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "eps",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-333": {
+ "kind": "Panel",
+ "spec": {
+ "id": 333,
+ "title": "PPS Frequency / Stability",
+ "description": "Displays the PPS signal's frequency offset and stability (jitter) in hertz. Useful for monitoring high-precision time sources like GPS or atomic clocks",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_timex_pps_frequency_hertz{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "PPS Frequency Offset",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_timex_pps_stability_hertz{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "PPS Frequency Stability",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "hertz",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-334": {
+ "kind": "Panel",
+ "spec": {
+ "id": 334,
+ "title": "PPS Time Accuracy",
+ "description": "Tracks PPS signal timing jitter and shift compared to system clock",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_timex_pps_jitter_seconds{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "PPS Jitter",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_timex_pps_shift_seconds{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "PPS Shift",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "s",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-335": {
+ "kind": "Panel",
+ "spec": {
+ "id": 335,
+ "title": "PPS Sync Events",
+ "description": "Rate of PPS synchronization diagnostics including calibration events, jitter violations, errors, and frequency stability exceedances",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_timex_pps_calibration_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "PPS Calibrations/sec",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_timex_pps_error_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "PPS Errors/sec",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_timex_pps_stability_exceeded_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "PPS Stability Exceeded/sec",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_timex_pps_jitter_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "PPS Jitter Events/sec",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "D",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "ops",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-336": {
+ "kind": "Panel",
+ "spec": {
+ "id": 336,
+ "title": "TCP/UDP Kernel Buffer Memory Pages",
+ "description": "TCP/UDP socket memory usage in kernel (in pages)",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_sockstat_TCP_mem{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "TCP",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_sockstat_UDP_mem{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "UDP",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-337": {
+ "kind": "Panel",
+ "spec": {
+ "id": 337,
+ "title": "UDP Queue",
+ "description": "Number of UDP packets currently queued in the receive (RX) and transmit (TX) buffers. A growing queue may indicate a bottleneck",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_udp_queues{instance=\"$node\",job=\"$job\",ip=\"v4\",queue=\"rx\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "UDP Rx in Queue",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_udp_queues{instance=\"$node\",job=\"$job\",ip=\"v4\",queue=\"tx\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "UDP Tx out Queue",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-338": {
+ "kind": "Panel",
+ "spec": {
+ "id": 338,
+ "title": "Network Saturation",
+ "description": "Network interface utilization as a percentage of its maximum capacity",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "(node_network_speed_bytes{instance=\"$node\",job=\"$job\"} > bool 0) * (rate(node_network_receive_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]) / node_network_speed_bytes{instance=\"$node\",job=\"$job\"})",
+ "format": "time_series",
+ "legendFormat": "{{device}} - Rx in",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "(node_network_speed_bytes{instance=\"$node\",job=\"$job\"} > bool 0) * (rate(node_network_transmit_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]) / node_network_speed_bytes{instance=\"$node\",job=\"$job\"})",
+ "format": "time_series",
+ "legendFormat": "{{device}} - Tx out",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "percentunit",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "out (-) / in (+)",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 40,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*out.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-339": {
+ "kind": "Panel",
+ "spec": {
+ "id": 339,
+ "title": "Sockstat Average Socket Memory",
+ "description": "Average memory used per socket (TCP/UDP). Helps tune net.ipv4.tcp_rmem / tcp_wmem",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "(node_sockstat_TCP_inuse{instance=\"$node\",job=\"$job\"} > bool 0) * (node_sockstat_TCP_mem_bytes{instance=\"$node\",job=\"$job\"} / node_sockstat_TCP_inuse{instance=\"$node\",job=\"$job\"})",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "TCP",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "(node_sockstat_UDP_inuse{instance=\"$node\",job=\"$job\"} > bool 0) * (node_sockstat_UDP_mem_bytes{instance=\"$node\",job=\"$job\"} / node_sockstat_UDP_inuse{instance=\"$node\",job=\"$job\"})",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "UDP",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-34": {
+ "kind": "Panel",
+ "spec": {
+ "id": 34,
+ "title": "Instantaneous Queue Size",
+ "description": "Number of in-progress I/O requests at the time of sampling (active requests in the disk queue)",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_disk_io_now{instance=\"$node\",job=\"$job\"}",
+ "interval": "",
+ "legendFormat": "{{device}}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "none",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/sda.*/"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "orange",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-340": {
+ "kind": "Panel",
+ "spec": {
+ "id": 340,
+ "title": "TCP Socket Queue",
+ "description": "TCP socket queue sizes. High rx_queued_bytes indicates application not reading fast enough. High tx_queued_bytes indicates network congestion or slow receiver",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_tcp_connection_states{state=\"rx_queued_bytes\",instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "RX Queued (waiting to be read)",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_tcp_connection_states{state=\"tx_queued_bytes\",instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "TX Queued (waiting to be sent)",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-341": {
+ "kind": "Panel",
+ "spec": {
+ "id": 341,
+ "title": "TCP Stat Transient",
+ "description": "Transient TCP connection states. These are typically short-lived during connection establishment and teardown",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_tcp_connection_states{state=\"syn_sent\",instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "SYN_SENT",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_tcp_connection_states{state=\"syn_recv\",instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "SYN_RECV",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_tcp_connection_states{state=\"fin_wait1\",instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "FIN_WAIT1",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_tcp_connection_states{state=\"close\",instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "CLOSE",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "D",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_tcp_connection_states{state=\"last_ack\",instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "LAST_ACK",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "E",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_tcp_connection_states{state=\"closing\",instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "CLOSING",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "F",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "noValue": "0",
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-35": {
+ "kind": "Panel",
+ "spec": {
+ "id": 35,
+ "title": "Average Queue Size",
+ "description": "Average queue length of the requests that were issued to the device",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_disk_io_time_weighted_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "{{device}}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "none",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/sda_*/"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#7EB26D",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-36": {
+ "kind": "Panel",
+ "spec": {
+ "id": 36,
+ "title": "Time Spent Doing I/Os",
+ "description": "Percentage of time the disk spent actively processing I/O operations, including general I/O, discards (TRIM), and write cache flushes",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_disk_io_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "{{device}} - General IO",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_disk_discard_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "{{device}} - Discard/TRIM",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_disk_flush_requests_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "interval": "",
+ "legendFormat": "{{device}} - Flush (write cache)",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "percentunit",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/sda.*/"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "orange",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-37": {
+ "kind": "Panel",
+ "spec": {
+ "id": 37,
+ "title": "Disk Average Wait Time",
+ "description": "Average time for requests issued to the device to be served. This includes the time spent by the requests in queue and the time spent servicing them.",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "(rate(node_disk_reads_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]) > bool 0) * (rate(node_disk_read_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]) / rate(node_disk_reads_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]))",
+ "interval": "",
+ "legendFormat": "{{device}} - Read",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "(rate(node_disk_writes_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]) > bool 0) * (rate(node_disk_write_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]) / rate(node_disk_writes_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]))",
+ "interval": "",
+ "legendFormat": "{{device}} - Write",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "s",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "read (–) / write (+)",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*Read.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/sda.*/"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "orange",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-40": {
+ "kind": "Panel",
+ "spec": {
+ "id": 40,
+ "title": "Node Exporter Scrape Time",
+ "description": "Duration of each individual collector executed during a Node Exporter scrape. Useful for identifying slow or failing collectors",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_scrape_collector_duration_seconds{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "{{collector}}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "s",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "normal"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-41": {
+ "kind": "Panel",
+ "spec": {
+ "id": 41,
+ "title": "File Nodes Free",
+ "description": "Number of free file nodes (inodes) available per mounted filesystem. A low count may prevent file creation even if disk space is available",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_filesystem_files_free{instance=\"$node\",job=\"$job\",device!~'rootfs'}",
+ "format": "time_series",
+ "legendFormat": "{{mountpoint}}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-42": {
+ "kind": "Panel",
+ "spec": {
+ "id": 42,
+ "title": "Disk Throughput",
+ "description": "Disk I/O throughput per device",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_disk_read_bytes_total{instance=\"$node\",job=\"$job\",device=~\"[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "{{device}} - Read",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_disk_written_bytes_total{instance=\"$node\",job=\"$job\",device=~\"[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "{{device}} - Write",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "Bps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "read (-) / write (+)",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 40,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*Read.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-43": {
+ "kind": "Panel",
+ "spec": {
+ "id": 43,
+ "title": "Filesystem Space Available",
+ "description": "Amount of available disk space per mounted filesystem, excluding rootfs. Based on block availability to non-root users",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}",
+ "format": "time_series",
+ "legendFormat": "{{mountpoint}}",
+ "metric": "",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_filesystem_free_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}",
+ "format": "time_series",
+ "legendFormat": "{{mountpoint}} - Free",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": true
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}",
+ "format": "time_series",
+ "legendFormat": "{{mountpoint}} - Size",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": true
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-44": {
+ "kind": "Panel",
+ "spec": {
+ "id": 44,
+ "title": "Filesystem in ReadOnly / Error",
+ "description": "Indicates filesystems mounted in read-only mode or reporting device-level I/O errors.",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_filesystem_readonly{instance=\"$node\",job=\"$job\",device!~'rootfs'}",
+ "format": "time_series",
+ "legendFormat": "{{mountpoint}} - ReadOnly",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_filesystem_device_error{instance=\"$node\",job=\"$job\",device!~'rootfs',fstype!~'tmpfs'}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "{{mountpoint}} - Device error",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bool_yes_no",
+ "min": 0,
+ "max": 1,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "normal"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-50": {
+ "kind": "Panel",
+ "spec": {
+ "id": 50,
+ "title": "ICMP Errors",
+ "description": "Rate of incoming ICMP messages that contained protocol-specific errors, such as bad checksums or invalid lengths",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_Icmp_InErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "ICMP Rx In",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "pps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-55": {
+ "kind": "Panel",
+ "spec": {
+ "id": 55,
+ "title": "UDP In / Out",
+ "description": "Rate of UDP datagrams sent and received per second, based on /proc/net/netstat",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_Udp_InDatagrams{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "UDP Rx in",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_Udp_OutDatagrams{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "UDP Tx out",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "pps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "out (-) / in (+)",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*out.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-60": {
+ "kind": "Panel",
+ "spec": {
+ "id": 60,
+ "title": "Network Traffic by Packets",
+ "description": "Number of network packets received and transmitted per second, by interface.",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_network_receive_packets_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "{{device}} - Rx in",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_network_transmit_packets_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "{{device}} - Tx out",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "pps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "out (-) / in (+)",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*out.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-61": {
+ "kind": "Panel",
+ "spec": {
+ "id": 61,
+ "title": "NF Conntrack",
+ "description": "Current and maximum connection tracking entries used by Netfilter (nf_conntrack). High usage approaching the limit may cause packet drops or connection issues",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_nf_conntrack_entries{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "NF conntrack entries",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_nf_conntrack_entries_limit{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "NF conntrack limit",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "NF conntrack limit"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "dark-red",
+ "mode": "fixed"
+ }
+ },
+ {
+ "id": "custom.fillOpacity",
+ "value": 0
+ },
+ {
+ "id": "custom.lineStyle",
+ "value": {
+ "dash": [
+ 10,
+ 10
+ ],
+ "fill": "dash"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-62": {
+ "kind": "Panel",
+ "spec": {
+ "id": 62,
+ "title": "Processes Status",
+ "description": "Processes currently in runnable or blocked states. Helps identify CPU contention or I/O wait bottlenecks.",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_procs_blocked{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Blocked (I/O Wait)",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_procs_running{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Runnable (Ready for CPU)",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-63": {
+ "kind": "Panel",
+ "spec": {
+ "id": 63,
+ "title": "Sockstat TCP",
+ "description": "Tracks TCP socket usage and memory per node",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_sockstat_TCP_alloc{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Allocated Sockets",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_sockstat_TCP_inuse{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "In-Use Sockets",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_sockstat_TCP_orphan{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Orphaned Sockets",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_sockstat_TCP_tw{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "TIME_WAIT Sockets",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "D",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-64": {
+ "kind": "Panel",
+ "spec": {
+ "id": 64,
+ "title": "Exporter File Descriptor Usage",
+ "description": "Number of file descriptors used by the exporter process versus its configured limit",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "process_max_fds{instance=\"$node\",job=\"$job\"}",
+ "interval": "",
+ "legendFormat": "Maximum open file descriptors",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "process_open_fds{instance=\"$node\",job=\"$job\"}",
+ "interval": "",
+ "legendFormat": "Open file descriptors",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*Max.*/"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#890F02",
+ "mode": "fixed"
+ }
+ },
+ {
+ "id": "custom.fillOpacity",
+ "value": 0
+ },
+ {
+ "id": "custom.lineStyle",
+ "value": {
+ "dash": [
+ 10,
+ 10
+ ],
+ "fill": "dash"
+ }
+ }
+ ]
+ },
+ {
+ "__systemRef": "hideSeriesFrom",
+ "matcher": {
+ "id": "byNames",
+ "options": {
+ "mode": "exclude",
+ "names": [
+ "Open file descriptors"
+ ],
+ "prefix": "All except:",
+ "readOnly": true
+ }
+ },
+ "properties": [
+ {
+ "id": "custom.hideFrom",
+ "value": {
+ "legend": false,
+ "tooltip": true,
+ "viz": true
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-7": {
+ "kind": "Panel",
+ "spec": {
+ "id": 7,
+ "title": "System Load",
+ "description": "System load average over 1, 5, and 15 minutes. Reflects the number of active or waiting processes. Values above CPU core count may indicate overload",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_load1{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Load 1m",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_load5{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Load 5m",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_load15{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Load 15m",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu))",
+ "format": "time_series",
+ "legendFormat": "CPU Core Count",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "D",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "CPU Core Count"
+ },
+ "properties": [
+ {
+ "id": "custom.fillOpacity",
+ "value": 0
+ },
+ {
+ "id": "custom.lineStyle",
+ "value": {
+ "dash": [
+ 10,
+ 10
+ ],
+ "fill": "dash"
+ }
+ },
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "dark-red",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-70": {
+ "kind": "Panel",
+ "spec": {
+ "id": 70,
+ "title": "Memory Vmalloc",
+ "description": "Usage of the kernel's vmalloc area, which provides virtual memory allocations for kernel modules and drivers. Includes total, used, and largest free block sizes",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_VmallocChunk_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Vmalloc Free Chunk – Largest available block in vmalloc area",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_VmallocTotal_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Vmalloc Total – Total size of the vmalloc memory area",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_VmallocUsed_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Vmalloc Used – Portion of vmalloc area currently in use",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*Total.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.fillOpacity",
+ "value": 0
+ },
+ {
+ "id": "custom.lineStyle",
+ "value": {
+ "dash": [
+ 10,
+ 10
+ ],
+ "fill": "dash"
+ }
+ },
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "dark-red",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-74": {
+ "kind": "Panel",
+ "spec": {
+ "id": 74,
+ "title": "Network Traffic Basic",
+ "description": "Per-interface network traffic (receive and transmit) in bits per second",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_network_receive_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8",
+ "format": "time_series",
+ "legendFormat": "Rx {{device}}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_network_transmit_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8",
+ "format": "time_series",
+ "legendFormat": "Tx {{device}}",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 40,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*Tx.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-75": {
+ "kind": "Panel",
+ "spec": {
+ "id": 75,
+ "title": "RAM Total",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"}",
+ "instant": true,
+ "range": false,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {
+ "maxDataPoints": 100
+ }
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "stat",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "colorMode": "none",
+ "graphMode": "none",
+ "justifyMode": "auto",
+ "orientation": "horizontal",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "decimals": 0,
+ "mappings": [
+ {
+ "type": "special",
+ "options": {
+ "match": "null",
+ "result": {
+ "text": "N/A"
+ }
+ }
+ }
+ ],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "thresholds"
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-77": {
+ "kind": "Panel",
+ "spec": {
+ "id": 77,
+ "title": "CPU Basic",
+ "description": "CPU time spent busy vs idle, split by activity type",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "avg(rate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"system\"}[$__rate_interval]))",
+ "format": "time_series",
+ "instant": false,
+ "legendFormat": "Busy System",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "avg(rate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"user\"}[$__rate_interval]))",
+ "format": "time_series",
+ "legendFormat": "Busy User",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "avg(rate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"iowait\"}[$__rate_interval]))",
+ "format": "time_series",
+ "legendFormat": "Busy Iowait",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "avg(sum without(mode) (rate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=~\".*irq\"}[$__rate_interval])))",
+ "format": "time_series",
+ "legendFormat": "Busy IRQs",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "D",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "avg(sum without (mode) (rate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode!='idle',mode!='user',mode!='system',mode!='iowait',mode!='irq',mode!='softirq'}[$__rate_interval])))",
+ "format": "time_series",
+ "legendFormat": "Busy Other",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "E",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "avg(rate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"idle\"}[$__rate_interval]))",
+ "format": "time_series",
+ "legendFormat": "Idle",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "F",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 250
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "desc"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "percentunit",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 40,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "smooth",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "percent"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Busy Iowait"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#890F02",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Idle"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#052B51",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Busy System"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#EAB839",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Busy User"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#0A437C",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Busy Other"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#6D1F62",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-78": {
+ "kind": "Panel",
+ "spec": {
+ "id": 78,
+ "title": "Memory Basic",
+ "description": "RAM and swap usage overview, including caches",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Total",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"} - (node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"} + node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"} + node_memory_SReclaimable_bytes{instance=\"$node\",job=\"$job\"})",
+ "format": "time_series",
+ "legendFormat": "Used",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"} + node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"} + node_memory_SReclaimable_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Cache + Buffer",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "legendFormat": "Free",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "D",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "(node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapFree_bytes{instance=\"$node\",job=\"$job\"})",
+ "format": "time_series",
+ "legendFormat": "Swap used",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "E",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true,
+ "width": 350
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 40,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "normal"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Swap used"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#BF1B00",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Total"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#E0F9D7",
+ "mode": "fixed"
+ }
+ },
+ {
+ "id": "custom.fillOpacity",
+ "value": 0
+ },
+ {
+ "id": "custom.stacking",
+ "value": {
+ "group": false,
+ "mode": "normal"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Cache + Buffer"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#052B51",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Free"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#7EB26D",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-8": {
+ "kind": "Panel",
+ "spec": {
+ "id": 8,
+ "title": "Context Switches / Interrupts",
+ "description": "Per-second rate of context switches and hardware interrupts. High values may indicate intense CPU or I/O activity",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_context_switches_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "Context switches",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_intr_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "legendFormat": "Interrupts",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "ops",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-82": {
+ "kind": "Panel",
+ "spec": {
+ "id": 82,
+ "title": "TCP Direct Transition",
+ "description": "Rate of TCP connection initiations per second. 'Active' opens are initiated by this host. 'Passive' opens are accepted from incoming connections",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_Tcp_ActiveOpens{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Active Opens",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_Tcp_PassiveOpens{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Passive Opens",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "eps",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-84": {
+ "kind": "Panel",
+ "spec": {
+ "id": 84,
+ "title": "Network Traffic",
+ "description": "Incoming and outgoing network traffic per interface",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_network_receive_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8",
+ "format": "time_series",
+ "legendFormat": "{{device}} - Rx in",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_network_transmit_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8",
+ "format": "time_series",
+ "legendFormat": "{{device}} - Tx out",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "out (-) / in (+)",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 40,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*out.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-85": {
+ "kind": "Panel",
+ "spec": {
+ "id": 85,
+ "title": "TCP Connections",
+ "description": "Number of currently established TCP connections and the system's max supported limit. On Linux, MaxConn may return -1 to indicate a dynamic/unlimited configuration",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_netstat_Tcp_CurrEstab{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Current Connections",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "node_netstat_Tcp_MaxConn{instance=\"$node\",job=\"$job\"}",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "Max Connections",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*Max.*/"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#890F02",
+ "mode": "fixed"
+ }
+ },
+ {
+ "id": "custom.fillOpacity",
+ "value": 0
+ },
+ {
+ "id": "custom.lineStyle",
+ "value": {
+ "dash": [
+ 10,
+ 10
+ ],
+ "fill": "dash"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-9": {
+ "kind": "Panel",
+ "spec": {
+ "id": 9,
+ "title": "Disk Read/Write IOps",
+ "description": "Number of I/O operations completed per second for the device (after merges), including both reads and writes",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_disk_reads_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "legendFormat": "{{device}} - Read",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_disk_writes_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "legendFormat": "{{device}} - Write",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "iops",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "read (–) / write (+)",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*Read.*/"
+ },
+ "properties": [
+ {
+ "id": "custom.transform",
+ "value": "negative-Y"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/sda.*/"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "orange",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-91": {
+ "kind": "Panel",
+ "spec": {
+ "id": 91,
+ "title": "TCP SynCookie",
+ "description": "Rate of TCP SYN cookies sent, validated, and failed. These are used to protect against SYN flood attacks and manage TCP handshake resources under load",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_TcpExt_SyncookiesFailed{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "SYN Cookies Failed",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_TcpExt_SyncookiesRecv{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "SYN Cookies Validated",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "B",
+ "hidden": false
+ }
+ },
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "rate(node_netstat_TcpExt_SyncookiesSent{instance=\"$node\",job=\"$job\"}[$__rate_interval])",
+ "format": "time_series",
+ "interval": "",
+ "legendFormat": "SYN Cookies Sent",
+ "range": true,
+ "step": 240
+ }
+ },
+ "refId": "C",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "11.6.1",
+ "spec": {
+ "options": {
+ "legend": {
+ "calcs": [
+ "min",
+ "mean",
+ "max"
+ ],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "eps",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 20,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*Failed.*/"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "dark-red",
+ "mode": "fixed"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ }
+ },
+ "layout": {
+ "kind": "RowsLayout",
+ "spec": {
+ "rows": [
+ {
+ "kind": "RowsLayoutRow",
+ "spec": {
+ "title": "Quick CPU / Mem / Disk",
+ "collapse": false,
+ "layout": {
+ "kind": "GridLayout",
+ "spec": {
+ "items": [
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 0,
+ "width": 3,
+ "height": 4,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-323"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 3,
+ "y": 0,
+ "width": 3,
+ "height": 4,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-20"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 6,
+ "y": 0,
+ "width": 3,
+ "height": 4,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-155"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 9,
+ "y": 0,
+ "width": 3,
+ "height": 4,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-16"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 0,
+ "width": 3,
+ "height": 4,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-21"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 15,
+ "y": 0,
+ "width": 3,
+ "height": 4,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-154"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 18,
+ "y": 0,
+ "width": 2,
+ "height": 2,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-14"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 20,
+ "y": 0,
+ "width": 2,
+ "height": 2,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-75"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 22,
+ "y": 0,
+ "width": 2,
+ "height": 2,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-18"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 18,
+ "y": 2,
+ "width": 2,
+ "height": 2,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-23"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 20,
+ "y": 2,
+ "width": 4,
+ "height": 2,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-15"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "kind": "RowsLayoutRow",
+ "spec": {
+ "title": "Basic CPU / Mem / Net / Disk",
+ "collapse": false,
+ "layout": {
+ "kind": "GridLayout",
+ "spec": {
+ "items": [
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 0,
+ "width": 12,
+ "height": 7,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-77"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 0,
+ "width": 12,
+ "height": 7,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-78"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 7,
+ "width": 12,
+ "height": 7,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-74"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 7,
+ "width": 12,
+ "height": 7,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-152"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "kind": "RowsLayoutRow",
+ "spec": {
+ "title": "CPU / Memory / Net / Disk",
+ "collapse": true,
+ "layout": {
+ "kind": "GridLayout",
+ "spec": {
+ "items": [
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 0,
+ "width": 12,
+ "height": 12,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-3"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 0,
+ "width": 12,
+ "height": 12,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-24"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 412,
+ "width": 12,
+ "height": 12,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-84"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 412,
+ "width": 12,
+ "height": 12,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-338"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 424,
+ "width": 12,
+ "height": 12,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-229"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 424,
+ "width": 12,
+ "height": 12,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-42"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 436,
+ "width": 12,
+ "height": 12,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-43"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 436,
+ "width": 12,
+ "height": 12,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-156"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 448,
+ "width": 12,
+ "height": 12,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-127"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 448,
+ "width": 12,
+ "height": 12,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-322"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "kind": "RowsLayoutRow",
+ "spec": {
+ "title": "Memory Meminfo",
+ "collapse": true,
+ "layout": {
+ "kind": "GridLayout",
+ "spec": {
+ "items": [
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 710,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-135"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 710,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-130"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 910,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-131"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 910,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-138"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 920,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-136"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 920,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-191"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 930,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-160"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 930,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-70"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 940,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-129"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 940,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-137"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 950,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-128"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 950,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-140"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "kind": "RowsLayoutRow",
+ "spec": {
+ "title": "Memory Vmstat",
+ "collapse": true,
+ "layout": {
+ "kind": "GridLayout",
+ "spec": {
+ "items": [
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 710,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-176"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 710,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-22"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 890,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-175"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 890,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-307"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "kind": "RowsLayoutRow",
+ "spec": {
+ "title": "System Timesync",
+ "collapse": true,
+ "layout": {
+ "kind": "GridLayout",
+ "spec": {
+ "items": [
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 710,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-260"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 710,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-291"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 860,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-168"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 860,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-333"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 870,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-334"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 870,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-335"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "kind": "RowsLayoutRow",
+ "spec": {
+ "title": "System Processes",
+ "collapse": true,
+ "layout": {
+ "kind": "GridLayout",
+ "spec": {
+ "items": [
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 710,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-62"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 710,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-315"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 740,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-148"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 740,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-305"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 750,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-313"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 750,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-314"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "kind": "RowsLayoutRow",
+ "spec": {
+ "title": "System Misc",
+ "collapse": true,
+ "layout": {
+ "kind": "GridLayout",
+ "spec": {
+ "items": [
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 790,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-8"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 790,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-7"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 800,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-321"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 800,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-306"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 810,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-259"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 810,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-151"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "kind": "RowsLayoutRow",
+ "spec": {
+ "title": "Hardware Misc",
+ "collapse": true,
+ "layout": {
+ "kind": "GridLayout",
+ "spec": {
+ "items": [
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 710,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-158"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 710,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-300"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 720,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-302"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 720,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-325"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "kind": "RowsLayoutRow",
+ "spec": {
+ "title": "Systemd",
+ "collapse": true,
+ "layout": {
+ "kind": "GridLayout",
+ "spec": {
+ "items": [
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 4200,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-298"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 4200,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-331"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 4210,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-297"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 4210,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-332"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "kind": "RowsLayoutRow",
+ "spec": {
+ "title": "Storage Disk",
+ "collapse": true,
+ "layout": {
+ "kind": "GridLayout",
+ "spec": {
+ "items": [
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 0,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-9"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 0,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-33"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 360,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-37"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 360,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-35"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 370,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-133"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 370,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-36"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 380,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-301"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 380,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-326"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 390,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-34"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "kind": "RowsLayoutRow",
+ "spec": {
+ "title": "Storage Filesystem",
+ "collapse": true,
+ "layout": {
+ "kind": "GridLayout",
+ "spec": {
+ "items": [
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 0,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-28"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 0,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-41"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 340,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-44"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 340,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-219"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "kind": "RowsLayoutRow",
+ "spec": {
+ "title": "Network Traffic",
+ "collapse": true,
+ "layout": {
+ "kind": "GridLayout",
+ "spec": {
+ "items": [
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 0,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-60"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 0,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-142"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 220,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-143"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 220,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-141"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 230,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-146"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 230,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-327"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 240,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-145"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 240,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-144"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 250,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-232"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 250,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-231"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 260,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-230"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 260,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-61"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 270,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-309"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 270,
+ "width": 6,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-280"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 18,
+ "y": 270,
+ "width": 6,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-288"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "kind": "RowsLayoutRow",
+ "spec": {
+ "title": "Network Sockstat",
+ "collapse": true,
+ "layout": {
+ "kind": "GridLayout",
+ "spec": {
+ "items": [
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 0,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-63"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 0,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-124"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 10,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-126"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 10,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-125"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 20,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-220"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 20,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-339"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 30,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-336"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 30,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-290"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 40,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-310"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 40,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-330"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "kind": "RowsLayoutRow",
+ "spec": {
+ "title": "Network Netstat",
+ "collapse": true,
+ "layout": {
+ "kind": "GridLayout",
+ "spec": {
+ "items": [
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 130,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-221"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 130,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-299"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 160,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-55"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 160,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-115"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 170,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-104"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 170,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-109"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 180,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-50"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 180,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-91"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 190,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-85"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 190,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-337"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 200,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-82"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 200,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-320"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 210,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-341"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 210,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-340"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "kind": "RowsLayoutRow",
+ "spec": {
+ "title": "Node Exporter",
+ "collapse": true,
+ "layout": {
+ "kind": "GridLayout",
+ "spec": {
+ "items": [
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 130,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-40"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 130,
+ "width": 12,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-308"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 140,
+ "width": 10,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-149"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 10,
+ "y": 140,
+ "width": 10,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-64"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 20,
+ "y": 140,
+ "width": 4,
+ "height": 10,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-157"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ ]
+ }
+ },
+ "links": [
+ {
+ "title": "GitHub",
+ "type": "link",
+ "icon": "external link",
+ "tooltip": "",
+ "url": "https://github.com/rfmoz/grafana-dashboards",
+ "tags": [],
+ "asDropdown": false,
+ "targetBlank": true,
+ "includeVars": false,
+ "keepTime": false
+ },
+ {
+ "title": "Grafana",
+ "type": "link",
+ "icon": "external link",
+ "tooltip": "",
+ "url": "https://grafana.com/grafana/dashboards/1860",
+ "tags": [],
+ "asDropdown": false,
+ "targetBlank": true,
+ "includeVars": false,
+ "keepTime": false
+ }
+ ],
+ "liveNow": false,
+ "preload": false,
+ "tags": [
+ "linux"
+ ],
+ "timeSettings": {
+ "timezone": "browser",
+ "from": "now-24h",
+ "to": "now",
+ "autoRefresh": "1m",
+ "autoRefreshIntervals": [
+ "5s",
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ],
+ "hideTimepicker": false,
+ "fiscalYearStartMonth": 0
+ },
+ "title": "Node Exporter Full",
+ "variables": [
+ {
+ "kind": "DatasourceVariable",
+ "spec": {
+ "name": "ds_prometheus",
+ "pluginId": "prometheus",
+ "refresh": "onDashboardLoad",
+ "regex": "",
+ "current": {
+ "text": "",
+ "value": ""
+ },
+ "options": [],
+ "multi": false,
+ "includeAll": false,
+ "label": "Datasource",
+ "hide": "dontHide",
+ "skipUrlSync": false,
+ "allowCustomValue": true
+ }
+ },
+ {
+ "kind": "QueryVariable",
+ "spec": {
+ "name": "job",
+ "current": {
+ "text": "",
+ "value": ""
+ },
+ "label": "Job",
+ "hide": "dontHide",
+ "refresh": "onDashboardLoad",
+ "skipUrlSync": false,
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "query": "label_values(node_uname_info, job)",
+ "refId": "Prometheus-job-Variable-Query"
+ }
+ },
+ "regex": "",
+ "sort": "alphabeticalAsc",
+ "definition": "",
+ "options": [],
+ "multi": false,
+ "includeAll": false,
+ "allowCustomValue": true
+ }
+ },
+ {
+ "kind": "QueryVariable",
+ "spec": {
+ "name": "nodename",
+ "current": {
+ "text": "",
+ "value": ""
+ },
+ "label": "Nodename",
+ "hide": "dontHide",
+ "refresh": "onDashboardLoad",
+ "skipUrlSync": false,
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "query": "label_values(node_uname_info{job=\"$job\"}, nodename)",
+ "refId": "Prometheus-nodename-Variable-Query"
+ }
+ },
+ "regex": "",
+ "sort": "alphabeticalAsc",
+ "definition": "label_values(node_uname_info{job=\"$job\"}, nodename)",
+ "options": [],
+ "multi": false,
+ "includeAll": false,
+ "allowCustomValue": true
+ }
+ },
+ {
+ "kind": "QueryVariable",
+ "spec": {
+ "name": "node",
+ "current": {
+ "text": "",
+ "value": ""
+ },
+ "label": "Instance",
+ "hide": "dontHide",
+ "refresh": "onDashboardLoad",
+ "skipUrlSync": false,
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "${ds_prometheus}"
+ },
+ "spec": {
+ "query": "label_values(node_uname_info{job=\"$job\", nodename=\"$nodename\"}, instance)",
+ "refId": "Prometheus-node-Variable-Query"
+ }
+ },
+ "regex": "",
+ "sort": "alphabeticalAsc",
+ "definition": "label_values(node_uname_info{job=\"$job\", nodename=\"$nodename\"}, instance)",
+ "options": [],
+ "multi": false,
+ "includeAll": false,
+ "allowCustomValue": true
+ }
+ }
+ ]
+ }
+} \ No newline at end of file
diff --git a/modules/vhack/mo/monitoring/dashboards/performance.json b/modules/vhack/mo/monitoring/dashboards/performance.json
new file mode 100644
index 0000000..bb8c88f
--- /dev/null
+++ b/modules/vhack/mo/monitoring/dashboards/performance.json
@@ -0,0 +1,1606 @@
+{
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": {
+ "type": "grafana",
+ "uid": "-- Grafana --"
+ },
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "type": "dashboard"
+ }
+ ]
+ },
+ "editable": true,
+ "fiscalYearStartMonth": 0,
+ "graphTooltip": 0,
+ "id": 6,
+ "links": [],
+ "panels": [
+ {
+ "collapsed": false,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 0
+ },
+ "id": 12,
+ "panels": [],
+ "title": "Node",
+ "type": "row"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "description": "",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": 3600000,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "decimals": 2,
+ "fieldMinMax": false,
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "red",
+ "value": null
+ },
+ {
+ "color": "transparent",
+ "value": 0.05
+ }
+ ]
+ },
+ "unit": "mbytes"
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byFrameRefID",
+ "options": "A"
+ },
+ "properties": [
+ {
+ "id": "custom.axisPlacement",
+ "value": "right"
+ },
+ {
+ "id": "unit",
+ "value": "ms"
+ },
+ {
+ "id": "decimals"
+ },
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "dark-red",
+ "mode": "fixed"
+ }
+ },
+ {
+ "id": "custom.lineStyle",
+ "value": {
+ "dash": [
+ 10,
+ 10
+ ],
+ "fill": "dash"
+ }
+ },
+ {
+ "id": "custom.lineWidth",
+ "value": 2
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byFrameRefID",
+ "options": "B"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "green",
+ "mode": "fixed"
+ }
+ },
+ {
+ "id": "custom.lineStyle",
+ "value": {
+ "dash": [
+ 0,
+ 10
+ ],
+ "fill": "dot"
+ }
+ },
+ {
+ "id": "custom.lineWidth",
+ "value": 2
+ },
+ {
+ "id": "custom.fillOpacity",
+ "value": 10
+ },
+ {
+ "id": "custom.axisPlacement",
+ "value": "auto"
+ },
+ {
+ "id": "custom.stacking",
+ "value": {
+ "group": "A",
+ "mode": "none"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 1
+ },
+ "id": 20,
+ "options": {
+ "legend": {
+ "calcs": [
+ "max",
+ "lastNotNull"
+ ],
+ "displayMode": "table",
+ "placement": "right",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "11.4.0",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "editorMode": "code",
+ "expr": "netdata_system_memory_full_pressure_stall_time_ms_average{hostname=~\"$hostname\"} * -1",
+ "hide": false,
+ "instant": false,
+ "legendFormat": "full stall time",
+ "range": true,
+ "refId": "A"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "editorMode": "code",
+ "expr": "sum(node_memory_MemTotal_bytes{instance=\"127.0.0.1:9112\"}) / 1000000 - sum(netdata_mem_available_MiB_average{instance=~\"$instance\"})",
+ "hide": false,
+ "instant": false,
+ "legendFormat": "remaining",
+ "range": true,
+ "refId": "B"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "disableTextWrap": false,
+ "editorMode": "code",
+ "expr": "sum by(dimension, service_name) (netdata_systemd_service_memory_usage_MiB_average{instance=~\"$instance\", service_name=~\"$service\", dimension=\"ram\"})",
+ "fullMetaSearch": false,
+ "hide": false,
+ "includeNullMetadata": true,
+ "legendFormat": "{{service_name}}",
+ "range": true,
+ "refId": "used",
+ "useBackend": false
+ }
+ ],
+ "title": "Memory",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "description": "",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": 3600000,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "decimals": 2,
+ "fieldMinMax": false,
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "red",
+ "value": null
+ },
+ {
+ "color": "transparent",
+ "value": 0.05
+ }
+ ]
+ },
+ "unit": "mbytes"
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byFrameRefID",
+ "options": "A"
+ },
+ "properties": [
+ {
+ "id": "custom.axisPlacement",
+ "value": "right"
+ },
+ {
+ "id": "unit",
+ "value": "ms"
+ },
+ {
+ "id": "decimals"
+ },
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "dark-red",
+ "mode": "fixed"
+ }
+ },
+ {
+ "id": "custom.lineStyle",
+ "value": {
+ "dash": [
+ 10,
+ 10
+ ],
+ "fill": "dash"
+ }
+ },
+ {
+ "id": "custom.lineWidth",
+ "value": 2
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byFrameRefID",
+ "options": "B"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "green",
+ "mode": "fixed"
+ }
+ },
+ {
+ "id": "custom.lineStyle",
+ "value": {
+ "dash": [
+ 0,
+ 10
+ ],
+ "fill": "dot"
+ }
+ },
+ {
+ "id": "custom.lineWidth",
+ "value": 2
+ },
+ {
+ "id": "custom.fillOpacity",
+ "value": 10
+ },
+ {
+ "id": "custom.axisPlacement",
+ "value": "auto"
+ },
+ {
+ "id": "custom.stacking",
+ "value": {
+ "group": "A",
+ "mode": "none"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 1
+ },
+ "id": 23,
+ "options": {
+ "legend": {
+ "calcs": [
+ "max",
+ "lastNotNull"
+ ],
+ "displayMode": "table",
+ "placement": "right",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "11.4.0",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "editorMode": "code",
+ "expr": "netdata_system_memory_full_pressure_stall_time_ms_average{hostname=~\"$hostname\"} * -1",
+ "hide": false,
+ "instant": false,
+ "legendFormat": "full stall time",
+ "range": true,
+ "refId": "A"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "editorMode": "code",
+ "expr": "sum(node_memory_SwapFree_bytes{instance=~\"127.0.0.1:9112\"}) / 1000000",
+ "hide": false,
+ "instant": false,
+ "legendFormat": "remaining",
+ "range": true,
+ "refId": "B"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "disableTextWrap": false,
+ "editorMode": "code",
+ "expr": "sum by(dimension, service_name) (netdata_systemd_service_memory_usage_MiB_average{hostname=~\"$hostname\", service_name=~\"$service\", dimension=\"swap\"})",
+ "fullMetaSearch": false,
+ "hide": false,
+ "includeNullMetadata": true,
+ "legendFormat": "{{service_name}}",
+ "range": true,
+ "refId": "used",
+ "useBackend": false
+ }
+ ],
+ "title": "Swap",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "description": "",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": 3600000,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "decimals": 2,
+ "fieldMinMax": false,
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "red",
+ "value": null
+ },
+ {
+ "color": "transparent",
+ "value": 0.05
+ }
+ ]
+ },
+ "unit": "percent"
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byFrameRefID",
+ "options": "B"
+ },
+ "properties": [
+ {
+ "id": "custom.axisPlacement",
+ "value": "right"
+ },
+ {
+ "id": "unit",
+ "value": "ms"
+ },
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "orange",
+ "mode": "fixed"
+ }
+ },
+ {
+ "id": "custom.lineStyle",
+ "value": {
+ "dash": [
+ 0,
+ 10
+ ],
+ "fill": "dot"
+ }
+ },
+ {
+ "id": "custom.lineWidth",
+ "value": 2
+ },
+ {
+ "id": "custom.fillOpacity",
+ "value": 34
+ }
+ ]
+ }
+ ]
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 9
+ },
+ "id": 22,
+ "options": {
+ "legend": {
+ "calcs": [
+ "max",
+ "sum"
+ ],
+ "displayMode": "table",
+ "placement": "right",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "11.4.0",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "editorMode": "code",
+ "expr": "netdata_system_cpu_some_pressure_stall_time_ms_average{hostname=~\"$hostname\"} * -1",
+ "hide": false,
+ "instant": false,
+ "legendFormat": "some stall time",
+ "range": true,
+ "refId": "B"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "disableTextWrap": false,
+ "editorMode": "code",
+ "expr": "sum by(dimension, service_name) (netdata_systemd_service_cpu_utilization_percentage_average{hostname=~\"$hostname\", service_name=~\"$service\"})",
+ "fullMetaSearch": false,
+ "hide": false,
+ "includeNullMetadata": true,
+ "legendFormat": "{{service_name}} / {{dimension}}",
+ "range": true,
+ "refId": "used",
+ "useBackend": false
+ }
+ ],
+ "title": "CPU",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "description": "",
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": 3600000,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "decimals": 2,
+ "fieldMinMax": false,
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "red",
+ "value": null
+ },
+ {
+ "color": "transparent",
+ "value": 0.05
+ }
+ ]
+ },
+ "unit": "Kibits"
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byFrameRefID",
+ "options": "A"
+ },
+ "properties": [
+ {
+ "id": "custom.axisPlacement",
+ "value": "right"
+ },
+ {
+ "id": "unit",
+ "value": "ms"
+ },
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "red",
+ "mode": "fixed"
+ }
+ },
+ {
+ "id": "custom.lineStyle",
+ "value": {
+ "dash": [
+ 0,
+ 10
+ ],
+ "fill": "dot"
+ }
+ },
+ {
+ "id": "custom.lineWidth",
+ "value": 2
+ },
+ {
+ "id": "custom.fillOpacity",
+ "value": 12
+ },
+ {
+ "id": "custom.stacking",
+ "value": {
+ "group": "A",
+ "mode": "none"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byFrameRefID",
+ "options": "B"
+ },
+ "properties": [
+ {
+ "id": "custom.axisPlacement",
+ "value": "right"
+ },
+ {
+ "id": "unit",
+ "value": "ms"
+ },
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "orange",
+ "mode": "fixed"
+ }
+ },
+ {
+ "id": "custom.lineStyle",
+ "value": {
+ "dash": [
+ 0,
+ 10
+ ],
+ "fill": "dot"
+ }
+ },
+ {
+ "id": "custom.lineWidth",
+ "value": 2
+ },
+ {
+ "id": "custom.fillOpacity",
+ "value": 17
+ },
+ {
+ "id": "custom.stacking",
+ "value": {
+ "group": "A",
+ "mode": "none"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 9
+ },
+ "id": 21,
+ "options": {
+ "legend": {
+ "calcs": [
+ "max",
+ "sum"
+ ],
+ "displayMode": "table",
+ "placement": "right",
+ "showLegend": true,
+ "width": 300
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "11.4.0",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "editorMode": "code",
+ "expr": "netdata_system_io_full_pressure_stall_time_ms_average{hostname=~\"$hostname\"} * -1",
+ "hide": false,
+ "instant": false,
+ "legendFormat": "full stall time",
+ "range": true,
+ "refId": "A"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "editorMode": "code",
+ "expr": "netdata_system_io_some_pressure_stall_time_ms_average{instance=~\"$instance\"} * -1",
+ "hide": false,
+ "instant": false,
+ "legendFormat": "some stall time",
+ "range": true,
+ "refId": "B"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "disableTextWrap": false,
+ "editorMode": "code",
+ "expr": "sum by(dimension, service_name) (netdata_systemd_service_disk_io_KiB_persec_average{instance=~\"$instance\", service_name=~\"$service\"})",
+ "fullMetaSearch": false,
+ "hide": false,
+ "includeNullMetadata": true,
+ "legendFormat": "{{service_name}} / {{dimension}}",
+ "range": true,
+ "refId": "used",
+ "useBackend": false
+ }
+ ],
+ "title": "Disk I/O",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "Kibits"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 17
+ },
+ "id": 18,
+ "options": {
+ "legend": {
+ "calcs": [
+ "max",
+ "sum"
+ ],
+ "displayMode": "table",
+ "placement": "right",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "11.4.0",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "editorMode": "code",
+ "expr": "netdata_disk_io_KiB_persec_average{hostname=~\"$hostname\", chart=~\"disk.sd.+\"}",
+ "instant": false,
+ "legendFormat": "{{device}} / {{dimension}}",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Disk I/O",
+ "type": "timeseries"
+ },
+ {
+ "collapsed": false,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 25
+ },
+ "id": 4,
+ "panels": [],
+ "title": "Network Requests",
+ "type": "row"
+ },
+ {
+ "datasource": {
+ "type": "loki",
+ "uid": "cd6cc53e-840c-484d-85f7-96fede324006"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "custom": {
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "scaleDistribution": {
+ "type": "linear"
+ }
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 26
+ },
+ "id": 17,
+ "links": [
+ {
+ "title": "explore",
+ "url": "https://grafana.tiserbox.com/explore?panes=%7B%22HWt%22:%7B%22datasource%22:%22cd6cc53e-840c-484d-85f7-96fede324006%22,%22queries%22:%5B%7B%22refId%22:%22A%22,%22expr%22:%22%7Bunit%3D%5C%22nginx.service%5C%22%7D%20%7C%20pattern%20%5C%22%3C_%3E%20%3C_%3E%20%3Cline%3E%5C%22%20%7C%20line_format%20%5C%22%7B%7B.line%7D%7D%5C%22%20%7C%20json%20%7C%20status%20%21~%20%5C%222..%5C%22%20%7C%20__error__%20%21%3D%20%5C%22JSONParserErr%5C%22%22,%22queryType%22:%22range%22,%22datasource%22:%7B%22type%22:%22loki%22,%22uid%22:%22cd6cc53e-840c-484d-85f7-96fede324006%22%7D,%22editorMode%22:%22code%22%7D%5D,%22range%22:%7B%22from%22:%22now-6h%22,%22to%22:%22now%22%7D%7D%7D&schemaVersion=1&orgId=1"
+ }
+ ],
+ "options": {
+ "calculate": false,
+ "cellGap": 1,
+ "color": {
+ "exponent": 0.5,
+ "fill": "dark-orange",
+ "mode": "scheme",
+ "reverse": false,
+ "scale": "exponential",
+ "scheme": "RdBu",
+ "steps": 62
+ },
+ "exemplars": {
+ "color": "rgba(255,0,255,0.7)"
+ },
+ "filterValues": {
+ "le": 1e-9
+ },
+ "legend": {
+ "show": true
+ },
+ "rowsFrame": {
+ "layout": "auto"
+ },
+ "tooltip": {
+ "mode": "single",
+ "showColorScale": false,
+ "yHistogram": false
+ },
+ "yAxis": {
+ "axisPlacement": "left",
+ "decimals": 0,
+ "reverse": false,
+ "unit": "s"
+ }
+ },
+ "pluginVersion": "11.4.0",
+ "targets": [
+ {
+ "datasource": {
+ "type": "loki",
+ "uid": "cd6cc53e-840c-484d-85f7-96fede324006"
+ },
+ "editorMode": "code",
+ "expr": "{hostname=~\"$hostname\",unit=\"nginx.service\"} | pattern \"<_> <_> <line>\" | line_format \"{{.line}}\" | json | __error__ != \"JSONParserErr\" | request_time > 100",
+ "legendFormat": "{{server_name}}",
+ "queryType": "range",
+ "refId": "A"
+ }
+ ],
+ "title": "Slow Requests Histogram > 100ms",
+ "transformations": [
+ {
+ "id": "extractFields",
+ "options": {
+ "keepTime": false,
+ "replace": false,
+ "source": "Line"
+ }
+ },
+ {
+ "id": "organize",
+ "options": {
+ "excludeByName": {
+ "Line": true,
+ "body_bytes_sent": true,
+ "bytes_sent": true,
+ "gzip_ration": true,
+ "id": true,
+ "labels": true,
+ "post": true,
+ "referrer": true,
+ "remote_addr": true,
+ "remote_user": true,
+ "request": true,
+ "request_length": true,
+ "server_name": true,
+ "status": true,
+ "time_local": true,
+ "tsNs": true,
+ "upstream_addr": true,
+ "upstream_connect_time": true,
+ "upstream_header_time": true,
+ "upstream_response_time": true,
+ "upstream_status": true,
+ "user_agent": true
+ },
+ "indexByName": {},
+ "renameByName": {}
+ }
+ },
+ {
+ "id": "convertFieldType",
+ "options": {
+ "conversions": [
+ {
+ "destinationType": "number",
+ "targetField": "request_time"
+ }
+ ],
+ "fields": {}
+ }
+ },
+ {
+ "id": "heatmap",
+ "options": {
+ "xBuckets": {
+ "mode": "size",
+ "value": ""
+ },
+ "yBuckets": {
+ "mode": "size",
+ "scale": {
+ "log": 2,
+ "type": "log"
+ },
+ "value": ""
+ }
+ }
+ }
+ ],
+ "type": "heatmap"
+ },
+ {
+ "datasource": {
+ "type": "loki",
+ "uid": "cd6cc53e-840c-484d-85f7-96fede324006"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "points",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ },
+ "unit": "ms"
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 26
+ },
+ "id": 2,
+ "options": {
+ "legend": {
+ "calcs": [
+ "max",
+ "mean",
+ "variance"
+ ],
+ "displayMode": "table",
+ "placement": "right",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "11.4.0",
+ "targets": [
+ {
+ "datasource": {
+ "type": "loki",
+ "uid": "cd6cc53e-840c-484d-85f7-96fede324006"
+ },
+ "editorMode": "code",
+ "expr": "{hostname=~\"$hostname\",unit=\"nginx.service\"} | pattern \"<_> <_> <line>\" | line_format \"{{.line}}\" | json | __error__ != \"JSONParserErr\" | request_time > 100",
+ "legendFormat": "",
+ "queryType": "range",
+ "refId": "A"
+ }
+ ],
+ "title": "Requests > 100ms",
+ "transformations": [
+ {
+ "id": "extractFields",
+ "options": {
+ "keepTime": true,
+ "replace": true,
+ "source": "labels"
+ }
+ },
+ {
+ "id": "organize",
+ "options": {
+ "excludeByName": {
+ "body_bytes_sent": true,
+ "bytes_sent": true,
+ "gzip_ration": true,
+ "job": true,
+ "line": true,
+ "post": true,
+ "referrer": true,
+ "remote_addr": true,
+ "remote_user": true,
+ "request": true,
+ "request_length": true,
+ "status": true,
+ "time_local": true,
+ "unit": true,
+ "upstream_addr": true,
+ "upstream_connect_time": true,
+ "upstream_header_time": true,
+ "upstream_response_time": true,
+ "upstream_status": true,
+ "user_agent": true
+ },
+ "indexByName": {},
+ "renameByName": {}
+ }
+ },
+ {
+ "id": "convertFieldType",
+ "options": {
+ "conversions": [
+ {
+ "dateFormat": "",
+ "destinationType": "number",
+ "targetField": "request_time"
+ }
+ ],
+ "fields": {}
+ }
+ },
+ {
+ "id": "partitionByValues",
+ "options": {
+ "fields": [
+ "server_name"
+ ]
+ }
+ },
+ {
+ "id": "renameByRegex",
+ "options": {
+ "regex": "request_time (.*)",
+ "renamePattern": "$1"
+ }
+ }
+ ],
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "loki",
+ "uid": "cd6cc53e-840c-484d-85f7-96fede324006"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "custom": {
+ "align": "auto",
+ "cellOptions": {
+ "type": "auto"
+ },
+ "filterable": false,
+ "inspect": false
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 24,
+ "x": 0,
+ "y": 34
+ },
+ "id": 3,
+ "links": [
+ {
+ "title": "explore",
+ "url": "https://grafana.tiserbox.com/explore?panes=%7B%22HWt%22:%7B%22datasource%22:%22cd6cc53e-840c-484d-85f7-96fede324006%22,%22queries%22:%5B%7B%22refId%22:%22A%22,%22expr%22:%22%7Bunit%3D%5C%22nginx.service%5C%22%7D%20%7C%20pattern%20%5C%22%3C_%3E%20%3C_%3E%20%3Cline%3E%5C%22%20%7C%20line_format%20%5C%22%7B%7B.line%7D%7D%5C%22%20%7C%20json%20%7C%20status%20%21~%20%5C%222..%5C%22%20%7C%20__error__%20%21%3D%20%5C%22JSONParserErr%5C%22%22,%22queryType%22:%22range%22,%22datasource%22:%7B%22type%22:%22loki%22,%22uid%22:%22cd6cc53e-840c-484d-85f7-96fede324006%22%7D,%22editorMode%22:%22code%22%7D%5D,%22range%22:%7B%22from%22:%22now-6h%22,%22to%22:%22now%22%7D%7D%7D&schemaVersion=1&orgId=1"
+ }
+ ],
+ "options": {
+ "cellHeight": "sm",
+ "footer": {
+ "countRows": false,
+ "enablePagination": false,
+ "fields": "",
+ "reducer": [
+ "sum"
+ ],
+ "show": false
+ },
+ "showHeader": true
+ },
+ "pluginVersion": "11.4.0",
+ "targets": [
+ {
+ "datasource": {
+ "type": "loki",
+ "uid": "cd6cc53e-840c-484d-85f7-96fede324006"
+ },
+ "editorMode": "code",
+ "expr": "{hostname=~\"$hostname\",unit=\"nginx.service\"} | pattern \"<_> <_> <line>\" | line_format \"{{.line}}\" | json | __error__ != \"JSONParserErr\" | request_time > 1",
+ "queryType": "range",
+ "refId": "A"
+ }
+ ],
+ "title": "Network Requests Above 1s",
+ "transformations": [
+ {
+ "id": "extractFields",
+ "options": {
+ "replace": true,
+ "source": "Line"
+ }
+ }
+ ],
+ "type": "table"
+ },
+ {
+ "collapsed": false,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 42
+ },
+ "id": 7,
+ "panels": [],
+ "title": "Databases",
+ "type": "row"
+ },
+ {
+ "datasource": {
+ "type": "loki",
+ "uid": "cd6cc53e-840c-484d-85f7-96fede324006"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "custom": {
+ "align": "auto",
+ "cellOptions": {
+ "type": "auto"
+ },
+ "inspect": false
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "duration_ms"
+ },
+ "properties": [
+ {
+ "id": "custom.width",
+ "value": 100
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "unit"
+ },
+ "properties": [
+ {
+ "id": "custom.width",
+ "value": 150
+ }
+ ]
+ }
+ ]
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 24,
+ "x": 0,
+ "y": 43
+ },
+ "id": 6,
+ "links": [
+ {
+ "title": "explore",
+ "url": "https://grafana.tiserbox.com/explore?panes=%7B%22HWt%22:%7B%22datasource%22:%22cd6cc53e-840c-484d-85f7-96fede324006%22,%22queries%22:%5B%7B%22refId%22:%22A%22,%22expr%22:%22%7Bunit%3D%5C%22nginx.service%5C%22%7D%20%7C%20pattern%20%5C%22%3C_%3E%20%3C_%3E%20%3Cline%3E%5C%22%20%7C%20line_format%20%5C%22%7B%7B.line%7D%7D%5C%22%20%7C%20json%20%7C%20status%20%21~%20%5C%222..%5C%22%20%7C%20__error__%20%21%3D%20%5C%22JSONParserErr%5C%22%22,%22queryType%22:%22range%22,%22datasource%22:%7B%22type%22:%22loki%22,%22uid%22:%22cd6cc53e-840c-484d-85f7-96fede324006%22%7D,%22editorMode%22:%22code%22%7D%5D,%22range%22:%7B%22from%22:%22now-6h%22,%22to%22:%22now%22%7D%7D%7D&schemaVersion=1&orgId=1"
+ }
+ ],
+ "options": {
+ "cellHeight": "sm",
+ "footer": {
+ "countRows": false,
+ "fields": "",
+ "reducer": [
+ "sum"
+ ],
+ "show": false
+ },
+ "showHeader": true
+ },
+ "pluginVersion": "11.4.0",
+ "targets": [
+ {
+ "datasource": {
+ "type": "loki",
+ "uid": "cd6cc53e-840c-484d-85f7-96fede324006"
+ },
+ "editorMode": "code",
+ "expr": "{hostname=~\"$hostname\",unit=\"postgresql.service\"} | regexp \".*duration: (?P<duration_ms>[0-9.]+) ms (?P<statement>.*)\" | duration_ms > 500 | __error__ != \"LabelFilterErr\"",
+ "queryType": "range",
+ "refId": "A"
+ }
+ ],
+ "title": "Slow DB Queries",
+ "transformations": [
+ {
+ "id": "extractFields",
+ "options": {
+ "replace": true,
+ "source": "labels"
+ }
+ },
+ {
+ "id": "organize",
+ "options": {
+ "excludeByName": {
+ "job": true
+ },
+ "indexByName": {
+ "duration_ms": 0,
+ "job": 1,
+ "statement": 3,
+ "unit": 2
+ },
+ "renameByName": {}
+ }
+ }
+ ],
+ "type": "table"
+ }
+ ],
+ "preload": false,
+ "refresh": "1m",
+ "schemaVersion": 40,
+ "tags": [],
+ "templating": {
+ "list": [
+ {
+ "allValue": ".*",
+ "current": {
+ "text": [
+ "baryum"
+ ],
+ "value": [
+ "baryum"
+ ]
+ },
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "definition": "label_values(netdata_systemd_service_unit_state_state_average,hostname)",
+ "includeAll": false,
+ "multi": true,
+ "name": "hostname",
+ "options": [],
+ "query": {
+ "qryType": 1,
+ "query": "label_values(netdata_systemd_service_unit_state_state_average,hostname)",
+ "refId": "PrometheusVariableQueryEditor-VariableQuery"
+ },
+ "refresh": 1,
+ "regex": "",
+ "type": "query"
+ },
+ {
+ "allValue": ".*",
+ "current": {
+ "text": [
+ "All"
+ ],
+ "value": [
+ "$__all"
+ ]
+ },
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "definition": "label_values(netdata_systemd_service_unit_state_state_average,unit_name)",
+ "includeAll": true,
+ "multi": true,
+ "name": "service",
+ "options": [],
+ "query": {
+ "qryType": 1,
+ "query": "label_values(netdata_systemd_service_unit_state_state_average,unit_name)",
+ "refId": "PrometheusVariableQueryEditor-VariableQuery"
+ },
+ "refresh": 1,
+ "regex": "",
+ "type": "query"
+ }
+ ]
+ },
+ "time": {
+ "from": "now-30m",
+ "to": "now"
+ },
+ "timepicker": {},
+ "timezone": "",
+ "title": "Performance",
+ "uid": "e01156bf-cdba-42eb-9845-a401dd634d41",
+ "version": 82,
+ "weekStart": ""
+}
diff --git a/modules/vhack/mo/monitoring/dashboards/scraping_jobs.json b/modules/vhack/mo/monitoring/dashboards/scraping_jobs.json
new file mode 100644
index 0000000..39921d0
--- /dev/null
+++ b/modules/vhack/mo/monitoring/dashboards/scraping_jobs.json
@@ -0,0 +1,334 @@
+{
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": {
+ "type": "grafana",
+ "uid": "-- Grafana --"
+ },
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "type": "dashboard"
+ }
+ ]
+ },
+ "editable": true,
+ "fiscalYearStartMonth": 0,
+ "graphTooltip": 0,
+ "id": 5,
+ "links": [],
+ "panels": [
+ {
+ "datasource": {
+ "type": "loki",
+ "uid": "cd6cc53e-840c-484d-85f7-96fede324006"
+ },
+ "fieldConfig": {
+ "defaults": {},
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 0
+ },
+ "id": 5,
+ "options": {
+ "dedupStrategy": "none",
+ "enableInfiniteScrolling": false,
+ "enableLogDetails": true,
+ "prettifyLogMessage": false,
+ "showCommonLabels": false,
+ "showLabels": false,
+ "showTime": true,
+ "sortOrder": "Descending",
+ "wrapLogMessage": false
+ },
+ "pluginVersion": "12.2.0",
+ "targets": [
+ {
+ "datasource": {
+ "type": "loki",
+ "uid": "cd6cc53e-840c-484d-85f7-96fede324006"
+ },
+ "direction": "backward",
+ "editorMode": "code",
+ "expr": "{unit=~\"prometheus-.*-exporter.service\"}",
+ "queryType": "range",
+ "refId": "A"
+ }
+ ],
+ "title": "Exporter Logs",
+ "type": "logs"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "fixedColor": "red",
+ "mode": "shades"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "showValues": false,
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": 0
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 0
+ },
+ "id": 4,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "12.2.0",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "editorMode": "code",
+ "expr": "rate(net_conntrack_dialer_conn_failed_total{hostname=~\"$hostname\"}[2m]) > 0",
+ "instant": false,
+ "legendFormat": "{{dialer_name}} - {{reason}}",
+ "range": true,
+ "refId": "A"
+ }
+ ],
+ "title": "Errors",
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "fixedColor": "red",
+ "mode": "thresholds"
+ },
+ "custom": {
+ "axisPlacement": "auto",
+ "fillOpacity": 70,
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineWidth": 0,
+ "spanNulls": false
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": 0
+ },
+ {
+ "color": "red",
+ "value": 1
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 0,
+ "y": 8
+ },
+ "id": 3,
+ "options": {
+ "alignValue": "center",
+ "legend": {
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "mergeValues": true,
+ "rowHeight": 0.9,
+ "showValue": "never",
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "12.2.0",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "editorMode": "code",
+ "expr": "prometheus_sd_discovered_targets{hostname=~\"$hostname\"}",
+ "hide": false,
+ "instant": false,
+ "legendFormat": "{{config}}",
+ "range": true,
+ "refId": "All"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "editorMode": "code",
+ "expr": "label_replace(increase((sum by(dialer_name) (net_conntrack_dialer_conn_failed_total{hostname=~\"$hostname\"}))[15m:1m]), \"config\", \"$1\", \"dialer_name\", \"(.*)\")",
+ "hide": false,
+ "instant": false,
+ "legendFormat": "{{dialer_name}}",
+ "range": true,
+ "refId": "Failed"
+ }
+ ],
+ "title": "Scraping jobs",
+ "transformations": [
+ {
+ "id": "labelsToFields",
+ "options": {
+ "keepLabels": [
+ "config"
+ ],
+ "mode": "columns"
+ }
+ },
+ {
+ "id": "merge",
+ "options": {}
+ },
+ {
+ "id": "organize",
+ "options": {
+ "excludeByName": {
+ "prometheus_sd_discovered_targets": true
+ },
+ "indexByName": {},
+ "renameByName": {
+ "prometheus_sd_discovered_targets": ""
+ }
+ }
+ },
+ {
+ "id": "partitionByValues",
+ "options": {
+ "fields": [
+ "config"
+ ]
+ }
+ }
+ ],
+ "type": "state-timeline"
+ }
+ ],
+ "preload": false,
+ "refresh": "",
+ "schemaVersion": 42,
+ "tags": [],
+ "templating": {
+ "list": [
+ {
+ "current": {
+ "text": "baryum",
+ "value": "baryum"
+ },
+ "definition": "label_values(up,hostname)",
+ "includeAll": false,
+ "name": "hostname",
+ "options": [],
+ "query": {
+ "qryType": 1,
+ "query": "label_values(up,hostname)",
+ "refId": "PrometheusVariableQueryEditor-VariableQuery"
+ },
+ "refresh": 1,
+ "regex": "",
+ "type": "query"
+ }
+ ]
+ },
+ "time": {
+ "from": "now-6h",
+ "to": "now"
+ },
+ "timepicker": {},
+ "timezone": "",
+ "title": "Scraping Jobs",
+ "uid": "debb763d-77aa-47bd-9290-2e02583c8ed2",
+ "version": 24
+}
diff --git a/modules/vhack/mo/monitoring/dashboards/systemd_exporter.json b/modules/vhack/mo/monitoring/dashboards/systemd_exporter.json
new file mode 100644
index 0000000..7a7e67c
--- /dev/null
+++ b/modules/vhack/mo/monitoring/dashboards/systemd_exporter.json
@@ -0,0 +1,2870 @@
+{
+ "apiVersion": "dashboard.grafana.app/v2",
+ "kind": "Dashboard",
+ "metadata": {
+ "name": "d67da086-b996-4b94-be01-84e607a60956",
+ "namespace": "default",
+ "uid": "5fdf1a03-a8fd-4697-aaaf-ef7e13e33ce9",
+ "resourceVersion": "1784477451414701",
+ "generation": 10,
+ "creationTimestamp": "2026-07-19T15:05:16Z",
+ "labels": {
+ "grafana.app/deprecatedInternalID": "2699293740498944"
+ },
+ "annotations": {
+ "grafana.app/createdBy": "user:dfsj9uc3855oga",
+ "grafana.app/folder": "",
+ "grafana.app/saved-from-ui": "Grafana v13.0.3 (NA)",
+ "grafana.app/updatedBy": "user:dfsj9uc3855oga",
+ "grafana.app/updatedTimestamp": "2026-07-19T16:10:51Z"
+ }
+ },
+ "spec": {
+ "annotations": [
+ {
+ "kind": "AnnotationQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "grafana",
+ "version": "v0",
+ "datasource": {
+ "name": "-- Grafana --"
+ },
+ "spec": {}
+ },
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "builtIn": true
+ }
+ }
+ ],
+ "cursorSync": "Off",
+ "description": "Dashboard for prometheus systemd exporter",
+ "editable": true,
+ "elements": {
+ "panel-1": {
+ "kind": "Panel",
+ "spec": {
+ "id": 1,
+ "title": "Exporter build info",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "spec": {
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "systemd_exporter_build_info",
+ "format": "table",
+ "instant": true,
+ "legendFormat": "__auto",
+ "range": false
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "table",
+ "version": "13.0.3",
+ "spec": {
+ "options": {
+ "cellHeight": "sm",
+ "showHeader": true
+ },
+ "fieldConfig": {
+ "defaults": {
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": 0,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "thresholds"
+ },
+ "custom": {
+ "align": "auto",
+ "cellOptions": {
+ "type": "auto"
+ },
+ "footer": {
+ "reducers": []
+ },
+ "inspect": false
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Time"
+ },
+ "properties": [
+ {
+ "id": "custom.hideFrom.viz",
+ "value": true
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "branch"
+ },
+ "properties": [
+ {
+ "id": "custom.hideFrom.viz",
+ "value": true
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "__name__"
+ },
+ "properties": [
+ {
+ "id": "custom.hideFrom.viz",
+ "value": true
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "instance"
+ },
+ "properties": [
+ {
+ "id": "custom.hideFrom.viz",
+ "value": true
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Value"
+ },
+ "properties": [
+ {
+ "id": "custom.hideFrom.viz",
+ "value": true
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ "panel-10": {
+ "kind": "Panel",
+ "spec": {
+ "id": 10,
+ "title": "Service Failed State",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "count by (state) (systemd_unit_state{instance=~\"$instance\",state=\"failed\"}==1)",
+ "instant": false,
+ "legendFormat": "{{state}}",
+ "range": true
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "stat",
+ "version": "13.0.3",
+ "spec": {
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "fieldConfig": {
+ "defaults": {
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": 0,
+ "color": "green"
+ },
+ {
+ "value": 1,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "thresholds"
+ },
+ "noValue": "0"
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-11": {
+ "kind": "Panel",
+ "spec": {
+ "id": 11,
+ "title": "Service Active State",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "count by (state) (systemd_unit_state{instance=~\"$instance\",state=\"active\"}==1)",
+ "instant": false,
+ "legendFormat": "{{state}}",
+ "range": true
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "stat",
+ "version": "13.0.3",
+ "spec": {
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "fieldConfig": {
+ "defaults": {
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": 0,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "thresholds"
+ },
+ "noValue": "0"
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-12": {
+ "kind": "Panel",
+ "spec": {
+ "id": 12,
+ "title": "Service Inactive State",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "count by (state) (systemd_unit_state{instance=~\"$instance\",state=\"inactive\"}==1)",
+ "instant": false,
+ "legendFormat": "{{state}}",
+ "range": true
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "stat",
+ "version": "13.0.3",
+ "spec": {
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "fieldConfig": {
+ "defaults": {
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": 0,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "thresholds"
+ },
+ "noValue": "0"
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-13": {
+ "kind": "Panel",
+ "spec": {
+ "id": 13,
+ "title": "Service Dectivating State",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "count by (state) (systemd_unit_state{instance=~\"$instance\",state=\"deactivating\"}==1)",
+ "instant": false,
+ "legendFormat": "{{state}}",
+ "range": true
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "stat",
+ "version": "13.0.3",
+ "spec": {
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "fieldConfig": {
+ "defaults": {
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": 0,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "thresholds"
+ },
+ "noValue": "0"
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-14": {
+ "kind": "Panel",
+ "spec": {
+ "id": 14,
+ "title": "Service State",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "count by (state) (systemd_unit_state{instance=~\"$instance\"}==1)",
+ "instant": false,
+ "legendFormat": "{{state}}",
+ "range": true
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "13.0.3",
+ "spec": {
+ "options": {
+ "annotations": {
+ "clustering": -1,
+ "multiLane": false
+ },
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": 0,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "showValues": false,
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-15": {
+ "kind": "Panel",
+ "spec": {
+ "id": 15,
+ "title": "Service Active services",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "spec": {
+ "$$hashKey": "object:24",
+ "aggregation": "Last",
+ "decimals": 2,
+ "displayAliasType": "Warning / Critical",
+ "displayType": "Regular",
+ "displayValueWithAlias": "Never",
+ "editorMode": "code",
+ "expr": "sum by (name,state) (systemd_unit_state{instance=~\"$instance\",state=\"active\"}) == 1",
+ "instant": false,
+ "legendFormat": "{{name}}",
+ "range": true,
+ "units": "none",
+ "valueHandler": "Number Threshold"
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "13.0.3",
+ "spec": {
+ "options": {
+ "annotations": {
+ "clustering": -1,
+ "multiLane": false
+ },
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "max": 1,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": 0,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "showValues": false,
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-16": {
+ "kind": "Panel",
+ "spec": {
+ "id": 16,
+ "title": "Service Inctive services",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "spec": {
+ "$$hashKey": "object:24",
+ "aggregation": "Last",
+ "decimals": 2,
+ "displayAliasType": "Warning / Critical",
+ "displayType": "Regular",
+ "displayValueWithAlias": "Never",
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "sum by (name,state) (systemd_unit_state{instance=~\"$instance\",state=\"inactive\"}) == 1",
+ "instant": false,
+ "legendFormat": "{{name}} ",
+ "range": true,
+ "units": "none",
+ "valueHandler": "Number Threshold"
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "13.0.3",
+ "spec": {
+ "options": {
+ "annotations": {
+ "clustering": -1,
+ "multiLane": false
+ },
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "max": 1,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": 0,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "showValues": false,
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-17": {
+ "kind": "Panel",
+ "spec": {
+ "id": 17,
+ "title": "Service Activating services",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "spec": {
+ "$$hashKey": "object:24",
+ "aggregation": "Last",
+ "decimals": 2,
+ "displayAliasType": "Warning / Critical",
+ "displayType": "Regular",
+ "displayValueWithAlias": "Never",
+ "editorMode": "builder",
+ "expr": "sum by(name, state) (systemd_unit_state{instance=~\"$instance\", state=\"activating\"}) == 1",
+ "instant": false,
+ "legendFormat": "{{name}}",
+ "range": true,
+ "units": "none",
+ "valueHandler": "Number Threshold"
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "13.0.3",
+ "spec": {
+ "options": {
+ "annotations": {
+ "clustering": -1,
+ "multiLane": false
+ },
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "max": 1,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": 0,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "showValues": false,
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-18": {
+ "kind": "Panel",
+ "spec": {
+ "id": 18,
+ "title": "Service Failed services",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "spec": {
+ "$$hashKey": "object:24",
+ "aggregation": "Last",
+ "decimals": 2,
+ "displayAliasType": "Warning / Critical",
+ "displayType": "Regular",
+ "displayValueWithAlias": "Never",
+ "editorMode": "code",
+ "expr": "sum by (name,state) (systemd_unit_state{instance=~\"$instance\",state=\"failed\"}) == 1",
+ "instant": false,
+ "legendFormat": "{{name}}",
+ "range": true,
+ "units": "none",
+ "valueHandler": "Number Threshold"
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "13.0.3",
+ "spec": {
+ "options": {
+ "annotations": {
+ "clustering": -1,
+ "multiLane": false
+ },
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "max": 1,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": 0,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "showValues": false,
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-19": {
+ "kind": "Panel",
+ "spec": {
+ "id": 19,
+ "title": "Service Devativating services",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "spec": {
+ "$$hashKey": "object:24",
+ "aggregation": "Last",
+ "decimals": 2,
+ "displayAliasType": "Warning / Critical",
+ "displayType": "Regular",
+ "displayValueWithAlias": "Never",
+ "editorMode": "builder",
+ "expr": "sum by(name, state) (systemd_unit_state{instance=~\"$instance\", state=\"deactivating\"}) == 1",
+ "instant": false,
+ "legendFormat": "{{name}}",
+ "range": true,
+ "units": "none",
+ "valueHandler": "Number Threshold"
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "13.0.3",
+ "spec": {
+ "options": {
+ "annotations": {
+ "clustering": -1,
+ "multiLane": false
+ },
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "max": 1,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": 0,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "showValues": false,
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-2": {
+ "kind": "Panel",
+ "spec": {
+ "id": 2,
+ "title": "Service Egress Traffic",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "spec": {
+ "editorMode": "builder",
+ "expr": "sum by(name) (rate(systemd_service_ip_egress_bytes{instance=~\"$instance\"}[$__rate_interval]))",
+ "instant": false,
+ "legendFormat": "{{name}} egress",
+ "range": true
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "13.0.3",
+ "spec": {
+ "options": {
+ "annotations": {
+ "clustering": -1,
+ "multiLane": false
+ },
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": 0,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "showValues": false,
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-24": {
+ "kind": "Panel",
+ "spec": {
+ "id": 24,
+ "title": "Timer last run",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "time() - systemd_timer_last_trigger_seconds{instance=~\"$instance\"} < 50*365*60*60",
+ "instant": false,
+ "legendFormat": "{{name}}",
+ "range": true
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "13.0.3",
+ "spec": {
+ "options": {
+ "annotations": {
+ "clustering": -1,
+ "multiLane": false
+ },
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "s",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": 0,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "log": 2,
+ "type": "log"
+ },
+ "showPoints": "auto",
+ "showValues": false,
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-25": {
+ "kind": "Panel",
+ "spec": {
+ "id": 25,
+ "title": "Service uptime",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "time() - systemd_unit_start_time_seconds{instance=~\"$instance\"} < 50*365*60*60",
+ "instant": false,
+ "legendFormat": "{{name}}",
+ "range": true
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "13.0.3",
+ "spec": {
+ "options": {
+ "annotations": {
+ "clustering": -1,
+ "multiLane": false
+ },
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "s",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": 0,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "log": 2,
+ "type": "log"
+ },
+ "showPoints": "auto",
+ "showValues": false,
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-26": {
+ "kind": "Panel",
+ "spec": {
+ "id": 26,
+ "title": "Unit State Count",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "sum(systemd_unit_state{instance=~\"$instance\"}) by (state)",
+ "interval": "1m",
+ "intervalFactor": 2,
+ "legendFormat": "{{ state }}",
+ "metric": "node_systemd_unit_state",
+ "range": true,
+ "step": 120
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "13.0.3",
+ "spec": {
+ "options": {
+ "annotations": {
+ "clustering": -1,
+ "multiLane": false
+ },
+ "legend": {
+ "calcs": [
+ "mean",
+ "lastNotNull",
+ "max",
+ "min"
+ ],
+ "displayMode": "table",
+ "placement": "right",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "multi",
+ "sort": "asc"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "short",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": 0,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "points",
+ "fillOpacity": 10,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 8,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "always",
+ "showValues": false,
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-3": {
+ "kind": "Panel",
+ "spec": {
+ "id": 3,
+ "title": "Service Ingress Traffic",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "sum by (name) (rate(systemd_service_ip_ingress_bytes{instance=~\"$instance\"}[$__rate_interval]))",
+ "instant": false,
+ "legendFormat": "{{name}} ingress",
+ "range": true
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "13.0.3",
+ "spec": {
+ "options": {
+ "annotations": {
+ "clustering": -1,
+ "multiLane": false
+ },
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "bytes",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": 0,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "showValues": false,
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-4": {
+ "kind": "Panel",
+ "spec": {
+ "id": 4,
+ "title": "Service Packets Sent",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "sum by (name) (rate(systemd_service_ip_egress_packets_total{instance=~\"$instance\"}[$__rate_interval]))",
+ "instant": false,
+ "legendFormat": "{{name}} sent",
+ "range": true
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "13.0.3",
+ "spec": {
+ "options": {
+ "annotations": {
+ "clustering": -1,
+ "multiLane": false
+ },
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "none",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": 0,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "showValues": false,
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-5": {
+ "kind": "Panel",
+ "spec": {
+ "id": 5,
+ "title": "Service Packets Received",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "sum by (name) (rate(systemd_service_ip_ingress_packets_total{instance=~\"$instance\"}[$__rate_interval]))",
+ "instant": false,
+ "legendFormat": "{{name}} received",
+ "range": true
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "13.0.3",
+ "spec": {
+ "options": {
+ "annotations": {
+ "clustering": -1,
+ "multiLane": false
+ },
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "none",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": 0,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "showValues": false,
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-6": {
+ "kind": "Panel",
+ "spec": {
+ "id": 6,
+ "title": "Service Restart",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "spec": {
+ "editorMode": "builder",
+ "expr": "sum by(name) (increase(systemd_service_restart_total{instance=~\"$instance\"}[$__rate_interval])) >= 1",
+ "instant": false,
+ "legendFormat": "{{name}} sent",
+ "range": true
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "13.0.3",
+ "spec": {
+ "options": {
+ "annotations": {
+ "clustering": -1,
+ "multiLane": false
+ },
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "none",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": 0,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "showValues": false,
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-7": {
+ "kind": "Panel",
+ "spec": {
+ "id": 7,
+ "title": "Service Restart Count",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "spec": {
+ "editorMode": "builder",
+ "expr": "sum by(name) (systemd_service_restart_total{instance=~\"$instance\"})",
+ "instant": false,
+ "legendFormat": "{{name}} sent",
+ "range": true
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "timeseries",
+ "version": "13.0.3",
+ "spec": {
+ "options": {
+ "annotations": {
+ "clustering": -1,
+ "multiLane": false
+ },
+ "legend": {
+ "calcs": [],
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "tooltip": {
+ "hideZeros": false,
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "fieldConfig": {
+ "defaults": {
+ "unit": "none",
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": 0,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "barWidthFactor": 0.6,
+ "drawStyle": "line",
+ "fillOpacity": 0,
+ "gradientMode": "none",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "linear",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "type": "linear"
+ },
+ "showPoints": "auto",
+ "showValues": false,
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "off"
+ }
+ }
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ },
+ "panel-9": {
+ "kind": "Panel",
+ "spec": {
+ "id": 9,
+ "title": "Service Activating State",
+ "description": "",
+ "links": [],
+ "data": {
+ "kind": "QueryGroup",
+ "spec": {
+ "queries": [
+ {
+ "kind": "PanelQuery",
+ "spec": {
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "spec": {
+ "editorMode": "code",
+ "expr": "count by (state) (systemd_unit_state{instance=~\"$instance\",state=\"activating\"}==1)",
+ "instant": false,
+ "legendFormat": "{{state}}",
+ "range": true
+ }
+ },
+ "refId": "A",
+ "hidden": false
+ }
+ }
+ ],
+ "transformations": [],
+ "queryOptions": {}
+ }
+ },
+ "vizConfig": {
+ "kind": "VizConfig",
+ "group": "stat",
+ "version": "13.0.3",
+ "spec": {
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "fieldConfig": {
+ "defaults": {
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": 0,
+ "color": "green"
+ }
+ ]
+ },
+ "color": {
+ "mode": "thresholds"
+ },
+ "noValue": "0"
+ },
+ "overrides": []
+ }
+ }
+ }
+ }
+ }
+ },
+ "layout": {
+ "kind": "RowsLayout",
+ "spec": {
+ "rows": [
+ {
+ "kind": "RowsLayoutRow",
+ "spec": {
+ "title": "General",
+ "collapse": false,
+ "layout": {
+ "kind": "GridLayout",
+ "spec": {
+ "items": [
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 0,
+ "width": 3,
+ "height": 3,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-9"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 3,
+ "y": 0,
+ "width": 3,
+ "height": 3,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-11"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 6,
+ "y": 0,
+ "width": 3,
+ "height": 3,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-10"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 9,
+ "y": 0,
+ "width": 3,
+ "height": 3,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-12"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 0,
+ "width": 3,
+ "height": 3,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-13"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 3,
+ "width": 24,
+ "height": 11,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-26"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 14,
+ "width": 12,
+ "height": 8,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-6"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 14,
+ "width": 12,
+ "height": 8,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-7"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 22,
+ "width": 12,
+ "height": 8,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-24"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 22,
+ "width": 12,
+ "height": 8,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-25"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "kind": "RowsLayoutRow",
+ "spec": {
+ "title": "State",
+ "collapse": false,
+ "layout": {
+ "kind": "GridLayout",
+ "spec": {
+ "items": [
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 0,
+ "width": 12,
+ "height": 8,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-14"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 0,
+ "width": 12,
+ "height": 8,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-16"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 8,
+ "width": 12,
+ "height": 8,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-15"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 8,
+ "width": 12,
+ "height": 8,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-17"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 16,
+ "width": 12,
+ "height": 8,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-18"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 16,
+ "width": 12,
+ "height": 8,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-19"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "kind": "RowsLayoutRow",
+ "spec": {
+ "title": "Traffic",
+ "collapse": false,
+ "layout": {
+ "kind": "GridLayout",
+ "spec": {
+ "items": [
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 0,
+ "width": 12,
+ "height": 8,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-2"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 0,
+ "width": 12,
+ "height": 8,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-3"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 8,
+ "width": 12,
+ "height": 8,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-4"
+ }
+ }
+ },
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 12,
+ "y": 8,
+ "width": 12,
+ "height": 8,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-5"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ {
+ "kind": "RowsLayoutRow",
+ "spec": {
+ "title": "Extra",
+ "collapse": false,
+ "layout": {
+ "kind": "GridLayout",
+ "spec": {
+ "items": [
+ {
+ "kind": "GridLayoutItem",
+ "spec": {
+ "x": 0,
+ "y": 0,
+ "width": 17,
+ "height": 4,
+ "element": {
+ "kind": "ElementReference",
+ "name": "panel-1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ ]
+ }
+ },
+ "links": [],
+ "liveNow": false,
+ "preload": false,
+ "tags": [],
+ "timeSettings": {
+ "timezone": "browser",
+ "from": "now-3h",
+ "to": "now",
+ "autoRefresh": "",
+ "autoRefreshIntervals": [
+ "5s",
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ],
+ "hideTimepicker": false,
+ "fiscalYearStartMonth": 0
+ },
+ "title": "Systemd exporter",
+ "variables": [
+ {
+ "kind": "DatasourceVariable",
+ "spec": {
+ "name": "datasource",
+ "pluginId": "prometheus",
+ "refresh": "onDashboardLoad",
+ "regex": "",
+ "current": {
+ "text": "Prometheus",
+ "value": "Prometheus"
+ },
+ "options": [],
+ "multi": false,
+ "includeAll": false,
+ "hide": "dontHide",
+ "skipUrlSync": false,
+ "allowCustomValue": true
+ }
+ },
+ {
+ "kind": "QueryVariable",
+ "spec": {
+ "name": "instance",
+ "current": {
+ "text": "",
+ "value": ""
+ },
+ "hide": "dontHide",
+ "refresh": "onDashboardLoad",
+ "skipUrlSync": false,
+ "query": {
+ "kind": "DataQuery",
+ "group": "prometheus",
+ "version": "v0",
+ "datasource": {
+ "name": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "spec": {
+ "query": "label_values(systemd_exporter_build_info,instance)",
+ "refId": "PrometheusVariableQueryEditor-VariableQuery"
+ }
+ },
+ "regex": "",
+ "regexApplyTo": "value",
+ "sort": "disabled",
+ "definition": "label_values(systemd_exporter_build_info,instance)",
+ "options": [],
+ "multi": false,
+ "includeAll": false,
+ "allowCustomValue": true
+ }
+ }
+ ]
+ }
+} \ No newline at end of file
diff --git a/modules/vhack/mo/monitoring/module.nix b/modules/vhack/mo/monitoring/module.nix
new file mode 100644
index 0000000..e0fc5db
--- /dev/null
+++ b/modules/vhack/mo/monitoring/module.nix
@@ -0,0 +1,31 @@
+# Heavily inspired by:
+# https://github.com/ibizaman/selfhostblocks/blob/989865eb519e3fc3e8a803c374775451c47a29c8/modules/blocks/monitoring.nix
+{
+ lib,
+ config,
+ ...
+}: let
+ cfg = config.vhack.monitoring;
+in {
+ imports = [
+ ./components/loki.nix
+ # ./components/perses.nix
+ ./components/grafana.nix
+ ./components/scrutiny.nix
+ ./components/prometheus.nix
+ ];
+
+ options.vhack.monitoring = {
+ enable = lib.mkEnableOption "monitoring defaults";
+ };
+
+ config.vhack.monitoring = lib.mkIf cfg.enable {
+ grafana.enable = true;
+
+ loki.enable = true;
+
+ prometheus.enable = true;
+
+ scrutiny. enable = true;
+ };
+}
diff --git a/modules/vhack/mo/monitoring/rules.json b/modules/vhack/mo/monitoring/rules.json
new file mode 100644
index 0000000..8e050e6
--- /dev/null
+++ b/modules/vhack/mo/monitoring/rules.json
@@ -0,0 +1,386 @@
+[
+ {
+ "uid": "f5246fa3-163f-4eae-9e1d-5b0fe2af0509",
+ "title": "5XX Requests Error Budgets Under 99%",
+ "condition": "threshold",
+ "data": [
+ {
+ "refId": "A",
+ "queryType": "range",
+ "relativeTimeRange": {
+ "from": 21600,
+ "to": 0
+ },
+ "datasourceUid": "cd6cc53e-840c-484d-85f7-96fede324006",
+ "model": {
+ "datasource": {
+ "type": "loki",
+ "uid": "cd6cc53e-840c-484d-85f7-96fede324006"
+ },
+ "editorMode": "code",
+ "expr": "(sum by(server_name) (count_over_time({unit=\"nginx.service\"} | pattern \"<_> <_> <line>\" | line_format \"{{.line}}\" | json | __error__ != \"JSONParserErr\" | status =~ \"[1234]..\" | server_name =~ \".*\" [1h])) / sum by(server_name) (count_over_time({unit=\"nginx.service\"} | pattern \"<_> <_> <line>\" | line_format \"{{.line}}\" | json | __error__ != \"JSONParserErr\" | server_name =~ \".*\" [1h])))",
+ "intervalMs": 1000,
+ "legendFormat": "{{server_name}}",
+ "maxDataPoints": 43200,
+ "queryType": "range",
+ "refId": "A"
+ }
+ },
+ {
+ "refId": "last",
+ "relativeTimeRange": {
+ "from": 0,
+ "to": 0
+ },
+ "datasourceUid": "__expr__",
+ "model": {
+ "conditions": [
+ {
+ "evaluator": {
+ "params": [],
+ "type": "gt"
+ },
+ "operator": {
+ "type": "and"
+ },
+ "query": {
+ "params": [
+ "B"
+ ]
+ },
+ "reducer": {
+ "params": [],
+ "type": "last"
+ },
+ "type": "query"
+ }
+ ],
+ "datasource": {
+ "type": "__expr__",
+ "uid": "__expr__"
+ },
+ "expression": "A",
+ "intervalMs": 1000,
+ "maxDataPoints": 43200,
+ "reducer": "last",
+ "refId": "last",
+ "type": "reduce"
+ }
+ },
+ {
+ "refId": "threshold",
+ "relativeTimeRange": {
+ "from": 0,
+ "to": 0
+ },
+ "datasourceUid": "__expr__",
+ "model": {
+ "conditions": [
+ {
+ "evaluator": {
+ "params": [
+ 0.99
+ ],
+ "type": "lt"
+ },
+ "operator": {
+ "type": "and"
+ },
+ "query": {
+ "params": [
+ "C"
+ ]
+ },
+ "reducer": {
+ "params": [],
+ "type": "last"
+ },
+ "type": "query"
+ }
+ ],
+ "datasource": {
+ "type": "__expr__",
+ "uid": "__expr__"
+ },
+ "expression": "last",
+ "intervalMs": 1000,
+ "maxDataPoints": 43200,
+ "refId": "threshold",
+ "type": "threshold"
+ }
+ }
+ ],
+ "dasboardUid": "d66242cf-71e8-417c-8ef7-51b0741545df",
+ "panelId": 9,
+ "noDataState": "OK",
+ "execErrState": "Error",
+ "for": "20m",
+ "annotations": {
+ "__dashboardUid__": "d66242cf-71e8-417c-8ef7-51b0741545df",
+ "__panelId__": "9",
+ "description": "",
+ "runbook_url": "",
+ "summary": "The error budget for a service for the last 1 hour is under 99%"
+ },
+ "labels": {
+ "role": "sysadmin"
+ },
+ "isPaused": false
+ },
+ {
+ "uid": "ee817l3a88s1sd",
+ "title": "Certificate Did Not Renew",
+ "condition": "C",
+ "data": [
+ {
+ "refId": "A",
+ "relativeTimeRange": {
+ "from": 1800,
+ "to": 0
+ },
+ "datasourceUid": "df80f9f5-97d7-4112-91d8-72f523a02b09",
+ "model": {
+ "adhocFilters": [],
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "editorMode": "code",
+ "expr": "min by(subject) (ssl_certificate_expiry_seconds)",
+ "interval": "",
+ "intervalMs": 15000,
+ "legendFormat": "{{exported_hostname}}: {{subject}} {{path}}",
+ "maxDataPoints": 43200,
+ "range": true,
+ "refId": "A"
+ }
+ },
+ {
+ "refId": "B",
+ "relativeTimeRange": {
+ "from": 0,
+ "to": 0
+ },
+ "datasourceUid": "__expr__",
+ "model": {
+ "conditions": [
+ {
+ "evaluator": {
+ "params": [],
+ "type": "gt"
+ },
+ "operator": {
+ "type": "and"
+ },
+ "query": {
+ "params": [
+ "B"
+ ]
+ },
+ "reducer": {
+ "params": [],
+ "type": "last"
+ },
+ "type": "query"
+ }
+ ],
+ "datasource": {
+ "type": "__expr__",
+ "uid": "__expr__"
+ },
+ "expression": "A",
+ "intervalMs": 1000,
+ "maxDataPoints": 43200,
+ "reducer": "last",
+ "refId": "B",
+ "type": "reduce"
+ }
+ },
+ {
+ "refId": "C",
+ "relativeTimeRange": {
+ "from": 0,
+ "to": 0
+ },
+ "datasourceUid": "__expr__",
+ "model": {
+ "conditions": [
+ {
+ "evaluator": {
+ "params": [
+ 604800
+ ],
+ "type": "lt"
+ },
+ "operator": {
+ "type": "and"
+ },
+ "query": {
+ "params": [
+ "C"
+ ]
+ },
+ "reducer": {
+ "params": [],
+ "type": "last"
+ },
+ "type": "query"
+ }
+ ],
+ "datasource": {
+ "type": "__expr__",
+ "uid": "__expr__"
+ },
+ "expression": "B",
+ "intervalMs": 1000,
+ "maxDataPoints": 43200,
+ "refId": "C",
+ "type": "threshold"
+ }
+ }
+ ],
+ "dashboardUid": "ae818js0bvw8wb",
+ "panelId": 3,
+ "noDataState": "NoData",
+ "execErrState": "Error",
+ "for": "20m",
+ "annotations": {
+ "__dashboardUid__": "ae818js0bvw8wb",
+ "__panelId__": "3",
+ "description": "The expiry date of the certificate is 1 week from now.",
+ "summary": "Certificate did not renew on time."
+ },
+ "labels": {
+ "role": "sysadmin"
+ },
+ "isPaused": false
+ },
+ {
+ "uid": "df4doj5pomhvkf",
+ "title": "Late Backups",
+ "condition": "C",
+ "data": [
+ {
+ "refId": "A",
+ "relativeTimeRange": {
+ "from": 10800,
+ "to": 0
+ },
+ "datasourceUid": "df80f9f5-97d7-4112-91d8-72f523a02b09",
+ "model": {
+ "adhocFilters": [],
+ "datasource": {
+ "type": "prometheus",
+ "uid": "df80f9f5-97d7-4112-91d8-72f523a02b09"
+ },
+ "editorMode": "code",
+ "exemplar": false,
+ "expr": "(\n # Timer triggered at least once in the last 24h\n label_replace((\n time()\n -\n systemd_timer_last_trigger_seconds{name=~\".*backup.*.timer\"}\n ) < 24*60*60, \"name\", \"$1.service\", \"name\", \"(.*).timer\")\n AND on(name)\n # At least one failure in the last 24h\n (\n max_over_time(systemd_unit_state{name=~\".*backup.*.service\", state=\"failed\"}[24h]) > 0\n )\n AND on(name)\n # No successes in the last 24h\n (\n max_over_time(systemd_unit_state{name=~\".*backup.*.service\", state=\"inactive\"}[24h]) == 0\n )\n)",
+ "instant": false,
+ "interval": "",
+ "intervalMs": 15000,
+ "legendFormat": "{{name}}",
+ "maxDataPoints": 43200,
+ "range": true,
+ "refId": "A"
+ }
+ },
+ {
+ "refId": "B",
+ "relativeTimeRange": {
+ "from": 0,
+ "to": 0
+ },
+ "datasourceUid": "__expr__",
+ "model": {
+ "conditions": [
+ {
+ "evaluator": {
+ "params": [],
+ "type": "gt"
+ },
+ "operator": {
+ "type": "and"
+ },
+ "query": {
+ "params": [
+ "B"
+ ]
+ },
+ "reducer": {
+ "params": [],
+ "type": "last"
+ },
+ "type": "query"
+ }
+ ],
+ "datasource": {
+ "type": "__expr__",
+ "uid": "__expr__"
+ },
+ "expression": "A",
+ "intervalMs": 1000,
+ "maxDataPoints": 43200,
+ "reducer": "last",
+ "refId": "B",
+ "type": "reduce"
+ }
+ },
+ {
+ "refId": "C",
+ "relativeTimeRange": {
+ "from": 0,
+ "to": 0
+ },
+ "datasourceUid": "__expr__",
+ "model": {
+ "conditions": [
+ {
+ "evaluator": {
+ "params": [
+ 0
+ ],
+ "type": "gt"
+ },
+ "operator": {
+ "type": "and"
+ },
+ "query": {
+ "params": [
+ "C"
+ ]
+ },
+ "reducer": {
+ "params": [],
+ "type": "last"
+ },
+ "type": "query"
+ }
+ ],
+ "datasource": {
+ "type": "__expr__",
+ "uid": "__expr__"
+ },
+ "expression": "B",
+ "intervalMs": 1000,
+ "maxDataPoints": 43200,
+ "refId": "C",
+ "type": "threshold"
+ }
+ }
+ ],
+ "dashboardUid": "f05500d0-15ed-4719-b68d-fb898ca13cc8",
+ "panelId": 15,
+ "noDataState": "OK",
+ "execErrState": "Error",
+ "annotations": {
+ "__dashboardUid__": "f05500d0-15ed-4719-b68d-fb898ca13cc8",
+ "__panelId__": "15",
+ "summary": "A backup did not run in the last 24 hours."
+ },
+ "labels": {
+ "role": "sysadmin"
+ },
+ "isPaused": false
+ }
+]
diff --git a/modules/by-name/mu/murmur/module.nix b/modules/vhack/mu/murmur/module.nix
index 5cc6f7d..061e236 100644
--- a/modules/by-name/mu/murmur/module.nix
+++ b/modules/vhack/mu/murmur/module.nix
@@ -47,8 +47,11 @@ in {
The entire team of [name of the company] is thrilled to welcome you on board. We hope you’ll do some amazing work here!
'';
- sslKey = "${cfg.murmurStore}/key.pem";
- sslCert = "${cfg.murmurStore}/fullchain.pem";
+
+ tls = {
+ keyPath = "${cfg.murmurStore}/key.pem";
+ certPath = "${cfg.murmurStore}/fullchain.pem";
+ };
registerUrl = cfg.url;
registerName = cfg.name;
diff --git a/modules/by-name/ne/nextcloud/module.nix b/modules/vhack/ne/nextcloud/module.nix
index 3e1ef3e..ed51936 100644
--- a/modules/by-name/ne/nextcloud/module.nix
+++ b/modules/vhack/ne/nextcloud/module.nix
@@ -43,8 +43,17 @@ in {
services = {
nextcloud = {
enable = true;
+ inherit (cfg) package;
+
extraApps = {
- inherit (cfg.package.packages.apps) calendar contacts tasks;
+ inherit
+ (cfg.package.packages.apps)
+ calendar
+ contacts
+ tasks
+ mail
+ onlyoffice
+ ;
};
extraAppsEnable = true;
configureRedis = true;
@@ -59,7 +68,6 @@ in {
hostName = cfg.hostname;
https = true;
maxUploadSize = "5G";
- package = cfg.package;
settings = {
default_phone_region = "DE";
};
diff --git a/modules/by-name/ng/nginx/module.nix b/modules/vhack/ng/nginx/module.nix
index fa3337d..1317d4d 100644
--- a/modules/by-name/ng/nginx/module.nix
+++ b/modules/vhack/ng/nginx/module.nix
@@ -18,15 +18,6 @@ in {
a default nginx config.
'';
- selfsign = lib.mkOption {
- type = lib.types.bool;
- default = false;
- description = ''
- Whether to selfsign the acme certificates. This should only
- really be useful for tests.
- '';
- };
-
redirects = lib.mkOption {
type = lib.types.attrsOf lib.types.str;
default = {};
@@ -39,9 +30,27 @@ in {
};
config = lib.mkIf cfg.enable {
- vhack.persist.directories = [
- "/var/lib/acme"
- ];
+ vhack = {
+ persist.directories = [
+ "/var/lib/acme"
+ ];
+
+ monitoring.prometheus = {
+ sources = [
+ {
+ name = "nginx";
+ target = "127.0.0.1:${toString config.services.prometheus.exporters.nginx.port}";
+ }
+ ];
+ };
+ };
+
+ services.prometheus.exporters.nginx = {
+ enable = true;
+ port = 9111;
+ listenAddress = "127.0.0.1";
+ scrapeUri = "http://localhost:80/nginx_status";
+ };
users = {
users.acme = {
@@ -56,10 +65,6 @@ in {
defaults = {
email = "admin@vhack.eu";
webroot = "/var/lib/acme/acme-challenge";
-
- # Avoid spamming the acme server, if we run in a test, and only really want self-signed
- # certificates
- server = lib.mkIf cfg.selfsign "https://127.0.0.1";
};
};
@@ -68,6 +73,10 @@ in {
};
services.nginx = {
enable = true;
+
+ # Enable the status page for the prometheus exporter.
+ statusPage = lib.mkIf config.services.prometheus.enable true;
+
virtualHosts = redirects;
};
};
diff --git a/modules/by-name/ni/nix-sync/internal_module.nix b/modules/vhack/ni/nix-sync/internal_module.nix
index 4e28586..4e28586 100644
--- a/modules/by-name/ni/nix-sync/internal_module.nix
+++ b/modules/vhack/ni/nix-sync/internal_module.nix
diff --git a/modules/by-name/ni/nix-sync/module.nix b/modules/vhack/ni/nix-sync/module.nix
index 9ddd210..9ddd210 100644
--- a/modules/by-name/ni/nix-sync/module.nix
+++ b/modules/vhack/ni/nix-sync/module.nix
diff --git a/modules/by-name/ni/nixconfig/module.nix b/modules/vhack/ni/nixconfig/module.nix
index a5bf950..a5bf950 100644
--- a/modules/by-name/ni/nixconfig/module.nix
+++ b/modules/vhack/ni/nixconfig/module.nix
diff --git a/modules/by-name/ns/nscd/module.nix b/modules/vhack/ns/nscd/module.nix
index 428ae3b..428ae3b 100644
--- a/modules/by-name/ns/nscd/module.nix
+++ b/modules/vhack/ns/nscd/module.nix
diff --git a/modules/by-name/oo/oomd/module.nix b/modules/vhack/oo/oomd/module.nix
index 3b39236..3b39236 100644
--- a/modules/by-name/oo/oomd/module.nix
+++ b/modules/vhack/oo/oomd/module.nix
diff --git a/modules/by-name/op/openssh/module.nix b/modules/vhack/op/openssh/module.nix
index 83aeadf..83aeadf 100644
--- a/modules/by-name/op/openssh/module.nix
+++ b/modules/vhack/op/openssh/module.nix
diff --git a/modules/by-name/pe/peertube/module.nix b/modules/vhack/pe/peertube/module.nix
index e65e0b5..e65e0b5 100644
--- a/modules/by-name/pe/peertube/module.nix
+++ b/modules/vhack/pe/peertube/module.nix
diff --git a/modules/by-name/po/postgresql/module.nix b/modules/vhack/po/postgresql/module.nix
index 319c3ac..319c3ac 100644
--- a/modules/by-name/po/postgresql/module.nix
+++ b/modules/vhack/po/postgresql/module.nix
diff --git a/modules/by-name/re/redlib/module.nix b/modules/vhack/re/redlib/module.nix
index 4d3c600..4d3c600 100644
--- a/modules/by-name/re/redlib/module.nix
+++ b/modules/vhack/re/redlib/module.nix
diff --git a/modules/by-name/re/resolvconf/module.nix b/modules/vhack/re/resolvconf/module.nix
index ff99696..ff99696 100644
--- a/modules/by-name/re/resolvconf/module.nix
+++ b/modules/vhack/re/resolvconf/module.nix
diff --git a/modules/vhack/ro/rocie/module.nix b/modules/vhack/ro/rocie/module.nix
new file mode 100644
index 0000000..1e419b8
--- /dev/null
+++ b/modules/vhack/ro/rocie/module.nix
@@ -0,0 +1,59 @@
+{
+ config,
+ lib,
+ ...
+}: let
+ cfg = config.vhack.rocie;
+ data = "/var/lib/rocie";
+in {
+ options.vhack.rocie = {
+ enable = lib.mkEnableOption "Rocie integration into vhack.eu";
+
+ domain = lib.mkOption {
+ type = lib.types.str;
+ description = "The domain where to deploy rocie";
+ };
+
+ loginSecret = lib.mkOption {
+ type = lib.types.path;
+ description = "The age encrypted secret file for rocie, passed to agenix";
+ };
+ };
+
+ config = lib.mkIf cfg.enable {
+ rocie = {
+ enable = true;
+ inherit (cfg) domain;
+
+ dbPath = "${data}/database.db";
+
+ secretKeyFile = config.age.secrets.rocie_secret.path;
+ };
+
+ vhack.persist.directories = [
+ {
+ directory = data;
+ user = "rocie";
+ group = "rocie";
+ mode = "0700";
+ }
+ ];
+
+ users = {
+ groups.rocie = {
+ gid = config.vhack.constants.ids.gids.rocie;
+ };
+ users.rocie = {
+ group = "rocie";
+ uid = config.vhack.constants.ids.uids.rocie;
+ };
+ };
+
+ age.secrets.rocie_secret = {
+ file = cfg.loginSecret;
+ mode = "700";
+ owner = "rocie";
+ group = "rocie";
+ };
+ };
+}
diff --git a/modules/by-name/ru/rust-motd/module.nix b/modules/vhack/ru/rust-motd/module.nix
index bf23843..bf23843 100644
--- a/modules/by-name/ru/rust-motd/module.nix
+++ b/modules/vhack/ru/rust-motd/module.nix
diff --git a/modules/by-name/sh/sharkey/module.nix b/modules/vhack/sh/sharkey/module.nix
index 18bf394..186fed2 100644
--- a/modules/by-name/sh/sharkey/module.nix
+++ b/modules/vhack/sh/sharkey/module.nix
@@ -2,7 +2,6 @@
config,
lib,
pkgs,
- pkgsUnstable,
...
}: let
cfg = config.vhack.sharkey;
@@ -19,7 +18,7 @@ in {
package = lib.mkOption {
type = lib.types.package;
- default = pkgsUnstable.sharkey;
+ default = pkgs.sharkey;
defaultText = lib.literalExpression "vhackPackages.sharkey";
description = "Sharkey package to use.";
};
diff --git a/modules/by-name/st/stalwart-mail/module.nix b/modules/vhack/st/stalwart-mail/module.nix
index f7e44d8..f7e44d8 100644
--- a/modules/by-name/st/stalwart-mail/module.nix
+++ b/modules/vhack/st/stalwart-mail/module.nix
diff --git a/modules/by-name/st/stalwart-mail/settings.nix b/modules/vhack/st/stalwart-mail/settings.nix
index eb53783..dfaf63d 100644
--- a/modules/by-name/st/stalwart-mail/settings.nix
+++ b/modules/vhack/st/stalwart-mail/settings.nix
@@ -24,7 +24,7 @@
then "internal"
else "in-memory";
in {
- config.services.stalwart-mail.settings = lib.mkIf cfg.enable {
+ config.services.stalwart.settings = lib.mkIf cfg.enable {
# https://www.rfc-editor.org/rfc/rfc6376.html#section-3.3
signature = let
signatures =
diff --git a/modules/by-name/sy/system-info/module.nix b/modules/vhack/sy/system-info/module.nix
index 8136ae5..e25e88c 100644
--- a/modules/by-name/sy/system-info/module.nix
+++ b/modules/vhack/sy/system-info/module.nix
@@ -36,9 +36,11 @@
"10222" = checkEnabled "taskchampion-sync" "taskchampion-sync";
+ "64738" = checkEnabled "murmur" "murmur";
+
# TODO(@bpeetz): Check which service opens these ports: <2025-01-28>
- "64738" = "???";
"4190" = "???";
+ "8112" = "???";
};
in ''
${mode} ${builtins.toString port}: ${
diff --git a/modules/by-name/ta/taskchampion-sync/module.nix b/modules/vhack/ta/taskchampion-sync/module.nix
index a722883..a7cba30 100644
--- a/modules/by-name/ta/taskchampion-sync/module.nix
+++ b/modules/vhack/ta/taskchampion-sync/module.nix
@@ -18,7 +18,10 @@ in {
config = lib.mkIf cfg.enable {
users = {
- users.taskchampion.uid = config.vhack.constants.ids.uids.taskchampion;
+ users.taskchampion = {
+ uid = config.vhack.constants.ids.uids.taskchampion;
+ group = "taskchampion";
+ };
groups.taskchampion.gid = config.vhack.constants.ids.uids.taskchampion;
};
@@ -34,6 +37,16 @@ in {
nginx.enable = true;
};
+ systemd.services.taskchampion-sync-server = {
+ serviceConfig = {
+ # The upstream service uses DynamicUsers, which currently poses issues to our
+ # directory persisting strategy.
+ User = "taskchampion";
+ Group = "taskchampion";
+ DynamicUser = lib.mkForce false;
+ };
+ };
+
services = {
taskchampion-sync-server = {
enable = true;
diff --git a/modules/by-name/us/users/module.nix b/modules/vhack/us/users/module.nix
index 6011204..e029130 100644
--- a/modules/by-name/us/users/module.nix
+++ b/modules/vhack/us/users/module.nix
@@ -36,7 +36,7 @@
uid = 1000;
}
{
- name = "sils";
+ name = "jaki";
password = "$y$jFT$KpFnahVCE9JbE.5P3us8o.$ZzSxCusWqe3sL7b6DLgOXNNUf114tiiptM6T8lDxtKC";
sshKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILn7Oumr5IYtTTIKRFvDnofGXXiDLBQE9jVF+7UE+4G5 vhack.eu";
uid = 1001;
diff --git a/pkgs/by-name/at/atuin-server-only/package.nix b/pkgs/by-name/at/atuin-server-only/package.nix
deleted file mode 100644
index ddad2ec..0000000
--- a/pkgs/by-name/at/atuin-server-only/package.nix
+++ /dev/null
@@ -1,22 +0,0 @@
-{atuin}:
-atuin.overrideAttrs (final: prev: {
- pname = prev.pname + "-server-only";
- inherit (prev) patches;
-
- # atuin's default features include 'check-updates', which do not make sense
- # for distribution builds. List all other default features.
- buildNoDefaultFeatures = true;
- buildFeatures = [
- # All of this is client code
- # "client"
- # "sync"
- # "check-update"
- # "clipboard"
- # "daemon" # Background daemon for the client
-
- "server"
- ];
-
- # The checks don't compile without the `server` feature
- doCheck = true;
-})
diff --git a/pkgs/by-name/st/stalwart-mail-patched/spam-filter.nix b/pkgs/by-name/st/stalwart-mail-patched/spam-filter.nix
index be8d32f..8d600ab 100644
--- a/pkgs/by-name/st/stalwart-mail-patched/spam-filter.nix
+++ b/pkgs/by-name/st/stalwart-mail-patched/spam-filter.nix
@@ -4,13 +4,13 @@
}:
stdenv.mkDerivation (finalAttrs: {
pname = "spam-filter";
- version = "2.0.4";
+ version = "3.0.0";
src = fetchFromGitHub {
owner = "stalwartlabs";
repo = "spam-filter";
tag = "v${finalAttrs.version}";
- hash = "sha256-unSRgmXE5T1QfE41E29BjJKpEAnMtYiAefcL2p7Cjak=";
+ hash = "sha256-mADA62eOHV7cJf4khkLh/OX0eQHRUus6nlGkieGFsKA=";
};
buildPhase = ''
diff --git a/pkgs/by-name/st/stalwart-mail-patched/update.sh b/pkgs/by-name/st/stalwart-mail-patched/update.sh
deleted file mode 100755
index 33d6e2b..0000000
--- a/pkgs/by-name/st/stalwart-mail-patched/update.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env sh
-
-nix-update --file ../../../standalone_pkgs.nix stalwart-mail-patched.passthru.spamfilter --option pure-eval false
-
-# vim: ft=sh
diff --git a/pkgs/by-name/st/stalwart-mail-patched/update.sh.ignored b/pkgs/by-name/st/stalwart-mail-patched/update.sh.ignored
new file mode 100755
index 0000000..a70ddc6
--- /dev/null
+++ b/pkgs/by-name/st/stalwart-mail-patched/update.sh.ignored
@@ -0,0 +1,5 @@
+#!/usr/bin/env sh
+
+NIX_CONFIG="pure-eval = false" nix-update --file ../../../standalone_pkgs.nix stalwart-mail-patched.passthru.spamfilter --option pure-eval false
+
+# vim: ft=sh
diff --git a/scripts/build.sh b/scripts/build.sh
index a3ff064..f1ff620 100755
--- a/scripts/build.sh
+++ b/scripts/build.sh
@@ -1,5 +1,41 @@
#! /usr/bin/env sh
+set -eu
+
+wrong_arg=false
+use_dirty=true
+
+for arg in "$@"; do
+ case "$arg" in
+ --dirty)
+ use_dirty=true
+ ;;
+ --clean)
+ use_dirty=false
+ ;;
+ *)
+ echo "arg '$arg' is not known."
+ wrong_arg=true
+ ;;
+ esac
+done
+
+if [ "$wrong_arg" = true ]; then
+ exit 2
+fi
+
+if [ "$use_dirty" = "false" ]; then
+ tmp="$(mktemp -d -t "server_build_script_XXXXX")"
+ trap 'rm -r "$tmp"' EXIT
+
+ git archive --format=tar.gz HEAD | {
+ cd "$tmp"
+ tar -xz
+ }
+
+ cd "$tmp"
+fi
+
for host in "server2" "server3"; do
nix build ".#nixosConfigurations.$host.config.system.build.toplevel" --print-out-paths --no-link --option max-jobs 1
done
diff --git a/scripts/check.sh b/scripts/check.sh
index f152cbb..dbfa67d 100755
--- a/scripts/check.sh
+++ b/scripts/check.sh
@@ -1,20 +1,38 @@
#! /usr/bin/env sh
-# --log-format multiline-with-logs \
-nix build \
- --option max-jobs 1 \
- --print-out-paths --no-link \
- .#checks.x86_64-linux.atuin-sync \
- .#checks.x86_64-linux.back \
- .#checks.x86_64-linux.deploy-activate \
- .#checks.x86_64-linux.deploy-schema \
- .#checks.x86_64-linux.dns \
- .#checks.x86_64-linux.formatting \
- .#checks.x86_64-linux.git-server \
- .#checks.x86_64-linux.rust-motd \
- .#checks.x86_64-linux.sharkey \
- .#checks.x86_64-linux.sharkey-cpu \
- .#checks.x86_64-linux.taskchampion-sync
-# .#checks.x86_64-linux.email-dns \
-# .#checks.x86_64-linux.email-http \
-# .#checks.x86_64-linux.email-ip \
+git_root="$(git rev-parse --show-toplevel)"
+
+fmt_check() {
+ echo ".#checks.x86_64-linux.$1"
+}
+
+failed="$(mktemp -t server_check_XXXXX)"
+trap 'rm -f "$failed"' EXIT
+trap 'exit 4' HUP INT QUIT TERM
+
+# We want word-splitting for the arg
+# shellcheck disable=SC2046
+set -- $(nix eval --file "$git_root/scripts/check_get_tests.nix" --raw)
+
+while [ "$#" -ne 0 ]; do
+ test="$1"
+ shift 1
+
+ echo "Building test '$test'..."
+ fmt_test="$(fmt_check "$test")"
+
+ if ! nix build \
+ --option max-jobs 1 \
+ --print-out-paths \
+ --no-link \
+ "$fmt_test"; then
+ echo "$test" >>"$failed"
+ fi
+done
+
+if [ "$(cat "$failed" | wc -l)" -ne 0 ]; then
+ echo "Failed tests:"
+ while read -r test; do
+ echo " - $test"
+ done <"$failed"
+fi
diff --git a/scripts/check_get_tests.nix b/scripts/check_get_tests.nix
new file mode 100644
index 0000000..a39d300
--- /dev/null
+++ b/scripts/check_get_tests.nix
@@ -0,0 +1,16 @@
+let
+ get = input: (builtins.fetchTree input.locked).outPath;
+
+ lock = (builtins.fromJSON (builtins.readFile ../flake.lock)).nodes;
+
+ flake-compat = import (get lock.flake-compat) {src = ../.;};
+ pkgs = import (get lock.nixpkgs) {};
+ inherit (pkgs) lib;
+
+ inherit (flake-compat) outputs;
+in
+ lib.strings.concatStringsSep "\n"
+ (builtins.attrNames
+ (lib.filterAttrs
+ (name: test: test.meta.broken == false)
+ outputs.checks.x86_64-linux))
diff --git a/scripts/ping_hosts.sh b/scripts/ping_hosts.sh
new file mode 100755
index 0000000..fba2490
--- /dev/null
+++ b/scripts/ping_hosts.sh
@@ -0,0 +1,12 @@
+#! /usr/bin/env sh
+
+user="${1-$USER}"
+hosts="${2-server2 server3}"
+
+for host in $hosts; do
+ echo "Checking status of '$user@$host.vhack.eu' ..."
+
+ ssh "$user@$host.vhack.eu" "set -x; systemctl --failed"
+done
+
+# vim: ft=sh
diff --git a/scripts/update_hosts.remote b/scripts/update_hosts.remote
new file mode 100644
index 0000000..7385129
--- /dev/null
+++ b/scripts/update_hosts.remote
@@ -0,0 +1,48 @@
+#! /usr/bin/env sh
+
+# This is the remote side of `update_hosts.sh`, it will be copied to the remote host
+# and is responsible for performing the update.
+
+set -e
+
+PATH_add() {
+ nix_expr="$1"
+ what="$(nix build "nixpkgs#$nix_expr.out" --print-out-paths --no-link)"
+
+ printf "Adding '%s' (%s/bin) to PATH..\n" "$nix_expr" "$what"
+
+ PATH="$what/bin:$PATH"
+ export PATH
+}
+
+branch="$1"
+flake_path="${2-""}"
+
+# We don't have access to git by default, so evaluate it here
+PATH_add git
+
+# By-default these systems use cppnix, which can't build our config. So let's switch to
+# lix.
+PATH_add lixPackageSets.latest.lix
+
+# We might or might not have python, and we need it, because we use the unwrapped
+# `nixos-update`.
+PATH_add python3
+PATH_add nixos-rebuild
+
+if [ -z "$flake_path" ]; then
+ set -x
+ cd /etc/nixos
+
+ sudo git fetch --all --prune
+ sudo git switch "$branch"
+ sudo git pull --rebase
+
+ flake_path="git+file:/etc/nixos/"
+fi
+
+# we use the unwrapped one, to make sure that we are really using lix (otherwise it might
+# be wrapped with cppnix).
+PYTHONNOUSERSITE='true' sudo --preserve-env=PATH --preserve-env=PYTHONNOUSERSITE ".nixos-rebuild-wrapped" --flake "$flake_path" --no-reexec boot
+
+sudo reboot
diff --git a/scripts/update_hosts.sh b/scripts/update_hosts.sh
new file mode 100755
index 0000000..4f32722
--- /dev/null
+++ b/scripts/update_hosts.sh
@@ -0,0 +1,86 @@
+#! /usr/bin/env sh
+set -e
+
+base_dir="$(git rev-parse --show-toplevel)"
+
+user="$USER"
+set_hosts=""
+branch="main"
+direct=false
+
+while [ "$#" -ne 0 ]; do
+ case "$1" in
+ --user)
+ shift 1
+ user="$1"
+ ;;
+ --host)
+ shift 1
+ set_hosts="$set_hosts $1"
+ ;;
+ --hosts)
+ shift 1
+ if [ -n "$set_hosts" ]; then
+ echo "Warning: --hosts overrides --host"
+ fi
+ set_hosts="$1"
+ ;;
+ --branch)
+ shift 1
+ branch="$1"
+ ;;
+ --direct)
+ direct=true
+ ;;
+ *)
+ echo "Arg '$1' not known."
+ exit 2
+ ;;
+ esac
+ shift 1
+done
+
+hosts="${set_hosts-"server2 server3"}"
+
+echo "update_hosts.sh --user '$user' --hosts '$hosts' --branch '$branch' --direct '$direct'"
+
+for host in $hosts; do
+ echo "Updating '$user@$host.vhack.eu' ..."
+
+ printf "Deploying remote side script ..\n"
+ scp "$base_dir/scripts/update_hosts.remote" "$user@$host.vhack.eu:update_host.remote"
+
+ flake_path=""
+ if [ "$direct" = true ]; then
+ printf "Deploying git config ..\n"
+
+ flake_path="path:$(git archive --format=tar.gz HEAD |
+ ssh "$user@$host.vhack.eu" \
+ 'flake_path=$(mktemp -d -t update_hosts_XXXXX); cd $flake_path && tar -xz; echo $flake_path')"
+
+ fi
+
+ tmp="$(mktemp -d -t "server_build_script_XXXXX")"
+ trap 'rm -r "$tmp"' EXIT
+ if [ "$direct" = true ]; then
+ git archive --format=tar.gz HEAD | {
+ cd "$tmp"
+ tar -xz
+ }
+ else
+ git clone "git.foss-syndicate.org" --branch="$branch" "$tmp"
+ fi
+ cd "$tmp"
+
+ printf "Copying closure ..\n"
+ nix copy --substitute-on-destination --to "ssh://$user@$host.vhack.eu" ".#nixosConfigurations.$host.config.system.build.toplevel"
+
+ printf "Executing remote side script ..\n"
+ ssh -t "$user@$host.vhack.eu" "chmod +x update_host.remote; ./update_host.remote '$branch' '$flake_path'"
+done
+
+# Give the servers some time to reboot
+sleep 5
+ping_hosts.sh "$user" "$hosts"
+
+# vim: ft=sh
diff --git a/secrets.nix b/secrets.nix
index 8d3ae92..3af0afa 100644
--- a/secrets.nix
+++ b/secrets.nix
@@ -70,4 +70,5 @@ in
"./tests/by-name/em/email-dns/secrets/dkim/bob.com/private.age".publicKeys = [soispha sils testingKey];
"./tests/by-name/em/email-dns/secrets/dkim/mail1.server.com/private.age".publicKeys = [soispha sils testingKey];
"./tests/by-name/em/email-dns/secrets/dkim/mail2.server.com/private.age".publicKeys = [soispha sils testingKey];
+ "./tests/by-name/ro/rocie/secrets/login.age".publicKeys = [soispha sils testingKey];
}
diff --git a/tests/by-name/at/atuin-sync/test.nix b/tests/by-name/at/atuin-sync/test.nix
index d65c216..cf8f0d8 100644
--- a/tests/by-name/at/atuin-sync/test.nix
+++ b/tests/by-name/at/atuin-sync/test.nix
@@ -1,67 +1,27 @@
{
- nixos-lib,
- pkgsUnstable,
- nixpkgs-unstable,
- vhackPackages,
pkgs,
extraModules,
- nixLib,
+ turtle,
+ vhack,
...
}:
-nixos-lib.runTest {
- hostPkgs = pkgs;
+vhack.runTest {
name = "atuin-sync";
-
- node = {
- specialArgs = {inherit pkgsUnstable vhackPackages nixpkgs-unstable nixLib;};
-
- # Use the nixpkgs as constructed by the `nixpkgs.*` options
- pkgs = null;
- };
+ serverDomains = [
+ {
+ server = "atuin-sync.server";
+ }
+ ];
nodes = let
atuinSession = "01969ec6b8d07e30a9d2df0911fbfe2a";
+ atuin = turtle.packages."${pkgs.stdenv.hostPlatform.system}".default;
in {
- acme = {
- imports = [
- ../../../common/acme/server.nix
- ../../../common/dns/client.nix
- ];
- };
- name_server = {nodes, ...}: {
- imports =
- extraModules
- ++ [
- ../../../common/acme/client.nix
- ../../../common/dns/server.nix
- ];
-
- vhack.dns.zones = {
- "atuin-sync.server" = {
- SOA = {
- nameServer = "ns";
- adminEmail = "admin@server.com";
- serial = 2025012301;
- };
- useOrigin = false;
-
- A = [
- nodes.server.networking.primaryIPAddress
- ];
- AAAA = [
- nodes.server.networking.primaryIPv6Address
- ];
- };
- };
- };
-
server = {config, ...}: {
imports =
extraModules
++ [
../../../../modules
- ../../../common/acme/client.nix
- ../../../common/dns/client.nix
];
vhack = {
@@ -75,54 +35,41 @@ nixos-lib.runTest {
};
client1 = {config, ...}: {
- imports = [
- ../../../common/acme/client.nix
- ../../../common/dns/client.nix
- ];
-
environment.sessionVariables.ATUIN_SESSION = atuinSession;
environment.systemPackages = [
- pkgs.atuin
+ atuin
pkgs.sqlite-interactive
];
};
client2 = {config, ...}: {
- imports = [
- ../../../common/acme/client.nix
- ../../../common/dns/client.nix
- ];
-
environment.sessionVariables.ATUIN_SESSION = atuinSession;
environment.systemPackages = [
- pkgs.atuin
+ atuin
pkgs.sqlite-interactive
];
};
};
- testScript = {nodes, ...}: let
- syncLogin = pkgs.writeShellScript "login-atuin-sync-account" ''
- atuin login --username syncy --password password1234 --key "$1"
- '';
-
- syncRegister = pkgs.writeShellScript "register-atuin-sync-account" ''
- atuin register --username syncy --email syncy@email.com --password password1234
- '';
+ services = [
+ {server = "turtle.service";}
+ ];
+ testScript = {nodes, ...}: let
mkSyncConfig = pkgs.writeShellScript "register-atuin-sync-account" ''
- mkdir --parents ~/.config/atuin/
- cat << EOF > ~/.config/atuin/config.toml
- sync_address = "https://atuin-sync.server"
+ mkdir --parents ~/.config/turtle/
+
+ cat << EOF > ~/.config/turtle/config.toml
- # Use the v2 sync
[sync]
- records = true
+ address = "https://atuin-sync.server"
+ user_id_path = "${pkgs.writeText "user-id" "019eb88a-6b51-7e52-b12c-7d30bd8e5928"}"
+ encryption_key_path = "${pkgs.writeText "encryption-key" "3AAgbWsDzL7M00/Mq0LMjsyOCy3MnsypBsyQzKbMywNGzNnMrUBozIINAxdbIiDMhQ=="}"
EOF
'';
- runCommandAndRecordInAtuin = pkgs.writeShellScript "run-command-and-record-in-atuin" ''
+ runCommandAndRecordInTurtle = pkgs.writeShellScript "run-command-and-record-in-atuin" ''
# SPDX-SnippetBegin
# SPDX-SnippetCopyrightText: 2023 mentalisttraceur (https://github.com/mentalisttraceur)
# Source: https://github.com/atuinsh/atuin/issues/1188#issuecomment-1698354107
@@ -131,49 +78,47 @@ nixos-lib.runTest {
local id
local status
local escaped_command="$(printf '%q ' "$@")"
- id="$(atuin history start -- "$escaped_command")"
+ id="$(turtle history start -- "$escaped_command")"
"$@"
status=$?
- atuin history end --exit $status "$id"
+ turtle history end --exit $status "$id"
return $status
}
# SPDX-SnippetEnd
run_and_record_in_atuin "$@"
'';
-
- acme = import ../../../common/acme {inherit pkgs;};
in
- acme.prepare ["server" "client1" "client2"]
# Python
''
- server.wait_for_unit("atuin.service")
server.wait_for_open_port(443)
# Wait for the server to acquire the acme certificate
client1.wait_until_succeeds("curl https://atuin-sync.server")
with subtest("Setup client syncing"):
- # See https://docs.atuin.sh/guide/sync/
for client in [client1, client2]:
client.succeed("${mkSyncConfig}")
- client1.succeed("${syncRegister}")
- client2.succeed(f"${syncLogin} '{client1.succeed("atuin key")}'")
-
- with subtest("Can import shell history"):
- client1.succeed("${runCommandAndRecordInAtuin} echo hi - client 1")
- client2.succeed("${runCommandAndRecordInAtuin} echo hi - client 2")
+ with subtest("Start turtle daemon"):
+ for client in [client1, client2]:
+ client.succeed("systemd-run turtle-daemon start")
- with subtest("Can sync tasks"):
for client in [client1, client2]:
- client.succeed("atuin sync --force")
- client1.succeed("atuin sync --force")
+ client.wait_until_succeeds("turtle daemon status")
+ with subtest("Can generate shell history"):
+ client1.succeed("${runCommandAndRecordInTurtle} echo hi - client 1")
+ client2.succeed("${runCommandAndRecordInTurtle} echo hi - client 2")
+
+ with subtest("Can sync"):
+ for client in [client1, client2]:
+ client.succeed("turtle sync perform")
+ client1.succeed("turtle sync perform")
with subtest("Have correct tasks"):
- hist1 = client1.succeed("atuin history list --session --format '{command}'").strip().split('\n')
- hist2 = client2.succeed("atuin history list --session --format '{command}'").strip().split('\n')
+ hist1 = client1.succeed("turtle history list --cmd-only").strip().split('\n')
+ hist2 = client2.succeed("turtle history list --cmd-only").strip().split('\n')
hist1.sort()
hist2.sort()
@@ -185,5 +130,32 @@ nixos-lib.runTest {
assert hist1 == hist2, f"The clients don't have the same amount of history items, client1: '{hist1}', client2: '{hist2}'"
assert hist1 == canonicalHistory, f"The history is not correct: '{hist1}' vs. '{canonicalHistory}'"
+
+ with subtest("Can sync again"):
+ client1.succeed("${runCommandAndRecordInTurtle} echo second try - client 1")
+ client2.succeed("${runCommandAndRecordInTurtle} echo second try - client 2")
+
+ for client in [client1, client2]:
+ client.succeed("turtle sync perform")
+ client1.succeed("turtle sync perform")
+
+ hist1 = client1.succeed("turtle history list --cmd-only").strip().split('\n')
+ hist2 = client2.succeed("turtle history list --cmd-only").strip().split('\n')
+
+ hist1.sort()
+ hist2.sort()
+
+ canonicalHistory = [
+ # The old history
+ "echo hi - client 1",
+ "echo hi - client 2",
+
+ # Our newly added history entries
+ "echo second try - client 1",
+ "echo second try - client 2"
+ ]
+
+ assert hist1 == hist2, f"The clients don't have the same amount of history items, client1: '{hist1}', client2: '{hist2}'"
+ assert hist1 == canonicalHistory, f"The history is not correct, got: '{hist1}', expected: '{canonicalHistory}'"
'';
}
diff --git a/tests/by-name/ba/back/test.nix b/tests/by-name/ba/back/test.nix
index 41d6c8e..b1d908d 100644
--- a/tests/by-name/ba/back/test.nix
+++ b/tests/by-name/ba/back/test.nix
@@ -1,11 +1,7 @@
{
- nixos-lib,
- pkgsUnstable,
- nixpkgs-unstable,
- vhackPackages,
pkgs,
extraModules,
- nixLib,
+ vhack,
...
}: let
domain = "server";
@@ -22,17 +18,15 @@
option user-configs = cgit\.owner cgit\.desc cgit\.section cgit\.homepage
'';
in
- nixos-lib.runTest {
- hostPkgs = pkgs; # the Nixpkgs package set used outside the VMs
-
+ vhack.runTest {
name = "back";
- node = {
- specialArgs = {inherit pkgsUnstable vhackPackages nixpkgs-unstable nixLib;};
+ ignore = "We are not using back currently.";
- # Use the nixpkgs as constructed by the `nixpkgs.*` options
- pkgs = null;
- };
+ serverDomains = [
+ {server = "git.${domain}";}
+ {server = "issues.${domain}";}
+ ];
nodes = {
server = {config, ...}: {
@@ -49,7 +43,6 @@ in
openssh.enable = true;
nginx = {
enable = true;
- selfsign = true;
};
git-server = {
enable = true;
@@ -73,23 +66,17 @@ in
PreferredAuthentications publickey
'';
users.users.alice = {isNormalUser = true;};
- networking.hosts = {
- "${nodes.server.networking.primaryIPAddress}" = [
- "git.${domain}"
- "issues.${domain}"
- "${domain}"
- ];
- };
};
};
+ services = [
+ {server = "gitolite-init.service";}
+ {server = "sshd.service";}
+ ];
+
testScript = {nodes, ...}:
- /*
- python
- */
+ # Python
''
- start_all()
-
with subtest("can setup ssh keys on client"):
client.succeed(
"mkdir -p ~root/.ssh",
@@ -103,11 +90,8 @@ in
)
with subtest("gitolite server starts"):
- server.wait_for_unit("gitolite-init.service")
- server.wait_for_unit("sshd.service")
client.succeed("ssh -n git@git.${domain} info")
-
with subtest("admin can clone and configure gitolite-admin.git"):
server.succeed("sudo -u git ${pkgs.writeShellScript "delete_main_branch_on_server" ''
set -xe
@@ -188,10 +172,10 @@ in
client.succeed("${pkgs.writeShellScript "curl-back" ''
set -xe
- curl --insecure --fail --show-error "https://issues.${domain}/alice/repo1/issues/?query=status:open" --output /root/issues.html
+ curl --fail --show-error "https://issues.${domain}/alice/repo1/issues/?query=status:open" --output /root/issues.html
grep -- 'Second bug title' /root/issues.html
- curl --insecure --fail --show-error "https://issues.${domain}/" --output /root/repos.html
+ curl --fail --show-error "https://issues.${domain}/" --output /root/repos.html
grep -- 'repo' /root/repos.html
grep -- "&lt;No description&gt;" /root/repos.html
grep -- '<span class="user-name">Alice</span>' /root/repos.html
diff --git a/tests/by-name/em/email-dns/test.nix b/tests/by-name/em/email-dns/test.nix
index c7ba3b3..33955d8 100644
--- a/tests/by-name/em/email-dns/test.nix
+++ b/tests/by-name/em/email-dns/test.nix
@@ -14,6 +14,9 @@
inherit (user) mkUser;
in
nixos-lib.runTest {
+ # Wait until we actually use stalwart again
+ meta.broken = true;
+
hostPkgs = pkgs; # the Nixpkgs package set used outside the VMs
name = "email-dns";
diff --git a/tests/by-name/em/email-http/test.nix b/tests/by-name/em/email-http/test.nix
index 82b4c45..42fd22b 100644
--- a/tests/by-name/em/email-http/test.nix
+++ b/tests/by-name/em/email-http/test.nix
@@ -14,6 +14,9 @@
inherit (user) mkUser;
in
nixos-lib.runTest {
+ # Wait until we actually use stalwart again
+ meta.broken = true;
+
hostPkgs = pkgs; # the Nixpkgs package set used outside the VMs
name = "email-http";
diff --git a/tests/by-name/em/email-ip/test.nix b/tests/by-name/em/email-ip/test.nix
index dabc404..c0b2d7e 100644
--- a/tests/by-name/em/email-ip/test.nix
+++ b/tests/by-name/em/email-ip/test.nix
@@ -78,6 +78,9 @@
};
in
nixos-lib.runTest {
+ # Wait until we actually use stalwart again
+ meta.broken = true;
+
hostPkgs = pkgs; # the Nixpkgs package set used outside the VMs
name = "email";
diff --git a/tests/by-name/gi/git-server/test.nix b/tests/by-name/gi/git-server/test.nix
index 524efcb..b374eb2 100644
--- a/tests/by-name/gi/git-server/test.nix
+++ b/tests/by-name/gi/git-server/test.nix
@@ -1,10 +1,7 @@
{
- nixos-lib,
- pkgsUnstable,
- nixpkgs-unstable,
pkgs,
extraModules,
- nixLib,
+ vhack,
...
}: let
sshKeys =
@@ -35,24 +32,16 @@
option user-configs = cgit\.owner cgit\.desc cgit\.section cgit\.homepage
'';
- expectedHtmlReadme = pkgs.writeText "expectedHtmlReadme" ''
- <h1>Alice's Repo</h1>
- '';
expectedMdReadme = pkgs.writeText "expectedMdReadme" ''
# Alice's Repo
'';
in
- nixos-lib.runTest {
- hostPkgs = pkgs; # the Nixpkgs package set used outside the VMs
-
+ vhack.runTest {
name = "git-server";
- node = {
- specialArgs = {inherit pkgsUnstable nixpkgs-unstable nixLib;};
-
- # Use the nixpkgs as constructed by the `nixpkgs.*` options
- pkgs = null;
- };
+ serverDomains = [
+ {server = gitServerDomain;}
+ ];
nodes = {
server = {config, ...}: {
@@ -67,7 +56,6 @@ in
openssh.enable = true;
nginx = {
enable = true;
- selfsign = true;
};
git-server = {
enable = true;
@@ -77,7 +65,7 @@ in
};
};
- client = {...}: {
+ client = {
environment.systemPackages = [pkgs.git];
programs.ssh.extraConfig = ''
Host *
@@ -91,13 +79,14 @@ in
};
};
- testScript = {nodes, ...}:
- /*
- python
- */
- ''
- start_all()
+ services = [
+ {server = "gitolite-init.service";}
+ {server = "sshd.service";}
+ ];
+ testScript = {...}:
+ # Python
+ ''
with subtest("can setup ssh keys on client"):
client.succeed(
"mkdir -p ~root/.ssh",
@@ -116,8 +105,6 @@ in
)
with subtest("gitolite server starts"):
- server.wait_for_unit("gitolite-init.service")
- server.wait_for_unit("sshd.service")
client.succeed("ssh -n git@server info")
@@ -205,7 +192,7 @@ in
cd ~bob
# Disable ssl verification, as the certs are self-signed
- git -c http.sslVerify=false clone https://server/alice/alice-project.git
+ git -c http.sslVerify=false clone https://server/alice/alice-project
''}")
with subtest("Alice can change settings in her repo"):
@@ -224,15 +211,13 @@ in
}
''}")
+ with subtest("Bob can see alice's README"):
+ client.succeed("sudo -u bob ${pkgs.writeShellScript "bob-alice-readme" ''
+ set -xe
- # He can't see the readme (FIXME: find out why this does not work. <2024-08-13> )
- # with subtest("Bob can see alice's README"):
- # client.succeed("sudo -u bob ${pkgs.writeShellScript "bob-alice-readme" ''
- # set -xe
- #
- # curl --insecure --silent --fail --show-error 'https://server/alice/alice-project/about' > readme.html
- # cat readme.html
- # diff --side-by-side ${expectedHtmlReadme} readme.html
- # ''}")
+ curl --fail --show-error 'https://server/alice/alice-project/about/' > readme.html
+ grep 'alice-project - My nice project.' ./readme.html
+ grep 'My nice project.' ./readme.html
+ ''}")
'';
}
diff --git a/tests/by-name/mo/monitoring-basic/test.nix b/tests/by-name/mo/monitoring-basic/test.nix
new file mode 100644
index 0000000..a4d67a9
--- /dev/null
+++ b/tests/by-name/mo/monitoring-basic/test.nix
@@ -0,0 +1,67 @@
+{
+ extraModules,
+ vhack,
+ ...
+}: let
+ grafanaDomain = "grafana.server.org";
+in
+ vhack.runTest {
+ name = "monitoring";
+
+ serverDomains = [
+ {server = grafanaDomain;}
+ ];
+
+ nodes = {
+ client = {};
+
+ server = {config, ...}: {
+ imports =
+ extraModules
+ ++ [
+ ../../../../modules
+ ];
+
+ # there are no SMART available disk in the VM, so this service always fails.
+ systemd.services."smartd".enable = false;
+
+ age.identityPaths = ["${../../../common/email/hostKey}"];
+
+ vhack = {
+ monitoring = {
+ grafana = {
+ enable = true;
+ contactPoints = ["me@example.com"];
+ fqdn = grafanaDomain;
+
+ adminPassword = ../../../common/email/dkim/alice.com/private.age;
+ secretKey = ../../../common/email/dkim/bob.com/private.age;
+
+ # TODO: Add a test for that <2026-07-19>
+ smtp = null;
+ };
+
+ loki = {
+ enable = true;
+ };
+
+ prometheus = {
+ enable = true;
+ };
+ };
+ };
+ };
+ };
+
+ services = [
+ {server = "grafana.service";}
+ {server = "fluent-bit.service";}
+ {server = "loki.service";}
+ ];
+
+ testScript = {...}:
+ # Python
+ ''
+ # TODO: We should probably query some of the prometheus metrics here? <2026-07-19>
+ '';
+ }
diff --git a/tests/by-name/mo/monitoring-federation/test.nix b/tests/by-name/mo/monitoring-federation/test.nix
new file mode 100644
index 0000000..106bc20
--- /dev/null
+++ b/tests/by-name/mo/monitoring-federation/test.nix
@@ -0,0 +1,109 @@
+{
+ extraModules,
+ pkgs,
+ vhack,
+ ...
+}: let
+ prometheusMain = "prometheus.server2.server.org";
+ remoteWriteTo = {
+ url = "https://${prometheusMain}";
+ };
+ promPort = 3001;
+in
+ vhack.runTest {
+ name = "monitoring";
+
+ serverDomains = [
+ {server2 = prometheusMain;}
+ ];
+
+ nodes = {
+ server2 = {config, ...}: {
+ imports =
+ extraModules
+ ++ [
+ ../../../../modules
+ ];
+
+ environment.systemPackages = [
+ pkgs.curl
+ ];
+
+ vhack = {
+ monitoring = {
+ prometheus = {
+ enable = true;
+ port = promPort;
+ remoteWriteReceiver = prometheusMain;
+ };
+ };
+ };
+ };
+ server3 = {config, ...}: {
+ imports =
+ extraModules
+ ++ [
+ ../../../../modules
+ ];
+
+ vhack = {
+ monitoring = {
+ prometheus = {
+ enable = true;
+ port = promPort;
+ inherit remoteWriteTo;
+ };
+ };
+ };
+ };
+ server4 = {config, ...}: {
+ imports =
+ extraModules
+ ++ [
+ ../../../../modules
+ ];
+
+ vhack = {
+ monitoring = {
+ prometheus = {
+ enable = true;
+ port = promPort;
+ inherit remoteWriteTo;
+ };
+ };
+ };
+ };
+ };
+
+ services = [
+ {server2 = "prometheus.service";}
+ {server3 = "prometheus.service";}
+ {server4 = "prometheus.service";}
+ ];
+
+ testScript = {...}:
+ # Python
+ ''
+ import json, time
+
+ # Give the Prometheus servers some time to generate metrics and sync with the main
+ # one.
+ time.sleep(15)
+
+ metrics = server2.succeed("${pkgs.writeShellScript "query-metrics" ''
+ curl --silent \
+ http://127.0.0.1:${toString promPort}/api/v1/query?query="go_gc_cleanups_queued_cleanups_total"
+ ''}")
+
+ metrics = json.loads(metrics)
+
+ hosts = []
+ for result in metrics["data"]["result"]:
+ server2.log(json.dumps(result,indent=4))
+ hosts.append(result["metric"]["hostname"])
+
+ hosts.sort()
+
+ assert hosts == ["server2", "server3", "server4"], f"Not all hosts used the remote write (got {hosts})"
+ '';
+ }
diff --git a/tests/by-name/ro/rocie/secrets/login.age b/tests/by-name/ro/rocie/secrets/login.age
new file mode 100644
index 0000000..33d63be
--- /dev/null
+++ b/tests/by-name/ro/rocie/secrets/login.age
@@ -0,0 +1,16 @@
+-----BEGIN AGE ENCRYPTED FILE-----
+YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAzMWE5dTBiU0hDUC9jUi93
+Y1phYllHRk9YSHBzUGQ2YmF5ZC9ydXNGV0JrClRpTjZZUHZ5MEFFa0VrYVVhTkE2
+eCtSaEU1YVlhNjFNYlRRYzNCdjhYRWMKLT4gWDI1NTE5IDUrZWdDUmpQcFBOcE0x
+UE5QRDR5NXVXUHdQOVk3UGV1S3lCc0pUQmZIZ00KUldVSVF3TzB0cHFVaDZuNlZR
+b2FoT0lVSTZydHFTNHhnQ3U0NGdSR1k1MAotPiBzc2gtZWQyNTUxOSBSc2dXcFEg
+dldGZU15UXgrRTMxRkp2MEVKUllWQ3VFdnJDMnM4OS8wc202WW9lNW5BYwpPWjV0
+cmNuaDlPZndtUVVScm5TaGlvVUhHa0JiN1MvbDhCTTUxYzNhM3RRCi0+IDxXeEhv
+cC1ncmVhc2UKM3N5OHRLNTJEY1NIeGlWYm9yR096Y1NpSlVOM1lYQk9jOHkxU3N2
+K2c3QitDYnR6QTJOOWczV0xBa2dEUE1PTQpYU2Z1elZwRzU0Tm1RVDE2VWVqekUw
+bFROLzU0c2NNTXYwL2N5QkxTaGtXUWxKVVF6SE0KLS0tIGlYMHIvUkJpZUR0SHo4
+cldLSTdnbU90SGJTcGZGaHkyOTZON0hka3BLdlEKeP4nHmKWvJfqgEXuiLBMzldi
+n1qIsnlF3IU1EA0abJg/RK1BFwWlx4wBlLmViw6UTL+VEw8lv23PuZl2t7UtXVzQ
+smXDapW8nInNmTaElBPdwJ072/dD0Ly+KF95Qr0FDDv+jlKG/D/Mw+xD4jvuJHSo
+2HQnPF6MLTjCxpyPPggleWgKrBQggHBjm/pHtOKmPC5qfp+LAjmQoJXny/0X6cA=
+-----END AGE ENCRYPTED FILE-----
diff --git a/tests/by-name/ro/rocie/test.nix b/tests/by-name/ro/rocie/test.nix
new file mode 100644
index 0000000..1f0fccb
--- /dev/null
+++ b/tests/by-name/ro/rocie/test.nix
@@ -0,0 +1,47 @@
+{
+ extraModules,
+ vhack,
+ ...
+}:
+vhack.runTest {
+ name = "rocie";
+
+ serverDomains = [
+ {server = "rocie.server";}
+ ];
+
+ nodes = {
+ server = {config, ...}: {
+ imports =
+ extraModules
+ ++ [
+ ../../../../modules
+ ];
+
+ age.identityPaths = ["${../../../common/email/hostKey}"];
+
+ vhack = {
+ persist.enable = true;
+ nginx.enable = true;
+ rocie = {
+ enable = true;
+ domain = "rocie.server";
+ loginSecret = ./secrets/login.age;
+ };
+ };
+ };
+
+ client = {_, ...}: {};
+ };
+
+ services = [
+ {server = "rocie.service";}
+ ];
+
+ testScript = {...}:
+ # Python
+ ''
+ client.wait_until_succeeds("curl --verbose https://rocie.server/api/can-be-provisioned > out.file")
+ client.copy_from_vm("out.file")
+ '';
+}
diff --git a/tests/by-name/ru/rust-motd/test.nix b/tests/by-name/ru/rust-motd/test.nix
index 6623c0c..43a905d 100644
--- a/tests/by-name/ru/rust-motd/test.nix
+++ b/tests/by-name/ru/rust-motd/test.nix
@@ -1,25 +1,11 @@
{
- nixos-lib,
- pkgsUnstable,
- nixpkgs-unstable,
- vhackPackages,
- pkgs,
extraModules,
- nixLib,
+ vhack,
...
}:
-nixos-lib.runTest {
- hostPkgs = pkgs;
-
+vhack.runTest {
name = "rust-motd";
- node = {
- specialArgs = {inherit pkgsUnstable extraModules vhackPackages nixpkgs-unstable nixLib;};
-
- # Use the nixpkgs as constructed by the `nixpkgs.*` options
- pkgs = null;
- };
-
nodes = {
server = {config, ...}: {
imports =
@@ -34,29 +20,18 @@ nixos-lib.runTest {
};
};
+ services = [
+ {
+ server = "rust-motd.service";
+ start = true;
+ }
+ ];
+
testScript = {nodes, ...}:
- /*
- python
- */
+ # Python
''
- from time import sleep
-
- start_all()
-
- # Give the service time to run.
- sleep(3)
-
- with subtest("All services running"):
- import json
- def all_services_running(host):
- (status, output) = host.systemctl("list-units --state=failed --plain --no-pager --output=json")
- host_failed = json.loads(output)
- assert len(host_failed) == 0, f"Expected zero failing services, but found: {json.dumps(host_failed, indent=4)}"
- all_services_running(server)
-
with subtest("Motd generated"):
- sleep(1)
- server.succeed("cat /var/lib/rust-motd/motd | tee /dev/stderr | grep --invert-match Error")
+ server.succeed("cat /var/lib/rust-motd/motd | tee /dev/stderr | grep --invert-match --ignore-case Error")
server.copy_from_vm("/var/lib/rust-motd/motd")
'';
diff --git a/tests/by-name/sh/sharkey-cpu/test.nix b/tests/by-name/sh/sharkey-cpu/test.nix
index 6082806..d648429 100644
--- a/tests/by-name/sh/sharkey-cpu/test.nix
+++ b/tests/by-name/sh/sharkey-cpu/test.nix
@@ -1,25 +1,12 @@
{
- nixos-lib,
- pkgsUnstable,
- nixpkgs-unstable,
- vhackPackages,
pkgs,
extraModules,
- nixLib,
+ vhack,
...
}:
-nixos-lib.runTest {
- hostPkgs = pkgs; # the Nixpkgs package set used outside the VMs
-
+vhack.runTest {
name = "sharkey-cpu";
- node = {
- specialArgs = {inherit pkgsUnstable extraModules vhackPackages nixpkgs-unstable nixLib;};
-
- # Use the nixpkgs as constructed by the `nixpkgs.*` options
- pkgs = null;
- };
-
nodes = {
server = {config, ...}: {
imports =
@@ -42,15 +29,25 @@ nixos-lib.runTest {
# Test that sharkey's hardening still allows access to the CPUs.
sharkey.serviceConfig.ExecStart = let
- nodejs = pkgs.lib.getExe pkgsUnstable.nodejs;
+ nodejs = pkgs.lib.getExe pkgs.nodejs;
script = pkgs.writeTextFile {
name = "script.js";
- text = ''
- import * as os from 'node:os';
+ text =
+ # js
+ ''
+ import * as os from 'node:os';
+
+ var cpus = os.cpus()
- console.log(os.cpus()[0].model)
- console.log(os.cpus().length)
- '';
+ if (cpus.length != 0) {
+ console.log(cpus[0].model)
+ } else {
+ // Fail?
+ }
+
+ while (true) {
+ }
+ '';
};
in
pkgs.lib.mkForce "${nodejs} ${script}";
@@ -58,24 +55,16 @@ nixos-lib.runTest {
};
};
- testScript = {nodes, ...}:
- /*
- python
- */
+ services = [
+ {server = "sharkey.service";}
+ ];
+
+ testScript = {...}:
+ # Python
''
from time import sleep
- start_all()
-
# Give the service time to run.
sleep(3)
-
- with subtest("All services running"):
- import json
- def all_services_running(host):
- (status, output) = host.systemctl("list-units --state=failed --plain --no-pager --output=json")
- host_failed = json.loads(output)
- assert len(host_failed) == 0, f"Expected zero failing services, but found: {json.dumps(host_failed, indent=4)}"
- all_services_running(server)
'';
}
diff --git a/tests/by-name/sh/sharkey/test.nix b/tests/by-name/sh/sharkey/test.nix
index 0d79cd2..7b6f537 100644
--- a/tests/by-name/sh/sharkey/test.nix
+++ b/tests/by-name/sh/sharkey/test.nix
@@ -1,66 +1,21 @@
{
- nixos-lib,
- pkgsUnstable,
- nixpkgs-unstable,
- vhackPackages,
- pkgs,
extraModules,
- nixLib,
+ vhack,
...
}:
-nixos-lib.runTest {
- hostPkgs = pkgs; # the Nixpkgs package set used outside the VMs
-
+vhack.runTest {
name = "sharkey";
- node = {
- specialArgs = {inherit pkgsUnstable extraModules vhackPackages nixpkgs-unstable nixLib;};
-
- # Use the nixpkgs as constructed by the `nixpkgs.*` options
- pkgs = null;
- };
+ serverDomains = [
+ {server = "sharkey.server";}
+ ];
nodes = {
- acme = {...}: {
- imports = [
- ../../../common/acme/server.nix
- ../../../common/dns/client.nix
- ];
- };
- name_server = {nodes, ...}: {
- imports =
- extraModules
- ++ [
- ../../../common/acme/client.nix
- ../../../common/dns/server.nix
- ];
-
- vhack.dns.zones = {
- "sharkey.server" = {
- SOA = {
- nameServer = "ns";
- adminEmail = "admin@server.com";
- serial = 2025012301;
- };
- useOrigin = false;
-
- A = [
- nodes.server.networking.primaryIPAddress
- ];
- AAAA = [
- nodes.server.networking.primaryIPv6Address
- ];
- };
- };
- };
-
server = {config, ...}: {
imports =
extraModules
++ [
../../../../modules
- ../../../common/acme/client.nix
- ../../../common/dns/client.nix
];
vhack = {
@@ -73,30 +28,16 @@ nixos-lib.runTest {
};
};
- client = {...}: {
- imports = [
- ../../../common/acme/client.nix
- ../../../common/dns/client.nix
- ];
- };
+ client = {...}: {};
};
- testScript = {nodes, ...}: let
- acme = import ../../../common/acme {inherit pkgs;};
- in
- acme.prepare ["server" "client"]
- # Python
- ''
- server.wait_for_unit("sharkey.service")
-
- with subtest("All services running"):
- import json
- def all_services_running(host):
- (status, output) = host.systemctl("list-units --state=failed --plain --no-pager --output=json")
- host_failed = json.loads(output)
- assert len(host_failed) == 0, f"Expected zero failing services, but found: {json.dumps(host_failed, indent=4)}"
- all_services_running(server)
+ services = [
+ {server = "sharkey.service";}
+ ];
- client.wait_until_succeeds("curl --silent https://sharkey.server | grep 'Thank you for using Sharkey!'")
- '';
+ testScript = {...}:
+ # Python
+ ''
+ client.wait_until_succeeds("curl --verbose https://sharkey.server | grep 'Thank you for using Sharkey!'")
+ '';
}
diff --git a/tests/by-name/ta/taskchampion-sync/test.nix b/tests/by-name/ta/taskchampion-sync/test.nix
index cdbe062..3878167 100644
--- a/tests/by-name/ta/taskchampion-sync/test.nix
+++ b/tests/by-name/ta/taskchampion-sync/test.nix
@@ -6,65 +6,26 @@
pkgs,
extraModules,
nixLib,
+ vhack,
...
}:
-nixos-lib.runTest {
- hostPkgs = pkgs;
+vhack.runTest {
name = "taskchampion-sync";
- node = {
- specialArgs = {inherit pkgsUnstable vhackPackages nixpkgs-unstable nixLib;};
-
- # Use the nixpkgs as constructed by the `nixpkgs.*` options
- pkgs = null;
- };
+ serverDomains = [
+ {server = "taskchampion.server";}
+ ];
nodes = let
- # The feature flag is only in version 3.2 and upwards. Stable is still on 3.1
- taskwarriorPackage = pkgsUnstable.taskwarrior3.overrideAttrs (final: prev: {
+ taskwarriorPackage = pkgs.taskwarrior3.overrideAttrs (final: prev: {
cmakeFlags = (prev.cmakeFlags or []) ++ ["-DENABLE_TLS_NATIVE_ROOTS=true"];
});
in {
- acme = {
- imports = [
- ../../../common/acme/server.nix
- ../../../common/dns/client.nix
- ];
- };
- name_server = {nodes, ...}: {
- imports =
- extraModules
- ++ [
- ../../../common/acme/client.nix
- ../../../common/dns/server.nix
- ];
-
- vhack.dns.zones = {
- "taskchampion.server" = {
- SOA = {
- nameServer = "ns";
- adminEmail = "admin@server.com";
- serial = 2025012301;
- };
- useOrigin = false;
-
- A = [
- nodes.server.networking.primaryIPAddress
- ];
- AAAA = [
- nodes.server.networking.primaryIPv6Address
- ];
- };
- };
- };
-
server = {config, ...}: {
imports =
extraModules
++ [
../../../../modules
- ../../../common/acme/client.nix
- ../../../common/dns/client.nix
];
vhack = {
@@ -78,27 +39,21 @@ nixos-lib.runTest {
};
task_client1 = {config, ...}: {
- imports = [
- ../../../common/acme/client.nix
- ../../../common/dns/client.nix
- ];
-
environment.systemPackages = [
taskwarriorPackage
];
};
task_client2 = {config, ...}: {
- imports = [
- ../../../common/acme/client.nix
- ../../../common/dns/client.nix
- ];
-
environment.systemPackages = [
taskwarriorPackage
];
};
};
+ services = [
+ {server = "taskchampion-sync-server.service";}
+ ];
+
testScript = {nodes, ...}: let
# Generated with uuidgen
uuid = "bf01376e-04a4-435a-9263-608567531af3";
@@ -113,13 +68,9 @@ nixos-lib.runTest {
echo 'sync.server.client_id=${uuid}' >> "${path}"
echo 'sync.encryption_secret=${password}' >> "${path}"
'';
-
- acme = import ../../../common/acme {inherit pkgs;};
in
- acme.prepare ["server" "task_client1" "task_client2"]
# Python
''
- server.wait_for_unit("taskchampion-sync-server.service")
server.wait_for_open_port(443)
with subtest("Setup task syncing"):
diff --git a/tests/common/acme/default.nix b/tests/common/acme/default.nix
index c756a4f..e7869c2 100644
--- a/tests/common/acme/default.nix
+++ b/tests/common/acme/default.nix
@@ -29,14 +29,11 @@ in {
( # python
''
# Start dependencies for the other services
- acme.start()
+ start_all()
+
acme.wait_for_unit("pebble.service")
- name_server.start()
name_server.wait_for_unit("nsd.service")
- # Start actual test
- start_all()
-
with subtest("Add pebble ca key to all services"):
for node in [name_server, ${builtins.concatStringsSep "," clients}]:
node.wait_until_succeeds("curl https://acme.test:15000/roots/0")
diff --git a/tests/default.nix b/tests/default.nix
index d9b354a..9bab516 100644
--- a/tests/default.nix
+++ b/tests/default.nix
@@ -3,11 +3,267 @@
nixLib,
pkgs,
}: let
+ splitAttr = attr: let
+ name = builtins.elemAt (builtins.attrNames attr) 0;
+ in {
+ inherit name;
+ value = attr.${name};
+ };
+
+ vhack.runTest = {
+ name,
+ nodes ? {},
+ serverDomains ? [],
+ testScript ? {_, ...}: "",
+ services ? [],
+ ignore ? null,
+ }: let
+ # Apparently the default's (e.g. `serivces ? []`), are not applied for the `@args`
+ # syntax.
+ args = {
+ inherit name nodes serverDomains testScript services ignore;
+ };
+ in
+ specialArgs.nixos-lib.runTest {
+ hostPkgs = pkgs;
+ inherit (args) name;
+
+ meta.broken = pkgs.lib.mkIf (args.ignore != null) true;
+
+ node = {
+ specialArgs = {
+ inherit
+ (specialArgs)
+ pkgsUnstable
+ vhackPackages
+ nixpkgs-unstable
+ ;
+ inherit nixLib;
+ };
+
+ # Use the nixpkgs as constructed by the `nixpkgs.*` options
+ pkgs = null;
+ };
+
+ nodes = pkgs.lib.mkMerge [
+ {
+ acme = {
+ imports = [
+ ./common/acme/server.nix
+ ./common/dns/client.nix
+ ];
+ };
+ name_server = {nodes, ...}: {
+ imports =
+ specialArgs.extraModules
+ ++ [
+ ./common/acme/client.nix
+ ./common/dns/server.nix
+ ];
+
+ vhack.dns.zones = let
+ mkDomain = attr: let
+ split = splitAttr attr;
+ in {
+ name = "${split.value}";
+ value = {
+ SOA = {
+ nameServer = "ns";
+ adminEmail = "admin@server.com";
+ serial = 2025012301;
+ };
+ useOrigin = false;
+
+ A = [
+ nodes.${split.name}.networking.primaryIPAddress
+ ];
+ AAAA = [
+ nodes.${split.name}.networking.primaryIPv6Address
+ ];
+ };
+ };
+ in
+ builtins.listToAttrs (builtins.map mkDomain args.serverDomains);
+ };
+ }
+ args.nodes
+ (builtins.mapAttrs (_: _: {
+ imports = [
+ ./common/acme/client.nix
+ ./common/dns/client.nix
+ ];
+ })
+ args.nodes)
+ ];
+
+ testScript = {nodes, ...} @ testScriptInput: let
+ acme = import ./common/acme {inherit pkgs;};
+
+ waitFor = builtins.concatStringsSep "\n" (
+ builtins.map (attr: let
+ split = splitAttr attr;
+ in " maybe_wait(${split.name},\"${split.value}\", ${
+ if (builtins.hasAttr "start" attr && attr.start)
+ then "True"
+ else "False"
+ })")
+ args.services
+ );
+
+ acmeOnline = builtins.concatStringsSep "\n" (builtins.map (attr: let
+ split = splitAttr attr;
+ in " status.append(acme_online(${split.name}, \"${split.value}\", renewRan.get(\"acme-order-renew-${split.value}.service\", False)))")
+ args.serverDomains);
+
+ allRunning =
+ builtins.concatStringsSep "\n" (builtins.map (name: " all_services_running(${name})")
+ (builtins.attrNames args.nodes));
+
+ optional = condition: value:
+ if condition
+ then value
+ else "";
+ in
+ acme.prepare (builtins.attrNames args.nodes)
+ # The acme code runs `start_all` before it hands execution back to us.
+ # So we don't need to run it.
+ (
+ optional (args.services != [] || args.serverDomains != [])
+ # Python
+ ''
+ def unit_exists(host, unitName: str) -> bool:
+ (status, _) = host.execute(f"test -f '/etc/systemd/system/{unitName}'")
+ return status == 0
+
+ wasAlive: bool
+ deadCounter: int
+ def run_and_wait(host, unit: str):
+ global wasAlive
+ global deadCounter
+
+ wasAlive = False
+ deadCounter = 0
+
+ def wait_state(_last_try: bool) -> bool:
+ global wasAlive
+ global deadCounter
+
+ state = host.get_unit_property(unit, "SubState")
+ host.log(f"(waiting) {unit} -> {state}")
+
+ match state:
+ case "failed":
+ assert False, f'Unit "{unit}" reached state "{state}"'
+ case "start" | "active" | "running":
+ wasAlive = True
+ case "dead":
+ if wasAlive:
+ return True
+ else:
+ if deadCounter >= 5:
+ return True
+
+ deadCounter = deadCounter + 1
+ return False
+
+ return False
+
+ with host.nested(f"Waiting for unit {unit}"):
+ retry(wait_state)
+ ''
+ + optional (args.serverDomains != [])
+ # Python
+ ''
+ def acme_online(host, domain, renewRan):
+ from typing import assert_never
+
+ unitMain = f"acme-{domain}.service"
+ unitRenew = f"acme-order-renew-{domain}.service"
+
+ infoMain = host.get_unit_property(unitMain, "SubState")
+ infoRenew = host.get_unit_property(unitRenew, "SubState")
+
+ match (infoMain, infoRenew):
+ case ("exited", "dead") | ("dead", "dead") if not renewRan:
+ # The unit might not exist, because we use the DNS values for
+ # generating this code (there is no needed mapping between DNS -> acme
+ # host). So we check, if it is an actual unit.
+ if unit_exists(host, unitMain):
+ host.start_job(f"acme-{domain}")
+ return ("Wait", unitRenew, host)
+ else:
+ return ("Done", None, None)
+
+ case ("exited", "dead") | ("exited", "dead") if renewRan:
+ # The unit is done, so it should be good?
+ host.require_unit_state(unitMain, "active")
+ host.succeed(f"${pkgs.lib.getExe pkgs.openssl} s_client -connect {domain}:443 -verify_return_error </dev/null")
+ return ("Done", None, None)
+
+ case (_, "running") | (_, "start"):
+ # It's currently running, let's wait
+ return ("Wait", unitRenew, host)
+
+ case other:
+ assert False, f"Wrong unit sub-states for ({unitMain},{unitRenew}): {other}"
+ assert_never() # i.e. unreachable
+
+ with subtest("Ensure, that all acme certificates have been fetched"):
+ renewRan = {}
+ while True:
+ status = []
+ ${acmeOnline}
+ done = True
+ for (state, unit, host) in status:
+ if state == "Wait":
+ run_and_wait(host, unit)
+ renewRan[unit] = True
+ if state != "Done":
+ done = False
+ if done:
+ break
+ ''
+ + optional (args.services != [])
+ # Python
+ ''
+ def maybe_wait(host, unit: str, should_start: bool):
+ if unit_exists(host, unit):
+ if should_start:
+ host.start_job(unit.removesuffix(".service"))
+ run_and_wait(host, unit)
+ else:
+ host.wait_for_unit(unit)
+ else:
+ assert False, f"Unit '{unit}' does not exist, test misconfigured"
+
+ with subtest("Waiting for units"):
+ ${waitFor}
+ ''
+ +
+ # Python
+ ''
+ def all_services_running(host):
+ import json
+ (status, output) = host.systemctl("list-units --state=failed --plain --no-pager --output=json")
+ host_failed = json.loads(output)
+ assert len(host_failed) == 0, f"Expected zero failing services, but found: {json.dumps(host_failed, indent=4)}"
+
+ with subtest("All services running"):
+ ${allRunning}
+
+ ${(args.testScript testScriptInput)}
+
+ with subtest("All services running"):
+ ${allRunning}
+ ''
+ );
+ };
+
tests = nixLib.mkByName {
baseDirectory = ./by-name;
fileName = "test.nix";
finalizeFunction = name: value:
- import value (nixLib.warnMerge specialArgs {inherit pkgs;} "the test args set");
+ import value (nixLib.warnMerge specialArgs {inherit pkgs vhack;} "the test args set");
};
in
tests
diff --git a/update.sh b/update.sh
index 903b0ea..1b10dab 100755
--- a/update.sh
+++ b/update.sh
@@ -13,7 +13,6 @@ __update_sh_run() {
__update_sh_run nix flake update
__update_sh_run ./pkgs/update_pkgs.sh "$@"
-for host in "server2" "server3"; do
- __update_sh_run nix build ".#nixosConfigurations.$host.config.system.build.toplevel" --print-out-paths --no-link --option max-jobs 1
-done
+__update_sh_run build.sh
+__update_sh_run check.sh
# vim: ft=sh
diff --git a/zones/default.nix b/zones/default.nix
index babb531..de03a0d 100644
--- a/zones/default.nix
+++ b/zones/default.nix
@@ -1,3 +1,6 @@
{lib, ...}: {
"vhack.eu" = import ./vhack.eu/zone.nix {inherit lib;};
+ "j-schoeffel.de" = import ./j-schoeffel.de/zone.nix {inherit lib;};
+ "jaki-schoeffel.de" = import ./jaki-schoeffel.de/zone.nix {inherit lib;};
+ "jaki.li" = import ./jaki.li/zone.nix {inherit lib;};
}
diff --git a/zones/j-schoeffel.de/zone.nix b/zones/j-schoeffel.de/zone.nix
new file mode 100644
index 0000000..a162a92
--- /dev/null
+++ b/zones/j-schoeffel.de/zone.nix
@@ -0,0 +1,149 @@
+{lib, ...}: let
+ /*
+ Computes a reasonable value for the DNS serial number from the date of last change
+ and the iteration of that day.
+
+ # Type
+
+ mkSerial :: Number -> Number -> Number -> Number -> Number
+
+ # Arguments
+
+ year
+ : The year of the last change in the format YYYY.
+
+ month
+ : The month of the last change in the format MM.
+
+ day
+ : The day of the last change in the format DD.
+
+ iteration
+ : The number of change on that day. The format should be CC (assuming there are less
+ than 100 changes happening on a day) .
+
+ # Examples
+
+ mkSerial 2025 04 01 01
+ => 2025040101
+ */
+ mkSerial = year: month: day: iteration: let
+ n2 = lib.strings.fixedWidthNumber 2;
+ n4 = lib.strings.fixedWidthNumber 4;
+ in
+ lib.strings.toIntBase10 "${n4 year}${n2 month}${n2 day}${n2 iteration}";
+in {
+ SOA = {
+ nameServer = "name-server1.j-schoeffel.de.";
+ adminEmail = "dns-admin@foss-syndicate.org";
+ # NOTE(@bpeetz): ALWAYS change the serial number, when you change something in the
+ # zone file! <2025-04-01>
+ serial = mkSerial 2026 08 14 01;
+ };
+ useOrigin = false;
+
+ # NOTE: matrix/mastodon need to have the point from `vhack.eu` to their IP <2025-03-10>
+ A = [
+ "92.60.38.179"
+ ];
+ AAAA = [
+ "2a03:4000:33:25b::4f4e"
+ ];
+
+ NS = [
+ "name-server1.j-schoeffel.de."
+ "name-server2.j-schoeffel.de."
+ ];
+
+ CAA = [
+ {
+ issuerCritical = false;
+ tag = "issue";
+ value = "letsencrypt.org";
+ }
+ ];
+
+ # Mail section {{{
+ MX = [
+ # {
+ # preference = 10;
+ # exchange = "mail.vhack.eu.";
+ # }
+ {
+ preference = 10;
+ exchange = "mail.foss-syndicate.org.";
+ }
+ ];
+
+ # https://www.rfc-editor.org/rfc/rfc7208.html
+ TXT = [
+ (builtins.concatStringsSep " " [
+ "v=spf1" # The version.
+ "+mx" # Allow mail from this domain MX record.
+ "-all" # Reject all other emails if the previous mechanism did not match.
+ ])
+ ];
+
+ # https://www.rfc-editor.org/rfc/rfc6376.html#section-3.6.1
+ # https://www.rfc-editor.org/rfc/rfc6376.html#section-7.5
+ DKIM = [
+ {
+ selector = "mail";
+ k = "ed25519";
+ p = "U0eOxgLD3yK7PKzQRSZdJ3EH/UwVxPeYmfm42gYXsDg=";
+ s = ["email"];
+ t = ["s"];
+ }
+ ];
+
+ # https://www.rfc-editor.org/rfc/rfc7489.html#section-6.3
+ DMARC = [
+ {
+ adkim = "strict";
+ aspf = "strict";
+ fo = [
+ "0"
+ "1"
+ "d"
+ "s"
+ ];
+ p = "reject";
+ rua = "admin@foss-syndicate.org";
+ ruf = ["admin@foss-syndicate.org"];
+ }
+ ];
+
+ # https://www.rfc-editor.org/rfc/rfc2782.txt
+ SRV = [
+ {
+ service = "imaps";
+ proto = "tcp";
+ priority = 0;
+ weight = 1;
+ port = 993;
+ target = "mail.foss-syndicate.org.";
+ }
+ {
+ service = "pop3s";
+ proto = "tcp";
+ priority = 0;
+ weight = 1;
+ port = 995;
+ target = "mail.foss-snydicate.org.";
+ }
+ {
+ service = "smtps";
+ proto = "tcp";
+ priority = 0;
+ weight = 1;
+ port = 465;
+ target = "mail.foss-syndicate.org.";
+ }
+ ];
+ # }}}
+
+ subdomains = {
+ name-server1.CNAME = ["server2.vhack.eu."];
+ name-server2.CNAME = ["server3.vhack.eu."];
+ };
+}
diff --git a/zones/jaki-schoeffel.de/zone.nix b/zones/jaki-schoeffel.de/zone.nix
new file mode 100644
index 0000000..d79f2f1
--- /dev/null
+++ b/zones/jaki-schoeffel.de/zone.nix
@@ -0,0 +1,149 @@
+{lib, ...}: let
+ /*
+ Computes a reasonable value for the DNS serial number from the date of last change
+ and the iteration of that day.
+
+ # Type
+
+ mkSerial :: Number -> Number -> Number -> Number -> Number
+
+ # Arguments
+
+ year
+ : The year of the last change in the format YYYY.
+
+ month
+ : The month of the last change in the format MM.
+
+ day
+ : The day of the last change in the format DD.
+
+ iteration
+ : The number of change on that day. The format should be CC (assuming there are less
+ than 100 changes happening on a day) .
+
+ # Examples
+
+ mkSerial 2025 04 01 01
+ => 2025040101
+ */
+ mkSerial = year: month: day: iteration: let
+ n2 = lib.strings.fixedWidthNumber 2;
+ n4 = lib.strings.fixedWidthNumber 4;
+ in
+ lib.strings.toIntBase10 "${n4 year}${n2 month}${n2 day}${n2 iteration}";
+in {
+ SOA = {
+ nameServer = "name-server1.jaki-schoeffel.de.";
+ adminEmail = "dns-admin@foss-syndicate.org";
+ # NOTE(@bpeetz): ALWAYS change the serial number, when you change something in the
+ # zone file! <2025-04-01>
+ serial = mkSerial 2026 08 14 01;
+ };
+ useOrigin = false;
+
+ # NOTE: matrix/mastodon need to have the point from `vhack.eu` to their IP <2025-03-10>
+ A = [
+ "92.60.38.179"
+ ];
+ AAAA = [
+ "2a03:4000:33:25b::4f4e"
+ ];
+
+ NS = [
+ "name-server1.jaki-schoeffel.de."
+ "name-server2.jaki-schoeffel.de."
+ ];
+
+ CAA = [
+ {
+ issuerCritical = false;
+ tag = "issue";
+ value = "letsencrypt.org";
+ }
+ ];
+
+ # Mail section {{{
+ MX = [
+ # {
+ # preference = 10;
+ # exchange = "mail.vhack.eu.";
+ # }
+ {
+ preference = 10;
+ exchange = "mail.foss-syndicate.org.";
+ }
+ ];
+
+ # https://www.rfc-editor.org/rfc/rfc7208.html
+ TXT = [
+ (builtins.concatStringsSep " " [
+ "v=spf1" # The version.
+ "+mx" # Allow mail from this domain MX record.
+ "-all" # Reject all other emails if the previous mechanism did not match.
+ ])
+ ];
+
+ # https://www.rfc-editor.org/rfc/rfc6376.html#section-3.6.1
+ # https://www.rfc-editor.org/rfc/rfc6376.html#section-7.5
+ DKIM = [
+ {
+ selector = "mail";
+ k = "ed25519";
+ p = "U0eOxgLD3yK7PKzQRSZdJ3EH/UwVxPeYmfm42gYXsDg=";
+ s = ["email"];
+ t = ["s"];
+ }
+ ];
+
+ # https://www.rfc-editor.org/rfc/rfc7489.html#section-6.3
+ DMARC = [
+ {
+ adkim = "strict";
+ aspf = "strict";
+ fo = [
+ "0"
+ "1"
+ "d"
+ "s"
+ ];
+ p = "reject";
+ rua = "admin@foss-syndicate.org";
+ ruf = ["admin@foss-syndicate.org"];
+ }
+ ];
+
+ # https://www.rfc-editor.org/rfc/rfc2782.txt
+ SRV = [
+ {
+ service = "imaps";
+ proto = "tcp";
+ priority = 0;
+ weight = 1;
+ port = 993;
+ target = "mail.foss-syndicate.org.";
+ }
+ {
+ service = "pop3s";
+ proto = "tcp";
+ priority = 0;
+ weight = 1;
+ port = 995;
+ target = "mail.foss-snydicate.org.";
+ }
+ {
+ service = "smtps";
+ proto = "tcp";
+ priority = 0;
+ weight = 1;
+ port = 465;
+ target = "mail.foss-syndicate.org.";
+ }
+ ];
+ # }}}
+
+ subdomains = {
+ name-server1.CNAME = ["server2.vhack.eu."];
+ name-server2.CNAME = ["server3.vhack.eu."];
+ };
+}
diff --git a/zones/jaki.li/zone.nix b/zones/jaki.li/zone.nix
new file mode 100644
index 0000000..792fce2
--- /dev/null
+++ b/zones/jaki.li/zone.nix
@@ -0,0 +1,149 @@
+{lib, ...}: let
+ /*
+ Computes a reasonable value for the DNS serial number from the date of last change
+ and the iteration of that day.
+
+ # Type
+
+ mkSerial :: Number -> Number -> Number -> Number -> Number
+
+ # Arguments
+
+ year
+ : The year of the last change in the format YYYY.
+
+ month
+ : The month of the last change in the format MM.
+
+ day
+ : The day of the last change in the format DD.
+
+ iteration
+ : The number of change on that day. The format should be CC (assuming there are less
+ than 100 changes happening on a day) .
+
+ # Examples
+
+ mkSerial 2025 04 01 01
+ => 2025040101
+ */
+ mkSerial = year: month: day: iteration: let
+ n2 = lib.strings.fixedWidthNumber 2;
+ n4 = lib.strings.fixedWidthNumber 4;
+ in
+ lib.strings.toIntBase10 "${n4 year}${n2 month}${n2 day}${n2 iteration}";
+in {
+ SOA = {
+ nameServer = "name-server1.jaki.li.";
+ adminEmail = "dns-admin@foss-syndicate.org";
+ # NOTE(@bpeetz): ALWAYS change the serial number, when you change something in the
+ # zone file! <2025-04-01>
+ serial = mkSerial 2026 08 14 02;
+ };
+ useOrigin = false;
+
+ # NOTE: matrix/mastodon need to have the point from `vhack.eu` to their IP <2025-03-10>
+ A = [
+ "92.60.38.179"
+ ];
+ AAAA = [
+ "2a03:4000:33:25b::4f4e"
+ ];
+
+ NS = [
+ "name-server1.jaki.li."
+ "name-server2.jaki.li."
+ ];
+
+ CAA = [
+ {
+ issuerCritical = false;
+ tag = "issue";
+ value = "letsencrypt.org";
+ }
+ ];
+
+ # Mail section {{{
+ MX = [
+ # {
+ # preference = 10;
+ # exchange = "mail.vhack.eu.";
+ # }
+ {
+ preference = 10;
+ exchange = "mail.foss-syndicate.org.";
+ }
+ ];
+
+ # https://www.rfc-editor.org/rfc/rfc7208.html
+ TXT = [
+ (builtins.concatStringsSep " " [
+ "v=spf1" # The version.
+ "+mx" # Allow mail from this domain MX record.
+ "-all" # Reject all other emails if the previous mechanism did not match.
+ ])
+ ];
+
+ # https://www.rfc-editor.org/rfc/rfc6376.html#section-3.6.1
+ # https://www.rfc-editor.org/rfc/rfc6376.html#section-7.5
+ DKIM = [
+ {
+ selector = "mail";
+ k = "ed25519";
+ p = "U0eOxgLD3yK7PKzQRSZdJ3EH/UwVxPeYmfm42gYXsDg=";
+ s = ["email"];
+ t = ["s"];
+ }
+ ];
+
+ # https://www.rfc-editor.org/rfc/rfc7489.html#section-6.3
+ DMARC = [
+ {
+ adkim = "strict";
+ aspf = "strict";
+ fo = [
+ "0"
+ "1"
+ "d"
+ "s"
+ ];
+ p = "reject";
+ rua = "admin@foss-syndicate.org";
+ ruf = ["admin@foss-syndicate.org"];
+ }
+ ];
+
+ # https://www.rfc-editor.org/rfc/rfc2782.txt
+ SRV = [
+ {
+ service = "imaps";
+ proto = "tcp";
+ priority = 0;
+ weight = 1;
+ port = 993;
+ target = "mail.foss-syndicate.org.";
+ }
+ {
+ service = "pop3s";
+ proto = "tcp";
+ priority = 0;
+ weight = 1;
+ port = 995;
+ target = "mail.foss-snydicate.org.";
+ }
+ {
+ service = "smtps";
+ proto = "tcp";
+ priority = 0;
+ weight = 1;
+ port = 465;
+ target = "mail.foss-syndicate.org.";
+ }
+ ];
+ # }}}
+
+ subdomains = {
+ name-server1.CNAME = ["server2.vhack.eu."];
+ name-server2.CNAME = ["server3.vhack.eu."];
+ };
+}
diff --git a/zones/vhack.eu/zone.nix b/zones/vhack.eu/zone.nix
index 709940d..91b5232 100644
--- a/zones/vhack.eu/zone.nix
+++ b/zones/vhack.eu/zone.nix
@@ -38,7 +38,7 @@ in {
adminEmail = "dns-admin@foss-syndicate.org";
# NOTE(@bpeetz): ALWAYS change the serial number, when you change something in the
# zone file! <2025-04-01>
- serial = mkSerial 2025 08 03 01;
+ serial = mkSerial 2026 07 19 02;
};
useOrigin = false;
@@ -149,6 +149,9 @@ in {
taskchampion.CNAME = ["server2.vhack.eu."];
atuin-sync.CNAME = ["server2.vhack.eu."];
+ grafana.CNAME = ["server2.vhack.eu."];
+ prometheus-server2.CNAME = ["server2.vhack.eu."];
+
dav.CNAME = ["server2.vhack.eu."];
etebase.CNAME = ["server2.vhack.eu."];
git.CNAME = ["server2.vhack.eu."];
@@ -162,7 +165,7 @@ in {
mastodon.CNAME = ["server3.vhack.eu."];
matrix.CNAME = ["server3.vhack.eu."];
- grocy.CNAME = ["server3.vhack.eu."];
+ rocie.CNAME = ["server3.vhack.eu."];
miniflux.CNAME = ["server3.vhack.eu."];
rss.CNAME = ["server3.vhack.eu."];