CloudWatchをGrowthForecastでロングスパングラフ化する

はじめに

以前「[CloudWatch]グラフの確認方法と確認できるグラフ一覧(EC2/ELB/RDS)」という記事で、CloudWatchをリソース監視の観点で考えたとき、

CloudWatchの統計は2週間しか記録されません。このため長期的なリソース分析には向きません。月スパン、年スパンでリソース分析を行う場合は、Zabbixなどの高機能な監視ソフトウェアをオススメします。

と書きました。瞬間的なサービスであれば必要無いでしょうが、長期的にサービスを提供し続けるシステムについてリソース状態の確認やシステムの利用頻度を分析するには、日別・曜日別・時間帯別などの詳細な負荷推移の分析が欠かせません。それにはやはり2週間は短すぎます。

そこで、CloudWatchのデータをロングスパンなグラフに変換する手段として、GrowthForecastというツールを使ってみました。

GrowthForecastとは

ざっくり言うと「Webサーバとして起動し、POSTで数値を与えたらGraphにしてくれるツール」です。複雑なグラフ作成ツールや監視ツールは多々ありますが、とにかく手軽にデータを与えるだけでグラフにしてくれる、というのがGrowthForecastの最大の特徴でありメリットです。

ただし、一点留意すべきところがあります。それは数値としてINT型しか使えない、ということです。CPU使用率の場合整数部が分かれば負荷を確認するには充分だし、ネットワークI/Oはbytes表記なので運用上ほぼ支障が無いと思いますが、少数部の詳細まで確認したいというニーズには対応しきれないかも知れません。

インストール

GrowthForecastサーバとなるEC2を構築します。インストールしたAMIはamzn-ami-pv-2013.09.2.x86_64-ebsです。監視対象サーバと同一VPC内にt1.microやm1.smallあたりでサクっとEC2を立てて、ひたすらグラフだけ集積する形を想定しています。またこのEC2にはIAM roleでPower User Access権限を割り当てています。

まず最初にyum updateとタイムゾーンの設定を行います。AWS Command line interfaceで時間指定のオプションを使いますので、システム時間をリージョンに合わせて設定しておきます。

$ sudo yum update
$ sudo cp /usr/share/zoneinfo/Japan /etc/localtime

次にGrowthForecastに必要なパッケージをyumでインストールします。この辺は公式Webサイトに書いてある手順そのままです。

$ sudo yum groupinstall "Development Tools"
$ sudo yum install pkgconfig glib2-devel gettext libxml2-devel pango-devel cairo-devel

CPANのインストールに必要なYAML関連のパッケージをインストールします。

$ sudo yum install libyaml-devel
$ sudo yum install *YAML*

cpanとcpanmをインストールします。

$ sudo yum install cpan
$ sudo cpan App::cpanminus

そして本題です。cpanmを使ってGrowthForecastをインストールします。

$ cpanm -n GrowthForecast

GrowthForecastの起動

起動するための下準備として、ホームディレクトリ配下のlibを参照するよう、.bashrcを編集します。

$ vi ~/.bashrc
export PERL_CPANM_OPT="--local-lib=~/perl5"
export PERL5LIB="/home/ec2-user/perl5/lib/perl5"
export PATH="~/perl5/bin:$PATH"

そしてデータフォルダを作ります。このフォルダの中にSQLite形式のdbファイルとRRDTool形式のrrdファイルが作成されます。

$ mkdir ~/growthforecast

起動します!

$ /home/ec2-user/perl5/bin/growthforecast.pl --data-dir /home/ec2-user/growthforecast &

GrowthForecastはデフォルトでは5125/tcpで起動しますので、構成に応じてSecurity Groupの設定を行って下さい。

CloudWatchのデータをGrowthForecastに投入する

監視対象側のサーバで自分のCloudWatchのデータを取得して、GrowthForecastに送信します。

スクリプトの中でjqを使いますのでyumでインストールします。

$ sudo yum install jq

そして以下のようなスクリプトを作ってみました。AWS command line toolでCloudWatchのデータ(CPU使用率、ネットワーク受信量、ネットワーク送信量)を取得し、戻り値のJSONフォーマットのデータからjqで値を抽出し、GrowthForecastが起動しているサーバ(この例だとIPアドレス:192.168.0.100)にPOSTしています。

#!/bin/bash

GFSERVER="192.168.0.100:5125"
INSTANCE_ID=`curl http://169.254.169.254/latest/meta-data/instance-id`
START_DATE=`date -u -d '10 minutes ago' +%Y-%m-%dT%TZ`
END_DATE=`date -u +%Y-%m-%dT%TZ`

CPU=`aws cloudwatch get-metric-statistics --metric-name CPUUtilization --namespace AWS/EC2 --region ap-northeast-1 --statistics Average --start-time $START_DATE --end-time $END_DATE --period 60 --dimensions Name=InstanceId,Value=$INSTANCE_ID | jq '.Datapoints[0] | .Average' | sed s/\.[0-9,]*$//g`
NIN=`aws cloudwatch get-metric-statistics --metric-name NetworkIn --namespace AWS/EC2 --region ap-northeast-1 --statistics Average --start-time $START_DATE --end-time $END_DATE --period 60 --dimensions Name=InstanceId,Value=$INSTANCE_ID | jq '.Datapoints[0] | .Average' | sed s/\.[0-9,]*$//g`
NOUT=`aws cloudwatch get-metric-statistics --metric-name NetworkOut --namespace AWS/EC2 --region ap-northeast-1 --statistics Average --start-time $START_DATE --end-time $END_DATE --period 60 --dimensions Name=InstanceId,Value=$INSTANCE_ID | jq '.Datapoints[0] | .Average' | sed s/\.[0-9,]*$//g`

if [ -n "$CPU" ]; then
  curl -F number=$CPU http://$GFSERVER/api/$INSTANCE_ID/cpu/register
fi

if [ -n "$NIN" ]; then
  curl -F number=$NIN http://$GFSERVER/api/$INSTANCE_ID/networkin/register
fi

if [ -n "$NOUT" ]; then
  curl -F number=$NOUT http://$GFSERVER/api/$INSTANCE_ID/networkout/register
fi

このスクリプトをcronで10分間隔で実行します。

グラフを表示する

Webブラウザで「http://"GrowthForecastサーバのグローバルIPアドレス":5125/」にアクセスすると、以下のようなトップページが表示されます。

GrowthForecast-3

例えば「cpu」のリンクをクリックすると...

i-9e20179b_»_cpu___GrowthForecast-2

はい!こんな感じでグラフが表示されます。サンプルのデータ量が少なくてすみません。週単位・月単位・年単位での表示も出来ますので、充分にロングスパンで確認出来ます!

まとめ

GrowthForecastは簡便で素晴らしいなぁと思います。例えば閾値による監視をしたかったり、奇麗なフォーマットでレポート化したいなどの場合は他の高機能な監視ツールを検討することになると思いますが、とにかくCloudWatchで出力される情報をグラフとして長期間保存したい場合は充分なのでは無いでしょうか。

このGrowthForecast、他の使い道も色々考えてみたいと思います。