今回は CloudWatch というか、mon-*系の監視コマンドを使ってみます。



・タグからEC2インスタンスを探す
MasterController という名前の AmazonLinux な EC2 で CloudWatch を試してみます。
MasterController というNameタグを持つインスタンスを探して、そのInstance-ID を入手します。
$ ec2-describe-instances \
     | grep -e '^TAG' \
     | grep 'MasterController' \
     | cut --fields=3
i-0f1b440c
あるいは --filter オプションを使用して以下のようにもできます。
$ ec2-describe-instances \
     --filter 'tag:Name=MasterController' \
   | grep '^INSTANCE' \
   | cut --fields=2
i-0f1b440c
書く手間は、あまり変わりませんね…。
いずれにせよ、コマンドじゃなくてAPIで探した方が良いような気がするけど…。とりあえず、今はコレでガマンしておきます。



・EC2インスタンス用のメトリックス
次に、mon-list-metrics を使って、先に入手した Instance-ID に紐づく Metrics のリストを
入手します。
⇒ mon-list-metrics コマンドだけを使っても一覧を入手できますが、既に削除済みのインスタンスに対するmetricsも表示されたりしてメンドクサイので、Instence-ID で検索したいのです。
$ mon-list-metrics \
     | egrep 'i-0f1b440c' \
     | grep -v '^"'
CPUUtilization                 AWS/EC2  {InstanceId=i-0f1b440c}
DiskReadBytes                  AWS/EC2  {InstanceId=i-0f1b440c}
DiskReadOps                    AWS/EC2  {InstanceId=i-0f1b440c}
DiskWriteBytes                 AWS/EC2  {InstanceId=i-0f1b440c}
DiskWriteOps                   AWS/EC2  {InstanceId=i-0f1b440c}
NetworkIn                      AWS/EC2  {InstanceId=i-0f1b440c}
NetworkOut                     AWS/EC2  {InstanceId=i-0f1b440c}
StatusCheckFailed              AWS/EC2  {InstanceId=i-0f1b440c}
StatusCheckFailed_Instance AWS/EC2  {InstanceId=i-0f1b440c}
StatusCheckFailed_System       AWS/EC2  {InstanceId=i-0f1b440c}

MasterController というタグが付けられたEC2インスタンスには、これだけのMetricsがあるらしいです。

しかし、もっとカンタンな方法を発見。

$ mon-list-metrics \
--dimensions "InstanceId=i-0f1b440c" \
     | egrep -v '^"'

CPUUtilization                 AWS/EC2  {InstanceId=i-0f1b440c}
DiskReadBytes                  AWS/EC2  {InstanceId=i-0f1b440c}
DiskReadOps                    AWS/EC2  {InstanceId=i-0f1b440c}
DiskWriteBytes                 AWS/EC2  {InstanceId=i-0f1b440c}
DiskWriteOps                   AWS/EC2  {InstanceId=i-0f1b440c}
NetworkIn                      AWS/EC2  {InstanceId=i-0f1b440c}
NetworkOut                     AWS/EC2  {InstanceId=i-0f1b440c}
StatusCheckFailed              AWS/EC2  {InstanceId=i-0f1b440c}
StatusCheckFailed_Instance AWS/EC2  {InstanceId=i-0f1b440c}
StatusCheckFailed_System AWS/EC2  {InstanceId=i-0f1b440c}
--dimensions オプションを使えば、簡単に Instance-ID で絞り込みできました!

で、肝心の Metrics そのものですが……。
MasterController は AmazonLinux なマイクロインスタンスなので、ローカルディスクは使用していないです(マイクロインスタンスではEBSが使用される)。つまり、Disk* 系の Metrics には あまり意味が無いというコトですね。


・EC2インスタンスの監視結果を得る
Metrics の一覧が手に入ったので、次は mon-get-stats コマンドで CloudWatch から監視結果の値を入手します。指定するパラメータは以下のようにします。
Metric     = CPUUtilization 
Statistics = Average
NameSpace = AWS/EC2
mon-get-stats --help で確認すると、Statistics には「Average, Sum, SampleCount, Maximum, Minimum」のいずれかが指定できるようです。
$ mon-get-stats \
     CPUUtilization \
     --statistics Average \
     --namespace AWS/EC2
あれ??? パラメータは足りているはずなのに、何も表示されませんね???
(このコマンド指定で何かが表示される場合もありますが、今回は表示されませんでした…。結果が表示されたり、されなかったりする理由は不明。)

気を取り直して、先ほど mon-list-metrics で指定した dimensions を設定してみます。
$ mon-get-stats \
     CPUUtilization \
     --statistics Average \
     --namespace AWS/EC2 \
     --dimensions "InstanceId=i-0f1b440c"

2013-02-17 17:13:00  23.830000000000002   Percent
2013-02-17 17:18:00  0.33399999999999996  Percent
2013-02-17 17:23:00  26.666000000000004   Percent
2013-02-17 17:28:00  0.0                  Percent
2013-02-17 17:33:00  0.0                  Percent
2013-02-17 17:38:00  1.6440000000000001   Percent
2013-02-17 17:43:00  47.18                Percent
2013-02-17 17:48:00  9.622                Percent
2013-02-17 17:53:00  18.887999999999998   Percent
2013-02-17 17:58:00  35.922000000000004   Percent
2013-02-17 18:03:00  12.334               Percent
--dimensions オプションに Instance-ID を指定したら 結果が表示されるようになりましたね。Dimensions は必須オプションではないのに……指定が必要な理由が分からないです。

他の値、ヘルスチェックの結果も見てみましょう。
$ mon-get-stats \
     StatusCheckFailed \
     --statistics Sum \
     --namespace AWS/EC2 \
     --dimensions "InstanceId=i-0f1b440c"

2013-02-17 18:25:00  0.0  Count
2013-02-17 18:30:00  0.0  Count
2013-02-17 18:35:00  0.0  Count
2013-02-17 18:40:00  0.0  Count
2013-02-17 18:45:00  0.0  Count
2013-02-17 18:50:00  0.0  Count
2013-02-17 18:55:00  0.0  Count
2013-02-17 19:00:00  0.0  Count
2013-02-17 19:05:00  0.0  Count
2013-02-17 19:10:00  0.0  Count
2013-02-17 19:15:00  0.0  Count
2013-02-17 19:20:00  0.0  Count
特にヘルスチェックに失敗するような処理もさせていないので、カウントはゼロになっていますね。



・EBSの Volume-ID を得る
MasterController(i-0f1b440c)にアタッチされた EBS の状態を確認してみましょう。
ec2-describe-volumes に --filter オプションを使って、EBS のボリュームIDを探してみます。
$ ec2-describe-volumes \
     --filter 'attachment.instance-id=i-0f1b440c' \
   | grep '^VOLUME' \
   | cut --fields=2


vol-6057ec42



・EBSに対するメトリックスを得る
では、EBS Volume(vol-6057ec42) に対する Metrics のリストを確認します。
$ mon-list-metrics \
     --namespace AWS/EBS \
     --dimensions='VolumeId=vol-6057ec42' \
   | grep -v '^"'
VolumeIdleTime           AWS/EBS  {VolumeId=vol-6057ec42}
VolumeQueueLength        AWS/EBS  {VolumeId=vol-6057ec42}
VolumeReadBytes          AWS/EBS  {VolumeId=vol-6057ec42}
VolumeReadOps            AWS/EBS  {VolumeId=vol-6057ec42}
VolumeTotalReadTime      AWS/EBS  {VolumeId=vol-6057ec42}
VolumeTotalWriteTime AWS/EBS  {VolumeId=vol-6057ec42}
VolumeWriteBytes         AWS/EBS  {VolumeId=vol-6057ec42}
VolumeWriteOps AWS/EBS  {VolumeId=vol-6057ec42}
AWS Management Console でも見たことがあるような監視項目が表示されています。




・EBSの監視結果を得る
まずは、VolumeQueueLength を見てみます。
$ mon-get-stats \
     VolumeQueueLength \
     --statistics Maximum \
     --namespace AWS/EBS \
     --dimensions "VolumeId=vol-6057ec42"
2013-02-17 19:01:00  3.06666666666667E-4  Count
2013-02-17 19:06:00  9.73333333333333E-4  Count
2013-02-17 19:11:00  2.4E-4               Count
2013-02-17 19:16:00  4.13333333333333E-4  Count
2013-02-17 19:21:00  2.13333333333333E-4  Count
2013-02-17 19:26:00  5.2E-4               Count
2013-02-17 19:31:00  2.66666666666667E-4  Count
2013-02-17 19:36:00  1.46666666666667E-4  Count
2013-02-17 19:41:00  1.46666666666667E-4  Count
2013-02-17 19:46:00  0.0                  Count
2013-02-17 19:51:00  0.0                  Count
2013-02-17 19:56:00  0.00133333333333333  Count
浮動小数点が E 表記になっているので、ものすごく見づらいです…。これをふつうの表記に変更する方法が分からない…。

VolumeQueueLength の意味は「The average number of read and write operations waiting to be completed during the period」(単位時間内に、READ/WRITE処理が待たされた回数の平均)ということらしいです。平均ってオカシイような気がするのですが…(単に「回数」じゃなくて??? ↑のコマンド実行結果にも Count [回数]って書いてあるし…)
あと、単位時間(the period)って どれぐらいなのでしょう? …と思いましたが、記録されている時間が 5分毎なので、恐らく 単位時間も5分なのでしょう。EC2の標準状態(無料)の監視間隔と同じですね。

他の値も見ておきます。
$ mon-get-stats \
     VolumeTotalWriteTime \
     --statistics Sum \
     --namespace AWS/EBS \
     --dimensions "VolumeId=vol-6057ec42"

2013-02-17 19:36:00  0.044  Seconds
2013-02-17 19:41:00  0.044  Seconds
2013-02-17 19:56:00  0.26   Seconds
2013-02-17 20:01:00  0.124  Seconds
2013-02-17 20:06:00  0.196  Seconds
2013-02-17 20:11:00  0.088  Seconds
2013-02-17 20:16:00  0.028  Seconds
2013-02-17 20:21:00  0.032  Seconds
2013-02-17 20:26:00  0.072  Seconds
VolumeTotalWriteTimeは「書き込みに処理かかった時間(=待たされた時間)」ということらしいです。これと VolumeTotalReadTime の値が高い値になったら、EBSの処理が遅延しているということになりますね…たぶん。
⇒ 実際に負荷試験するなり、実運用しているEBSから値を取得するなりしないと、ホントのところは分かりませんが…。




・まとめ???
mon-* 系コマンド(というか CloudWatch)には、Namespace / Metrics / Statistics / Dimensions / Unit / Period という値が登場しますが…。ここまでコマンドを使ってみた結果、以下のような感じになっているものと思われます。


Namespaceデータ取得元の大雑把な分類 (AWS/EC2、AWS/EBS など)
Metricsデータの種類 (CPU使用率、失敗回数、遅延時間など)
Dimensionsデータ取得元の詳細な分類(Volume-ID、Instance-ID など)
Statisticsデータの統計方法(平均、合計、最大、最小、記録回数など)
Unit データの単位 (~秒、~バイト、~ビット、~パーセント、~回、~バイト/秒 など)
Periodデータを取得/統計する単位時間 (標準の無料利用状態だと5分単位)

標準で用意されたデータを参照して利用するだけでは、単なる簡単で便利な自動監視機構にしか見えませんが…。
カスタムメトリックス(mon-put-data とか?)とアラームを使いこなせれば、もっと高度に使えそうな気がします…。
⇒ そもそも AutoScaling の基礎になっているので、そのとおりなのですが…(^^;



今回はここまで……。