GlassFish v2.1で閾値をこえたらログを出す管理ルールを作る

感想おまちしてます!

GlassFish Performance Advisor 的なもの、自作しよう、その 2を参考に。

会社でやったときはうんともすんとも動かなかったので、おぎのさんの例を参考に進める。

GlassFish v2.1のOS監視用カスタムMBeanを作るで作ったOSMonitorを監視して、閾値を超えたらログを出力させてみる。

スポンサーリンク

MBeanインタフェース作成

とりあえずこれはいるみたい。IF名の最後をMBeanにすること。

 package com.daipresents.gfmon.action;
public interface LoggingActionMBean {
}

Action作成

上で作ったMBeanインタフェースと、NotificationListenerという通知を受信するためのIFを実装する。
handleNotificationというメソッドがあれば、監視されるMBeanではなく、Actionを実行するMBeanと認識しているみたい。

今回はログを出すだけにしているが、閾値を上回ったり下回ったりしたときにActionを変えることもできる。

 package com.daipresents.gfmon.action;
import javax.management.Notification;
import javax.management.NotificationListener;
import javax.management.monitor.MonitorNotification;
import org.apache.log4j.Logger;
public class LoggingAction implements NotificationListener,  LoggingActionMBean {
private Logger logger = Logger.getLogger(LoggingAction.class);
public LoggingAction(){
}
public void handleNotification(Notification notification, Object handback) {
String observedAttribute = ((MonitorNotification) notification).getObservedAttribute();
String notificationMessage;
if (notification.getType().equals(MonitorNotification.THRESHOLD_HIGH_VALUE_EXCEEDED)) {
notificationMessage = observedAttribute + " exceeded high threshold.";
} else {
notificationMessage = observedAttribute + " exceeded low threshold.";
}
logger.info("NOTIFICATION:" + notificationMessage);
}
}

GlassFishへ登録

001 カスタムMBeanを配備。

004 002実装したActionであるLoggingActionを入力する。

003名前もそろえてLoggingActionとしておく。

004 (1)監視されるMBeanもActionのMBeanも同じ一覧に表示される。よって、名前にActionを入れるとかにするとわかりやすくて便利かも。
005 (1)次に設定>管理ルールを作成する。このルールでMBeanを監視し、何かあったら何かするといった定義を行うことができる。

006 (1)ルール名は日本語だとおかしくなるので英語に。イベントタイプはいろいろあるけどmonitorにする。

007ここがやっかい。
監視対象のMBeanにはカスタムMBeanの画面(ここだとOSMonitorの編集画面)に表示される「オブジェクト名」を使う。さらに、オブジェクト名だけではだめで、以下のように「server=server」を追加してあげなければならない。よって入力は以下のようになる。

user:impl-class-name=com.daipresents.gfmon.OSMonitor,name=OSMonitor,server=server

単体でGlassFIshを動かしている場合は「server=server」らしいので、クラスタのときとかは「server=clusterXXX」とか「server=instanceXXX」とかもありえるかも。

監視対象の属性は「FreePhysicalMemoryInPercent」のようにgetterのgetを除いたものを指定すればその値を見てくれる。下のほうにある数値型は「getFreePhysicalMemoryInPercent()」の戻り値に合わせ、その値の上限下限を設定できる。

粒度周期は監視の周期時間。今回は5秒。
閾値は上限下限ともに0にして、すぐに反応するようにした。

008アクションには、今回作成したLoggingActionが選べるようになっているはずなので選択しておく。

動作確認

サーバの再起動が必要かもしれない。僕の環境では管理ルールを作成したら動き出した。
以下のようなログが5秒おきにでている。

2009-03-15 15:44:10,462  INFO com.daipresents.gfmon.action.LoggingAction - NOTIFICATION:FreePhysicalMemoryInPercent exceeded low threshold.
2009-03-15 15:44:15,470  INFO com.daipresents.gfmon.OSMonitor - FreePhysicalMemoryInPercent = 31
2009-03-15 15:44:20,478  INFO com.daipresents.gfmon.OSMonitor - FreePhysicalMemoryInPercent = 31
2009-03-15 15:44:25,485  INFO com.daipresents.gfmon.OSMonitor - FreePhysicalMemoryInPercent = 31
2009-03-15 15:44:30,493  INFO com.daipresents.gfmon.OSMonitor - FreePhysicalMemoryInPercent = 31
200


ソースはGoogleコード