@cryptotaxi247 / netdata-1 / commits / 77c07842b

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 // ------------------------------------------------------------------------