Skip to content

Instantly share code, notes, and snippets.

@inokappa
Last active November 9, 2015 11:59
Show Gist options
  • Save inokappa/2a220eb50793094e1c0a to your computer and use it in GitHub Desktop.
Save inokappa/2a220eb50793094e1c0a to your computer and use it in GitHub Desktop.
涙の自腹課金検証シリーズ第三弾:CloudWatch とは

涙の自腹課金検証シリーズ第三弾:CloudWatch とは


やりたい事

  • CloudWatch の CLI ツールについて理解を深める
  • カスタムメトリクスを投げる方法について理解を深める
  • カスタムメトリクスを使って一般的(Load Average or メモリ使用量、ディスク使用量)なサーバーリソースの監視が出来るようになる
  • 同じくカスタムメトリクスを使ってサーバープロセスの監視が出来るようになる

CloudWatch の CLI ツール詳細

情報

Java 版、Python 版の私的な対応表

やっていることは同じであろう...という前提で、勝手に対応表を作ってみた。

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 を見てみる

メトリクスデータを追加する mon-put-dataput-metric-data に関して詳しく触れてみる。

mon-put-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 分掛かるとのこと。

put-metric-data

  • オプション
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

  • コマンドラインから Load Average を取得する方法
uptime |awk '{print $10}' | cut -d ',' -f 1

Memory 使用量

  • コマンドラインからメモリ使用量をメガで取得する方法
free -mt | grep Total | awk '{print $4}'

Disk 使用量

  • ディスク使用量をメガで取得する方法
df -m / | tail -n+2 | while read fs size used rest ; do if [[ $used ]] ; then echo $fs $used; fi; done

以下のような結果が返ってくる。

/dev/xvda1 1488

サーバープロセスの監視

Apache のプロセス

  • 後で調べる

Growthforecast のプロセス

  • 後で調べる

その他

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

以下、イメージ。

簡単や。

@inokappa
Copy link
Author

CPU 使用率、メモリ使用率、/ パーティションのディスク使用率を取得する bash

#!/bin/bash     
echo CPU: `top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}'` 
FREE_DATA=`free -m | grep Mem` 
CURRENT=`echo $FREE_DATA | cut -f3 -d' '`
TOTAL=`echo $FREE_DATA | cut -f2 -d' '`
echo RAM: $(echo "scale = 2; $CURRENT/$TOTAL*100" | bc)
echo HDD: `df -lh | awk '{if ($6 == "/") { print $5 }}' | head -1 | cut -d'%' -f1`

ネタ元はこちら

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment