Added new postgres charts and updated standby charts to include slot_… (#11267)
gizzardqueen committed
Jun 21, 2021 at 09:32 UTC
77c07842b1111576f521e8ee23fe0494202f31d6
2 files changed
+107
-11
collectors/python.d.plugin/postgres/postgres.chart.py
+88
-11
@@ -55,6 +55,8 @@ QUERY_NAME_REPSLOT_FILES = 'REPSLOT_FILES'
55
QUERY_NAME_IF_SUPERUSER = 'IF_SUPERUSER'
56
QUERY_NAME_SERVER_VERSION = 'SERVER_VERSION'
57
QUERY_NAME_AUTOVACUUM = 'AUTOVACUUM'
58
+QUERY_NAME_FORCED_AUTOVACUUM = 'FORCED_AUTOVACUUM'
59
+QUERY_NAME_TX_WRAPAROUND = 'TX_WRAPAROUND'
60
QUERY_NAME_DIFF_LSN = 'DIFF_LSN'
61
QUERY_NAME_WAL_WRITES = 'WAL_WRITES'
62
@@ -135,6 +137,13 @@ METRICS = {
137
'vacuum_freeze',
138
'brin_summarize'
139
],
140
+ QUERY_NAME_FORCED_AUTOVACUUM: [
141
+ 'percent_towards_forced_vacuum'
142
+ ],
143
+ QUERY_NAME_TX_WRAPAROUND: [
144
+ 'oldest_current_xid',
145
+ 'percent_towards_wraparound'
146
+ ],
147
QUERY_NAME_STANDBY_DELTA: [
148
'sent_delta',
149
'write_delta',
@@ -453,10 +462,10 @@ WHERE
462
QUERY_STANDBY = {
463
DEFAULT: """
464
SELECT
456
- application_name
457
-FROM pg_stat_replication
458
-WHERE application_name IS NOT NULL
459
-GROUP BY application_name;
465
+ COALESCE(prs.slot_name, psr.application_name) application_name
466
+FROM pg_stat_replication psr
467
+LEFT OUTER JOIN pg_replication_slots prs on psr.pid = prs.active_pid
468
+WHERE application_name IS NOT NULL;
469
""",
470
}
471
@@ -470,7 +479,7 @@ FROM pg_replication_slots;
479
QUERY_STANDBY_DELTA = {
480
DEFAULT: """
481
SELECT
473
- application_name,
482
+ COALESCE(prs.slot_name, psr.application_name) application_name,
483
pg_wal_lsn_diff(
484
CASE pg_is_in_recovery()
485
WHEN true THEN pg_last_wal_receive_lsn()
@@ -495,12 +504,13 @@ SELECT
504
ELSE pg_current_wal_lsn()
505
END,
506
replay_lsn) AS replay_delta
498
-FROM pg_stat_replication
507
+FROM pg_stat_replication psr
508
+LEFT OUTER JOIN pg_replication_slots prs on psr.pid = prs.active_pid
509
WHERE application_name IS NOT NULL;
510
""",
511
V96: """
512
SELECT
503
- application_name,
513
+ COALESCE(prs.slot_name, psr.application_name) application_name,
514
pg_xlog_location_diff(
515
CASE pg_is_in_recovery()
516
WHEN true THEN pg_last_xlog_receive_location()
@@ -525,7 +535,8 @@ SELECT
535
ELSE pg_current_xlog_location()
536
END,
537
replay_location) AS replay_delta
528
-FROM pg_stat_replication
538
+FROM pg_stat_replication psr
539
+LEFT OUTER JOIN pg_replication_slots prs on psr.pid = prs.active_pid
540
WHERE application_name IS NOT NULL;
541
""",
542
}
@@ -533,11 +544,12 @@ WHERE application_name IS NOT NULL;
544
QUERY_STANDBY_LAG = {
545
DEFAULT: """
546
SELECT
536
- application_name,
547
+ COALESCE(prs.slot_name, psr.application_name) application_name,
548
COALESCE(EXTRACT(EPOCH FROM write_lag)::bigint, 0) AS write_lag,
549
COALESCE(EXTRACT(EPOCH FROM flush_lag)::bigint, 0) AS flush_lag,
550
COALESCE(EXTRACT(EPOCH FROM replay_lag)::bigint, 0) AS replay_lag
540
-FROM pg_stat_replication
551
+FROM pg_stat_replication psr
552
+LEFT OUTER JOIN pg_replication_slots prs on psr.pid = prs.active_pid
553
WHERE application_name IS NOT NULL;
554
"""
555
}
@@ -650,6 +662,43 @@ WHERE query NOT LIKE '%%pg_stat_activity%%';
662
""",
663
}
664
665
+QUERY_FORCED_AUTOVACUUM = {
666
+ DEFAULT: """
667
+WITH max_age AS (
668
+ SELECT setting AS autovacuum_freeze_max_age
669
+ FROM pg_catalog.pg_settings
670
+ WHERE name = 'autovacuum_freeze_max_age' )
671
+, per_database_stats AS (
672
+ SELECT datname
673
+ , m.autovacuum_freeze_max_age::int
674
+ , age(d.datfrozenxid) AS oldest_current_xid
675
+ FROM pg_catalog.pg_database d
676
+ JOIN max_age m ON (true)
677
+ WHERE d.datallowconn )
678
+SELECT max(ROUND(100*(oldest_current_xid/autovacuum_freeze_max_age::float))) AS percent_towards_forced_autovacuum
679
+FROM per_database_stats;
680
+""",
681
+}
682
+
683
+QUERY_TX_WRAPAROUND = {
684
+ DEFAULT: """
685
+WITH max_age AS (
686
+ SELECT 2000000000 as max_old_xid
687
+ FROM pg_catalog.pg_settings
688
+ WHERE name = 'autovacuum_freeze_max_age' )
689
+, per_database_stats AS (
690
+ SELECT datname
691
+ , m.max_old_xid::int
692
+ , age(d.datfrozenxid) AS oldest_current_xid
693
+ FROM pg_catalog.pg_database d
694
+ JOIN max_age m ON (true)
695
+ WHERE d.datallowconn )
696
+SELECT max(oldest_current_xid) AS oldest_current_xid
697
+ , max(ROUND(100*(oldest_current_xid/max_old_xid::float))) AS percent_towards_wraparound
698
+FROM per_database_stats;
699
+""",
700
+}
701
+
702
QUERY_DIFF_LSN = {
703
DEFAULT: """
704
SELECT
@@ -712,6 +761,10 @@ def query_factory(name, version=NO_VERSION):
761
return QUERY_SHOW_VERSION[DEFAULT]
762
elif name == QUERY_NAME_AUTOVACUUM:
763
return QUERY_AUTOVACUUM[DEFAULT]
764
+ elif name == QUERY_NAME_FORCED_AUTOVACUUM:
765
+ return QUERY_FORCED_AUTOVACUUM[DEFAULT]
766
+ elif name == QUERY_NAME_TX_WRAPAROUND:
767
+ return QUERY_TX_WRAPAROUND[DEFAULT]
768
elif name == QUERY_NAME_WAL:
769
if version < 100000:
770
return QUERY_WAL[V96]
@@ -767,7 +820,10 @@ ORDER = [
820
'replication_slot',
821
'standby_delta',
822
'standby_lag',
770
- 'autovacuum'
823
+ 'autovacuum',
824
+ 'forced_autovacuum',
825
+ 'tx_wraparound_oldest_current_xid',
826
+ 'tx_wraparound_percent_towards_wraparound'
827
]
828
829
CHARTS = {
@@ -954,6 +1010,24 @@ CHARTS = {
1010
['brin_summarize', 'brin summarize', 'absolute']
1011
]
1012
},
1013
+ 'forced_autovacuum': {
1014
+ 'options': [None, 'Percent towards forced autovacuum', 'percent', 'autovacuum', 'postgres.forced_autovacuum', 'line'],
1015
+ 'lines': [
1016
+ ['percent_towards_forced_autovacuum', 'percent', 'absolute']
1017
+ ]
1018
+ },
1019
+ 'tx_wraparound_oldest_current_xid': {
1020
+ 'options': [None, 'Oldest current XID', 'xid', 'tx_wraparound', 'postgres.tx_wraparound_oldest_current_xid', 'line'],
1021
+ 'lines': [
1022
+ ['oldest_current_xid', 'xid', 'absolute']
1023
+ ]
1024
+ },
1025
+ 'tx_wraparound_percent_towards_wraparound': {
1026
+ 'options': [None, 'Percent towards wraparound', 'percent', 'tx_wraparound', 'postgres.percent_towards_wraparound', 'line'],
1027
+ 'lines': [
1028
+ ['percent_towards_wraparound', 'percent', 'absolute']
1029
+ ]
1030
+ },
1031
'standby_delta': {
1032
'options': [None, 'Standby delta', 'KiB', 'replication delta', 'postgres.standby_delta', 'line'],
1033
'lines': [
@@ -1180,6 +1254,9 @@ class Service(SimpleService):
1254
if self.server_version >= 90400:
1255
self.queries[query_factory(QUERY_NAME_AUTOVACUUM)] = METRICS[QUERY_NAME_AUTOVACUUM]
1256
1257
+ self.queries[query_factory(QUERY_NAME_FORCED_AUTOVACUUM)] = METRICS[QUERY_NAME_FORCED_AUTOVACUUM]
1258
+ self.queries[query_factory(QUERY_NAME_TX_WRAPAROUND)] = METRICS[QUERY_NAME_TX_WRAPAROUND]
1259
+
1260
if self.server_version >= 100000:
1261
self.queries[query_factory(QUERY_NAME_STANDBY_LAG)] = METRICS[QUERY_NAME_STANDBY_LAG]
1262
web/gui/dashboard_info.js
+19
@@ -1684,6 +1684,25 @@ netdataDashboard.context = {
1684
'Assuming non-superuser accounts are being used to connect to Postgres (so <i>superuser_reserved_connections</i> are subtracted from <i>max_connections</i>).<br/>' +
1685
'For more information see <a href="https://www.postgresql.org/docs/current/runtime-config-connection.html" target="_blank">Connections and Authentication</a>.'
1686
},
1687
+ 'postgres.forced_autovacuum': {
1688
+ info: 'Percent towards forced autovacuum for one or more tables.<ul>' +
1689
+ '<li><strong>percent_towards_forced_autovacuum:</strong> a forced autovacuum will run once this value reaches 100.</li>' +
1690
+ '</ul>' +
1691
+ 'For more information see <a href="https://www.postgresql.org/docs/current/routine-vacuuming.html" target="_blank">Preventing Transaction ID Wraparound Failures</a>.'
1692
+ },
1693
+ 'postgres.tx_wraparound_oldest_current_xid': {
1694
+ info: 'The oldest current transaction id (xid).<ul>' +
1695
+ '<li><strong>oldest_current_xid:</strong> oldest current transaction id.</li>' +
1696
+ '</ul>' +
1697
+ 'If for some reason autovacuum fails to clear old XIDs from a table, the system will begin to emit warning messages when the database\'s oldest XIDs reach eleven million transactions from the wraparound point.<br/>' +
1698
+ 'For more information see <a href="https://www.postgresql.org/docs/current/routine-vacuuming.html" target="_blank">Preventing Transaction ID Wraparound Failures</a>.'
1699
+ },
1700
+ 'postgres.percent_towards_wraparound': {
1701
+ info: 'Percent towards transaction wraparound.<ul>' +
1702
+ '<li><strong>percent_towards_wraparound:</strong> transaction wraparound may occur when this value reaches 100.</li>' +
1703
+ '</ul>' +
1704
+ 'For more information see <a href="https://www.postgresql.org/docs/current/routine-vacuuming.html" target="_blank">Preventing Transaction ID Wraparound Failures</a>.'
1705
+ },
1706
1707
1708
// ------------------------------------------------------------------------