@@ -19,8 +19,10 @@ class Xlog(Plugin):
1919 "(pg_catalog.pg_current_xlog_location(), '0/00000000');"
2020
2121 # 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;"
2426
2527 # PG 14 pg_stat_wal
2628 query_wal_records = "SELECT wal_records FROM pg_stat_wal;"
@@ -53,18 +55,18 @@ class Xlog(Plugin):
5355
5456 def run (self , zbx ):
5557
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' ])
6762 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 ():
6870 Pooler .run_sql_type ('replication_lag_master_query' )
6971 if Pooler .server_version_greater ('10.0' ):
7072 result = Pooler .query (self .query_wal_lsn_diff )
@@ -263,12 +265,18 @@ def keys_and_queries(self, template_zabbix):
263265 result .append (
264266 '{0},$2 $1 -c "{1}"' .format (self .key_count_wall .format ('[*]' ), Pooler .SQL ['count_xlog_files' ][0 ]))
265267 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' )))
266272 else :
267273 result .append (
268274 '{0},$2 $1 -c "{1}"' .format (self .key_count_wall .format ('[*]' ), Pooler .SQL ['count_wal_files' ][0 ]))
269275 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' )))
272280 if LooseVersion (self .VersionPG ) >= LooseVersion ('14' ):
273281 result .append ('{0},$2 $1 -c "{1}"' .format (self .key_wal_records .format ('[*]' ), self .query_wal_records ))
274282 result .append ('{0},$2 $1 -c "{1}"' .format (self .key_wal_fpi .format ('[*]' ), self .query_wal_fpi ))
0 commit comments