雑多なインフラエンジニア日記

技術ブログでっす~

ELBのリクエスト数をmuninに取り込む (CloudWatch to munin)

CloudWatchで、ELBのステータスコードの数、リクエスト数、レイテンシが見れますが、
2週間しか保存されないので必要なものをmuninに取り込んでます。

現状は6分間のMAXリクエスト数しか取り込んで無いですが、本来はキャパプラとか過去の振り返り
のために、全部2週間以上保存すべきなんですけどね。。。

とりあえず、
1. plugin-conf.d に必要な情報を設定する。
2. 作成したスクリプトを通常通り、muninのplugin配下に置いてリンクを貼る。
で完了です。

スクリプト自体はmuninのお作法に従っているだけなので、大したことはやってません。
設定やスクリプト例については、ココが解りやすいです。
http://www.seeds-std.co.jp/seedsblog/671.html


・plugin-conf.d 配下に以下を設定したファイルを配置

##################################################################
# ALL ELB
##################################################################

#---------------------------
# abcdef.net
#---------------------------
[abcdef-net-aws_elb*]
env.elbname abcdef-net

[abcdef-net-aws_elb_request]
env.metiric RequestCount
env.statistics Sum
env.vlabel Count
env.draw LINE2

[abcdef-net-aws_elb_latency] ※以下のスクリプトでは使用してないけど一応。
env.metiric Latency
env.statistics Avg
env.vlabel sec
env.draw LINE2



・CloudWatchデータ取得用スクリプト (スクリプト名:aws_elb)

#!/bin/sh

#--------------------------------
# Required
#--------------------------------
. /root/.bash_profile          # AWS API(boto)を実行するのに必要な変数設定
MONCMD=/opt/aws/bin/mon-get-stats
START=`date --iso-8601=seconds --date '6 minutes ago'`  # 日付形式指定
END=`date --iso-8601=seconds --date '1 minutes ago'`    # 日付形式指定
PERIOD=360  # 5分だとCloudWatchのデータが取得できない時があるので6分指定

ELBNAME="$elbname"
METRIC="$metiric"
VLABEL="$vlabel"

#--------------------------------
# Optional
#--------------------------------
TYPE="${type:-GAUGE}"
GRAPH_PERIOD="${graph_period:- }"
DRAW="${draw:-AREA}"


#--------------------------------
# Make Graph
#--------------------------------
if [ "$1" = "config" ]; then
	# Global attributes 
	echo 'graph_title AWS ELB - '${METRIC}''
	echo 'graph_args --base 1000 -l 0'
	if [ ${GRAPH_PERIOD} != "" ] ; then
                echo 'graph_vlabel '${VLABEL}' / '${GRAPH_PERIOD}''
	else
		echo 'graph_vlabel '${VLABEL}''
	fi
	echo 'graph_category AWS-ELB '${ELBNAME}''
	echo 'graph_info ELB '${METRIC}''

	# Data source attributes
        echo "${METRIC}.label ${METRIC}"
        echo "${METRIC}.min 0"
        echo "${METRIC}.info ${METRIC}"
        echo "${METRIC}.type ${TYPE}"
        echo "${METRIC}.draw ${DRAW}"

	exit 0
fi


#--------------------------------
# Get numerical value
#--------------------------------
#echo -n "${METRIC}.value "

VALUE=`${MONCMD} \
--metric-name ${METRIC} \
--statistics "Maximum" \
--namespace "AWS/ELB" \
--dimensions LoadBalancerName=${ELBNAME} \
--start-time ${START} \
--end-time ${END} \
--period ${PERIOD} \
| awk '{print $3}'`

if [ "${VALUE}" != "" ] ; then
	echo "${METRIC}.value ${VALUE}"
else
	echo "${METRIC}.value 0"
fi



・mon-get-statsについて公式を参照願います。
http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/cli-mon-get-stats.html


・AWS API(boto)導入は過去記事を参照願います。
http://xoxo-infra.hatenablog.com/entry/2013/02/28/195446


引数変えればELB以外にも色々と応用が効きますが、調子に乗って監視対象数を増やしま
くると監視サーバのCPUがパツるので注意して下さい。

てか、CloudWatchの応答が遅いのを何とかして欲しい・・・。
もはや、有料でいいからZabbix、Nagios、munin、Cacti相当の機能を付加して欲しい・・・。

以上です!