MyCSS

2011/05/19

JavaのJXMをCloudWatchのカスタムメトリクスに突っ込んでみた件(四番煎じ) はてなブックマークに追加

CloudWatchのカスタムメトリクス
AWSのリソース監視、アラート発信が出来るCloudWatchですが、EC2に関しては正直今ひとつ使いにくいなーと思っておりました。理由は、OSより内側の情報が取れないので、ディスクの空きスペースを監視したり、Tomcatのメモリ状況等の情報を取得する事が出来なかったからです。

お仕事では状況のモニタリングにMuninを使っていますが、その為にインスタンスを1台立てたりして結構メンドイ…っていうか、クラウドっぽくない(笑)訳で、おもわず
Muninの類とCloudWatchって統合できるようにならないのかなー?
とつぶやいた訳ですが、ソリューションアーキテクトの荒木さんに
Zabbix Senderとくっつけてる人とかいますよ!
と教えていただき、なるほどと思いつつ、やりたい事は逆なんだよなーとか思っていたら、じつは一週間ほど前にそのようなリリースがあったんですね…完全に見逃しておりました。

【AWS発表】 クラウド監視サービスAmazon CloudWatchでカスタムのメトリクスが使用可能に - Amazon Web Services ブログ

また、すでに試されている方々もおられます。
これはイケル!と思いつつ、一番やりたいのはJavaアプリのモニタリングなんだよなー、という訳で、
JMXから直接CloudWatchのカスタムメトリクスに投げられるものなんてまだないよね…
とつぶやいたら、これまたソリューションアーキテクトの大谷さんに
無ければ作るだけなのではないかw
と突っ込まれましたので、簡単に作ってみましたw
実行には、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 件のコメント :

コメントを投稿