@@ -7,42 +7,39 @@ class ArchiveCommand(Plugin):
77 AgentPluginType = 'pg'
88 DEFAULT_CONFIG = {'max_count_files' : str (2 )}
99 Interval = 60
10+
11+ # if streaming replication is on, archive queue length and size will always be 0 for replicas
1012 query_agent_count_files = """
11- WITH segment_parts_count AS
12- (SELECT 4096/(setting::bigint/1024/1024) AS value FROM pg_settings
13- WHERE name = 'wal_segment_size'),
14- last_wal_div AS
15- (SELECT ('x' || substring(last_archived_wal from 9 for 8))::bit(32)::int AS value
16- FROM pg_stat_archiver),
17- last_wal_mod AS
18- (SELECT ('x' || substring(last_archived_wal from 17 for 8))::bit(32)::int AS value
19- FROM pg_stat_archiver),
20- current_wal_div AS
21- (SELECT ('x' || substring(pg_walfile_name(pg_current_wal_lsn()) from 9 for 8))::bit(32)::int AS value),
22- current_wal_mod AS
23- (SELECT ('x' || substring(pg_walfile_name(pg_current_wal_lsn()) from 17 for 8))::bit(32)::int AS value)
24- SELECT greatest(coalesce((segment_parts_count.value - last_wal_mod.value) + ((current_wal_div.value - last_wal_div.value - 1) * segment_parts_count.value) + current_wal_mod.value - 1, 0), 0)
25- FROM segment_parts_count, last_wal_div, last_wal_mod, current_wal_div, current_wal_mod;
13+ WITH values AS (
14+ SELECT
15+ 4096/(pg_settings.setting::bigint/1024/1024) AS segment_parts_count,
16+ setting::bigint AS segment_size,
17+ ('x' || substring(pg_stat_archiver.last_archived_wal from 9 for 8))::bit(32)::int AS last_wal_div,
18+ ('x' || substring(pg_stat_archiver.last_archived_wal from 17 for 8))::bit(32)::int AS last_wal_mod,
19+ CASE WHEN pg_is_in_recovery() THEN NULL ELSE
20+ ('x' || substring(pg_walfile_name(pg_current_wal_lsn()) from 9 for 8))::bit(32)::int END AS current_wal_div,
21+ CASE WHEN pg_is_in_recovery() THEN NULL ELSE
22+ ('x' || substring(pg_walfile_name(pg_current_wal_lsn()) from 17 for 8))::bit(32)::int END AS current_wal_mod
23+ FROM pg_settings, pg_stat_archiver
24+ WHERE pg_settings.name = 'wal_segment_size')
25+ SELECT greatest(coalesce((segment_parts_count - last_wal_mod) + ((current_wal_div - last_wal_div - 1) * segment_parts_count) + current_wal_mod - 1, 0), 0) AS count_files
26+ FROM values;
2627 """
2728 query_agent_size_files = """
28- WITH segment_parts_count AS
29- (SELECT 4096/(setting::bigint/1024/1024) AS value FROM pg_settings
30- WHERE name = 'wal_segment_size'),
31- segment_size AS
32- (SELECT setting::bigint AS value FROM pg_settings
33- WHERE name = 'wal_segment_size'),
34- last_wal_div AS
35- (SELECT ('x' || substring(last_archived_wal from 9 for 8))::bit(32)::int AS value
36- FROM pg_stat_archiver),
37- last_wal_mod AS
38- (SELECT ('x' || substring(last_archived_wal from 17 for 8))::bit(32)::int AS value
39- FROM pg_stat_archiver),
40- current_wal_div AS
41- (SELECT ('x' || substring(pg_walfile_name(pg_current_wal_lsn()) from 9 for 8))::bit(32)::int AS value),
42- current_wal_mod AS
43- (SELECT ('x' || substring(pg_walfile_name(pg_current_wal_lsn()) from 17 for 8))::bit(32)::int AS value)
44- SELECT greatest(coalesce(((segment_parts_count.value - last_wal_mod.value) + ((current_wal_div.value - last_wal_div.value - 1) * segment_parts_count.value) + current_wal_mod.value - 1) * segment_size.value, 0), 0)
45- FROM segment_parts_count, segment_size, last_wal_div, last_wal_mod, current_wal_div, current_wal_mod;
29+ WITH values AS (
30+ SELECT
31+ 4096/(pg_settings.setting::bigint/1024/1024) AS segment_parts_count,
32+ setting::bigint AS segment_size,
33+ ('x' || substring(pg_stat_archiver.last_archived_wal from 9 for 8))::bit(32)::int AS last_wal_div,
34+ ('x' || substring(pg_stat_archiver.last_archived_wal from 17 for 8))::bit(32)::int AS last_wal_mod,
35+ CASE WHEN pg_is_in_recovery() THEN NULL ELSE
36+ ('x' || substring(pg_walfile_name(pg_current_wal_lsn()) from 9 for 8))::bit(32)::int END AS current_wal_div,
37+ CASE WHEN pg_is_in_recovery() THEN NULL ELSE
38+ ('x' || substring(pg_walfile_name(pg_current_wal_lsn()) from 17 for 8))::bit(32)::int END AS current_wal_mod
39+ FROM pg_settings, pg_stat_archiver
40+ WHERE pg_settings.name = 'wal_segment_size')
41+ SELECT greatest(coalesce(((segment_parts_count - last_wal_mod) + ((current_wal_div - last_wal_div - 1) * segment_parts_count) + current_wal_mod - 1) * segment_size, 0), 0) AS size_files
42+ FROM values;
4643 """
4744
4845 query_agent_archived_count = "SELECT archived_count from pg_stat_archiver;"
@@ -52,9 +49,9 @@ class ArchiveCommand(Plugin):
5249 Items = [
5350 # key, desc, color, side, graph
5451 ('count_files_to_archive' , 'count files in archive_status need to archive' , 'FFD700' , 0 , 1 ),
55- ('size_files_to_archive' , 'size of files need to archive' , '00FF00' , 1 , 0 ),
52+ ('size_files_to_archive' , 'size of files need to archive' , '00FF00' , 0 , 0 ),
5653 ('archived_files' , 'count archived files' , '00F000' , 0 , 1 ),
57- ('failed_trying_to_archive' , 'count attempts to archive files' , 'FF0000' , 1 , 1 ),
54+ ('failed_trying_to_archive' , 'count attempts to archive files' , 'FF0000' , 0 , 1 ),
5855 ]
5956 old_archived_count = None
6057 old_failed_count = None
@@ -66,25 +63,21 @@ def run(self, zbx):
6663 result1 = Pooler .query ("""select * from mamonsu.archive_command_files()""" )
6764 else :
6865 result1 = Pooler .query ("""
69- WITH segment_parts_count AS
70- (SELECT 4096/(setting::bigint/1024/1024) AS value FROM pg_settings
71- WHERE name = 'wal_segment_size'),
72- segment_size AS
73- (SELECT setting::bigint AS value FROM pg_settings
74- WHERE name = 'wal_segment_size'),
75- last_wal_div AS
76- (SELECT ('x' || substring(last_archived_wal from 9 for 8))::bit(32)::int AS value
77- FROM pg_stat_archiver),
78- last_wal_mod AS
79- (SELECT ('x' || substring(last_archived_wal from 17 for 8))::bit(32)::int AS value
80- FROM pg_stat_archiver),
81- current_wal_div AS
82- (SELECT ('x' || substring(pg_walfile_name(pg_current_wal_lsn()) from 9 for 8))::bit(32)::int AS value),
83- current_wal_mod AS
84- (SELECT ('x' || substring(pg_walfile_name(pg_current_wal_lsn()) from 17 for 8))::bit(32)::int AS value)
85- SELECT greatest(coalesce((segment_parts_count.value - last_wal_mod.value) + ((current_wal_div.value - last_wal_div.value - 1) * segment_parts_count.value) + current_wal_mod.value - 1, 0), 0) AS count_files,
86- greatest(coalesce(((segment_parts_count.value - last_wal_mod.value) + ((current_wal_div.value - last_wal_div.value - 1) * segment_parts_count.value) + current_wal_mod.value - 1) * segment_size.value, 0), 0) AS size_files
87- FROM segment_parts_count, segment_size, last_wal_div, last_wal_mod, current_wal_div, current_wal_mod;
66+ WITH values AS (
67+ SELECT
68+ 4096/(pg_settings.setting::bigint/1024/1024) AS segment_parts_count,
69+ setting::bigint AS segment_size,
70+ ('x' || substring(pg_stat_archiver.last_archived_wal from 9 for 8))::bit(32)::int AS last_wal_div,
71+ ('x' || substring(pg_stat_archiver.last_archived_wal from 17 for 8))::bit(32)::int AS last_wal_mod,
72+ CASE WHEN pg_is_in_recovery() THEN NULL ELSE
73+ ('x' || substring(pg_walfile_name(pg_current_wal_lsn()) from 9 for 8))::bit(32)::int END AS current_wal_div,
74+ CASE WHEN pg_is_in_recovery() THEN NULL ELSE
75+ ('x' || substring(pg_walfile_name(pg_current_wal_lsn()) from 17 for 8))::bit(32)::int END AS current_wal_mod
76+ FROM pg_settings, pg_stat_archiver
77+ WHERE pg_settings.name = 'wal_segment_size')
78+ SELECT greatest(coalesce((segment_parts_count - last_wal_mod) + ((current_wal_div - last_wal_div - 1) * segment_parts_count) + current_wal_mod - 1, 0), 0) AS count_files,
79+ greatest(coalesce(((segment_parts_count - last_wal_mod) + ((current_wal_div - last_wal_div - 1) * segment_parts_count) + current_wal_mod - 1) * segment_size, 0), 0) AS size_files
80+ FROM values;
8881 """ )
8982 result2 = Pooler .query ("""SELECT archived_count, failed_count from pg_stat_archiver;""" )
9083
0 commit comments