CloudWatchのカスタムメトリクス使ってみた

【AWS発表】 クラウド監視サービスAmazon CloudWatchでカスタムのメトリクスが使用可能に、という記事が出てました。
要するに自分の好きな値をCloudWatchに突っ込める!!!
いいですねー、さっそく使ってみましょう!


CLIツールとPHPプログラムを使って動作を確認してみました。
東京リージョンではうまく動かなかったので、検証はUS Eastで実施しています。
(東京は非対応?またちゃんと確認)

CLIツールで

EC2上のWEBサーバからApacheのプロセス数を格納してみましょう。

導入

おっとEC2のyumレポジトリはアップデートされてない><

[ec2-user@useast01 aws]$ sudo yum upgrade aws-apitools-mon
Loaded plugins: fastestmirror, priorities, security
Loading mirror speeds from cached hostfile
amzn-main                                                | 2.1 kB     00:00     
amzn-updates                                             | 2.1 kB     00:00     
Skipping security plugin, no data
Setting up Upgrade Process
No Packages marked for Update

しかたないのでダウンロード版でやります。
最新版をダウンロードしてください。

[ec2-user@useast01 src]$ wget http://ec2-downloads.s3.amazonaws.com/CloudWatch-2010-08-01.zip
…
インストール手順省略
[ec2-user@useast01 src]$ export EC2_REGION=us-east-1
…

どうしてもわからない人はとりあえずこことかで。

データ送信

mon-put-dataというコマンドが追加されています。
こんな感じでデータを送信できます。
(namespaceは「AWS/」で始まるものでなければなんでもよし、metric-name、dimensionsは任意です。)

[ec2-user@useast01 bin]$ ./mon-put-data --namespace Httpd --metric-name Processes \ 
  --dimensions 'Host=useast01' --value `ps -e|grep httpd|wc -l`

時間をおいて3回ほど。

確認

メトリクスをリストしてみます。(実際に取れるようになるまで、けっこうタイムラグがあります)

[ec2-user@useast01 bin]$ ./mon-list-metrics --namespace Httpd
Processes  Httpd  {Host=useast01}

mon-get-statsで値を見てみましょう

[ec2-user@useast01 bin]$ ./mon-get-stats Processes --namespace Httpd \ 
  --dimensions 'Host=useast01' --statistics Average --headers

Time                 Average  Unit
2011-05-12 17:10:00  9.0      None
2011-05-12 17:17:00  9.0      None
2011-05-12 17:18:00  10.0     None

簡単ですね><


単位を指定する--unit、タイムスタンプを指定する--timestamp、
サンプル数、平均、最大/最小まで詳細に値を入力する--statisticValues、
などのオプションもありますので必要に応じて指定してください。

[ec2-user@useast01 bin]$ ./mon-put-data --namespace TestNS --metric-name Test \ 
  --dimensions 'Host=useast01' --unit Bytes \ 
  --statisticValues "SampleCount=10, Sum=1000, Maximum=150, Minimum=50"

[ec2-user@useast01 bin]$ ./mon-get-stats Test --namespace TestNS \
  --dimensions 'Host=useast01' \ 
  --statistics 'SampleCount,Average,Minimum,Maximum,Sum' --headers

Time                 SampleCount  Average  Sum     Minimum  Maximum  Unit
2011-05-12 17:34:00  10.0         100.0    1000.0  50.0     150.0    Bytes
2011-05-12 17:35:00  10.0         100.0    1000.0  50.0     150.0    Bytes

AWS SDK for PHPを使って

では次はプログラムから!!!
RDSのSelectクエリ数を格納する、という想定でやってみましょう。
(想定なので値はテキトウ)

導入

以下からAWS SDK for PHPの最新版をダウンロードしてください。
http://aws.amazon.com/sdkforphp/
導入手順はこことかこことかを。
ライブラリのドキュメントはここです。

データ送信

一気に2台ぶん送ります。プログラムはこんな感じです。

#!/usr/bin/php
<?php
require_once('sdk.class.php');

$region = "us-east-1";
#$region = AmazonCloudWatch::REGION_APAC_NE1; # Japan

$namespace   = 'DB';
$metric_name = 'Select';
$unit        = 'Count';
$timestamp   = 'now';

$metric_data = array(
  array(
    'MetricName' => $metric_name,
    'Dimensions' => array(
      array('Name' => 'Host', 'Value' => 'db01'),
    ),
    'Timestamp' => $timestamp,
    'StatisticValues' => array(
      'SampleCount' => 10,
      'Sum' => 1000,
      'Minimum' => 50,
      'Maximum' => 150
    ),
    'Unit' => $unit
  ),
  array(
    'MetricName' => $metric_name,
    'Dimensions' => array(
      array('Name' => 'Host', 'Value' => 'db02'),
    ),
    'Timestamp' => $timestamp,
    'StatisticValues' => array(
      'SampleCount' => 1,
      'Sum' => 200,
      'Minimum' => 200,
      'Maximum' => 200
    ),
    'Unit' => $unit
  ),
);


$cw = new AmazonCloudWatch();
$cw->set_region($region);
$res = $cw->put_metric_data($namespace, $metric_data);
 
if($res->isOK()){
  echo("Put OK\n");
}else{
  echo("API Error.\n" . print_r($res, true));
}

3回ほど実行

[mikeda@test01 cw]$ php cw_put.php
Put OK
[mikeda@test01 cw]$ php cw_put.php
Put OK
[mikeda@test01 cw]$ php cw_put.php
Put OK
確認
[mikeda@test01 cw]$ mon-get-stats Select --namespace DB --dimensions 'Host=db01' \
  --statistics 'SampleCount,Average,Minimum,Maximum,Sum' --headers

Time                 SampleCount  Average  Sum     Minimum  Maximum  Unit
2011-05-12 17:51:00  10.0         100.0    1000.0  50.0     150.0    Count
2011-05-12 17:53:00  10.0         100.0    1000.0  50.0     150.0    Count
2011-05-12 17:55:00  10.0         100.0    1000.0  50.0     150.0    Count
[mikeda@test01 cw]$ mon-get-stats Select --namespace DB --dimensions 'Host=db02' \ 
  --statistics 'SampleCount,Average,Minimum,Maximum,Sum' --headers

Time                 SampleCount  Average  Sum    Minimum  Maximum  Unit
2011-05-12 17:51:00  1.0          200.0    200.0  200.0    200.0    Count
2011-05-12 17:53:00  1.0          200.0    200.0  200.0    200.0    Count
2011-05-12 17:55:00  1.0          200.0    200.0  200.0    200.0    Count

というわけで

反映までの若干のタイムラグやCloudWatch特有のめんどくささはありますが、けっこう簡単に使えました。
取得した値はもちろんManagementConsoleでも確認できます。

監視要件がそれほど複雑でなく、保存期間2週間でいいというのであれば、
「全ての監視をCloudWatchで」というのも可能ではないかと思います。


あとはやはり、Auto Scalingのトリガーですね!!!
いろいろ工夫の余地がありそうです。