cloudpack の Sebastian です。

AWSにはAmazon CloudWatchって機能がある。
知らない人はgoogle先生に聞いてね

要するにAWSの特定の機能の状況を監視するモニター機能なのね
ところが当たり前といえば当たり前なんだけれど、標準ではAWSが用意した内容しか監視できません

これを解決する為にcustom metricと言う機能があります

Amazon CloudWatch

custom metricの話をする前に少しだけmetricとそれに関わるAmazon CloudWatchの用語に関して書いておきます。

何かを監視する以上は

  • 監視する対象は?
  • 対象の何を監視するのか?

必用になります

AWSではこの関する対象を以下の2つの情報で指定を行っています。

  • Namespace
  • Dimension

Namespace

AWSの場合、対象を決める場合まず何のサービスなのか?
と言うところから入ります。
Amazon CloudWatchではこれをNamespaceと呼んでいるようです。

以下がサービスごとのNamespaceの指定です

サービス名 Namespace
Auto Scaling AWS/AutoScaling
AWS の請求 AWS/Billing
Amazon DynamoDB AWS/DynamoDB
Amazon ElastiCache AWS/ElastiCache
Amazon Elastic Block Store AWS/EBS
Amazon Elastic Compute Cloud AWS/EC2
Elastic Load Balancing AWS/ELB
Amazon Elastic MapReduce AWS/ElasticMapReduce
AWS OpsWorks AWS/OpsWorks
Amazon Redshift AWS/Redshift
Amazon Relational Database Service AWS/RDS
Amazon Route 53 AWS/Route53
Amazon Simple Notification Service AWS/SNS
Amazon Simple Queue Service AWS/SQS
Amazon Simple Workflow Service AWS/SWF
AWS Storage Gateway AWS/StorageGateway

Dimention

Namespaceがわかれば次にそのサービスの中の監視対象と成るものを指定する必用が出てきます。
例えばDimationがAWS/EC2だとすると監視する対象はInstanceかも知れません
もしかしたら特定のAMIから作成されたInstance全部かも知れません
もしくはElastic IPかも知れません
そういう訳でDimentionで指定されたサービス中の何かを更に細かく指定します
例えばNamespaceがAWS/EC2の場合だとDimentionとして指定できる内容は以下の様になります。

Dimention AWSの公式説明
AutoScalingGroupName このディメンションを指定すると、リクエストしたデータがフィルタリングされて、指定したキャパシティグループ内のインスタンスのものだけになります。AutoScalingGroup は、Auto Scaling サービスを使用する場合に定義するインスタンスのコレクションです。このディメンションを EC2 のメトリックスに対して使用できるのは、インスタンスが AutoScalingGroup 内にあるときに限られます。詳細モニタリングまたは基本モニタリングが有効になっているインスタンスに対して使用できます。
ImageId このディメンションを指定すると、リクエストしたデータがフィルタリングされて、この EC2 Amazon マシンイメージ(AMI)を実行しているインスタンスのものだけになります。詳細モニタリングが有効になっているインスタンスに対して使用できます。
InstanceId このディメンションを指定すると、リクエストしたデータがフィルタリングされて、指定のインスタンスのものだけになります。これを利用すると、どのインスタンスからのデータをモニタリングするかを指定できます。詳細モニタリングが有効になっているインスタンスに対して使用できます。
InstanceType このディメンションを指定すると、リクエストしたデータがフィルタリングされて、指定のインスタンスタイプで実行されているインスタンスのものだけになります。これを利用すると、実行されているインスタンスのタイプでデータを分類することができます。例えば、m1.small インスタンスと m1.large インスタンスのデータを比較して、アプリケーションに対するビジネス価値はどちらが上かを判断します。詳細モニタリングが有効になっているインスタンスに対して使用できます。

Dimantionは実際には2つの値からなり
一つはName、一つはNameが示す値としてのValueです
NameはDimantionとして指定できるDimention名が指定され
Valueには指定されたNameの内で一意になる値を指定します。

例えばNameがInstanceIdの場合はValueはi-xxxxxxxxの様な指定する事で
監視対象がInstanceIdで指定されたサーバーである事を示しています。

metricとは

NamespaceとDimationが決定すると監視対象となる物が絞れます
しかしこれだけだと例えば監視対象のNamespaceがAWS/EC2でDimentionがInstanceIdの場合
そのInstanceIdで指定されたInstance内の何を監視するのか

簡単に説明すると監視対象です

例えば指定したInstanceがどれだけDiskに書き込みをしているか?
例えば指定したInstanceがどれだけNetworkI/Oを使用しているか?

これらを指定する値をcloudwatchではmetricと呼んでいます。
以下はAWS/EC2のNamespace内で全てのDimentionでmetricとして指定できる一覧です

Metrics AWSの公式説明 単位
CPUUtilization 割り当てられた EC2 コンピュートユニットのうち、現在インスタンス上で使用されているものの比率。このメトリックスは、選択されたインスタンス上でアプリケーションを実行するのに必要な処理能力を表します。 Percent
DiskReadOps このインスタンスで利用できるすべてのエフェメラルディスクでの、完了した読み取り操作の数(インスタンスで Amazon EBS を使用している場合は、「Amazon EBS のメトリックス」を参照してください)。このメトリックスは、一定の時間当たりの、アプリケーションがディスクから読み取る回数を表しています。これを利用すると、アプリケーションがハードディスクからデータを読み取る速度がわかります。 Count
DiskWriteOps このインスタンスで利用できるすべてのエフェメラルディスクでの、完了した書き込み操作の数(インスタンスで Amazon EBS を使用している場合は、「Amazon EBS のメトリックス」を参照してください)。このメトリックスは、一定の時間当たりの、アプリケーションがハードディスクに書き込む回数を表しています。これを利用すると、アプリケーションがハードディスクにデータを保存する速度がわかります。 Count
DiskReadBytes このインスタンスで利用できるすべてのエフェメラルディスクでの、読み取りバイト数(インスタンスで Amazon EBS を使用している場合は、「Amazon EBS のメトリックス」を参照してください)。このメトリックスを使用すると、このインスタンスのハードディスクからアプリケーションが読み取るデータの量がわかります。これを利用すると、アプリケーションの速度がわかります。 Bytes
DiskWriteBytes このインスタンスで利用できるすべてのエフェメラルディスクでの、書き込みバイト数(インスタンスで Amazon EBS を使用している場合は、「Amazon EBS のメトリックス」を参照してください)。このメトリックスを使用すると、このインスタンスのハードディスクにアプリケーションが書き込むデータの量がわかります。これを利用すると、アプリケーションの速度がわかります。 Bytes
NetworkIn すべてのネットワークインターフェースでの、このインスタンスによって受信されたバイトの数。このメトリックスは、1 つのインスタンス上での 1 つのアプリケーションへのネットワークトラフィックの量を表しています。 Bytes
NetworkOut すべてのネットワークインターフェースでの、このインスタンスから送信されたバイトの数。このメトリックスは、1 つのインスタンス上での 1 つのアプリケーションからのネットワークトラフィックの量を表しています。 Bytes
StatusCheckFailed StatusCheckFailed_Instance と StatusCheckFailed_System の組み合わせで、どちらかのステータスチェックが失敗したら報告します。このメトリックスの値は 0 か 1 です。0 はステータスチェックが成功したことを示します。1 はステータスチェックの失敗を示します。 Count
StatusCheckFailed_Instance “最近 1 分間にインスタンスが EC2 インスタンスステータスチェックに成功したかどうかを報告します。このメトリックスの値は 0 か 1 です。0 はステータスチェックが成功したことを示します。1 はステータスチェックの失敗を示します。 Count
StatusCheckFailed_System 最近 1 分間にインスタンスが EC2 システムステータスチェックに成功したかどうかを報告します。メトリックスの値は 0 か 1 です。0 はステータスチェックが成功したことを示します。1 はステータスチェックの失敗を示します。 Count

custom metric

ここまででcloudwatch内の話を進めましたが
見て分かるように、cloudwatchで監視対象となるmetricは少々数が少ないです。
used memoryを監視したい人もいれば、apacheのBusyWorkerを確認したい人も居るでしょう
そういう時にcloudwatchではmetricを自分で作成出来る機能があります。

流れとしては

  • custom metricのnamespace名 , dimention, metric名 , 単位を決める
  • 監視する値を取得する
  • 取得した値を定期的にcloudwatchに送信する

以上の手順を行うことで自分の手で新たにmetricが作成できます
namespace名とmetric名は任意で
単位は以下の中から決めます

単位
Seconds
Microseconds
Milliseconds
Bytes
Kilobytes
Megabytes
Gigabytes
Terabytes
Bits
Kilobits
Megabits
Gigabits
Terabits
Percent
Count
Bytes/Second
Kilobytes/Second
Megabytes/Second
Gigabytes/Second
Terabytes/Second
Bits/Second
Kilobits/Second
Megabits/Second
Gigabits/Second
Terabits/Second
Count/Second
None

じゃあ、作ろう

試しにapacheのserver-statusからBusyWorkersを取得してcustom metricとしてみましょう

内容は以下の様にします

項目
namespace System/Apache
dimantion InstanceId
metric BusyWorkers
単位 None

定期的にcloudwatchに送るためにはcronを使うことにしましょう
cloudwatchに値を送信するにはmon-put-dataコマンドを用います
これはAmazon Linuxだと/opt/aws/bin/以下にあります

下準備

mon-put-dataはaws-cliとは別途、credentialsの指定が必要になります
ec2のroleなどを指定していても動きません
Amazon Linuxだと/opt/aws/credential-file-path.templateがあるのでこれをコピーして用います

cp /opt/aws/credential-file-path.template /home/ec2-user/.aws/croudwatch_credential

コピーしたらcloudwatchにアクセス出来るUserのcredentialの情雨を書き込んで下さい

vi /home/ec2-user/.aws/croudwatch_credential
AWSAccessKeyId=
AWSSecretKey=
書いてみる
#!/bin/sh

# 投げ先のcloudwatchのurl
export AWS_CLOUDWATCH_URL=https://monitoring.amazonaws.com
# cloudwatch用のcredenatial情報
export AWS_CREDENTIAL_FILE=/home/ec2-user/.aws/cloudwatch_credentials

# 自分のInstanceIdを取得
instanceid=`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`
# 自分のリージョンを取得
instanceregion=$(curl -s http://169.254.169.254/latest/meta-data/local-hostname | cut -d '.' -f2)

# Apacheのserver-statusにアクセスしてBusyWorkersを取得する
busy=$(curl -s http://localhost/server-status?auto | grep BusyWorkers | sed 's/BusyWorkers: //g')

# cloudwatchに送信する
mon-put-data --metric-name "BusyWorkers" --namespace "System/Apatche" --dimensions "InstanceId=$instanceid" --value "$busy" --unit "None" --region $instanceregion

これだけです
後はこのスクリプトを保存してcronにて定期的に回してあげるとcloudwatchに送信されます。

確認してみる

取り敢えずaws-cliからmetricsが追加されているか確認してみます

aws cloudwatch list-metrics --namespace "System/Apache"
{
        {
            "Namespace": "System/Apache",
            "Dimensions": [
                {
                    "Name": "InstanceId",
                    "Value": "i-xxxxxxxx"
                }
            ],
            "MetricName": "BusyWorkers"
        }
    ]
}

はい、追加されましたね

元記事はこちらです。
CloudWatch と custom metric