この章の内容は次のとおりです。
アプリケーションの開発とデプロイ、およびWLSTの使い方については、次の項での説明に加え、次のマニュアルも参照してください。
Oracle WebLogic Serverアプリケーションの開発
Oracle WebLogic Server JMXを使用した管理の容易なアプリケーションの開発
Oracle WebLogic Server JMXを使用したカスタム管理ユーティリティの開発
Oracle WebLogic Serverへのアプリケーションのデプロイ
WebLogic Scripting Toolの理解
通常、診断データは、以下のプロセスでWLDFコンポーネントによって生成および取得されます。
ハーベスタ、インストゥルメンテーション、イメージ・キャプチャ、および監視および通知の各コンポーネントのWLDF XML記述子ファイルの設定によって、サーバーの実行中に生成される診断データの種類と量が決まります。
診断コンテキストとインストゥルメンテーションの設定によって、診断データがシステム内を流れる過程でフィルタ処理およびモニターされます。データが収集され、アクションがトリガーされ、イベントが生成され、構成された通知が送信されます。
アーカイブ・コンポーネントによってデータが格納されます。
アクセサ・コンポーネントによってデータが取得されます。
構成は主に管理タスクであり、WebLogic Server管理コンソールまたはWLSTスクリプトを使用して行います。システム・レベル(サーバーおよびクラスタ)やアプリケーション・レベルでデプロイ可能な記述子モジュールとXML構成ファイルは、診断リソースを構成するための主なメソッドです。(WLDFリソースの構成の詳細は、「WLDF構成について」を参照してください)。
アクセサ・コンポーネントによる出力の取得は、管理タスクになる場合と、プログラム的なタスクになる場合があります。
WebLogic Server管理コンソールまたはWLSTを使用してWLDFリソースを作成すると、WebLogic ServerによってリソースごとにMBean(マネージドBean)が作成されます。JMXまたはWLSTを使用してこれらのMBeanにアクセスできます。WLSTはJMXクライアントであるため、WLSTを使用して実行できるすべてのタスクは、JMXを使用してプログラム的に実行することもできます。
表17-1に、WLDFおよびそのコンポーネントに関係するBeanとパッケージをリストを示します。図17-1では、Beanをタイプ別にグループ化しています。
表17-1 BeanおよびパッケージへのWLDFコンポーネントのマッピング
コンポーネント | Bean /パッケージ |
---|---|
WLDF |
|
診断イメージ |
|
インストゥルメンテーション |
|
診断コンテキスト |
パッケージ: weblogic.diagnostics.context |
ハーベスタ |
|
監視および通知 |
WLDFWatchNotificationRuntimeMBean パッケージ: weblogic.diagnostics.watch |
アーカイブ |
|
アクセサ |
|
ランタイム・コントロール |
WebLogic診断フレームワークを使用すると、次のタスクをプログラムで実行できます。
診断記述子ファイルを作成および変更して、WLDFハーベスタ、インストゥルメンテーション、および監視および通知コンポーネントをサーバー・レベルで構成します。
JMXを使用して、WLDFの操作と属性にアクセスします。
JMXを使用して、収集可能なデータを格納するカスタムMBeanを作成します。次に、ハーベスタを構成してデータを収集したり、監視および通知を構成して値をモニターしたりできます。
次のタスクを実行するJavaプログラムを作成します。
JMXリスナーによる通知のキャプチャ。
JMSによる通知のキャプチャ。
アクセサによるアーカイブされたデータの取得(アクセサは、他のコンポーネントと同様にJMXとして表面化されており、WLSTやJMXプログラミングによって診断データを取り出すことができます)。
構成APIと実行時APIは、WLDFを構成およびモニターします。構成APIと実行時APIは、双方ともMBeanとして公開されます。
構成MBeanとシステム・モジュールBeanは、WLDFリソースを作成および構成し、その実行時の動作を決定します。
ランタイムMBeanは、様々なコンポーネントの実行時状態および定義された処理をモニターします。
構成APIと実行時APIを使用すると、データ収集を構成、アクティブ化、非アクティブ化したり、監視、通知、アラーム、診断イメージ・キャプチャを構成したり、データにアクセスしたりできます。
構成APIは、次のWLDFコンポーネントの構成に使用するインタフェースを定義します。
データ・コレクタ:構成APIを使用すると、インストゥルメンテーション、収集、イメージ・キャプチャを構成および制御できます。
インストゥルメンテーション・コンポーネントでは、サーバー・レベルのインストゥルメンテーションおよびインストゥルメンテーション・モニターを有効化、無効化、作成、および破棄できます。
注意:
構成APIでは、アプリケーション・レベルのインストゥルメンテーションの構成をサポートしていません。ただし、Java Specification Request (JSR) 88 APIを使用している場合、アプリケーション・レベルのインストゥルメンテーションに対する構成の変更が影響を受ける可能性があります。
ハーベスタ・コンポーネントでは、収集する型を追加および削除したり、その型のどの属性およびインスタンスを収集するかを指定したり、ハーベスタのサンプル期間を設定したりできます。
診断イメージ・キャプチャ・コンポーネントでは、イメージ・キャプチャを格納するディレクトリの名前とパス、イベント・イメージ・キャプチャの間隔(最近アーカイブされたイベントが診断イメージにキャプチャされる時間間隔)を設定できます。
監視および通知:構成APIを使用すると、監視および通知の有効化、無効化、作成および破棄を行えます。また、構成APIを使用すると、次のことが可能になります。
ルールの種類、監視ルール式、監視の重大度の設定
通知に対するアラームの種類およびアラーム・リセット期間の設定
診断イメージ・キャプチャをトリガーするための監視の構成
監視への通知の追加、および監視からの通知の削除
アーカイブ:アーカイブの種類およびアーカイブ・ディレクトリを設定できます。
実行時APIは、WLDFコンポーネントの実行時の状態をモニターするためのインタフェースを定義します。これらのAPIのインスタンスは、個々の管理対象サーバーのインスタンス上でインスタンス化されます。実行時APIは、ランタイムMBeanとして定義されているので、JMXクライアントが簡単にアクセスできます。
実行時APIは、個々のWLDFコンポーネントの他のすべての実行時インスタンスをカプセル化します。これらのAPIは、weblogic.management.runtimeパッケージに入っています。
実行時APIを使用すると、以下のWLDFコンポーネントをモニターできます。
データ・コレクタ:実行時APIを使用すると、インストゥルメンテーション、ハーベスタ、イメージ・キャプチャの各コンポーネントをモニターできます。
インストゥルメンテーション・コンポーネントでは、ジョインポイント数の統計、インストゥルメンテーション・モニターで検査されたクラスの数、変更されたクラスの数、およびインストゥルメンテーション・モニターでクラスの検査にかかった時間をモニターできます。
ハーベスタ・コンポーネントでは、収集可能な型のセット、収集可能な属性、および収集可能なインスタンス(つまり、特定の型で現在収集可能なインスタンス)を問い合わせることができます。また、収集用に現在構成されている型、属性、およびインスタンスを問い合わせることもできます。サンプリング間隔、および収集プロセスに関する様々な実行時統計も利用可能です。
イメージ・キャプチャ・コンポーネントでは、診断イメージの出力先およびロックアウト期間を指定して、イメージ・キャプチャを開始できます。
監視および通知:実行時APIを使用すると、監視および通知およびアーカイブの各コンポーネントをモニターできます。
監視および通知コンポーネントでは、監視アラームを設定したり、アラーム、イベント、ログ・レコード、収集されたメトリックの解析に関する情報など、監視ルールの評価やトリガーされた監視に関する統計をモニターしたりできます。
アーカイブ:ファイル名、アーカイブの統計など、アーカイブに関する情報をモニターできます。
データ・アクセサ:実行時APIを使用すると、別のアーカイブに保持されている診断データを取り出すことができます。また、実行時APIでは、基底のアーカイブからデータを検索する問合せ式を指定できるので、データのフィルタ処理も利用できます。列型のマップ(診断データの対応する型名に列名を関連付けたマップ)、データ・レコード数とタイムスタンプに関する統計、カーソル(クライアントがデータ・レコードを取得するためのカーソル)に関する情報をモニターできます。
以下の2つのパッケージが用意されています。
weblogic.diagnostics.contextには次が含まれます。
DiagnosticContextConstants、WebLogic診断システムでサポートされる仕分けフラグの索引を定義します。
DiagnosticContextHelper、アプリケーションから診断コンテキストへの限定的なアクセスを提供します。
weblogic.diagnostics.watchには次が含まれます。
JMXWatchNotification、通知に関する追加情報を含む拡張JMX通知オブジェクトです。この情報は、getExtendedInfoメソッドから返される参照されたWatchNotificationオブジェクトに保持されます。
WatchNotification、監視ルールの通知を定義します。
次の項で説明する例では、WLDF Beanおよびパッケージを使用して、実行中のサーバーに関する情報にアクセスし、それを変更しています。
また、「WebLogic Scripting Toolのサンプル」のWLSTおよびJMXのサンプルも参照してください。
次のサンプルでは、weblogic.diagnostics.contextパッケージのDiagnosticContextHelperクラスを使用して、DYE_0フラグの値を取得および設定します。(診断コンテキストの詳細は、「診断コンテキストを管理するためのDyeInjectionモニターの構成」を参照してください)。
このプログラムをコンパイルして実行するには:
例17-1 例: DiagnosticContextExample.java
package weblogic.diagnostics.examples; import weblogic.diagnostics.context.DiagnosticContextHelper; public class DiagnosticContextExample { public static void main(String args[]) throws Exception { System.out.println("ContextId=" + DiagnosticContextHelper.getContextId()); System.out.println("isDyedWith(DYE_0)=" + DiagnosticContextHelper.isDyedWith(DiagnosticContextHelper.DYE_0)); DiagnosticContextHelper.setDye(DiagnosticContextHelper.DYE_0, true); System.out.println("isDyedWith(DYE_0)=" + DiagnosticContextHelper.isDyedWith(DiagnosticContextHelper.DYE_0)); } }
HarvesterMonitorプログラムでは、ハーベスタJMX通知を使用して、収集サイクルの発生を識別します。次に、アクセサを使用して新しい値を取得します。すべてのアクセスは、JMXを使用して実行します。次の各項では、通知リスナーとHarvesterMonitor.javaコードについて説明します。
ハーベスタ・コンポーネントの詳細は、「メトリック収集用のハーベスタの構成」を参照してください。
通知リスナーでは、特定のトランスポート媒体に対応する実装が用意されています。たとえば、SMTP通知リスナーでは、メール・サーバーとのSMTP接続を確立し、そのSMTP通知リスナーが受信する通知インスタンスで電子メールを送信するメカニズムを利用できます。JMX、SNMP、JMSなどの種類のリスナーでも、それぞれに対応した実装があります。
注意:
SMTP、JMX、SNMP、またはJMS以外のトランスポート媒体を使用して、WebLogic診断フレームワークで生成されたイベントを伝播するプラグインを開発できます。1つの方法としては、JMX NotificationListenerインタフェースを使用してオブジェクトを実装し、選択したトランスポート媒体の要件に従って通知を伝播します。
表17-2に、WebLogic Serverで利用可能な各通知リスナーの種類、およびその種類に対応する構成を示します。
表17-2 通知リスナーの種類
通知媒体 | 説明 | 必要な構成パラメータ |
---|---|---|
JMS |
JMS Messageキューまたはトピックを介して伝播。 |
必須:宛先のJNDI名。 省略可能:接続ファクトリのJNDI名(ない場合は、デフォルトJMS接続ファクトリを使用)。 |
JMX |
標準JMX通知を介して伝播。 |
必須パラメータはなし。イベントのポストにはあらかじめ定義されたシングルトンを使用します。 |
SMTP |
通常の電子メールを介して伝播。 |
必須: MailSession JNDI名とDestinationの電子メール。 省略可能:電子メールの件名と本文(指定しない場合は、デフォルトを使用) |
SNMP |
SNMPトラップおよびWebLogic Server SNMPエージェントを介して伝播。 |
必須パラメータはなし。ただし、WebLogic SNMPエージェントでSNMPTrapDestination MBeanを定義する必要があります。 |
デフォルトでは、監視ルールから起動したすべての通知は、構成された媒体を介して起動されるとともに、サーバー・ログ・ファイルに格納されます。
HarvesterMonitorプログラムをコンパイルして実行するには:
例17-2 例: HarvesterMonitor.java
package weblogic.diagnostics.examples; import weblogic.management.mbeanservers.runtime.RuntimeServiceMBean; import javax.management.*; import javax.management.remote.*; import javax.naming.Context; import java.util.*; public class HarvesterMonitor { private static String accessorRuntimeMBeanName; private static ObjectName accessorRuntimeMBeanObjectName; private static String harvRuntimeMBeanName; private static ObjectName harvRuntimeMBeanObjectName; private static MBeanServerConnection rmbs; private static ObjectName getObjectName(String objectNameStr) { try { return new ObjectName(getCanonicalName(objectNameStr)); } catch (RuntimeException x) { throw x; } catch (Exception x) { x.printStackTrace(); throw new RuntimeException(x); } } private static String getCanonicalName(String objectNameStr) { try { return new ObjectName(objectNameStr).getCanonicalName(); } catch (RuntimeException x) { throw x; } catch (Exception x) { x.printStackTrace(); throw new RuntimeException(x); } } private static String serverName; private static int port; private static String userName; private static String password; private static ArrayList typesToMonitor = null; public static void main(String[] args) throws Exception { if (args.length < 4) { System.out.println( "Usage: java weblogic.diagnostics.harvester.HarvesterMonitor " + "<serverName> <port> <userName> <password> [<types>]" + weblogic.utils.PlatformConstants.EOL + " where <types> (optional) is a comma-separated list " + "of types to monitor."); System.exit(1); } serverName = args[0]; port = Integer.parseInt(args[1]); userName = args[2]; password = args[3]; accessorRuntimeMBeanName = getCanonicalName( "com.bea:ServerRuntime=" + serverName + ",Name=HarvestedDataArchive,Type=WLDFDataAccessRuntime" + ",WLDFAccessRuntime=Accessor,WLDFRuntime=WLDFRuntime"); accessorRuntimeMBeanObjectName = getObjectName(accessorRuntimeMBeanName); harvRuntimeMBeanName = getCanonicalName( "com.bea:ServerRuntime=" + serverName + ",Name=WLDFHarvesterRuntime,Type=WLDFHarvesterRuntime" + ",WLDFRuntime=WLDFRuntime"); harvRuntimeMBeanObjectName = getObjectName(harvRuntimeMBeanName); if (args.length > 4) { String typesStr = args[4]; typesToMonitor = new ArrayList(); int index; while ((index = typesStr.indexOf(",")) > 0) { String typeName = typesStr.substring(0,index).trim(); typesToMonitor.add(typeName); typesStr = typesStr.substring(index+1); } typesToMonitor.add(typesStr.trim()); } rmbs = getRuntimeMBeanServerConnection(); new HarvesterMonitor().new HarvestCycleHandler(); while(true) {Thread.sleep(100000);} } static protected String JNDI = "/jndi/"; static public MBeanServerConnection getRuntimeMBeanServerConnection() throws Exception { JMXServiceURL serviceURL; serviceURL = new JMXServiceURL("t3", "localhost", port, JNDI + RuntimeServiceMBean.MBEANSERVER_JNDI_NAME); System.out.println("ServerName=" + serverName); System.out.println("URL=" + serviceURL); Hashtable h = new Hashtable(); h.put(Context.SECURITY_PRINCIPAL, userName); h.put(Context.SECURITY_CREDENTIALS, password); h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, "weblogic.management.remote"); JMXConnector connector = JMXConnectorFactory.connect(serviceURL,h); return connector.getMBeanServerConnection(); } class HarvestCycleHandler implements NotificationListener { // used to track harvest cycles private int timestampIndex; private int domainIndex; private int serverIndex; private int typeIndex; private int instNameIndex; private int attrNameIndex; private int attrTypeIndex; private int attrValueIndex; long lastSampleTime = System.currentTimeMillis(); HarvestCycleHandler() throws Exception{ System.out.println("Harvester monitor started..."); try { setUpRecordIndices(); rmbs.addNotificationListener(harvRuntimeMBeanObjectName, this, null, null); } catch (javax.management.InstanceNotFoundException x) { System.out.println("Cannot find JMX data. " + "Is the server name correct?"); System.exit(1); } } private void setUpRecordIndices() throws Exception { Map columnIndexMap = (Map)rmbs.getAttribute( accessorRuntimeMBeanObjectName, "ColumnIndexMap"); timestampIndex = ((Integer)columnIndexMap.get("TIMESTAMP")).intValue(); domainIndex = ((Integer)columnIndexMap.get("DOMAIN")).intValue(); serverIndex = ((Integer)columnIndexMap.get("SERVER")).intValue(); typeIndex = ((Integer)columnIndexMap.get("TYPE")).intValue(); instNameIndex = ((Integer)columnIndexMap.get("NAME")).intValue(); attrNameIndex = ((Integer)columnIndexMap.get("ATTRNAME")).intValue(); attrTypeIndex = ((Integer)columnIndexMap.get("ATTRTYPE")).intValue(); attrValueIndex = ((Integer)columnIndexMap.get("ATTRVALUE")).intValue(); } public synchronized void handleNotification(Notification notification, Object handback) { System.out.println("\n------------------------------------------"); long thisSampleTime = System.currentTimeMillis()+1; try { String lastTypeName = null; String lastInstName = null; String cursor = (String)rmbs.invoke(accessorRuntimeMBeanObjectName, "openCursor", new Object[]{new Long(lastSampleTime), new Long(thisSampleTime), null}, new String[]{ "java.lang.Long", "java.lang.Long", "java.lang.String" } ); while (((Boolean)rmbs.invoke(accessorRuntimeMBeanObjectName, "hasMoreData", new Object[]{cursor}, new String[]{"java.lang.String"})).booleanValue()) { Object[] os = (Object[])rmbs.invoke(accessorRuntimeMBeanObjectName, "fetch", new Object[]{cursor}, new String[]{"java.lang.String"}); for (int i = 0; i < os.length; i++) { Object[] values = (Object[])os[i]; String typeName = (String)values[typeIndex]; String instName = (String)values[instNameIndex]; String attrName = (String)values[attrNameIndex]; if (!typeName.equals(lastTypeName)) { if (typesToMonitor != null && !typesToMonitor.contains(typeName)) continue; System.out.println("\nType " + typeName); lastTypeName = typeName; } if (!instName.equals(lastInstName)) { System.out.println("\n Instance " + instName); lastInstName = instName; } Object attrValue = values[attrValueIndex]; System.out.println(" - " + attrName + "=" + attrValue); } } lastSampleTime = thisSampleTime; } catch (Exception e) {e.printStackTrace();} } } }
例17-3に、HarvesterMonitorプログラムからの出力のサンプルを示します。
例17-3 HarvesterMonitorからのサンプル出力
ServerName=myserver URL=service:jmx:t3://localhost:7001/jndi/weblogic.management.mbeanservers.runtime Harvester monitor started... ------------------------------------------------------ Type weblogic.management.runtime.WLDFHarvesterRuntimeMBean Instance com.bea:Name=WLDFHarvesterRuntime,ServerRuntime=myserver,Type=WLDFHarvesterRuntime,WLDFRuntime=WLDFRuntime - TotalSamplingTime=202048863 - CurrentSnapshotElapsedTime=1839619 Type weblogic.management.runtime.ServerRuntimeMBean Instance com.bea:Name=myserver,Type=ServerRuntime - RestartRequired=false - ListenPortEnabled=true - ActivationTime=1118319317071 - ServerStartupTime=40671 - ServerClasspath= [deleted long classpath listing] - CurrentMachine= - SocketsOpenedTotalCount=1 - State=RUNNING - RestartsTotalCount=0 - AdminServer=true - AdminServerListenPort=7001 - ClusterMaster=false - StateVal=2 - CurrentDirectory=C:\testdomain\. - AdminServerHost=10.40.8.123 - OpenSocketsCurrentCount=1 - ShuttingDown=false - SSLListenPortEnabled=false - AdministrationPortEnabled=false - AdminServerListenPortSecure=false - Registered=true
次のサンプルでは、JMXを使用してログ・エントリを標準出力します。すべてのアクセスは、JMXを使用して実行します。(アクセサ・コンポーネントの詳細は、「データ・アクセサを使用した診断データへのアクセス」を参照してください)。
このプログラムをコンパイルして実行するには:
例17-4 JMXAccessorExample.java
package weblogic.diagnostics.examples;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Hashtable;
import java.util.Iterator;
import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.naming.Context;
public class JMXAccessorExample {
private static final String JNDI = "/jndi/";
public static void main(String[] args) {
try {
if (args.length != 2) {
System.err.println("Incorrect invocation. Correct usage is:\n" +
"java weblogic.diagnostics.examples.JMXAccessorExample " +
"<logicalName> <query>");
System.exit(1);
}
String logicalName = args[0];
String query = args[1];
MBeanServerConnection mbeanServerConnection =
lookupMBeanServerConnection();
ObjectName service = new
ObjectName(weblogic.management.mbeanservers.runtime.RuntimeServiceMBean.OBJECT_NAME);
ObjectName serverRuntime =
(ObjectName) mbeanServerConnection.getAttribute(service,
"ServerRuntime");
ObjectName wldfRuntime =
(ObjectName) mbeanServerConnection.getAttribute(serverRuntime,
"WLDFRuntime");
ObjectName wldfAccessRuntime =
(ObjectName) mbeanServerConnection.getAttribute(wldfRuntime,
"WLDFAccessRuntime");
ObjectName wldfDataAccessRuntime =
(ObjectName) mbeanServerConnection.invoke(wldfAccessRuntime,
"lookupWLDFDataAccessRuntime", new Object[] {logicalName},
new String[] {"java.lang.String"});
String cursor =
(String) mbeanServerConnection.invoke(wldfDataAccessRuntime,
"openCursor", new Object[] {query},
new String[] {"java.lang.String"});
int fetchedCount = 0;
do {
Object[] rows =
(Object[]) mbeanServerConnection.invoke(wldfDataAccessRuntime,
"fetch", new Object[] {cursor},
new String[] {"java.lang.String"});
fetchedCount = rows.length;
for (int i=0; i<rows.length; i++) {
StringBuffer sb = new StringBuffer();
Object[] cols = (Object[]) rows[i];
for (int j=0; j<cols.length; j++) {
sb.append("Index " + j + "=" + cols[j].toString() + " ");
}
System.out.println("Found row = " + sb.toString());
}
} while (fetchedCount > 0);
mbeanServerConnection.invoke(wldfDataAccessRuntime,
"closeCursor", new Object[] {cursor},
new String[] {"java.lang.String"});
} catch(Throwable th) {
th.printStackTrace();
System.exit(1);
}
}
private static MBeanServerConnection lookupMBeanServerConnection ()
throws Exception {
// construct JMX service URL
JMXServiceURL serviceURL;
serviceURL = new JMXServiceURL("iiop", "localhost", 7001,
JNDI + "weblogic.management.mbeanservers.runtime");
// Specify the user, password, and WebLogic provider package
Hashtable h = new Hashtable();
h.put(Context.SECURITY_PRINCIPAL,"weblogic");
h.put(Context.SECURITY_CREDENTIALS,"password");
h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,
"weblogic.management.remote");
// Get jmx connector
JMXConnector connector = JMXConnectorFactory.connect(serviceURL,h);
// return MBean server connection class
return connector.getMBeanServerConnection();
} // End - lookupMBeanServerConnection
}