Básicamente se trata de la diferencia de tiempo entre el momento en que la base de datos de origen ha creado un ‘mensaje’ y este llega a la base de datos de destino, encolado y ‘aplicado’.

La latencia en la fase de apply se puede obtener con la siguiente query:

SELECT APPLY_NAME,
     (APPLY_TIME-APPLIED_MESSAGE_CREATE_TIME)*86400 "Latency in Seconds",
     TO_CHAR(APPLIED_MESSAGE_CREATE_TIME,'HH24:MI:SS MM/DD/YY')
        "Message Creation",
     TO_CHAR(APPLY_TIME,'HH24:MI:SS MM/DD/YY') "Apply Time",
     APPLIED_MESSAGE_NUMBER
  FROM DBA_APPLY_PROGRESS;

Puse el siguiente test de Nagios para monitorizar esta métrica, que puede dar indicaciones de si hay un cuello de botella en las comunicaciones. El valor de TZ_OFFSET lo tuve que añadir al encontrarme ante la situación de que la base de datos de destino estaba en un huso horario distinto.

#!/bin/bash

STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4

USER_PASS=$1
DATABASE=$2
APPLY_NAME=$3
TZ_OFFSET=$4
LATENCY_MAX=$5

TNS_ADMIN=/opt/sqlplus; export TNS_ADMIN
SQLPLUS="/opt/sqlplus/sqlplus -s ${USER_PASS}@${DATABASE}"


#---------------------------
# Heartbeat source database
#---------------------------
echo "set pages 0
set lines 20
set linesize 9999
set head off
set echo off
set verify off
set feedback off


SELECT (APPLY_TIME-APPLIED_MESSAGE_CREATE_TIME)*86400 + $TZ_OFFSET "Latency"
 FROM DBA_APPLY_PROGRESS;
exit" > /tmp/commands.$$.tmp
LATENCY=`$SQLPLUS < /tmp/commands.$$.tmp | awk '{print $1}'`

rm /tmp/commands.$$.tmp
if [ -z "$LATENCY" ]; then echo "Streams Latency - no value on apply_name $APPLY_NAME|'latency'=0;;;;"; exit $STATE_CRITICAL; fi

echo "Streams Latency - $APPLY_NAME latency of $LATENCY sec.|'latency'=$LATENCY;$LATENCY_MAX;;;"

if [ "$LATENCY" -gt "$LATENCY_MAX" ]; then exit $STATE_WARNING;
else exit $STATE_OK; fi