2013年4月16日火曜日

NagiosでSQSの(メッセージ数の)監視

スズキです。

よくSQSのメッセージ数の監視をNagiosでやるのですが、そのときのネタです。

当然、キュー内のメッセージ数(ApproximateNumberOfMessagesVisible)を
監視するのですが、メッセージ数が閾値を超えてなくても、
処理数(NumberOfMessagesReceived )が、ある一定の期間0だったら、
アプリケーションの方で障害があって処理できてないと見なし、アラート通知するようにも
してみました。

実際のNagiosプラグインは下記となります。
# cat check_sqs #!/bin/sh
. `dirname $0`/utils.sh

set -e
trap 'echo "UNKNOWN: $?"; exit $STATE_UNKNOWN' ERR

WARN=0
CRIT=0
REVERSE=false

while getopts c:w:q:p: OPTNAME; do
    case $OPTNAME in
    w)
        WARN=$OPTARG
        ;;
    c)
        CRIT=$OPTARG
        ;;
    q)
        QUEUE=$OPTARG
        ;;
    p)
        PERIOD=$OPTARG
        ;;
    *)
        echo "UNKNOWN: Usage"
        exit $STATE_UNKNOWN
        ;;
    esac
done

START_TIME=`date -u -d '10 minutes ago' +%Y-%m-%dT%TZ`
END_TIME=`date -u +%Y-%m-%dT%TZ`
DIMENSIONS={\"name\":\"QueueName\",\"value\":\"$QUEUE\"}

METRIC_DATA=`aws cloudwatch get-metric-statistics \
--namespace   AWS/SQS \
--metric-name ApproximateNumberOfMessagesVisible \
--dimensions  $DIMENSIONS \
--statistics  Average \
--period      60 \
--start-time  $START_TIME \
--end-time    $END_TIME \
| jq '.Datapoints[0] | .Average' \
| cut -d\" -f2`

CRIT_STATUS=`echo "$METRIC_DATA > $CRIT" | bc`
WARN_STATUS=`echo "$METRIC_DATA > $WARN" | bc`
OK_STATUS=`echo "$METRIC_DATA == 0" | bc`

if   [ $CRIT_STATUS -eq 1 ]; then
    echo "CRITICAL ApproximateNumberOfMessagesVisible: $METRIC_DATA"
    exit $STATE_CRITICAL
elif [ $WARN_STATUS -eq 1 ]; then
    echo "WARNING ApproximateNumberOfMessagesVisible: $METRIC_DATA"
    exit $STATE_WARNING
elif [ $OK_STATUS -eq 1 ]; then
    echo "OK ApproximateNumberOfMessagesVisible: $METRIC_DATA"
    exit $STATE_OK
fi

METRIC_DATA=`aws cloudwatch get-metric-statistics \
--namespace   AWS/SQS \
--metric-name NumberOfMessagesReceived \
--dimensions  $DIMENSIONS \
--statistics  Average \
--period      $PERIOD \
--start-time  $START_TIME \
--end-time    $END_TIME \
| jq '.Datapoints[0] | .Average' \
| cut -d\" -f2`

RECEIVE_STATUS=`echo "$METRIC_DATA == 0" | bc`

if   [ $RECEIVE_STATUS -eq 1 ]; then
    echo "CRITICAL NumberOfMessagesReceived: $METRIC_DATA"
    exit $STATE_CRITICAL
elif [ $RECEIVE_STATUS -eq 0 ]; then
    echo "OK ApproximateNumberOfMessagesVisible: $METRIC_DATA"
    exit $STATE_OK
fi

echo "UNKNOWN: End"; exit $STATE_UNKNOWN
※同一ディレクトリに"utils.sh"(/usr/lib64/nagios/plugins/utils.sh)が必要です
※下記のようにbcをインストールしておく必要があります。
# yum -y install bc

実行は下記の通りです。
# ./check_sqs -c 3 -w 3 -q suz-lab-queue -p 600
OK ApproximateNumberOfMessagesVisible: 0.0
"-q"でキュー名を指定して、"-p"で処理数をチェックする期間を指定しています。

NagiosプラグインもどこかでまとめてGitHubに置きたい...
--------
http://www.suz-lab.com

0 コメント: