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」