File: //lib/python2.7/site-packages/lap/pgsql_replication_slave.py
import psycopg2
import yaml
# get the parameters to connect
def __run__(params):
conn = None
try:
conn = psycopg2.connect(host=params.get('host'),
port=int(params.get('port')),
database=params.get('dbname'),
user=params.get('user'),
password=params.get('passwd'))
cursor = conn.cursor()
# get slave lag
cursor.execute("""
SELECT
CASE WHEN pg_last_xlog_receive_location() = pg_last_xlog_replay_location()
THEN 0
ELSE EXTRACT (EPOCH FROM now() - pg_last_xact_replay_timestamp())::INTEGER
END AS log_delay;
""")
slave_lag = cursor.fetchone()[0]
if slave_lag > 2:
return[2, 'CRITICAL: Replication is not synchronized! Lag: %s' % slave_lag]
elif slave_lag == 0:
# verify this database is powerdns
database = ''
cursor.execute("select current_database()")
database = cursor.fetchone()
if database[0] == 'powerdns':
thresolds = yaml.load(params.get('thresholds'))
cursor.execute("""SELECT 'monit' AS object_name, replication_monit.d,
(date_part('epoch'::text, now() - replication_monit.d::timestamp with time zone) / 60::double precision)::integer AS age
FROM replication_monit
LIMIT 1;
""")
(name, d, d_int) = cursor.fetchone()
if d_int > int(thresolds['critical']):
return [2, 'CRITICAL: Behind {0} minutes'.format(d_int)]
elif d_int > int(thresolds['warning']):
return [1, 'WARNING: Behind {0} minutes'.format(d_int)]
else:
return[0, 'OK: Replication synchronized! Behind {0} minutes.'.format(d_int)]
else:
return[0, 'OK: Replication synchronized!']
else:
return[2, 'CRITICAL: Impossible to determine the lag']
except Exception, e:
return [2, 'CRITICAL: {0}'.format(str(e))]
print "erro"
finally:
try:
if conn:
conn.close()
except:
# finally clause, don't bother about errors here
pass