タイトル

Need for Answer

2014年3月6日木曜日

AWS CloudWatchの値をfluentdに流す方法

AWSのcloudwatchは2週間以上前のデータを見ることが出来ません。要件次第では自力ハウジングする必要があります。先人に感謝しつつ実現しましょう、というお話。

概要は、『fluentdでShellScriptを定期的にkickし、返り値をtsv形式で受け取る』という感じ。fluentdで受け取ったあとは、outputプラグインにお任せしましょう。

まずはShellScript。『aws cloudwatch get-metric-statistics』で取得した値を、tsv形式で吐き出すスクリプトです。今回はSNS通信の送信・失敗数をカウントすることにしました。

get-metric-statisticsは該当する値が無いとnullを返すので、『0』を代入する必要が有ります。これくらいしか悩む所ありません。
#!/bin/bash
export AWS_CONFIG_FILE=[適当なパス]

if [ $# -ne 1 ]; then
  LASTSEC=300
else
  LASTSEC=$1
fi

LASTSEC_CMD="$LASTSEC seconds ago"

NOW=`date +"%Y/%m/%dT%I:%M:%SJST"`
LASTDAY=`date -d "$LASTSEC_CMD" +" %Y/%m/%dT%I:%M:%SJST"`

# DEBUG -----------------------------------
#LASTDAY=`date -d '5 days ago' +"%Y/%m/%dT%I:%M:%SJST"`

# Get CloudWatch DATA ---------------------
SEND=`/usr/bin/aws cloudwatch get-metric-statistics --namespace "AWS/SNS" --metric-name "NumberOfMessagesPublished" --start-time $LASTDAY --end-time $NOW --period $LASTSEC --statistics "Sum" --dimensions Name=Application,Value=********** --output text | awk 'NR==2 {print $2}'| sed -e "s/.0//g"`

FAILED=`/usr/bin/aws cloudwatch get-metric-statistics --namespace "AWS/SNS" --metric-name "NumberOfNotificationsFailed" --start-time $LASTDAY --end-time $NOW --period $LASTSEC --statistics "Sum" --dimensions Name=Application,Value=********** --output text| awk 'NR==2 {print $2}'| sed -e "s/.0//g"`
# null check ------------------------------
if [ -z $SEND ]; then
  SEND="0"
fi
if [ -z $FAILED ]; then
  FAILED="0"
fi

# echo TSV Format -------------------------
echo -e "$SEND\t$FAILED"

このShellScriptをfluentdからkickしてもらいます。ShellScriptから吐き出されたtsvにはkey、tagがないので、ここで定義します。起動間隔もここで定義できます。
<source>
  type exec
  command [shellのパス]
  keys [key名1],[key名2]
  tag [タグ名]
  run_interval 300s
</source>
fluentdに投げ込んだ後は、S3に送るなりmongoDBに喰わせるなりご自由に!

0 件のコメント:

コメントを投稿