From c42c6cd71e832c2bc9c7691a6f9715b005588f4b Mon Sep 17 00:00:00 2001 From: 0xgouda Date: Mon, 1 Dec 2025 18:58:28 +0200 Subject: [PATCH 1/5] Remove `$online_interval` variable from `0-health-check` dashboard. There is no need to use additional `$online_interval` variable, we can directly use `$__timeFilter(time)` to get data only from the time range used by users. - `select 0 as time` and `select time` blocks are removed. - `$__timeGroup($online_inteval` blocks are removed, as data is already within the chosen time range no need for further grouping by time. - `where time > now() - '$online_interval'::interval` are substituted with `$__timeFilter(time)`. --- grafana/postgres/v12/0-health-check.json | 169 +++++++++-------------- 1 file changed, 64 insertions(+), 105 deletions(-) diff --git a/grafana/postgres/v12/0-health-check.json b/grafana/postgres/v12/0-health-check.json index dd6adfef4..c3b64f3c7 100644 --- a/grafana/postgres/v12/0-health-check.json +++ b/grafana/postgres/v12/0-health-check.json @@ -103,7 +103,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -124,7 +124,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "SELECT\n time,\n (data->>'in_recovery_int')::int\nFROM\n wal\nWHERE\n time > now() - '$online_interval'::interval\n AND dbname = '$dbname'\nORDER BY time DESC\nLIMIT 1\n", + "rawSql": "SELECT (data->>'in_recovery_int')::int\nFROM wal\nWHERE $__timeFilter(time) AND dbname = '$dbname'\nORDER BY time DESC\nLIMIT 1\n", "refId": "A", "resultFormat": "time_series", "select": [ @@ -230,7 +230,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -251,7 +251,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "SELECT\n time,\n (data->>'postmaster_uptime_s')::int\nFROM\n wal\nWHERE\n time > now() - '$online_interval'::interval\n AND dbname = '$dbname'\nORDER BY time DESC\nLIMIT 1\n", + "rawSql": "SELECT (data->>'postmaster_uptime_s')::int\nFROM wal\nWHERE $__timeFilter(time) AND dbname = '$dbname'\nORDER BY time DESC\nLIMIT 1\n", "refId": "A", "resultFormat": "time_series", "select": [ @@ -370,7 +370,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -391,7 +391,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "select time, (data->>'server_version_num')::int8 as value from settings where dbname = '$dbname' and $__timeFilter(time) order by time desc limit 1;", + "rawSql": "select (data->>'server_version_num')::int8 as value \nfrom settings \nwhere dbname = '$dbname' and $__timeFilter(time) \norder by time \ndesc limit 1;", "refId": "A", "resultFormat": "time_series", "select": [ @@ -497,7 +497,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -518,7 +518,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "SELECT\n 0 AS time,\n max((data->>'longest_query_seconds')::int)\nFROM\n backends\nWHERE\n time > now() - '$online_interval'::interval\n AND dbname = '$dbname'\n", + "rawSql": "SELECT max((data->>'longest_query_seconds')::int)\nFROM backends\nWHERE $__timeFilter(time) AND dbname = '$dbname'", "refId": "A", "resultFormat": "time_series", "select": [ @@ -637,7 +637,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -658,7 +658,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "SELECT\n time,\n (data->>'numbackends')::int\nFROM\n db_stats\nWHERE\n time > now() - '$online_interval'::interval\n AND dbname = '$dbname'\nORDER BY time DESC\nLIMIT 1", + "rawSql": "SELECT (data->>'numbackends')::int\nFROM db_stats\nWHERE $__timeFilter(time) AND dbname = '$dbname'\nORDER BY time DESC\nLIMIT 1", "refId": "A", "resultFormat": "time_series", "select": [ @@ -752,7 +752,7 @@ "editorMode": "code", "format": "table", "rawQuery": true, - "rawSql": " SELECT \r\n max((data->>'sessions')::int8) - min((data->>'sessions')::int8) as established\r\nfrom db_stats \r\nwhere dbname = '$dbname' and time > now() - '$online_interval'::interval\r\norder by 1", + "rawSql": "select max((data->>'sessions')::int8) - min((data->>'sessions')::int8) as established\r\nfrom db_stats \r\nwhere dbname = '$dbname' and $__timeFilter(time) \r\norder by 1", "refId": "A", "sql": { "columns": [ @@ -857,7 +857,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -878,7 +878,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "SELECT\n 0 as time,\n max((data->>'waiting')::int)\nFROM\n backends\nWHERE\n $__timeFilter(time, $online_interval)\n AND dbname = '$dbname'", + "rawSql": "SELECT max((data->>'waiting')::int)\nFROM backends\nWHERE $__timeFilter(time, $online_interval) AND dbname = '$dbname'", "refId": "A", "resultFormat": "time_series", "select": [ @@ -999,7 +999,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -1139,7 +1139,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -1160,7 +1160,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "select\n $__timeGroup(time, $online_interval),\n max((roll-roll_lag)::numeric / ((roll-roll_lag) + (comm-comm_lag)))*100 as \"TX rollback ratio\"\nfrom (\n select\n time,\n (data->>'xact_rollback')::int8 as roll, lag((data->>'xact_rollback')::int8) over w as roll_lag,\n (data->>'xact_commit')::int8 as comm, lag((data->>'xact_commit')::int8) over w as comm_lag\n FROM\n db_stats\n WHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\n window w as (order by time)\n) x\nWHERE comm > comm_lag or roll > roll_lag\nGROUP BY 1\nORDER BY 1 DESC\nLIMIT 1\n", + "rawSql": "select\n max((roll-roll_lag)::numeric / ((roll-roll_lag) + (comm-comm_lag)))*100 as \"TX rollback ratio\"\nfrom (\n select\n (data->>'xact_rollback')::int8 as roll, lag((data->>'xact_rollback')::int8) over w as roll_lag,\n (data->>'xact_commit')::int8 as comm, lag((data->>'xact_commit')::int8) over w as comm_lag\n FROM\n db_stats\n WHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\n window w as (order by time)\n) x\nWHERE comm > comm_lag or roll > roll_lag", "refId": "A", "resultFormat": "time_series", "select": [ @@ -1272,7 +1272,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -1293,7 +1293,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "SELECT\n time,\n (data->>'max_connections')::int\nFROM\n settings\nWHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\nORDER BY time DESC\nLIMIT 1", + "rawSql": "SELECT (data->>'max_connections')::int\nFROM settings\nWHERE $__timeFilter(time) AND dbname = '$dbname'\nORDER BY time DESC\nLIMIT 1", "refId": "A", "resultFormat": "time_series", "select": [ @@ -1411,7 +1411,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -1432,7 +1432,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "select\n $__timeGroup(time, $online_interval),\n avg( (c - c_lag) / extract(epoch from time - time_lag)) as qps\nfrom (\n select \n (data->>'calls')::int8 as c, lag((data->>'calls')::int8) over w as c_lag,\n time, lag(time) over w as time_lag\n from stat_statements_calls\n where dbname = '$dbname' and $__timeFilter(time)\n window w as (order by time) \n) x\nwhere c >= c_lag and time > time_lag\ngroup by 1\norder by 1 desc\nlimit 1\n", + "rawSql": "select\n avg( (c - c_lag) / extract(epoch from time - time_lag) ) as qps\nfrom (\n select \n (data->>'calls')::int8 as c, lag((data->>'calls')::int8) over w as c_lag,\n time, lag(time) over w as time_lag\n from stat_statements_calls\n where dbname = '$dbname' and $__timeFilter(time)\n window w as (order by time) \n) x\nwhere c >= c_lag and time > time_lag", "refId": "A", "resultFormat": "time_series", "select": [ @@ -1544,7 +1544,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -1565,7 +1565,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "SELECT\n 0 as time,\n max((data->>'idleintransaction')::int)\nFROM\n backends\nWHERE\n time > now() - '$online_interval'::interval\n AND dbname = '$dbname'\n", + "rawSql": "SELECT max((data->>'idleintransaction')::int)\nFROM backends\nWHERE $__timeFilter(time) AND dbname = '$dbname'", "refId": "A", "resultFormat": "time_series", "select": [ @@ -1679,7 +1679,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -1700,7 +1700,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "SELECT\n time,\n (data->>'size_b')::int8\nFROM\n db_size\nWHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\nORDER BY time DESC\nLIMIT 1", + "rawSql": "SELECT\n (data->>'size_b')::int8\nFROM\n db_size\nWHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\nORDER BY time DESC\nLIMIT 1", "refId": "A", "resultFormat": "time_series", "select": [ @@ -1811,7 +1811,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -1832,7 +1832,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "select\n $__timeGroup(time, $online_interval),\n avg( ((roll-roll_lag) + (comm-comm_lag)) / extract(epoch from (time - time_lag)) )\nfrom (\n select\n time, lag(time) over w as time_lag,\n (data->>'xact_rollback')::int8 as roll, lag((data->>'xact_rollback')::int8) over w as roll_lag,\n (data->>'xact_commit')::int8 as comm, lag((data->>'xact_commit')::int8) over w as comm_lag\n FROM\n db_stats\n WHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\n window w as (order by time)\n) x\nWHERE (comm > comm_lag or roll > roll_lag) and time > time_lag\nGROUP BY 1\nORDER BY 1 DESC\nLIMIT 1\n", + "rawSql": "select\n avg( ((roll-roll_lag) + (comm-comm_lag)) / extract(epoch from (time - time_lag)) )\nfrom (\n select\n time, lag(time) over w as time_lag,\n (data->>'xact_rollback')::int8 as roll, lag((data->>'xact_rollback')::int8) over w as roll_lag,\n (data->>'xact_commit')::int8 as comm, lag((data->>'xact_commit')::int8) over w as comm_lag\n FROM\n db_stats\n WHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\n window w as (order by time)\n) x\nWHERE (comm > comm_lag or roll > roll_lag) and time > time_lag", "refId": "A", "resultFormat": "time_series", "select": [ @@ -1944,7 +1944,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -1965,7 +1965,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "select\n time,\n (data->>'free')::int8\nfrom\n psutil_disk\nwhere \n dbname = '$dbname' and $__timeFilter(time)\n and tag_data->>'dir_or_tablespace' = 'data_directory'\norder by 1 desc\nlimit 1", + "rawSql": "select\n (data->>'free')::int8\nfrom\n psutil_disk\nwhere \n dbname = '$dbname' and $__timeFilter(time)\n and tag_data->>'dir_or_tablespace' = 'data_directory'\norder by 1 desc\nlimit 1", "refId": "A", "resultFormat": "time_series", "select": [ @@ -2082,7 +2082,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -2103,7 +2103,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "select\n$__timeGroup(time, $online_interval),\navg(case when c = c_lag then 0 else (tt-tt_lag)::numeric / (c-c_lag) end) as \"avg_query_runtime\"\nfrom (\n\n select \n (data->>'total_time')::float8 as tt, lag((data->>'total_time')::float8) over w as tt_lag,\n (data->>'calls')::int8 as c, lag((data->>'calls')::int8) over w as c_lag,\n time\n from stat_statements_calls\n where dbname = '$dbname' and $__timeFilter(time)\n window w as (order by time)\n) x\nwhere c >= c_lag and tt >= tt_lag\ngroup by 1\norder by 1 desc\nlimit 1", + "rawSql": "select\navg(case when c = c_lag then 0 else (tt-tt_lag)::numeric / (c-c_lag) end) as \"avg_query_runtime\"\nfrom (\n\n select \n (data->>'total_time')::float8 as tt, lag((data->>'total_time')::float8) over w as tt_lag,\n (data->>'calls')::int8 as c, lag((data->>'calls')::int8) over w as c_lag\n from stat_statements_calls\n where dbname = '$dbname' and $__timeFilter(time)\n window w as (order by time)\n) x\nwhere c >= c_lag and tt >= tt_lag\norder by 1 desc\nlimit 1", "refId": "A", "resultFormat": "time_series", "select": [ @@ -2214,7 +2214,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -2235,7 +2235,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "SELECT\n 0 as time,\n count(*)\nFROM\n configuration_changes\nWHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\n", + "rawSql": "SELECT\n count(*)\nFROM\n configuration_changes\nWHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\n", "refId": "A", "resultFormat": "time_series", "select": [ @@ -2348,7 +2348,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -2369,7 +2369,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "select\n time,\n last_value-first_value as size_diff\nfrom (\n select\n time,\n first_value((data->>'size_b')::int8) over w,\n last_value((data->>'size_b')::int8) over w\n from\n db_size\n where \n dbname = '$dbname' and $__timeFilter(time)\n window w as (\n order by time rows BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING\n )\n) x\norder by 1 desc\nlimit 1", + "rawSql": "select\n last_value-first_value as size_diff\nfrom (\n select\n first_value((data->>'size_b')::int8) over w,\n last_value((data->>'size_b')::int8) over w\n from\n db_size\n where \n dbname = '$dbname' and $__timeFilter(time)\n window w as (\n order by time rows BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING\n )\n) x\norder by 1 desc\nlimit 1", "refId": "A", "resultFormat": "time_series", "select": [ @@ -2490,7 +2490,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -2511,7 +2511,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "SELECT\n time,\n (data->>'is_failing_int')::int\nFROM\n archiver\nWHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\nORDER BY time DESC\nLIMIT 1\n", + "rawSql": "SELECT\n (data->>'is_failing_int')::int\nFROM\n archiver\nWHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\nORDER BY time DESC\nLIMIT 1\n", "refId": "A", "resultFormat": "time_series", "select": [ @@ -2629,7 +2629,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -2650,7 +2650,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "SELECT\n time,\n (data->>'wal_size_b')::float8\nFROM\n wal_size\nWHERE\n time > now() - '$online_interval'::interval\n AND dbname = '$dbname'\nORDER BY time DESC\nLIMIT 1\n", + "rawSql": "SELECT\n (data->>'wal_size_b')::float8\nFROM\n wal_size\nWHERE\n $__timeFilter(time) \n AND dbname = '$dbname'\nORDER BY time DESC\nLIMIT 1\n", "refId": "A", "resultFormat": "time_series", "select": [ @@ -2751,7 +2751,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -2772,7 +2772,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "WITH q_duplicates AS (\nSELECT\n coalesce(sum(count-1), 0) as extra\nFROM (\nSELECT\n tag_data->>'table_full_name' as table_full_name,\n data->>'index_def' as index_def,\n count(*)\nFROM\n index_stats\nWHERE\n time = (select max(time) from index_stats where $__timeFilter(time) AND dbname = '$dbname')\n AND dbname = '$dbname'\nGROUP BY 1, 2\nHAVING count(*) > 1\n) x\n)\nSELECT\n 0 as time,\n sum((data->>'is_invalid_int')::int) + (select extra from q_duplicates)\nFROM\n index_stats\nWHERE\n time = (select max(time) from index_stats where $__timeFilter(time) AND dbname = '$dbname')\n AND dbname = '$dbname'\nGROUP BY 1", + "rawSql": "WITH q_duplicates AS (\nSELECT\n coalesce(sum(count-1), 0) as extra\nFROM (\nSELECT\n tag_data->>'table_full_name' as table_full_name,\n data->>'index_def' as index_def,\n count(*)\nFROM\n index_stats\nWHERE\n time = (select max(time) from index_stats where $__timeFilter(time) AND dbname = '$dbname')\n AND dbname = '$dbname'\nGROUP BY 1, 2\nHAVING count(*) > 1\n) x\n)\nSELECT\n sum((data->>'is_invalid_int')::int) + (select extra from q_duplicates)\nFROM\n index_stats\nWHERE\n time = (select max(time) from index_stats where $__timeFilter(time) AND dbname = '$dbname')\n AND dbname = '$dbname'", "refId": "A", "resultFormat": "time_series", "select": [ @@ -2883,7 +2883,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -2904,7 +2904,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "SELECT\n 0 as time,\n count(*)\nFROM\n table_changes\nWHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\n", + "rawSql": "SELECT\n count(*)\nFROM\n table_changes\nWHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\n", "refId": "A", "resultFormat": "time_series", "select": [ @@ -3021,7 +3021,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -3042,7 +3042,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "SELECT\n 0 as time,\n coalesce(sum(req - req_lag), 0)\nFROM (\nSELECT\n (data->>'checkpoints_req')::int as req,\n lag((data->>'checkpoints_req')::int) over(order by time) as req_lag\nFROM\n bgwriter\nWHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\n) x\nWHERE req > req_lag\n", + "rawSql": "SELECT\n coalesce(sum(req - req_lag), 0)\nFROM (\nSELECT\n (data->>'checkpoints_req')::int as req,\n lag((data->>'checkpoints_req')::int) over(order by time) as req_lag\nFROM\n bgwriter\nWHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\n) x\nWHERE req > req_lag\n", "refId": "A", "resultFormat": "time_series", "select": [ @@ -3149,7 +3149,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -3170,7 +3170,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "SELECT\n time,\n (data->>'approx_table_bloat_b')::int8\nFROM\n table_bloat_approx_summary_sql\nWHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\nORDER BY 1 DESC\nLIMIT 1\n", + "rawSql": "SELECT\n (data->>'approx_table_bloat_b')::int8\nFROM\n table_bloat_approx_summary_sql\nWHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\nORDER BY 1 DESC\nLIMIT 1\n", "refId": "A", "resultFormat": "time_series", "select": [ @@ -3282,7 +3282,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -3303,7 +3303,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "select\n 0 as time,\n avg((wal-wal_lag) / (etime-lag_etime)) as \"WAL rate\"\nfrom (\n select \n (data->>'xlog_location_b')::int8 as wal, lag((data->>'xlog_location_b')::int8) over w as wal_lag,\n extract(epoch from time) as etime,\n lag(extract(epoch from time)) over w as lag_etime,\n time\n from wal\n where dbname = '$dbname' and $__timeFilter(time)\n window w as (order by time)\n) x\nwhere wal >= wal_lag and etime > lag_etime", + "rawSql": "select\n avg((wal-wal_lag) / (etime-lag_etime)) as \"WAL rate\"\nfrom (\n select \n (data->>'xlog_location_b')::int8 as wal, lag((data->>'xlog_location_b')::int8) over w as wal_lag,\n extract(epoch from time) as etime,\n lag(extract(epoch from time)) over w as lag_etime,\n time\n from wal\n where dbname = '$dbname' and $__timeFilter(time)\n window w as (order by time)\n) x\nwhere wal >= wal_lag and etime > lag_etime", "refId": "A", "resultFormat": "time_series", "select": [ @@ -3966,7 +3966,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -3987,7 +3987,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "select\n 0 as time,\n avg(case when tb-tb_lag > 0 then (tb-tb_lag) / (etime - lag_etime) else 0 end) as \"Temp bytes (1h rate)\"\nfrom (\n select \n (data->>'temp_bytes')::int8 as tb, lag((data->>'temp_bytes')::int8) over w as tb_lag,\n (extract(epoch from time))::int8 as etime,\n (lag(extract(epoch from time)) over w)::int8 as lag_etime\n from db_stats\n where dbname = '$dbname' and $__timeFilter(time)\n window w as (order by time)\n) x\nwhere tb >= tb_lag and etime > lag_etime\n", + "rawSql": "select\n avg(case when tb-tb_lag > 0 then (tb-tb_lag) / (etime - lag_etime) else 0 end) as \"Temp bytes (1h rate)\"\nfrom (\n select \n (data->>'temp_bytes')::int8 as tb, lag((data->>'temp_bytes')::int8) over w as tb_lag,\n (extract(epoch from time))::int8 as etime,\n (lag(extract(epoch from time)) over w)::int8 as lag_etime\n from db_stats\n where dbname = '$dbname' and $__timeFilter(time)\n window w as (order by time)\n) x\nwhere tb >= tb_lag and etime > lag_etime\n", "refId": "A", "resultFormat": "time_series", "select": [ @@ -4106,7 +4106,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -4127,7 +4127,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "select\n time,\n avg(((del-del_lag) * 60) / extract(epoch from time - time_lag))\nfrom (\n select \n (data->>'tup_deleted')::int8 as del, lag((data->>'tup_deleted')::int8) over w as del_lag,\n time, lag(time) over w as time_lag\n from db_stats\n where dbname = '$dbname' and $__timeFilter(time)\n window w as (order by time)\n) x\nwhere del >= del_lag and time > time_lag\ngroup by 1\norder by 1", + "rawSql": "select\n avg(((del-del_lag) * 60) / extract(epoch from time - time_lag))\nfrom (\n select \n (data->>'tup_deleted')::int8 as del, lag((data->>'tup_deleted')::int8) over w as del_lag,\n time, lag(time) over w as time_lag\n from db_stats\n where dbname = '$dbname' and $__timeFilter(time)\n window w as (order by time)\n) x\nwhere del >= del_lag and time > time_lag\norder by 1", "refId": "A", "resultFormat": "time_series", "select": [ @@ -4244,7 +4244,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -4265,7 +4265,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "SELECT\n 0 as time,\n max((data->>'backup_duration_s')::int8)\nFROM\n db_stats\nWHERE\n $__timeFilter(time)\n and dbname = '$dbname'", + "rawSql": "SELECT\n max((data->>'backup_duration_s')::int8)\nFROM\n db_stats\nWHERE\n $__timeFilter(time)\n and dbname = '$dbname'", "refId": "A", "resultFormat": "time_series", "select": [ @@ -4376,7 +4376,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -4397,7 +4397,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "SELECT\n 0 as time,\n max((data->>'tx_freeze_age')::int8)\nFROM\n table_stats\nWHERE\n $__timeFilter(time)\n and dbname = '$dbname'", + "rawSql": "SELECT\n max((data->>'tx_freeze_age')::int8)\nFROM\n table_stats\nWHERE\n $__timeFilter(time)\n and dbname = '$dbname'", "refId": "A", "resultFormat": "time_series", "select": [ @@ -4510,7 +4510,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -4531,7 +4531,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "select\n time,\n avg(((upd-upd_lag) * 60) / extract(epoch from time - time_lag))\nfrom (\n select \n (data->>'tup_updated')::int8 as upd, lag((data->>'tup_updated')::int8) over w as upd_lag,\n time, lag(time) over w as time_lag\n from db_stats\n where dbname = '$dbname' and $__timeFilter(time)\n window w as (order by time)\n) x\nwhere upd >= upd_lag and time > time_lag\ngroup by 1\norder by 1", + "rawSql": "select\n avg(((upd-upd_lag) * 60) / extract(epoch from time - time_lag))\nfrom (\n select \n (data->>'tup_updated')::int8 as upd, lag((data->>'tup_updated')::int8) over w as upd_lag,\n time, lag(time) over w as time_lag\n from db_stats\n where dbname = '$dbname' and $__timeFilter(time)\n window w as (order by time)\n) x\nwhere upd >= upd_lag and time > time_lag\norder by 1", "refId": "A", "resultFormat": "time_series", "select": [ @@ -4655,7 +4655,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -4676,7 +4676,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "SELECT\n 0 as time,\n sum((data->>'non_active_int')::int)\nFROM\n replication_slots\nWHERE\n time = (select max(time) from replication_slots where time > now() - '$online_interval'::interval AND dbname = '$dbname')\n AND dbname = '$dbname'\n", + "rawSql": "SELECT\n sum((data->>'non_active_int')::int)\nFROM\n replication_slots\nWHERE\n time = (select max(time) from replication_slots where $__timeFilter(time) AND dbname = '$dbname')\n AND dbname = '$dbname'\n", "refId": "A", "resultFormat": "time_series", "select": [ @@ -4788,7 +4788,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -4809,7 +4809,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "SELECT\n 0 as time,\n max((data->>'replay_lag_b')::int8)\nFROM\n replication\nWHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\n", + "rawSql": "SELECT\n max((data->>'replay_lag_b')::int8)\nFROM\n replication\nWHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\n", "refId": "A", "resultFormat": "time_series", "select": [ @@ -4921,7 +4921,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -4942,7 +4942,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "select\n 0 as time,\n max(xmin) from (\nSELECT\n max((data->>'xmin_age_tx')::int8) as xmin\nFROM\n replication_slots\nWHERE\n time = (select max(time) from replication_slots where time > now() - '$online_interval'::interval AND dbname = '$dbname')\n and dbname = '$dbname' \nUNION ALL\nSELECT\n max((data->>'max_xmin_age_tx')::int8) as xmin\nFROM\n backends\nWHERE\n time = (select max(time) from backends where time > now() - '$online_interval'::interval AND dbname = '$dbname')\n and dbname = '$dbname'\n) x", + "rawSql": "select\n max(xmin) from (\nSELECT\n max((data->>'xmin_age_tx')::int8) as xmin\nFROM\n replication_slots\nWHERE\n time = (select max(time) from replication_slots where $__timeFilter(time) AND dbname = '$dbname')\n and dbname = '$dbname' \nUNION ALL\nSELECT\n max((data->>'max_xmin_age_tx')::int8) as xmin\nFROM\n backends\nWHERE\n time = (select max(time) from backends where $__timeFilter(time) AND dbname = '$dbname')\n and dbname = '$dbname'\n) x", "refId": "A", "resultFormat": "time_series", "select": [ @@ -5053,47 +5053,6 @@ "refresh": 1, "regex": "", "type": "query" - }, - { - "auto": false, - "auto_count": 30, - "auto_min": "10s", - "current": { - "text": "10m", - "value": "10m" - }, - "label": "Max. age for 'online' metrics", - "name": "online_interval", - "options": [ - { - "selected": false, - "text": "1m", - "value": "1m" - }, - { - "selected": false, - "text": "3m", - "value": "3m" - }, - { - "selected": false, - "text": "5m", - "value": "5m" - }, - { - "selected": true, - "text": "10m", - "value": "10m" - }, - { - "selected": false, - "text": "15m", - "value": "15m" - } - ], - "query": "1m,3m,5m,10m,15m", - "refresh": 2, - "type": "interval" } ] }, From 2f604090058349decebcb9902e867379bf099481 Mon Sep 17 00:00:00 2001 From: 0xgouda Date: Mon, 1 Dec 2025 19:05:41 +0200 Subject: [PATCH 2/5] Display `dbname` as `Source Name`. --- grafana/postgres/v12/0-health-check.json | 1 + 1 file changed, 1 insertion(+) diff --git a/grafana/postgres/v12/0-health-check.json b/grafana/postgres/v12/0-health-check.json index c3b64f3c7..166fbd672 100644 --- a/grafana/postgres/v12/0-health-check.json +++ b/grafana/postgres/v12/0-health-check.json @@ -5048,6 +5048,7 @@ "definition": "", "includeAll": false, "name": "dbname", + "label": "Source Name", "options": [], "query": "SELECT DISTINCT dbname FROM admin.all_distinct_dbname_metrics ORDER BY 1;", "refresh": 1, From a993aff1417066424e48bb10e9826f7a97879797 Mon Sep 17 00:00:00 2001 From: 0xgouda Date: Mon, 1 Dec 2025 19:51:28 +0200 Subject: [PATCH 3/5] Remove `time` field selection from `Shared Buffers hit pct.` panel. --- grafana/postgres/v12/0-health-check.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grafana/postgres/v12/0-health-check.json b/grafana/postgres/v12/0-health-check.json index 166fbd672..26ca85966 100644 --- a/grafana/postgres/v12/0-health-check.json +++ b/grafana/postgres/v12/0-health-check.json @@ -1020,7 +1020,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "select\n time,\n ((hit-hit_lag)::numeric / ((hit-hit_lag) + (read-read_lag)))*100 as \"Shared buffers hit ratio\"\nfrom (\n select \n (data->>'blks_hit')::int8 as hit, lag((data->>'blks_hit')::int8) over w as hit_lag,\n (data->>'blks_read')::int8 as read, lag((data->>'blks_read')::int8) over w as read_lag,\n (data->>'xact_rollback')::int8 as roll, lag((data->>'xact_rollback')::int8) over w as roll_lag,\n (data->>'xact_commit')::int8 as comm, lag((data->>'xact_commit')::int8) over w as comm_lag,\n time\n from db_stats\n where dbname = '$dbname' and $__timeFilter(time)\n window w as (order by time)\n) x\nwhere hit > hit_lag or read > read_lag\norder by 1", + "rawSql": "select\n ((hit-hit_lag)::numeric / ((hit-hit_lag) + (read-read_lag)))*100 as \"Shared buffers hit ratio\"\nfrom (\n select \n (data->>'blks_hit')::int8 as hit, lag((data->>'blks_hit')::int8) over w as hit_lag,\n (data->>'blks_read')::int8 as read, lag((data->>'blks_read')::int8) over w as read_lag,\n (data->>'xact_rollback')::int8 as roll, lag((data->>'xact_rollback')::int8) over w as roll_lag,\n (data->>'xact_commit')::int8 as comm, lag((data->>'xact_commit')::int8) over w as comm_lag,\n time\n from db_stats\n where dbname = '$dbname' and $__timeFilter(time)\n window w as (order by time)\n) x\nwhere hit > hit_lag or read > read_lag\norder by 1", "refId": "A", "resultFormat": "time_series", "select": [ From c057355a8706dd424ce97762f0b8b727abef7dc4 Mon Sep 17 00:00:00 2001 From: 0xgouda Date: Mon, 1 Dec 2025 20:18:58 +0200 Subject: [PATCH 4/5] Migrate more panels to `table format`. --- grafana/postgres/v12/0-health-check.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/grafana/postgres/v12/0-health-check.json b/grafana/postgres/v12/0-health-check.json index 26ca85966..35f864bc4 100644 --- a/grafana/postgres/v12/0-health-check.json +++ b/grafana/postgres/v12/0-health-check.json @@ -878,7 +878,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "SELECT max((data->>'waiting')::int)\nFROM backends\nWHERE $__timeFilter(time, $online_interval) AND dbname = '$dbname'", + "rawSql": "SELECT max((data->>'waiting')::int)\nFROM backends\nWHERE $__timeFilter(time) AND dbname = '$dbname'", "refId": "A", "resultFormat": "time_series", "select": [ @@ -3544,7 +3544,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -3565,7 +3565,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "SELECT\n 0 as time,\n max((data->>'longest_autovacuum_seconds')::int8) as longest_autovacuum_seconds\nFROM\n backends\nWHERE\n $__timeFilter(time)\n AND dbname = '$dbname'", + "rawSql": "SELECT\n max((data->>'longest_autovacuum_seconds')::int8) as longest_autovacuum_seconds\nFROM\n backends\nWHERE\n $__timeFilter(time)\n AND dbname = '$dbname'", "refId": "A", "resultFormat": "time_series", "select": [ @@ -3682,7 +3682,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -3703,7 +3703,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "SELECT\n time,\n sum((scan-scan_lag) * 60 / extract(epoch from (time-time_lag)))\nFROM (\n SELECT\n time, lag(time) over w as time_lag,\n (data->>'seq_scan')::int8 as scan, lag((data->>'seq_scan')::int8) over w as scan_lag\n FROM\n table_stats\n WHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\n AND (data->>'table_size_b')::int8 > 100000000\n WINDOW w AS (partition by tag_data->>'table_full_name' order by time)\n) x\nWHERE scan > scan_lag and time > time_lag\nGROUP BY 1\nORDER BY 1", + "rawSql": "SELECT\n sum((scan-scan_lag) * 60 / extract(epoch from (time-time_lag)))\nFROM (\n SELECT\n time, lag(time) over w as time_lag,\n (data->>'seq_scan')::int8 as scan, lag((data->>'seq_scan')::int8) over w as scan_lag\n FROM\n table_stats\n WHERE\n $__timeFilter(time)\n AND dbname = '$dbname'\n AND (data->>'table_size_b')::int8 > 100000000\n WINDOW w AS (partition by tag_data->>'table_full_name' order by time)\n) x\nWHERE scan > scan_lag and time > time_lag", "refId": "A", "resultFormat": "time_series", "select": [ @@ -3822,7 +3822,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "format": "time_series", + "format": "table", "group": [], "groupBy": [ { @@ -3843,7 +3843,7 @@ "orderByTime": "ASC", "policy": "default", "rawQuery": true, - "rawSql": "select\n time,\n avg(((ins-ins_lag) * 60) / extract(epoch from time - time_lag))\nfrom (\n select \n (data->>'tup_inserted')::int8 as ins, lag((data->>'tup_inserted')::int8) over w as ins_lag,\n time, lag(time) over w as time_lag\n from db_stats\n where dbname = '$dbname' and $__timeFilter(time)\n window w as (order by time)\n) x\nwhere ins >= ins_lag and time > time_lag\ngroup by 1\norder by 1", + "rawSql": "select\n avg(((ins-ins_lag) * 60) / extract(epoch from time - time_lag))\nfrom (\n select \n (data->>'tup_inserted')::int8 as ins, lag((data->>'tup_inserted')::int8) over w as ins_lag,\n time, lag(time) over w as time_lag\n from db_stats\n where dbname = '$dbname' and $__timeFilter(time)\n window w as (order by time)\n) x\nwhere ins >= ins_lag and time > time_lag", "refId": "A", "resultFormat": "time_series", "select": [ From a90172a4af9a132ac9af9438e391b02f039ab6b0 Mon Sep 17 00:00:00 2001 From: 0xgouda Date: Tue, 2 Dec 2025 17:19:20 +0200 Subject: [PATCH 5/5] remove `timeFrom: $online_interval` field from all panels. --- grafana/postgres/v12/0-health-check.json | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/grafana/postgres/v12/0-health-check.json b/grafana/postgres/v12/0-health-check.json index 35f864bc4..9c407e21f 100644 --- a/grafana/postgres/v12/0-health-check.json +++ b/grafana/postgres/v12/0-health-check.json @@ -152,7 +152,6 @@ ] } ], - "timeFrom": "$online_interval", "title": "Instance state", "type": "stat" }, @@ -285,7 +284,6 @@ ] } ], - "timeFrom": "$online_interval", "title": "Instance uptime", "type": "stat" }, @@ -428,7 +426,6 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "description": "Longest query duration during last $online_interval", "fieldConfig": { "defaults": { "decimals": 0, @@ -552,7 +549,6 @@ ] } ], - "timeFrom": "$online_interval", "title": "Longest query runtime", "type": "stat" }, @@ -692,7 +688,6 @@ ] } ], - "timeFrom": "$online_interval", "title": "Active connections", "type": "stat" }, @@ -912,7 +907,6 @@ ] } ], - "timeFrom": "$online_interval", "title": "Blocked sessions", "type": "stat" }, @@ -1336,7 +1330,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "description": "Queries per Second based on \"pg_stat_statements\" extension info. Last $online_interval avg. < 0.1 Error / < 1 Warning thresholds by default", + "description": "Queries per Second based on \"pg_stat_statements\" extension info. < 0.1 Error / < 1 Warning thresholds by default", "fieldConfig": { "defaults": { "decimals": 1, @@ -1599,7 +1593,6 @@ ] } ], - "timeFrom": "$online_interval", "title": "\"Idle in TX\" count", "type": "stat" }, @@ -1736,7 +1729,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "description": "Transactions per Second. Last $online_interval average. <0.1 % Error / < 1.0 Warn thresholds by default", + "description": "Transactions per Second. <0.1 % Error / < 1.0 Warn thresholds by default", "fieldConfig": { "defaults": { "decimals": 1, @@ -2007,7 +2000,7 @@ "type": "grafana-postgresql-datasource", "uid": "pgwatch-metrics" }, - "description": "Last $online_interval avg. based on \"pg_stat_statements\" info. > 0.5s Warning / > 5s Error thresholds by default", + "description": "Average query runtime based on \"pg_stat_statements\" info. > 0.5s Warning / > 5s Error thresholds by default", "fieldConfig": { "defaults": { "decimals": 1, @@ -2545,7 +2538,6 @@ ] } ], - "timeFrom": "$online_interval", "title": "WAL archiving status", "type": "stat" }, @@ -4299,7 +4291,6 @@ ] } ], - "timeFrom": "$online_interval", "title": "Backup duration", "type": "stat" }, @@ -4704,7 +4695,6 @@ ] } ], - "timeFrom": "$online_interval", "title": "Inactive repl. slots", "type": "stat" }, @@ -4837,7 +4827,6 @@ ] } ], - "timeFrom": "$online_interval", "title": "Max. replication lag", "type": "stat" },