JMX でシステムの状況をざっくり確認したい
Perl の世界では、よく管理画面にヘルスチェック的な数字等を表示する機能を組み込みますが、Java の世界では JMX で見れるようにしておくのが一般的なようです。
JMX の使い方を調べてみると、出自が古いこともあって、古い情報が多いのと、使える機能を細かく説明しているサイトが多く、実際の僕のユースケースにあう形の実装方法に行き着くまでに時間がかかりました(得てしてプログラミング関係の情報、「これもできます」「あれもできます」という説明が多くて、実際のユースケースにたどりつくのに時間がかかるものですね。Java にかぎらず)。
実際、ゆるふわに JMX にメトリックス数字を追加するだけなら、そんなに考えることは多くないことがわかりました。
まず、以下のようなインターフェースを定義します。なんかゲッターっぽいのを定義しておけばよいです。 名前は MBean で終わる必要があるとのこと。public にしておかないと死にます。
public interface HelloMBean {
public String getHello();
public String getName();
public void setName(String name);
}
そして実装クラスを作ります。得に難しいことはないです。普通につくればよい。
private static class Hello implements HelloMBean {
private String name;
public String getHello() {
System.out.println("MBEEAAAAN");
if (name == null) {
return "Hello, world";
} else {
return "Hello, " + name;
}
}
@Override
public String getName() {
return this.name;
}
@Override
public void setName(String name) {
this.name = name;
}
}
あとは、実際に MBeanServer に登録すればよろしい。
public static void main(String[] args) throws MalformedObjectNameException, NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException, IOException {
// visualvm などでどれを見たらいいのか分かりやすくするために、PID を表示しておく。
System.out.println(ManagementFactory.getRuntimeMXBean().getName());
final MBeanServer mbeanServer =
ManagementFactory.getPlatformMBeanServer();
ObjectName objectName = new ObjectName("me.geso:type=MBeanSample");
final Hello helloMbean = new Hello();
mbeanServer.registerMBean(helloMbean, objectName);
// 試すためにメインスッドレに待っててもらう
System.in.read();
}
後はまあ、visualvm-mbeans プラグインを visualvm に入れて、確認すればいい。jconsole で見てもいい。
JMX 自体、太古より伝わる技術なので、最近の Java に比べると使い方がだいぶ違う。のでとっつきにくい。 最近の Java ならば以下のように、アノテーションでやるところだと思う。
private static class Hello {
@JMXDeMireruYo
public String getHello() {
System.out.println("MBEEAAAAN");
return "World";
}
}
とか思ってたら、なんかあるっぽい? javax.management.ManagedAttribute でできるっぽいけどよくわからんな。。 EE のアレの側にアノテーション入ってるっぽいし、がんばって使う必要があるのかよくわからん。
http://tomee.apache.org/examples-trunk/mbean-auto-registration/README.html
Setter でデータを変更することもできるので、ちょっとした管理上の操作などを行う事もできるんだと思う。 閾値を一時的にいじるとか。。
DynamicMBean とやらを使えば、インターフェースを実装するのではなく、フレキシブルに項目を変動させることが可能だが、まーなんというかけっこうダルそうだったので、必要になるまで考えないことにした。
JMX を使うと java 以外の言語で数字とるのが面倒という説もありますが、その場合は JVM に jolokia (httpd を立ち上げて JSON API として metrics 数字を取得可能にするやつ)をロードすればいいのであまり大した問題ではないです。