CloudWatchのカスタムメトリクス
AWSのリソース監視、アラート発信が出来るCloudWatchですが、EC2に関しては正直今ひとつ使いにくいなーと思っておりました。理由は、OSより内側の情報が取れないので、ディスクの空きスペースを監視したり、Tomcatのメモリ状況等の情報を取得する事が出来なかったからです。お仕事では状況のモニタリングにMuninを使っていますが、その為にインスタンスを1台立てたりして結構メンドイ…っていうか、クラウドっぽくない(笑)訳で、おもわず


【AWS発表】 クラウド監視サービスAmazon CloudWatchでカスタムのメトリクスが使用可能に - Amazon Web Services ブログ
また、すでに試されている方々もおられます。
- CloudWatchのカスタムメトリクス使ってみた - IT 東京 楽しいと思うこと
- CloudWatchのCustom Metricsを使ってみた(二番煎じ) - log4moto
- suz-lab - blog: NagiosとCloudWatchを組み合わせてみた


実行には、AWS SDK for Javaの最新版が必要になります。公式サイトからダウンロードしても良いですし、Mavenのリポジトリより適時落としてください。
使用例
JXMを使ってヒープメモリの状況を取り出し、それを一分間隔でCloudWatchに投げる例です。import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryUsage;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.cloudwatch.AmazonCloudWatchClient;
import com.amazonaws.services.cloudwatch.model.Dimension;
import com.amazonaws.services.cloudwatch.model.MetricDatum;
import com.amazonaws.services.cloudwatch.model.PutMetricDataRequest;
import com.amazonaws.services.cloudwatch.model.StandardUnit;
public class JMXTest1 {
public static void main(String[] args) throws Exception {
while (true) {
MemoryMXBean mBean = ManagementFactory.getMemoryMXBean();
// ヒープメモリ状況取得
MemoryUsage heapUsage = mBean.getHeapMemoryUsage();
// Dimension
Dimension dimension = new Dimension().withName("Server").withValue("001");
// カスタムメトリクスデータのリクエストを生成
PutMetricDataRequest request = new PutMetricDataRequest()
.withNamespace("MyJVMTest01")
.withMetricData(
// Used
new MetricDatum().withDimensions(dimension)
.withMetricName("Used")
.withUnit(StandardUnit.Bytes.toString())
.withValue((double) heapUsage.getUsed()),
// Max
new MetricDatum().withDimensions(dimension)
.withMetricName("Max")
.withUnit(StandardUnit.Bytes.toString())
.withValue((double) heapUsage.getMax()),
// Committed
new MetricDatum()
.withDimensions(dimension)
.withMetricName("Committed")
.withUnit(StandardUnit.Bytes.toString())
.withValue((double) heapUsage.getCommitted())
);
AWSCredentials cred = new BasicAWSCredentials("アクセスキー", "シークレットキー");
AmazonCloudWatchClient client = new AmazonCloudWatchClient(cred);
// CloudWatchにデータ送信
client.putMetricData(request);
Thread.sleep(60 * 1000);
}
}
}で、結果がこれ。(画像クリックで拡大)
というわけで、めでたしめでたし!
ついでに要望など
カスタムメトリクスはとても嬉しい機能なのですが、グラフの時間を自分のロケールで表示できればパーフェクトですね… という訳で顧客というのはトコトンわがままな訳ですが(笑)とても良いサービスなのでついつい言ってしまいます!

0 件のコメント :
コメントを投稿