[WLS, Java] Weblogic Server - Monitor JDBC Resources via JMX API

原文はこちら。
https://blogs.oracle.com/muraliveligeti/entry/monitor_jdbc_resources_via_jmx

ドメインのJDBCリソースを監視する方法は2つあります。
  1. 各管理対象サーバに直接アクセス(ランタイムMBeanサーバ)
  2. 管理サーバを経由してアクセス(ドメインランタイムMBeanサーバ)
ドメインランタイムMBeanサーバを使った場合のメリット
  • 管理サーバ上のドメインランタイムMBeanサーバに接続するための一つのURLだけでよく、接続後、全てのサーバインスタンスの値をルックアップ、必要に応じて結果をフィルタリングすることもできる。
  • コードがランタイムMBeanサーバを使って複数のサーバインスタンスのMBeanの値を読み取る場合、各サーバインスタンス(一意のリスニングアドレス、ポートの組み合わせを持つ)のURLを使ってコードを作成する必要がある。
  • WebLogic Serverドメインの全ての管理トラフィックを管理サーバのセキュアな管理ポートにルーティングすることができる。ファイウォールを使うと、管理サーバの管理ポートへの外部からの接続を防ぐことができる。
ドメインランタイムMBeanサーバを使った場合のデメリット
  • 管理サーバが落ちている場合、ドメインランタイムMBeanサーバを使って監視できない。その場合、ランタイムMBeanサーバにアクセスする必要がある。
  • 各管理サーバのランタイムMBeanサーバに直接接続してMBeanの値を読む場合、ドメインランタイムMBeanサーバが管理対象サーバから値を取り出すために必要なネットワークホップ数が少なくなる。
WebLogic ServerのMbeansを、管理用途か、サーバやリソースの構成用途かに基づいて、以下の一般的なタイプの一つに分類することができます。
  1. ランタイムMBeansにはサーバやリソースのランタイム状態に関する情報が含まれている。 一般的にMBeanにはサーバやリソースの現在の状態に関するデータのみ持っており、これらのデータを永続化しない。サーバインスタンスを停止した場合、ランタイムMBeansからの全てのランタイム統計やメトリックは破棄される。
  2. 構成MBeansにはサーバやリソースの構成に関する情報が含まれている。このMBeansはドメインのXML構成ドキュメントに格納されている情報を表現している。システムモジュールの構成MBeansは、例えばJDBCデータソースや、システムレベルで指定されたJMSトピックサービスのようなサービス構成に関する情報が含まれている。
全てのMBeansを、javax.management.ObjectName型というオブジェクト名でMBeanサーバに登録する必要があります。
WebLogic Severの命名規則はMBeanオブジェクト名を以下のようにエンコードします。
com.bea:Name=name,Type=type[,TypeOfParentMBean=NameOfParentMBean]
[,TypeOfParentMBean1=NameOfParentMBean1]...
ここで、
  • com.bea: JMXドメイン名
  • Name=name,Type=type[,TypeOfParentMBean=NameOfParentMBean] [,TypeOfParentMBean1=NameOfParentMBean1]... :JMXキープロパティ
キープロパティの順序は重要ではありませんが、名前は必ずcom.bea:で始まる必要があります。
では、JDBCリソースを監視するためにMBeanサーバに接続するプログラムを書くというシナリオを考えてみましょう。
WebLogic ServerはMBeanを階層データモデルで整理しています。このモデルでは、全ての親MBeanが子MBeanのオブジェクト名を含む属性を持ちます。標準的なJMX APIで子オブジェクト名を使って、子MBeanの属性値を設定・取得したり、メソッドを呼び出したりします。
WebLogic ServerのMBean階層をナビゲートするには…

Step 1: MBeanサーバとの接続を作成する
MBeanサーバに接続する方法には、(a) ローカル接続と(b) リモート接続の2種類があります。

(a) ローカル接続
アプリケーションが同一サーバ(管理サーバもしくは管理対象サーバ)で実行しているものとします。
ドメインランタイムMBeanサーバに接続
private static MBeanServer connection;   
InitialContext ctx = new InitialContext();   
connection= (MBeanServer)ctx.lookup("java:comp/env/jmx/domainRuntime"); 

管理対象サーバのランタイムMBeanサーバに接続
private static MBeanServer connection;
InitialContext ctx = new InitialContext();   
connection = (MBeanServer)ctx.lookup("java:comp/env/jmx/runtime"); 
(b) リモート接続
アプリケーションはサーバ外で動作しており、サーバ(管理サーバもしくは管理対象サーバ)のリソースを監視するものとします。
ドメインランタイムMBeanサーバに接続
private static MBeanServerConnection connection;   
private static JMXConnector connector;   

String hostname = "WLS_host";
int port = WLS_port;   
String protocol = "t3";

Integer portInteger = Integer.valueOf(portString);   
int port = portInteger.intValue();   

String jndiroot = "/jndi/";   
String mserver = "weblogic.management.mbeanservers.domainruntime";   

JMXServiceURL serviceURL = new JMXServiceURL(protocol, hostname, port, jndiroot + mserver);
Hashtable<String,String> h = new Hashtable<String,String>();   

h.put(Context.SECURITY_PRINCIPAL, username);   
h.put(Context.SECURITY_CREDENTIALS, password);   
h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,"weblogic.management.remote");   

connector = JMXConnectorFactory.connect(serviceURL, h);   
connection = connector.getMBeanServerConnection(); 

管理対象サーバのランタイムMBeanサーバに接続
private static MBeanServerConnection connection;   
private static JMXConnector connector;   

String hostname = "WLS_host";
int port = WLS_port;
String protocol = "t3";
Integer portInteger = Integer.valueOf(portString);
int port = portInteger.intValue();   
String jndiroot = "/jndi/";   
String mserver = "weblogic.management.mbeanservers.runtime";   

JMXServiceURL serviceURL = new JMXServiceURL(protocol, hostname, port, jndiroot + mserver);
Hashtable<String,String> h = new Hashtable<String,String>();   

h.put(Context.SECURITY_PRINCIPAL, username);   
h.put(Context.SECURITY_CREDENTIALS, password);   
h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,"weblogic.management.remote");   

connector = JMXConnectorFactory.connect(serviceURL, h);   
connection = connector.getMBeanServerConnection(); 

Step 2: MBeanのオブジェクト名を取得する

MBeanServerConnection.getAttribute(ObjectName object-name, String attribute)メソッドを呼び出してMBean階層のルートでMBeanの名前を取得します。ここで、
  • object-name:MBeanサーバに登録されているサービスMBeanのオブジェクト名。
  • attribute :  子MBeanの一つ以上のインスタンスを含む現在のMBeanの属性の名前。属性が複数の子を含む場合、オブジェクト名の配列 ObjectName[] に出力結果を割り当てる。
1)ドメインランタイムMBeanを取得
javax.management.ObjectName service = new ObjectName(   
"com.bea:Name=DomainRuntimeService,Type=weblogic.management.mbeanservers.domainruntime.DomainRuntimeServiceMBean"); 

2)DomainRuntimeServiceでServerRuntimesを取得する(つまり、ドメインランタイムMBeanから全ての管理対象サーバのランタイムMBeanを取得しようとする、ということ)
ObjectName[] serverRuntimesArray = (ObjectName[])connection.getAttribute(service, "ServerRuntimes"); 

3)各サーバランタイムMBeanについてJDBCDataSourceRuntimeMBeansを取得する
Foreach serverRuntime:   
Start:   
ObjectName[] dataSourceArray = (ObjectName[])connection.getAttribute(new ObjectName("com.bea:Name="+name+",ServerRuntime="+name+",Location="+name+",Type=JDBCServiceRuntime"),"JDBCDataSourceRuntimeMBeans");
End:
ここで、
  • connection:MBeanServerConnection型のオブジェクト(step 1でこのオブジェクトを取得済み)


このエントリに添付したアプリケーションにアクセスするには

JDBCMbean.warとJDBCMbean.zipをこのエントリに添付しています。
  1. warファイルをダウンロード
  2. JDBCMbean.warを管理サーバにデプロイし、以下のURLでアプリケーションにアクセス
    http://<host>:<port>/JDBCMbean/index.jsp".
  3. ホスト名、管理サーバのポート番号、管理ユーザ名、パスワードを指定してsubmitをクリックする。このプログラムは環境全体(管理サーバ、管理対象サーバ)のJDBC構成を抽出する

.warファイルを実行すると以下のような表示が出てきます。

JDBC Resources

JDBCリソースの監視のためのサンプルWebアプリケーション
https://blogs.oracle.com/muraliveligeti/resource/JDBCMbean.war
プロジェクトファイル
https://blogs.oracle.com/muraliveligeti/resource/JDBCMbean.zip

0 件のコメント:

コメントを投稿