nandi/atop-analyzepublic Fork
⑂ d1f6c06
Commits
⬇ Clone ▾
git clone https://git.rickub.com/nandi/atop-analyze.git
git clone ssh://git@rickub.com/nandi/atop-analyze.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

Download ZIP

Fix Grafana dashboard queries and disable incompatible Loki plugin

nandithebull committed 2026-09-22T21:06:00-07:00 Browse files
d1f6c06 parent: a4ffaee
modified grafana/provisioning/dashboards/json/atop-overview.json +3 -3
@@ -26,7 +26,7 @@
2626 "gridPos": {"h": 9, "w": 24, "x": 0, "y": 9},
2727 "id": 3,
2828 "options": {"showHeader": true},
29- "targets": [{"editorType": "sql", "format": 1, "queryType": "table", "rawSql": "SELECT name AS process, round(avg(cpu_pct), 2) AS avg_cpu_pct, round(max(cpu_pct), 2) AS peak_cpu_pct FROM (SELECT host, epoch, pid, name, argMax(cpu_pct, ingest_version) AS cpu_pct FROM atop_processes WHERE $__timeFilter(epoch) GROUP BY host, epoch, pid, name) GROUP BY name ORDER BY avg_cpu_pct DESC LIMIT 15", "refId": "A"}],
29+ "targets": [{"editorType": "sql", "format": 1, "queryType": "table", "rawSql": "SELECT name AS process, round(avg(latest_cpu_pct), 2) AS avg_cpu_pct, round(max(latest_cpu_pct), 2) AS peak_cpu_pct FROM (SELECT host, epoch, pid, name, argMax(cpu_pct, ingest_version) AS latest_cpu_pct FROM atop_processes WHERE $__timeFilter(epoch) GROUP BY host, epoch, pid, name) GROUP BY name ORDER BY avg_cpu_pct DESC LIMIT 15", "refId": "A"}],
3030 "title": "Top processes",
3131 "type": "table"
3232 },
@@ -37,7 +37,7 @@
3737 "gridPos": {"h": 10, "w": 24, "x": 0, "y": 18},
3838 "id": 4,
3939 "options": {"showHeader": true},
40- "targets": [{"editorType": "sql", "format": 1, "queryType": "table", "rawSql": "SELECT time, host, round(host_busy_pct, 2) AS host_busy_pct, pid, process, round(process_cpu_pct, 2) AS process_cpu_pct FROM (SELECT p.epoch AS time, p.host, p.pid, p.name AS process, p.cpu_pct AS process_cpu_pct, s.busy_pct AS host_busy_pct, row_number() OVER (PARTITION BY p.host, p.epoch ORDER BY p.cpu_pct DESC, p.pid) AS process_rank FROM (SELECT host, epoch, pid, name, argMax(cpu_pct, ingest_version) AS cpu_pct FROM atop_processes WHERE $__timeFilter(epoch) GROUP BY host, epoch, pid, name) AS p INNER JOIN (SELECT host, epoch, argMax(busy_pct, ingest_version) AS busy_pct FROM atop_samples WHERE $__timeFilter(epoch) GROUP BY host, epoch) AS s ON p.host = s.host AND p.epoch = s.epoch) WHERE process_rank <= 5 ORDER BY time DESC, host, process_rank LIMIT 500", "refId": "A"}],
40+ "targets": [{"editorType": "sql", "format": 1, "queryType": "table", "rawSql": "SELECT time, host, round(host_busy_pct, 2) AS host_busy_pct, pid, process, round(process_cpu_pct, 2) AS process_cpu_pct FROM (SELECT p.epoch AS time, p.host, p.pid, p.name AS process, p.latest_cpu_pct AS process_cpu_pct, s.latest_busy_pct AS host_busy_pct, row_number() OVER (PARTITION BY p.host, p.epoch ORDER BY p.latest_cpu_pct DESC, p.pid) AS process_rank FROM (SELECT host, epoch, pid, name, argMax(cpu_pct, ingest_version) AS latest_cpu_pct FROM atop_processes WHERE $__timeFilter(epoch) GROUP BY host, epoch, pid, name) AS p INNER JOIN (SELECT host, epoch, argMax(busy_pct, ingest_version) AS latest_busy_pct FROM atop_samples WHERE $__timeFilter(epoch) GROUP BY host, epoch) AS s ON p.host = s.host AND p.epoch = s.epoch) WHERE process_rank <= 5 ORDER BY time DESC, host, process_rank LIMIT 500", "refId": "A"}],
4141 "title": "Incident replay: top processes by interval",
4242 "type": "table"
4343 },
@@ -58,7 +58,7 @@
5858 "gridPos": {"h": 9, "w": 12, "x": 12, "y": 28},
5959 "id": 6,
6060 "options": {"showHeader": true},
61- "targets": [{"editorType": "sql", "format": 1, "queryType": "table", "rawSql": "SELECT name AS process, round(avg(rss_kib) / 1024, 2) AS avg_rss_mib, round(max(rss_kib) / 1024, 2) AS peak_rss_mib, round(max(vmem_kib) / 1024, 2) AS peak_vmem_mib, round(max(swap_kib) / 1024, 2) AS peak_swap_mib FROM (SELECT host, epoch, pid, name, argMax(rss_kib, ingest_version) AS rss_kib, argMax(vmem_kib, ingest_version) AS vmem_kib, argMax(swap_kib, ingest_version) AS swap_kib FROM atop_processes WHERE $__timeFilter(epoch) GROUP BY host, epoch, pid, name) WHERE rss_kib IS NOT NULL GROUP BY name ORDER BY peak_rss_mib DESC LIMIT 15", "refId": "A"}],
61+ "targets": [{"editorType": "sql", "format": 1, "queryType": "table", "rawSql": "SELECT name AS process, round(avg(latest_rss_kib) / 1024, 2) AS avg_rss_mib, round(max(latest_rss_kib) / 1024, 2) AS peak_rss_mib, round(max(latest_vmem_kib) / 1024, 2) AS peak_vmem_mib, round(max(latest_swap_kib) / 1024, 2) AS peak_swap_mib FROM (SELECT host, epoch, pid, name, argMax(rss_kib, ingest_version) AS latest_rss_kib, argMax(vmem_kib, ingest_version) AS latest_vmem_kib, argMax(swap_kib, ingest_version) AS latest_swap_kib FROM atop_processes WHERE $__timeFilter(epoch) GROUP BY host, epoch, pid, name) WHERE latest_rss_kib IS NOT NULL GROUP BY name ORDER BY peak_rss_mib DESC LIMIT 15", "refId": "A"}],
6262 "title": "Top processes by RSS",
6363 "type": "table"
6464 }
@@ -26,7 +26,7 @@
26 "gridPos": {"h": 9, "w": 24, "x": 0, "y": 9},26 "gridPos": {"h": 9, "w": 24, "x": 0, "y": 9},
27 "id": 3,27 "id": 3,
28 "options": {"showHeader": true},28 "options": {"showHeader": true},
29- "targets": [{"editorType": "sql", "format": 1, "queryType": "table", "rawSql": "SELECT name AS process, round(avg(cpu_pct), 2) AS avg_cpu_pct, round(max(cpu_pct), 2) AS peak_cpu_pct FROM (SELECT host, epoch, pid, name, argMax(cpu_pct, ingest_version) AS cpu_pct FROM atop_processes WHERE $__timeFilter(epoch) GROUP BY host, epoch, pid, name) GROUP BY name ORDER BY avg_cpu_pct DESC LIMIT 15", "refId": "A"}],29+ "targets": [{"editorType": "sql", "format": 1, "queryType": "table", "rawSql": "SELECT name AS process, round(avg(latest_cpu_pct), 2) AS avg_cpu_pct, round(max(latest_cpu_pct), 2) AS peak_cpu_pct FROM (SELECT host, epoch, pid, name, argMax(cpu_pct, ingest_version) AS latest_cpu_pct FROM atop_processes WHERE $__timeFilter(epoch) GROUP BY host, epoch, pid, name) GROUP BY name ORDER BY avg_cpu_pct DESC LIMIT 15", "refId": "A"}],
30 "title": "Top processes",30 "title": "Top processes",
31 "type": "table"31 "type": "table"
32 },32 },
@@ -37,7 +37,7 @@
37 "gridPos": {"h": 10, "w": 24, "x": 0, "y": 18},37 "gridPos": {"h": 10, "w": 24, "x": 0, "y": 18},
38 "id": 4,38 "id": 4,
39 "options": {"showHeader": true},39 "options": {"showHeader": true},
40- "targets": [{"editorType": "sql", "format": 1, "queryType": "table", "rawSql": "SELECT time, host, round(host_busy_pct, 2) AS host_busy_pct, pid, process, round(process_cpu_pct, 2) AS process_cpu_pct FROM (SELECT p.epoch AS time, p.host, p.pid, p.name AS process, p.cpu_pct AS process_cpu_pct, s.busy_pct AS host_busy_pct, row_number() OVER (PARTITION BY p.host, p.epoch ORDER BY p.cpu_pct DESC, p.pid) AS process_rank FROM (SELECT host, epoch, pid, name, argMax(cpu_pct, ingest_version) AS cpu_pct FROM atop_processes WHERE $__timeFilter(epoch) GROUP BY host, epoch, pid, name) AS p INNER JOIN (SELECT host, epoch, argMax(busy_pct, ingest_version) AS busy_pct FROM atop_samples WHERE $__timeFilter(epoch) GROUP BY host, epoch) AS s ON p.host = s.host AND p.epoch = s.epoch) WHERE process_rank <= 5 ORDER BY time DESC, host, process_rank LIMIT 500", "refId": "A"}],40+ "targets": [{"editorType": "sql", "format": 1, "queryType": "table", "rawSql": "SELECT time, host, round(host_busy_pct, 2) AS host_busy_pct, pid, process, round(process_cpu_pct, 2) AS process_cpu_pct FROM (SELECT p.epoch AS time, p.host, p.pid, p.name AS process, p.latest_cpu_pct AS process_cpu_pct, s.latest_busy_pct AS host_busy_pct, row_number() OVER (PARTITION BY p.host, p.epoch ORDER BY p.latest_cpu_pct DESC, p.pid) AS process_rank FROM (SELECT host, epoch, pid, name, argMax(cpu_pct, ingest_version) AS latest_cpu_pct FROM atop_processes WHERE $__timeFilter(epoch) GROUP BY host, epoch, pid, name) AS p INNER JOIN (SELECT host, epoch, argMax(busy_pct, ingest_version) AS latest_busy_pct FROM atop_samples WHERE $__timeFilter(epoch) GROUP BY host, epoch) AS s ON p.host = s.host AND p.epoch = s.epoch) WHERE process_rank <= 5 ORDER BY time DESC, host, process_rank LIMIT 500", "refId": "A"}],
41 "title": "Incident replay: top processes by interval",41 "title": "Incident replay: top processes by interval",
42 "type": "table"42 "type": "table"
43 },43 },
@@ -58,7 +58,7 @@
58 "gridPos": {"h": 9, "w": 12, "x": 12, "y": 28},58 "gridPos": {"h": 9, "w": 12, "x": 12, "y": 28},
59 "id": 6,59 "id": 6,
60 "options": {"showHeader": true},60 "options": {"showHeader": true},
61- "targets": [{"editorType": "sql", "format": 1, "queryType": "table", "rawSql": "SELECT name AS process, round(avg(rss_kib) / 1024, 2) AS avg_rss_mib, round(max(rss_kib) / 1024, 2) AS peak_rss_mib, round(max(vmem_kib) / 1024, 2) AS peak_vmem_mib, round(max(swap_kib) / 1024, 2) AS peak_swap_mib FROM (SELECT host, epoch, pid, name, argMax(rss_kib, ingest_version) AS rss_kib, argMax(vmem_kib, ingest_version) AS vmem_kib, argMax(swap_kib, ingest_version) AS swap_kib FROM atop_processes WHERE $__timeFilter(epoch) GROUP BY host, epoch, pid, name) WHERE rss_kib IS NOT NULL GROUP BY name ORDER BY peak_rss_mib DESC LIMIT 15", "refId": "A"}],61+ "targets": [{"editorType": "sql", "format": 1, "queryType": "table", "rawSql": "SELECT name AS process, round(avg(latest_rss_kib) / 1024, 2) AS avg_rss_mib, round(max(latest_rss_kib) / 1024, 2) AS peak_rss_mib, round(max(latest_vmem_kib) / 1024, 2) AS peak_vmem_mib, round(max(latest_swap_kib) / 1024, 2) AS peak_swap_mib FROM (SELECT host, epoch, pid, name, argMax(rss_kib, ingest_version) AS latest_rss_kib, argMax(vmem_kib, ingest_version) AS latest_vmem_kib, argMax(swap_kib, ingest_version) AS latest_swap_kib FROM atop_processes WHERE $__timeFilter(epoch) GROUP BY host, epoch, pid, name) WHERE latest_rss_kib IS NOT NULL GROUP BY name ORDER BY peak_rss_mib DESC LIMIT 15", "refId": "A"}],
62 "title": "Top processes by RSS",62 "title": "Top processes by RSS",
63 "type": "table"63 "type": "table"
64 }64 }
modified grafana/provisioning/datasources/clickhouse.yaml +1 -1
@@ -12,7 +12,7 @@ datasources:
1212 protocol: http
1313 secure: true
1414 dialTimeout: 120
15- queryTimeout: 180
15+ queryTimeout: 360
1616 username: grafana_reader
1717 defaultDatabase: default
1818 httpHeaders:
@@ -12,7 +12,7 @@ datasources:
12 protocol: http12 protocol: http
13 secure: true13 secure: true
14 dialTimeout: 12014 dialTimeout: 120
15- queryTimeout: 18015+ queryTimeout: 360
16 username: grafana_reader16 username: grafana_reader
17 defaultDatabase: default17 defaultDatabase: default
18 httpHeaders:18 httpHeaders:
modified modal_grafana.py +3 -0
@@ -64,6 +64,9 @@ image = (
6464 "GF_PATHS_DATA": "/var/lib/grafana",
6565 "GF_PATHS_LOGS": "/var/log/grafana",
6666 "GF_PATHS_PLUGINS": "/opt/grafana/plugins",
67+ # The preinstalled Loki Explore 1.0.39 imports react/jsx-runtime,
68+ # which Grafana 11.6.0 does not provide. This app does not use Loki.
69+ "GF_PLUGINS_DISABLE_PLUGINS": "grafana-lokiexplore-app",
6770 "GF_DATABASE_WAL": "false",
6871 "GF_PATHS_PROVISIONING": "/etc/grafana/provisioning",
6972 "GF_AUTH_DISABLE_LOGIN_FORM": "true",
@@ -64,6 +64,9 @@ image = (
64 "GF_PATHS_DATA": "/var/lib/grafana",64 "GF_PATHS_DATA": "/var/lib/grafana",
65 "GF_PATHS_LOGS": "/var/log/grafana",65 "GF_PATHS_LOGS": "/var/log/grafana",
66 "GF_PATHS_PLUGINS": "/opt/grafana/plugins",66 "GF_PATHS_PLUGINS": "/opt/grafana/plugins",
67+ # The preinstalled Loki Explore 1.0.39 imports react/jsx-runtime,
68+ # which Grafana 11.6.0 does not provide. This app does not use Loki.
69+ "GF_PLUGINS_DISABLE_PLUGINS": "grafana-lokiexplore-app",
67 "GF_DATABASE_WAL": "false",70 "GF_DATABASE_WAL": "false",
68 "GF_PATHS_PROVISIONING": "/etc/grafana/provisioning",71 "GF_PATHS_PROVISIONING": "/etc/grafana/provisioning",
69 "GF_AUTH_DISABLE_LOGIN_FORM": "true",72 "GF_AUTH_DISABLE_LOGIN_FORM": "true",