- CloudWatch によるインスタンスのモニタリング
- 自分なりにはこちらに纏めた
- 今更ウンチクを語る必要も無い
AWS
ではポピュラーツール - と言いつつ、今更気付いたけど
Java
版とPython
版がある
- CloudWatch の CLI ツールについて理解を深める
- カスタムメトリクスを投げる方法について理解を深める
- カスタムメトリクスを使って一般的(
Load Average
or メモリ使用量、ディスク使用量)なサーバーリソースの監視が出来るようになる - 同じくカスタムメトリクスを使ってサーバープロセスの監視が出来るようになる
やっていることは同じであろう...という前提で、勝手に対応表を作ってみた。
Java 版 | Python 版 | やれること | 備考(触っていて気づいたら書く) |
---|---|---|---|
mon-cmd | mon-* コマンドの詳細を表示する | ||
mon-delete-alarms | delete-alarms | 指定されたアラームを削除する | |
mon-describe-alarm-history | describe-alarm-history | 指定されたアラームの履歴を表示する | 過去 2 週間分に限る |
mon-describe-alarms | describe-alarms | 設定されているアラームの一覧を表示する | |
mon-describe-alarms-for-metric | describe-alarms-for-metric | 指定されたメトリックに関連付けられたアラームの情報を表示する | |
mon-disable-alarm-actions | disable-alarm-actions | 指定したアラームのアクションを無効にする | |
mon-enable-alarm-actions | enable-alarm-actions | 指定したアラームのアクションを有効にする | |
mon-get-stats | get-metric-statistics | 指定したメトリクスの時系列データを表示する | |
mon-list-metrics | list-metrics | AWSアカウントに関連付けられたメトリックのリストを表示する | |
mon-put-data | put-metric-data | メトリクスデータを追加する | Java 版詳細 / Python 版詳細 |
mon-put-metric-alarm | put-metric-alarm | 指定されたアラームをメトリクスに設定、更新する | |
mon-set-alarm-state | set-alarm-state | 一時的にアラーム状態を変更する | 次の監視タイミングまでそのアラームは真の状態に設定される |
mon-version | バージョン情報を表示 | Amazon CloudWatch CLI version w.x.y.z (API 2010-08-01) と表示された |
ちなみに Amazon Linux
の場合にはどちらのバージョンもインストールされていた。
メトリクスデータを追加する mon-put-data
と put-metric-data
に関して詳しく触れてみる。
- オプション
Name | 詳細 | デフォルト |
---|---|---|
-d, --dimensions "key1=value1,key2=value2..." | 直訳すると dimensions は「大きさ」とかになるけど Instance ID 毎にメトリクス指定したい場合には必要 |
-- |
-m, --metric-name VALUE1,VALUE2,VALUE3... | メトリクス名を指定 | 必須 |
-n, --namespace VALUE | メトリクス内に Namespece を含める(AWS Namespaces) |
必須 |
-s, --statistic Values "key1=value1,key2=value2..." | メトリクスの値を指定する(--value オプションと排他で使用する) |
必須 |
-t, --timestamp VALUE | メトリックのタイムスタンプを指定(The current UTC time. ) |
-- |
-u, --unit VALUE | 記録されるメトリクスの単位を指定 | -- |
-v, --value VALUE | メトリクスの値を指定する(--statistic Values オプションと排他で使用する) |
必須 |
--statistic Values
は登録するメトリクス内に最高値を含めたい場合に利用出来そう。ただ、基本的には --value
で良いのではないかと思っている。
- やってみる
mon-put-data --metric-name RequestCount \
--namespace "MyService" \
--dimensions "Instanceid=`curl -s http://169.254.169.254/latest/meta-data/instance-id`" \
--value `echo $RANDOM`
- 定期的に実行させると...
以下のような Cron
を仕込んでおく。(事前にこちらを参考にクライアントツールをダウンロードしておく)
#!/usr/bin/env bash
export JAVA_HOME=/usr/lib/jvm/jre
export PATH=$PATH:$JAVA_HOME/bin
export AWS_CREDENTIAL_FILE=/path/to/key
export AWS_CLOUDWATCH_URL=http://monitoring.us-east-1.amazonaws.com/
export AWS_CLOUDWATCH_HOME=/opt/aws/CloudWatch
Instance_id=`curl -s http://169.254.169.254/latest/meta-data/instance-id`
${AWS_CLOUDWATCH_HOME}/bin/mon-put-data --metric-name RequestCount \
--namespace "MyService" \
--dimensions "Instanceid=${Instance_id}" \
--value `echo $RANDOM`
以下のようにグラフが表示される。
- 注意点
When you create a new metric using the mon-put-data command, it can take up to two minutes before you can retrieve statistics on the new metric using the mon-get-stats command. However, it can take up to fifteen minutes before the new metric appears in the list of metrics retrieved using the mon-list-metrics command.
上記のように初めて mon-put-data
で登録したデータは mon-get-stats
で確認出来るまでに 2
分掛かるようだ。また、mon-list-metrics
で確認出来るようになるには 15
分掛かるとのこと。
- オプション
Name | 詳細 | デフォルト |
---|---|---|
--namespace | Namespace を指定する | 要確認 |
--metric-data | メトリクスを指定する(JSON 形式で登録する) |
要確認 |
--metric-name | メトリクス名を指定する | 要確認 |
--timestamp | メトリックのタイムスタンプを指定(The current UTC time. ) |
要確認 |
--unit | 記録されるメトリクスの単位を指定 | 要確認 |
--value | メトリクスの値を指定する | 要確認 |
--dimensions | Instance ID 毎にメトリクス指定したい場合には必要 |
要確認 |
--statistic-values | メトリクスの値を指定する(--value オプションと排他で使用する) |
要確認 |
- やってみる
--metric-data
オプションに JSON
で書かれたメトリクス情報を登録してみたいので以下のように JSON
ファイルを用意する。
[
{
"MetricName": "New Posts",
"Value": 123456789,
"Unit": "Count",
"Dimensions": [
{
"Name": "Instanceid",
"Value": "xxxxxx"
}
]
}
]
この JSON
ファイルを test.json
というファイル名で保存して、以下のように aws
コマンドを実行する。
aws --region us-east-1 cloudwatch put-metric-data --namespace "Usage Metrics" --metric-data file://test.json
- 定期的に実行させると...
以下のように JSON
を適当に生成させるようなロジックを入れてスクリプト と cron
でボチボチ回してみる。
cat << EOT > ${HOME}/cloudwatch/test.json
[
{
"MetricName": "New Posts",
"Value": `echo $RANDOM`,
"Unit": "Count",
"Dimensions": [
{
"Name": "Instanceid",
"Value": "`curl -s http://169.254.169.254/latest/meta-data/instance-id`"
}
]
}
]
EOT
aws --region us-east-1 cloudwatch put-metric-data --namespace "Usage Metrics" --metric-data file://${HOME}/cloudwatch/test.json
- コマンドラインから Load Average を取得する方法
uptime |awk '{print $10}' | cut -d ',' -f 1
- コマンドラインからメモリ使用量をメガで取得する方法
free -mt | grep Total | awk '{print $4}'
- ディスク使用量をメガで取得する方法
df -m / | tail -n+2 | while read fs size used rest ; do if [[ $used ]] ; then echo $fs $used; fi; done
以下のような結果が返ってくる。
/dev/xvda1 1488
- 後で調べる
- 後で調べる
CloudWatch
を使う上で知っておくと良いと思ったネタをメモ。
インスタンス内から API
で取得出来る。
curl http://169.254.169.254/latest/meta-data/
以下のような情報が返ってくる。
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
hostname
instance-action
instance-id
instance-type
kernel-id
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
インスタンス ID
は以下のように取得する。
curl -s http://169.254.169.254/latest/meta-data/instance-id
インスタンスのホスト名は以下のように取得する。
curl -s http://169.254.169.254/latest/meta-data/hostname
以下、イメージ。
簡単や。
CPU 使用率、メモリ使用率、/ パーティションのディスク使用率を取得する bash
ネタ元はこちら。