@@ -19,8 +19,10 @@ class Xlog(Plugin):
19
19
"(pg_catalog.pg_current_xlog_location(), '0/00000000');"
20
20
21
21
# get time of replication lag
22
- query_agent_replication_lag = "SELECT CASE WHEN extract(epoch from now()-pg_last_xact_replay_timestamp()) " \
23
- "IS NULL THEN 0 ELSE extract(epoch from now()-pg_last_xact_replay_timestamp()) END"
22
+ query_agent_replication_lag = "SELECT " \
23
+ "CASE WHEN coalesce(pg_last_{1}(), '0/00000000') = coalesce(pg_last_{2}(), '0/00000000') THEN 0 " \
24
+ "ELSE extract (epoch FROM now() - coalesce(pg_last_xact_replay_timestamp(), now() - INTERVAL '{0} seconds')) " \
25
+ "END;"
24
26
25
27
# PG 14 pg_stat_wal
26
28
query_wal_records = "SELECT wal_records FROM pg_stat_wal;"
@@ -53,18 +55,18 @@ class Xlog(Plugin):
53
55
54
56
def run (self , zbx ):
55
57
56
- if Pooler .in_recovery ():
57
- if Pooler .server_version_greater ('10.0' ):
58
- lag = Pooler .run_sql_type ('replication_lag_slave_query' , args = [self .plugin_config ('interval' ),
59
- 'wal_receive_lsn' ,
60
- 'wal_replay_lsn' ])
61
- else :
62
- lag = Pooler .run_sql_type ('replication_lag_slave_query' , args = [self .plugin_config ('interval' ),
63
- 'xlog_receive_location' ,
64
- 'xlog_replay_location' ])
65
- if lag [0 ][0 ] is not None :
66
- zbx .send ('pgsql.replication_lag[sec]' , float (lag [0 ][0 ]))
58
+ if Pooler .server_version_greater ('10.0' ):
59
+ lag = Pooler .run_sql_type ('replication_lag_slave_query' , args = [self .plugin_config ('interval' ),
60
+ 'wal_receive_lsn' ,
61
+ 'wal_replay_lsn' ])
67
62
else :
63
+ lag = Pooler .run_sql_type ('replication_lag_slave_query' , args = [self .plugin_config ('interval' ),
64
+ 'xlog_receive_location' ,
65
+ 'xlog_replay_location' ])
66
+ if lag [0 ][0 ] is not None :
67
+ zbx .send ('pgsql.replication_lag[sec]' , float (lag [0 ][0 ]))
68
+
69
+ if not Pooler .in_recovery ():
68
70
Pooler .run_sql_type ('replication_lag_master_query' )
69
71
if Pooler .server_version_greater ('10.0' ):
70
72
result = Pooler .query (self .query_wal_lsn_diff )
@@ -263,12 +265,18 @@ def keys_and_queries(self, template_zabbix):
263
265
result .append (
264
266
'{0},$2 $1 -c "{1}"' .format (self .key_count_wall .format ('[*]' ), Pooler .SQL ['count_xlog_files' ][0 ]))
265
267
result .append ('{0},$2 $1 -c "{1}"' .format (self .key_wall .format ('[*]' ), self .query_xlog_lsn_diff ))
268
+ result .append (
269
+ '{0},$2 $1 -c "{1}"' .format ("pgsql.replication_lag.sec[*]" , self .query_agent_replication_lag .format (self .plugin_config ('interval' ),
270
+ 'xlog_receive_location' ,
271
+ 'xlog_replay_location' )))
266
272
else :
267
273
result .append (
268
274
'{0},$2 $1 -c "{1}"' .format (self .key_count_wall .format ('[*]' ), Pooler .SQL ['count_wal_files' ][0 ]))
269
275
result .append ('{0},$2 $1 -c "{1}"' .format (self .key_wall .format ('[*]' ), self .query_wal_lsn_diff ))
270
- result .append (
271
- '{0},$2 $1 -c "{1}"' .format ("pgsql.replication_lag.sec[*]" , self .query_agent_replication_lag ))
276
+ result .append (
277
+ '{0},$2 $1 -c "{1}"' .format ("pgsql.replication_lag.sec[*]" , self .query_agent_replication_lag .format (self .plugin_config ('interval' ),
278
+ 'wal_receive_lsn' ,
279
+ 'wal_replay_lsn' )))
272
280
if LooseVersion (self .VersionPG ) >= LooseVersion ('14' ):
273
281
result .append ('{0},$2 $1 -c "{1}"' .format (self .key_wal_records .format ('[*]' ), self .query_wal_records ))
274
282
result .append ('{0},$2 $1 -c "{1}"' .format (self .key_wal_fpi .format ('[*]' ), self .query_wal_fpi ))
0 commit comments