ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server診断フレームワークの構成と使用
11g リリース1(10.3.6)
B60994-04
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストヘ移動
製品
目次へ移動
目次

前
 
次
 

13 データ・アクセサを使用した診断データへのアクセス

WebLogic診断フレームワーク(WLDF)のデータ・アクセサ・コンポーネントを使用すると、ログ・レコード、データ・イベント、収集されたメトリックなどの様々なソースからの診断データにアクセスできます。

データ・アクセサを使用すると、型、コンポーネント、属性を基準としてデータをルックアップできます。時間ベースのフィルタ処理を実行でき、イベントにアクセスする際には重大度、ソース、コンテンツを基準としたフィルタ処理が可能です。また、表形式の診断データにアクセスすることもできます。

次の項では、データ・アクセサについて説明し、オンライン(サーバーが実行中の状態)およびオフライン(サーバーが実行中でない状態)でデータ・アクセサを使用する方法について示します。

データ・アクセサのアクセス対象のデータ・ストア

データ・アクセサでは、他のWLDFコンポーネントから診断情報を取得します。キャプチャされた情報は、診断データの種類別に分かれた複数の論理データ・ストア内に分類されます。たとえば、サーバー・ログ、HTTPログ、収集されたメトリックは、それぞれ別のデータ・ストアにキャプチャされます。

WLDFでは、診断データがサーバー単位で管理されます。そのため、データ・アクセサでは個々のサーバーのデータ・ストアにアクセスできます。

データ・ストアは表形式を取ることがあります。表の各レコードが1つの項目を表し、その項目の特性が複数の列で説明されます。様々なデータ・ストアに多様な列がありますが。データ項目が収集された時間などほとんどのデータ・ストアで共有される列もあります。

データ・アクセサでは、サーバーのWLDFで使用されるデータ・ストアについて以下のような情報を取得できます。

WLDFAccessRuntimeMBeanを使用すると、このようなデータ・ストアを検索したり、データ・ストアにあるデータの性質を判断したりできます。また、問合せを使用してそうしたデータに選択的にアクセスすることもできます。

WebLogicログの詳細は、『Oracle WebLogic Serverログ・ファイルの構成とログ・メッセージのフィルタ処理』を参照してください。

診断データへのオンライン・アクセス

実行中のサーバーの診断データには、管理コンソール、JMX API群、またはWebLogic Scripting Tool (WLST)を使用してアクセスします。

管理コンソールを使用してデータへのアクセス

管理コンソールでは、明示的にデータ・アクセサを使用することはありませんが、アクセサで収集された情報は管理コンソールに表示されます。たとえば、「ログ・ファイルの概要」ページなどがそれに該当します。Oracle WebLogic Server管理コンソール・ヘルプログの表示と構成に関する項を参照してください。

ランタイムMBeanを使用してプログラム的にデータへのアクセス

データ・アクセサには、データ・ストアの検索とデータ・ストアからのデータ取得のために以下のランタイムMBeanが用意されています。

  • 以下の処理にはWLDFAccessRuntimeMBeanを使用します。

    • サーバー上の利用可能なデータ・ストアの論理名を取得します。

    • 特定のデータ・ソースのデータにアクセスするために、論理名を基にWLDFDataAccessRuntimeMBeanをルックアップします。様々なデータ・ストアは、各自の論理名によって一意に識別されます。

    Oracle WebLogic Server MBeanリファレンスWLDFAccessRuntimeMBeanに関する項を参照してください。

  • 検索条件または問合せに基づいてデータ・ストアを取得するには、WLDFDataAccessRuntimeMBeanを使用します。問合せには任意で時間間隔を指定して、特定の時間内にデータ・レコードを取得するようにできます。このMBeanには、データ・セットの複数の列、およびデータ・ストア内のレコード群の最古と最新のタイムスタンプに関するメタデータが備わっています。

    現在、データ・アクセサのランタイムMBeanが作成されて登録されるまでには時間がかかります。そのため、リモート・クライアントがそれらにアクセスしようとすると、それらが存在せず、InstanceNotFoundExceptionがスローされることがあります。

    クライアントは、WLDFAccessRuntimeのWLDFDataAccessRuntime属性を取得して、認識されているすべてのデータ・アクセス・ランタイムを作成するようにできます。例:

      ObjectName objName = 
          new ObjectName("com.bea:ServerRuntime=" + serverName + 
                          ",Name=Accessor," +
                          "Type=WLDFAccessRuntime," +
                          "WLDFRuntime=WLDFRuntime"); 
      rmbs.getAttribute(objName, "WLDFDataAccessRuntimes");
    

    Oracle WebLogic Server MBeanリファレンスWLDFDataAccessRuntimeMBeanに関する項を参照してください。

WLSTを使用してオンラインで診断データへのアクセス

WLSTのexportDiagnosticDataFromServerコマンドを使用すると、実行中のサーバーの診断データにアクセスできます。このコマンドの構文とサンプルは、『WebLogic Scripting Toolコマンド・リファレンス』の診断コマンドに関する項を参照してください。

データ・アクセサでWLDF問合せ言語の使用

データ・ストアのデータを問い合わせるには、WLDF問合せ言語を使用します。データ・アクセサの問合せ言語の構文の詳細は、付録A「WLDF問合せ言語」を参照してください。

診断データへのオフライン・アクセス

WLSTのexportDiagnosticDataコマンドを使用すると、オフライン状態にあるサーバーの診断データの履歴にアクセスできます。このコマンドの構文とサンプルは、『WebLogic Scripting Toolコマンド・リファレンス』の診断コマンドに関する項を参照してください。


注意:

データが固持されるマシンだけから格納されたデータにアクセスするのにexportDiagnosticDataを使用できます。

データ・アクセサのオフライン・モードでは、データ・ストア・インスタンスの検索はできません。インスタンスについてはあらかじめ認識しておく必要があります。


診断データへのプログラム的なアクセス

例13-1では、アクセサを使用して様々なアーカイブ・データ・ストアに問い合せるユーティリティのJavaソース・コードを示します。

例13-1 WLDFアクセサを使用するサンプル・コード

/*
 * WLAccessor.java
 *
 * Demonstration utility that allows query of the different ARCV data stores
 * via the WLDF Accessor.
 *
 */
 
 import javax.naming.Context;
 import weblogic.jndi.Environment;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.Properties;
 import weblogic.management.ManagementException;
 import weblogic.management.runtime.WLDFAccessRuntimeMBean;
 import weblogic.management.runtime.WLDFDataAccessRuntimeMBean;
 import weblogic.diagnostics.accessor.ColumnInfo;
 import weblogic.diagnostics.accessor.DataRecord;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 
 import javax.management.MBeanServerConnection;
 import javax.management.remote.JMXConnector;
 import javax.management.remote.JMXConnectorFactory;
 import javax.management.remote.JMXServiceURL;
 import javax.management.ObjectName;
 import weblogic.management.mbeanservers.runtime.RuntimeServiceMBean;
 import weblogic.management.runtime.ServerRuntimeMBean;
 import weblogic.management.jmx.MBeanServerInvocationHandler;
 import weblogic.management.configuration.ServerMBean;
 
 /**
  * Demonstration utility that allows query of the different ARCV data stores
  * via the WLDF Accessor. The class looks up the appropriate accessor and
  * executes the query given the specified query parameters.
  *
  * To see information about it's usage, compile this file and run
  *
  *   java WLAccessor usage
  */
public class WLAccessor {
  
  /** Creates a new instance of WLAccessor */
  public WLAccessor(Properties p) {
  initialize(p);
  }
 
  /**
  * Retrieve the specfied WLDFDataAccessRuntimeMBean instance for querying.
  */
  public WLDFDataAccessRuntimeMBean getAccessor(String accessorType)
  throws Throwable
  {
  // Get the runtime MBeanServerConnection
  MBeanServerConnection runtimeMBS = this.getRuntimeMBeanServerConnection();
 
  // Lookup the runtime service for the connected server
  ObjectName rtSvcObjName = new ObjectName(RuntimeServiceMBean.OBJECT_NAME);
  RuntimeServiceMBean rtService = null;
 
    rtService = (RuntimeServiceMBean) 
      MBeanServerInvocationHandler.newProxyInstance(
        runtimeMBS, rtSvcObjName
        );

    // Walk the Runtime tree to the desired accessor instance.
    ServerRuntimeMBean srt = rtService.getServerRuntime();

    WLDFDataAccessRuntimeMBean ddar = 
      srt.getWLDFRuntime().getWLDFAccessRuntime().
      lookupWLDFDataAccessRuntime(accessorType);

    return ddar;
  }
 
 /**
   * Execute the query using the given parameters, and display the formatted
   * records.
   */
  public void queryEventData() throws Throwable
  {
    String logicalName = "EventsDataArchive";
    WLDFDataAccessRuntimeMBean accessor = getAccessor(accessorType);

    ColumnInfo[] colinfo = accessor.getColumns();
    inform("Query string: " + queryString);

    int recordsFound = 0;
    Iterator actualIt = 
      accessor.retrieveDataRecords(beginTime, endTime, queryString);
    while (actualIt.hasNext()) {
      DataRecord rec = (DataRecord)actualIt.next();
      inform("Record[" + recordsFound + "]: {");
      Object[] values = rec.getValues();
      for (int colno=0; colno < values.length; colno++) {
        inform("[" + colno + "]  "
               + colinfo[colno].getColumnName() + 
               " (" +  colinfo[colno].getColumnTypeName() + "):   " + 
                values[colno]);
      }
      inform("}");
      inform("");
      recordsFound++;
    }
    inform("Found " + recordsFound + " results");
  }

  /**
   * Main method that implements the tool.
   * @param args the command line arguments
   */
  public static void main(String[] args) {
    try {
      WLAccessor acsr = new WLAccessor(handleArgs(args));
      acsr.queryEventData();
    } catch (UsageException uex) {
      usage();
    } catch (Throwable t) {
      inform("Caught exception, " + t.getMessage(), t);
      inform("");
      usage();
    }
  }

  public static class UsageException extends Exception {}

  /**
   * Process the command line arguments, which are provided as name/value pairs.
  */
  public static Properties handleArgs(String[] args) throws Exception
  {
    Properties p = checkForDefaults();
    for (int i = 0; i < args.length; i++) {
      if (args[i].equalsIgnoreCase("usage"))
        throw new UsageException();

      String[] nvpair = new String[2];
      int token = args[i].indexOf('=');
      if (token < 0) 
        throw new Exception("Invalid argument, " + args[i]);
      nvpair[0] = args[i].substring(0,token);
      nvpair[1] = args[i].substring(token+1);
      p.put(nvpair[0], nvpair[1]);
    }
    return p;
  }
  
  /**
   * Look for a default properties file
   */
  public static Properties checkForDefaults() throws IOException {
    Properties defaults = new Properties();
    try {
      File defaultprops = new File("accessor-defaults.properties");
      FileInputStream defaultsIS = new FileInputStream(defaultprops);
      //inform("loading options from accessor-defaults.properties");
      defaults.load(defaultsIS);
      } catch (FileNotFoundException fnfex) {
      //inform("No accessor-defaults.properties found");
    } 
    return defaults;
  }
  public static void inform(String s) {
    System.out.println(s);
  }
  public static void inform(String s, Throwable t) {
    System.out.println(s);
    t.printStackTrace();
  }

  private MBeanServerConnection getRuntimeMBeanServerConnection() 
    throws IOException
  {
    // construct jmx service url
    
    // "service:jmx:[url]/jndi/[mbeanserver-jndi-name]"
    JMXServiceURL serviceURL =
      new JMXServiceURL(
        "service:jmx:" + getServerUrl() + 
        "/jndi/" + RuntimeServiceMBean.MBEANSERVER_JNDI_NAME
        );

    // specify the user and pwd. Also specify weblogic provide package
    inform("user name [" + username + "]");
    inform("password [" + password + "]");
    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");
    // get jmx connector 
    JMXConnector connector = JMXConnectorFactory.connect(serviceURL, h);

    inform("Using JMX Connector to connect to " + serviceURL);
    return connector.getMBeanServerConnection();
  }

  private void initialize(Properties p) {
    serverUrl = p.getProperty("url","t3://localhost:7001");
    username = p.getProperty("user","weblogic");
    password = p.getProperty("pass","weblogic");
    queryString = p.getProperty("query","SEVERITY IN
('Error','Warning','Critical','Emergency')");
    accessorType = p.getProperty("type","ServerLog");

    try {
      beginTime = Long.parseLong(p.getProperty("begin","0"));

      String end = p.getProperty("end");
      endTime = (end==null) ? Long.MAX_VALUE : Long.parseLong(end);
    } catch (NumberFormatException nfex) {
      throw new RuntimeException("Error formatting time bounds", nfex);
    }
  }

  private static void usage() {
    inform("");
    inform("");
    inform("Usage: ");
    inform("");
    inform("  java WLAccessor [options]");
    inform("");
    inform("where [options] can be any combination of the following: ");
    inform("");
    inform("    usage                   Prints this text and exits");
    inform("    url=<url>               default: 't3://localhost:7001'");
    inform("    user=<username>         default: 'weblogic'");
    inform("    pass=<password>         default: 'weblogic'");
    inform("    begin=<begin-timestamp> default: 0");
    inform("    end=<end-timestamp>     default: Long.MAX_VALUE");
    inform("    query=<query-string>    default: \"SEVERITY IN ('Error','Warning','Critical','Emergency')\"");
    inform("    type=<accessor-type>    default: 'ServerLog'");
    inform("");
    inform("Example:");
    inform("");
    inform("    java WLAccessor user=system pass=gumby1234 url=http://myhost:8000 \\");
    inform("       query=\"SEVERITY = 'Error'\" begin=1088011734496 type=ServerLog");
    inform("");
    inform("");
    inform("");
    inform("All properties (except \"usage\") can all be specified in a file ");
    inform("in the current working directory. The file must be named: ");
    inform("");
    inform("           \"accessor-defaults.properties\"");
    inform("");
    inform("Each property specified in the defaults file can still be ");
    inform("overridden on the command-line as shown above");
    inform("");
  }

  /** Getter for property serverUrl.
   * @return Value of property serverUrl.
   *
   */
  public java.lang.String getServerUrl() {
    return serverUrl;
  }
  
  /** Setter for property serverUrl.
   * @param serverUrl New value of property serverUrl.
   *
   */
  public void setServerUrl(java.lang.String serverUrl) {
    this.serverUrl = serverUrl;
  }
  
  protected String serverName = null;
  protected String username = null;
  protected String password = null;
  protected String queryString = "";
  private String serverUrl = "t3://localhost:7001";
  private String accessorType = null;

  private long endTime = Long.MAX_VALUE;
  private long beginTime = 0;

  private WLDFAccessRuntimeMBean dar = null;

}

システム・クロックをリセットすることによるデータのアーカイブおよび取得に対する影響

診断データがWLDFアーカイブまたはログに書き込まれている間にシステム・クロックをより前の時間にリセットすると、タイムスタンプに基づいてデータを問い合わせる際に、予期しない結果が生じる可能性があります。たとえば、イベントのシーケンスが次のような場合を考えます。

  1. 2:00 PMに、診断イベントがRECORD_200として、2:00:00 PMのタイムスタンプでアーカイブされます。

  2. 2:30 PMに、診断イベントがRECORD_230として、2:30:00 PMのタイムスタンプでアーカイブされます。

  3. 3:00 PMに、システム・クロックを2:00 PMにリセットします。

  4. 2:15 PM(クロックのリセット後)に、診断イベントがRECORD_215として、2:15:00 PMのタイムスタンプでアーカイブされます。

  5. 2:00 PMと2:20 PMの間に生成されたレコードを取得する問合せを発行します。

問合せは、2:30:00 PMのタイムスタンプを持つRECORD_230によって終了するため、RECORD_215を取得しません。