WebLogic 診断フレームワークのコンフィグレーションと使い方

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

WLDF のプログラム的なコンフィグレーションと使用

前の章で説明したように、WebLogic Server Administration Console を使用して、WebLogic 診断フレームワーク (WLDF) などの WebLogic Server の機能を有効化、コンフィグレーション、およびモニタすることができます。また、JMX API と WebLogic Scripting Tool (WLST) を使用して、同じタスクをプログラム的に実行することもできます。

以下の節では、WLDF のプログラム的なコンフィグレーションについて説明します。

アプリケーションの開発とデプロイ、および WLST の使い方については、以降の節での説明に加え、以下のマニュアルも参照してください。

 


WLDF によるデータの生成と取得

通常、診断データは、以下のプロセスで WLDF コンポーネントによって生成および取得されます。

コンフィグレーションは主に管理タスクであり、Administration Console または WLST スクリプトを使用して行います。システム レベル (サーバおよびクラスタ) やアプリケーション レベルで診断リソースをコンフィグレーションする場合、通常はデプロイ可能な記述子モジュールである XML コンフィグレーション ファイルを使用します (WLDF リソースのコンフィグレーションの詳細については、「WLDF コンフィグレーションについて」を参照)。

アクセサ コンポーネントによる出力の取得は、管理タスクになる場合と、プログラム的なタスクになる場合があります。

 


Bean およびパッケージへの WLDF コンポーネントのマッピング

Administration Console または WLST を使って WLDF リソースを作成すると、WebLogic Server は各リソースについて MBean (管理対象 Bean) を作成します。JMX または WLST を使用してこれらの MBean にアクセスできます。weblogic.WLST は JMX クライアントであるため、WLST を使用して実行できるすべてのタスクは、JMX を使用してプログラム的に実行することもできます。

表 14-1 に、WLDF およびそのコンポーネントに関係する Bean とパッケージを示します。図 14-1 では、Bean をタイプ別にグループ化しています。

表 14-1 WLDF コンポーネントと Bean およびパッケージのマッピング
コンポーネント
Bean / パッケージ
WLDF
診断イメージ
インスツルメンテーション
診断コンテキスト
ハーベスタ
監視と通知
パッケージ : weblogic.diagnostics.watch
アーカイブ
アクセサ

図 14-1 WLDF コンフィグレーション MBean、実行時 MBean、およびシステム モジュール Bean

WLDF コンフィグレーション MBean、実行時 MBean、およびシステム モジュール Bean

 


プログラミング ツール

WebLogic 診断フレームワークを使用すると、以下のタスクをプログラム的に実行できます。

コンフィグレーション API と実行時 API

コンフィグレーション API と実行時 API は、WLDF をコンフィグレーションおよびモニタします。コンフィグレーション API と実行時 API は、双方とも MBean としてエクスポーズされます。

コンフィグレーション API と実行時 API を使用すると、データ収集をコンフィグレーション、アクティブ化、非アクティブ化したり、監視、通知、アラーム、診断イメージ キャプチャをコンフィグレーションしたり、データにアクセスしたりできます。

コンフィグレーション API

コンフィグレーション API は、以下の WLDF コンポーネントのコンフィグレーションに使用するインタフェースを定義します。

実行時 API

実行時 API は、WLDF コンポーネントの実行時の状態をモニタするためのインタフェースを定義します。これらの API のインスタンスは、個々の管理対象サーバのインスタンス上でインスタンス化されます。実行時 API は、実行時 MBean として定義されているので、JMX クライアントが簡単にアクセスできます。

実行時 API は、個々の WLDF コンポーネントの他のすべての実行時インスタンスをカプセル化します。これらの API は、weblogic.management.runtime パッケージに入っています。

実行時 API を使用すると、以下の WLDF コンポーネントをモニタできます。

 


WLDF パッケージ

以下の 2 つのパッケージが用意されています。

 


WLDF プログラミング : サンプル

以下のサンプルでは、WLDF Bean およびパッケージを使用し、実行中のサーバの情報にアクセスして変更します。

また、「WebLogic Scripting Tool のサンプル」の WLST および JMX のサンプルも参照してください。

サンプル : DiagnosticContextExample.java

次のサンプルでは、weblogic.diagnostics.context パッケージの DiagnosticContextHelper クラスを使用して、DYE_0 フラグの値を取得および設定します (診断コンテキストの詳細については、「診断コンテキストを管理するための DyeInjection モニタのコンフィグレーション」を参照)。

このプログラムをコンパイルして実行するには、次の手順に従います。

  1. DiagnosticContextExample.java サンプル (コード リスト 14-1) をディレクトリにコピーし、次のコマンドを使用してコンパイルします。
  2. javac -d . DiagnosticContextExample.java

    これにより、./weblogic/diagnostics/examples ディレクトリが作成され、その中に DiagnosticContextExample.class が格納されます。

  3. プログラムを実行します。コマンドの構文は次のようになります。
  4. java weblogic.diagnostics.examples.DiagnosticContextExample

    サンプル出力は次のようになります。

    # java weblogic.diagnostics.examples.DiagnosticContextExample
    ContextId=5b7898f93bf010ce:40305614:1048582efd4:-8000-0000000000000001
    isDyedWith(DYE_0)=false
    isDyedWith(DYE_0)=true
    コード リスト 14-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.java

HarvesterMonitor プログラムでは、ハーベスタ JMX 通知を使用して、収集サイクルの発生を識別します。次に、アクセサを使用して新しい値を取得します。すべてのアクセスは、JMX を使用して実行します。この節では、HarvesterMonitor.java のコードを示す前に、通知リスナについて説明します。

ハーベスタ コンポーネントの詳細については、「メトリック収集用のハーベスタのコンフィグレーション」を参照してください。

通知リスナ

通知リスナでは、特定の転送媒体に対応する実装が用意されています。たとえば、SMTP 通知リスナでは、メール サーバとの SMTP 接続を確立し、その SMTP 通知リスナが受信する通知インスタンスで電子メールをトリガするメカニズムを利用できます。JMX、SNMP、JMS などの種類のリスナでも、それぞれに対応した実装があります。

注意 : SMTP、JMX、SNMP、または JMS 以外の転送媒体を使用して、WebLogic 診断フレームワークで生成されたイベントを伝播するプラグインを開発できます。1 つの方法としては、JMX NotificationListener インタフェースを使用してオブジェクトを実装し、選択した転送媒体の必要条件に従って通知を伝播します。

表 14-2 に、WebLogic Server で利用可能な各通知リスナの種類、およびその種類に対応するコンフィグレーションを示します。

表 14-2 通知リスナの種類
通知媒体

説明

必要なコンフィグレーション パラメータ
JMS
JMS Message キューまたはトピックを介して伝播。
必須 : 送り先の JNDI 名。
省略可能 : 接続ファクトリの JNDI 名 (ない場合は、デフォルト JMS 接続ファクトリを使用)。
JMX
標準 JMX 通知を介して伝播。
必須パラメータはなし。イベントのポストにはあらかじめ定義されたシングルトンを使用。
SMTP
通常の電子メールを介して伝播。
必須 : MailSession JNDI 名と Destination の電子メール。
省略可能 : 電子メールの件名と本文 (指定しない場合は、デフォルトを使用)
SNMP
SNMP トラップおよび WebLogic Server SNMP エージェントを介して伝播。
必須パラメータはなし。ただし、WebLogic SNMP エージェントで SNMPTrapDestination を定義する必要がある。

デフォルトでは、監視ルールから発動したすべての通知は、コンフィグレーションされた媒体を介して発動されるとともに、サーバ ログ ファイルに格納されます。

HarvesterMonitor.java

HarvesterMonitor プログラムをコンパイルして実行するには、次の手順に従います。

  1. HarvesterMonitor.java サンプル (コード リスト 14-2) をディレクトリにコピーし、次のコマンドを使用してコンパイルします。
  2. javac -d . HarvesterMonitor.java

    これにより、./weblogic/diagnostics/examples ディレクトリが作成され、その中に HarvesterMonitor.class および HarvesterMonitor$HarvestCycleHandler.class が格納されます。

  3. モニタを開始します。コマンドの構文は次のようになります。
  4. java HarvesterMonitor <server> <port> <uname> <pw> [<types>]

    WebLogic Server インスタンスにアクセスし、サーバの名前、ポート番号、管理者のログイン名、および管理者のパスワードを調べる必要があります。

    収集される型名のリストを指定することもできます。指定した場合、プログラムを実行するとそれらの型の値のみが表示されます。ただし、選択したそれぞれの型について収集した値がすべて表示されます。表示される値を制約する方法は提供されていません。

    収集が明示的にコンフィグレーションされた値のみが表示されます。監視ルールをサポートするためだけに収集された値 (暗黙的な値) は表示されません。

    次のコマンドでは、CLASSPATH 変数に「.」を含める必要があります。また、このコマンドは、プログラムをコンパイルしたディレクトリから実行する必要があります。このコマンドを実行すると、ポート 7001、ユーザ weblogic、パスワード weblogicmyserver サーバに接続されます。

    java weblogic.diagnostics.examples.HarvesterMonitor myserver 7001
    weblogic weblogic

    HarvesterMonitor からの出力のサンプルについては、コード リスト 14-3 を参照してください。

    コード リスト 14-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 {
    // 収集サイクルの追跡に使用
        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();}
    }
    }
    }

コード リスト 14-3 に、HarvesterMonitor プログラムからの出力のサンプルを示します。

コード リスト 14-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

サンプル : JMXAccessorExample.java

次のサンプルでは、JMX を使用してログ エントリを標準出力に出力します。すべてのアクセスは、JMX を使用して実行します (アクセサ コンポーネントの詳細については、「データ アクセサを使用した診断データへのアクセス」を参照)。

このプログラムをコンパイルして実行するには、次の手順に従います。

  1. JMXAccessorExample.java サンプル (コード リスト 14-4) をディレクトリにコピーし、次のコマンドを使用してコンパイルします。
  2. javac -d . JMXAccessorExample.java

    これにより、./weblogic/diagnostics/examples ディレクトリが作成され、その中に JMXAccessorExample.class が格納されます。

  3. プログラムを実行します。コマンドの構文は次のようになります。
  4. java weblogic.diagnostics.example.JMXAccessor <logicalName> <query>

    WebLogic Server インスタンスにアクセスし、サーバの名前、ポート番号、管理者のログイン名、および管理者のパスワードを調べる必要があります。

    logicalName はログの名前です。有効な名前は、HarvestedDataArchiveEventsDataArchiveServerLogDomainLogHTTPAccessLogServletAccessorHelper.WEBAPP_LOG、RAUtil.CONNECTOR_LOGJMSMessageLog、および CUSTOM です。

    query は、「WLDF クエリ言語」で説明する構文を使用して作成されます。JMXAccessorExample プログラムでは、空の query (空の二重引用符のペア、"") を指定すると、ログ内のすべてのエントリが返されます。

    次のコマンドでは、CLASSPATH 変数に「.」を含める必要があります。また、このコマンドは、プログラムをコンパイルしたディレクトリから実行する必要があります。プログラムでは、IIOP (Internet Inter-ORB Protocol) プロトコルを使用して、ユーザ weblogic、パスワード weblogic でポート 7001 に接続し、ServerLog ログ内のすべてのエントリを標準出力に出力します。

    java weblogic.diagnostics.examples.JMXAccessorExample ServerLog ""

    このサンプルは、適切なユーザ名とパスワードを使用するように変更できます。

    コード リスト 14-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 {
        // JMX サービス URL を作成する
    JMXServiceURL serviceURL;
    serviceURL = new JMXServiceURL("iiop", "localhost", 7001,
    JNDI + "weblogic.management.mbeanservers.runtime");
        //ユーザ、パスワード、WebLogic プロバイダ パッケージを指定する
    Hashtable h = new Hashtable();
    h.put(Context.SECURITY_PRINCIPAL,"weblogic");
    h.put(Context.SECURITY_CREDENTIALS,"weblogic");
    h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,
    "weblogic.management.remote");
    // JMX コネクタを取得する
    JMXConnector connector = JMXConnectorFactory.connect(serviceURL,h);
        // MBean サーバの接続クラスを返す
    return connector.getMBeanServerConnection();
      } // - lookupMBeanServerConnection の終了
    }


ページの先頭       前  次