Skip to content

Commit a3ebb38

Browse files
authored
[!] add Grafana v12 dashboards for Prometheus data source (#933)
* [!] add Grafana v12 dashboards for Prometheus data source Add Prometheus dashboard equivalents for PostgreSQL monitoring Created a comprehensive set of 12 Grafana dashboards that use Prometheus as the data source, providing equivalent functionality to the existing PostgreSQL dashboards. The new dashboards translate SQL queries to PromQL while maintaining all monitoring capabilities. New dashboards include: - Global database overview with connections, QPS, TPS, and query runtime - Query performance analysis with top queries by time and calls - Table activity monitoring with scans, modifications, and sizes - Replication monitoring with WAL activity and status tracking - Performance recommendations for indexes, queries, and configuration - Stored procedures monitoring with call statistics and performance - Statement analysis dashboards for calls and execution time - System resource monitoring for CPU, memory, and disk usage All dashboards feature: - Proper PromQL translations using rate() functions for counters - Consistent template variables for database selection and time intervals - Table transformations to join metrics by common identifiers - Appropriate units and thresholds for monitoring PostgreSQL systems This enables users who prefer Prometheus as their metrics backend to have the same comprehensive PostgreSQL monitoring capabilities that were previously only available with direct PostgreSQL connections. * [-] fix "Connections Overview" panel in "Global Overview dashboard" * [+] enable both dashboard sets Postgres and Prometheus in docker compose * [-] fix Connections Overview promql
1 parent 9e3ffca commit a3ebb38

21 files changed

+12022
-31
lines changed

docker/compose.grafana.yml

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ services:
66
user: "0:0"
77
environment:
88
GF_AUTH_ANONYMOUS_ENABLED: true
9-
GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH: /var/lib/grafana/dashboards/1-global-db-overview.json
9+
GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH: /var/lib/grafana/dashboards/postgres/1-global-db-overview.json
1010
GF_INSTALL_PLUGINS: marcusolsson-treemap-panel
1111
GF_AUTH_ANONYMOUS_ORG_ROLE: Admin
1212
# GF_FEATURE_TOGGLES_ENABLE: dashboardNewLayouts
@@ -17,14 +17,10 @@ services:
1717
- "../grafana/dashboards.yml:/etc/grafana/provisioning/dashboards/pgwatch_dashboards.yml"
1818
# Uncomment the datasource version you want to use
1919
- "../grafana/postgres_datasource.yml:/etc/grafana/provisioning/datasources/postgres_datasource.yml"
20-
# - "../grafana/prometheus_datasource.yml:/etc/grafana/provisioning/datasources/prometheus_datasource.yml"
20+
- "../grafana/prometheus_datasource.yml:/etc/grafana/provisioning/datasources/prometheus_datasource.yml"
2121
# Uncomment the dashboard version you want to use and comment out the other one.
22-
# - "../grafana/postgres/v10:/var/lib/grafana/dashboards"
23-
# - "../grafana/postgres/v11:/var/lib/grafana/dashboards"
24-
- "../grafana/postgres/v12:/var/lib/grafana/dashboards"
25-
# - "../grafana/prometheus/v10:/var/lib/grafana/dashboards"
26-
# - "../grafana/prometheus/v11:/var/lib/grafana/dashboards"
27-
# - "../grafana/prometheus/v12:/var/lib/grafana/dashboards"
22+
- "../grafana/postgres/v12:/var/lib/grafana/dashboards/postgres"
23+
- "../grafana/prometheus/v12:/var/lib/grafana/dashboards/prometheus"
2824
depends_on:
2925
postgres:
3026
condition: service_healthy

grafana/dashboards.yml

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,24 @@
11
apiVersion: 1
22

33
providers:
4-
- name: 'default'
4+
- name: 'postgres-dashboards'
55
orgId: 1
6-
folder: ''
6+
folder: 'pgwatch (postgres)'
77
type: 'file'
88
disableDeletion: false
9-
updateIntervalSeconds: 10 #how often Grafana will scan for changed dashboards
9+
allowUiUpdates: true
10+
editable: true
11+
updateIntervalSeconds: 10
1012
options:
11-
path: /var/lib/grafana/dashboards
13+
path: /var/lib/grafana/dashboards/postgres
14+
15+
- name: 'prometheus-dashboards'
16+
orgId: 1
17+
folder: 'pgwatch (prometheus)'
18+
type: 'file'
19+
disableDeletion: false
20+
allowUiUpdates: true
21+
editable: true
22+
updateIntervalSeconds: 10
23+
options:
24+
path: /var/lib/grafana/dashboards/prometheus

grafana/postgres/v12/1-global-db-overview.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
"type": "grafana-postgresql-datasource",
3333
"uid": "pgwatch-metrics"
3434
},
35-
"description": "- Total number of sessions established to database(s). \n- Number of database sessions that were terminated because connection to the client was lost.\n- Number of database sessions that were terminated by fatal errors.\n- Number of database sessions that were terminated by operator intervention.",
35+
"description": "Number of new database sessions established per monitored source over time. Each line represents a different monitored database/source.",
3636
"fieldConfig": {
3737
"defaults": {
3838
"color": {
@@ -114,9 +114,9 @@
114114
"targets": [
115115
{
116116
"editorMode": "code",
117-
"format": "table",
117+
"format": "time_series",
118118
"rawQuery": true,
119-
"rawSql": "with sessions as (\r\n SELECT \r\n $__timeGroup(time, $agg_interval),\r\n (data->>'sessions')::int8 as sessions,\r\n lag((data->>'sessions')::int8) over w as lag_sessions,\r\n (data->>'sessions_abandoned')::int8 as sessions_abandoned,\r\n lag((data->>'sessions_abandoned')::int8) over w as lag_sessions_abandoned,\r\n (data->>'sessions_fatal')::int8 as sessions_fatal,\r\n lag((data->>'sessions_fatal')::int8) over w as lag_sessions_fatal,\r\n (data->>'sessions_killed')::int8 as sessions_killed,\r\n lag((data->>'sessions_killed')::int8) over w as lag_sessions_killed\r\nfrom db_stats \r\nwhere dbname in ($dbname) and $__timeFilter(time)\r\nwindow w as (order by time)\r\n)\r\nselect \r\n time,\r\n sum(sessions)-sum(lag_sessions) as established,\r\n sum(sessions_abandoned)-sum(lag_sessions_abandoned) as abandoned,\r\n sum(sessions_fatal)-sum(lag_sessions_fatal) as fatal,\r\n sum(sessions_killed)-sum(lag_sessions_killed) as killed\r\nfrom sessions \r\ngroup by time\r\norder by 1",
119+
"rawSql": "with session_changes as (\r\n SELECT \r\n dbname,\r\n time,\r\n coalesce((data->>'sessions')::int8 - lag((data->>'sessions')::int8) over w, 0) as established\r\nfrom db_stats \r\nwhere dbname in ($dbname) and $__timeFilter(time)\r\nwindow w as (partition by dbname order by time)\r\n)\r\nselect \r\n $__timeGroup(time, $agg_interval),\r\n sum(established) as value,\r\n dbname as metric\r\nfrom session_changes\r\ngroup by 1, dbname\r\norder by 1, dbname",
120120
"refId": "A",
121121
"sql": {
122122
"columns": [

0 commit comments

Comments
 (0)