CloudWatchでApacheを監視する

運用をおこなっていると、時間の節約ため監視系はどこか一つに統一したいと思ってくることがあります。

ボトルネック調査などには向きませんが、アクセス、リソース監視程度であればCloudWatchに統一してしまったほうがサーバーに負荷がかからないので良いかと思います。

まずApacheで「mod_status」を有効にし、

wget -q -O - http://localhost/server-status?auto

でAapacheの情報が見えるようにします。ひとまず上記コマンドで取れる情報をそのままCloudWatchに投げます。

#!/bin/bash

export EC2_REGION=ap-northeast-1
export AWS_CLOUDWATCH_HOME=/opt/aws/apitools/mon
export JAVA_HOME=/usr/lib/jvm/jre

STATUS="/tmp/apache_status"
CREDENTIAL="{awsのcredentialのファイル}"

SERVER=`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`
wget -q -O - http://localhost/server-status?auto > $STATUS
BUSYWORKERS=`cat $STATUS | grep BusyWorkers | awk '{ print $2 }'`
IDLEWORKERS=`cat $STATUS | grep IdleWorkers | awk '{ print $2 }'`
ReqPerSec=`cat $STATUS | grep ReqPerSec  | awk '{ print $2 }'`
BytesPerSec=`cat $STATUS | grep BytesPerSec  | awk '{ print $2 }'`
BytesPerReq=`cat $STATUS | grep BytesPerReq  | awk '{ print $2 }'`

/opt/aws/bin/mon-put-data --metric-name httpd-busyworkers --namespace "EC2: HTTPD" --dimensions "InstanceId=$SERVER" --unit "Count" --value $BUSYWORKERS  --aws-credential-file $CREDENTIAL
/opt/aws/bin/mon-put-data --metric-name httpd-idleworkers --namespace "EC2: HTTPD" --dimensions "InstanceId=$SERVER" --unit "Count" --value $IDLEWORKERS  --aws-credential-file $CREDENTIAL
/opt/aws/bin/mon-put-data --metric-name httpd-request-per-sec --namespace "EC2: HTTPD" --dimensions "InstanceId=$SERVER" --unit "Count" --value $ReqPerSec  --aws-credential-file $CREDENTIAL
/opt/aws/bin/mon-put-data --metric-name httpd-byte-per-sec --namespace "EC2: HTTPD" --dimensions "InstanceId=$SERVER" --unit "Bytes" --value $BytesPerSec  --aws-credential-file $CREDENTIAL
/opt/aws/bin/mon-put-data --metric-name httpd-byte-per-req --namespace "EC2: HTTPD" --dimensions "InstanceId=$SERVER" --unit "Bytes" --value $BytesPerReq  --aws-credential-file $CREDENTIAL

あとはcronに5分置きに実行するようにすればCloudWatchから見れるようになります。