diff --git a/check_pg_streaming_replication b/check_pg_streaming_replication index 7b74cbf..7afae93 100755 --- a/check_pg_streaming_replication +++ b/check_pg_streaming_replication @@ -210,6 +210,20 @@ REPLAY_WARNING_DELAY = $REPLAY_WARNING_DELAY REPLAY_CRITICAL_DELAY = $REPLAY_CRITICAL_DELAY " +# Set some stuff to PostgreSQL version +if [ $( echo "$PG_VERSION < 10" |bc -l ) -eq 1 ] +then + pg_current_wal_lsn='pg_current_xlog_location()' + pg_wal_lsn_diff='pg_xlog_location_diff' + sent_lsn='sent_location' + write_lsn='write_location' +else + pg_current_wal_lsn='pg_current_wal_lsn()' + pg_wal_lsn_diff='pg_wal_lsn_diff' + sent_lsn='sent_lsn' + write_lsn='write_lsn' +fi + # Postgres is running ? if [ $DEBUG -eq 0 ] then @@ -295,16 +309,16 @@ then debug "Master application name : $M_APP_NAME" fi - # Get current state/sync_state from master - M_CUR_STATE_SYNC_STATE="$( psql_master_get "SELECT state,sync_state FROM pg_stat_replication WHERE application_name='$M_APP_NAME';" )" - if [ ! -n "$M_CUR_STATE_SYNC_STATE" ] + # Get current state information from master + M_CUR_REPL_STATE_INFO="$( psql_master_get "SELECT state, sync_state FROM pg_stat_replication WHERE application_name='$M_APP_NAME';" )" + if [ ! -n "$M_CUR_REPL_STATE_INFO" ] then - echo "UNKNOWN : Can't retreive current state and sync state from master server" + echo "UNKNOWN : Can't retreive current replication state information from master server" exit 3 fi - debug "Master current state / sync_state : $M_CUR_STATE_SYNC_STATE" + debug "Master current replication state:\n\tstate|sync_state\n\t$M_CUR_REPL_STATE_INFO" - M_CUR_STATE=$( echo "$M_CUR_STATE_SYNC_STATE"|cut -d'|' -f1 ) + M_CUR_STATE=$( echo "$M_CUR_REPL_STATE_INFO"|cut -d'|' -f1 ) debug "Master current state : $M_CUR_STATE" if [ "$M_CUR_STATE" != "streaming" ] then @@ -312,7 +326,7 @@ then exit 2 fi - M_CUR_SYNC_STATE=$( echo "$M_CUR_STATE_SYNC_STATE"|cut -d'|' -f2 ) + M_CUR_SYNC_STATE=$( echo "$M_CUR_REPL_STATE_INFO"|cut -d'|' -f2 ) debug "Master current sync state : $M_CUR_SYNC_STATE" if [ "$M_CUR_SYNC_STATE" != "sync" ] then @@ -375,13 +389,21 @@ else debug "Postgres is not in recovery mode" # Check standby client - STANDBY_CLIENTS=$( psql_get "SELECT client_addr, sync_state FROM pg_stat_replication;" ) + STANDBY_CLIENTS=$( psql_get "SELECT application_name, client_addr, sent_location, write_location, state, sync_state, current_lag + FROM ( + SELECT application_name, client_addr, sent_location, write_location, state, sync_state, current_lag + FROM ( + SELECT application_name, client_addr, $sent_lsn AS sent_location, $write_lsn AS write_location, state, sync_state, + $pg_wal_lsn_diff($pg_current_wal_lsn, $write_lsn) AS current_lag + FROM pg_stat_replication + ) AS s2 + ) AS s1" ) if [ ! -n "$STANDBY_CLIENTS" ] then echo "WARNING : no stand-by client connected" exit 1 fi - debug "Stand-by client(s) : $( echo -n $STANDBY_CLIENTS|sed 's/\n/ , /g' )" + debug "Stand-by client(s):\n\t$( echo -e "$STANDBY_CLIENTS"|sed 's/\n/\n\t/' )" STANDBY_CLIENTS_TXT="" STANDBY_CLIENTS_COUNT=0 @@ -389,11 +411,16 @@ else do let STANDBY_CLIENTS_COUNT=STANDBY_CLIENTS_COUNT+1 - IP=$( echo $line|cut -d '|' -f 1 ) - MODE=$( echo $line|cut -d '|' -f 2 ) - STANDBY_CLIENTS_TXT="$STANDBY_CLIENTS_TXT $IP (mode=$MODE)" + NAME=$( echo $line|cut -d '|' -f 1 ) + IP=$( echo $line|cut -d '|' -f 2 ) + SENT_LOCATION=$( echo $line|cut -d '|' -f 3 ) + WRITE_LOCATION=$( echo $line|cut -d '|' -f 4 ) + STATE=$( echo $line|cut -d '|' -f 5 ) + SYNC_STATE=$( echo $line|cut -d '|' -f 6 ) + LAG=$( echo $line|cut -d '|' -f 7 ) + STANDBY_CLIENTS_TXT="$STANDBY_CLIENTS_TXT\n$NAME ($IP): $STATE/$SYNC_STATE (Location: sent='$SENT_LOCATION' / write='$WRITE_LOCATION', Lag: ${LAG}b)" done - echo "OK : $STANDBY_CLIENTS_COUNT stand-by client(s) connected - $STANDBY_CLIENTS_TXT" + echo -e "OK : $STANDBY_CLIENTS_COUNT stand-by client(s) connected\n$STANDBY_CLIENTS_TXT" exit 0 fi