Fix Grafana dashboard queries and disable incompatible Loki plugin
d1f6c06 parent: a4ffaee modified
grafana/provisioning/dashboards/json/atop-overview.json +3 -3 | @@ -26,7 +26,7 @@ | ||
| 26 | 26 | "gridPos": {"h": 9, "w": 24, "x": 0, "y": 9}, |
| 27 | 27 | "id": 3, |
| 28 | 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 | 30 | "title": "Top processes", |
| 31 | 31 | "type": "table" |
| 32 | 32 | }, |
| @@ -37,7 +37,7 @@ | ||
| 37 | 37 | "gridPos": {"h": 10, "w": 24, "x": 0, "y": 18}, |
| 38 | 38 | "id": 4, |
| 39 | 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 | 41 | "title": "Incident replay: top processes by interval", |
| 42 | 42 | "type": "table" |
| 43 | 43 | }, |
| @@ -58,7 +58,7 @@ | ||
| 58 | 58 | "gridPos": {"h": 9, "w": 12, "x": 12, "y": 28}, |
| 59 | 59 | "id": 6, |
| 60 | 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 | 62 | "title": "Top processes by RSS", |
| 63 | 63 | "type": "table" |
| 64 | 64 | } |
| @@ -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: | ||
| 12 | 12 | protocol: http |
| 13 | 13 | secure: true |
| 14 | 14 | dialTimeout: 120 |
| 15 | - queryTimeout: 180 | |
| 15 | + queryTimeout: 360 | |
| 16 | 16 | username: grafana_reader |
| 17 | 17 | defaultDatabase: default |
| 18 | 18 | httpHeaders: |
| @@ -12,7 +12,7 @@ datasources: | |||
| 12 | protocol: http | 12 | protocol: http |
| 13 | secure: true | 13 | secure: true |
| 14 | dialTimeout: 120 | 14 | dialTimeout: 120 |
| 15 | - queryTimeout: 180 | 15 | + queryTimeout: 360 |
| 16 | username: grafana_reader | 16 | username: grafana_reader |
| 17 | defaultDatabase: default | 17 | defaultDatabase: default |
| 18 | httpHeaders: | 18 | httpHeaders: |
modified
modal_grafana.py +3 -0 | @@ -64,6 +64,9 @@ image = ( | ||
| 64 | 64 | "GF_PATHS_DATA": "/var/lib/grafana", |
| 65 | 65 | "GF_PATHS_LOGS": "/var/log/grafana", |
| 66 | 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 | 70 | "GF_DATABASE_WAL": "false", |
| 68 | 71 | "GF_PATHS_PROVISIONING": "/etc/grafana/provisioning", |
| 69 | 72 | "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", |