[Java, WLS, Database, FMW] WLS Replay Statistics

原文はこちら。
https://blogs.oracle.com/WebLogicServer/entry/wls_replay_statistics

12.1.0.2 Oracle JDBC thinドライバから、リプレイドライバはリプレイに関連する統計情報を持っています。これは何個の接続を再生するか理解する上で役立ちます。完全にアプリケーションに対して透過的なので、接続リプレイはチェックしない限りわからないことでしょう。

統計情報は接続ごと、もしくはデータソース毎に利用可能ですが、WebLogic Serverのデータソースの接続はドライバレベルのデータソースオブジェクトを共有しないので、後者(データソース毎の統計情報)はWebLogic Serverでは有用ではありません。WebLogic Server 12.2.1ではデータソースレベルでの統計情報を取得するための別の機構を提供します。

以下のサンプルコードは、oracle.jdbc.replay.ReplayableConnectionインターフェースを使う個々の接続に対する利用可能な統計情報を出力する方法を示しています。このインターフェースはoracle.jdbc.replay.ReplayStatisticsオブジェクトを取得するメソッドを使えるようにするものです。統計情報値の詳細は、以下のドキュメントをご覧下さい。
Oracle®Database JDBC Java API Reference 12c Release 1 (12.1.0.2)
oracle.jdbc.replay
Interface ReplayStatistics
https://docs.oracle.com/database/121/JAJDB/oracle/jdbc/replay/ReplayStatistics.html
if (conn instanceof ReplayableConnection) {
  ReplayableConnection rc = ((ReplayableConnection)conn);
  ReplayStatistics rs = rc.getReplayStatistics(
     ReplayableConnection.StatisticsReportType.FOR_CURRENT_CONNECTION);
  System.out.println("Individual Statistics");
  System.out.println("TotalCalls="+rs.getTotalCalls());
  System.out.println("TotalCompletedRequests="+rs.getTotalCompletedRequests());
  System.out.println("FailedReplayCount="+rs.getFailedReplayCount());
  System.out.println("TotalRequests="+rs.getTotalRequests());
  System.out.println("TotalCallsTriggeringReplay="+rs.getTotalCallsTriggeringReplay());
  System.out.println("TotalReplayAttempts="+rs.getTotalReplayAttempts());
  System.out.println("TotalProtectedCalls="+rs.getTotalProtectedCalls());
  System.out.println("SuccessfulReplayCount="+rs.getSuccessfulReplayCount());
  System.out.println("TotalCallsAffectedByOutages="+rs.getTotalCallsAffectedByOutages()); 
  System.out.println("TotalCallsAffectedByOutagesDuringReplay="+  
       rs.getTotalCallsAffectedByOutagesDuringReplay());  
  System.out.println("ReplayDisablingCount="+rs.getReplayDisablingCount());
}
getReplayStatistics()メソッドに加えて、clearReplayStatistics()メソッドもあります。

WebLogic Serverデータソースに関連付けられているすべての接続の統合ビューを提供するために、関連付けられているランタイムMBeanの新しいオペレーションを使って情報を取り出すことができます。このとき、WebLogic Server MBeanサーバを検索し、JDBCサービスを取得してから、JDBCデータソースのランタイムMBeanのリストにあるデータソース名を検索し、JDBCReplayStatisticsRuntimeMBeanを取得する必要があります。なお、データソースがリプレイドライバを使っていない場合、ドライバーが12.1.0.2より前の場合、または汎用データソース、AGL(Active GridLink)データソースではない場合、この値はnullになります。リプレイ情報を使うためには、データソースの全ての接続を集約するため、MBean値を設定するrefreshStatics()をまず呼び出す必要があります。その後、以下のサンプルコードのように、MBeanのオペレーションを呼び出して統計値を取得することができます。データソースの全接続の統計情報をクリアするためのclearStatistics()もあります。以下のサンプルコードは、データソースから集約した統計情報を表示するものです。
public void printReplayStats(String dsName) throws Exception {
  MBeanServer server = getMBeanServer();
  ObjectName[] dsRTs = getJdbcDataSourceRuntimeMBeans(server);
  for (ObjectName dsRT : dsRTs) {
    String name = (String)server.getAttribute(dsRT, "Name");
    if (name.equals(dsName)) {
      ObjectName mb =(ObjectName)server.getAttribute(dsRT,  
        "JDBCReplayStatisticsRuntimeMBean");
      server.invoke(mb,"refreshStatistics", null, null);
      MBeanAttributeInfo[] attributes = server.getMBeanInfo(mb).getAttributes();
      System.out.println("Roll-up");
      for (int i = 0; i <attributes.length; i++) {
        if(attributes[i].getType().equals("java.lang.Long")) {
          System.out.println(attributes[i].getName()+"="+
            (Long)server.getAttribute(mb, attributes[i].getName()));
        }
      }
    }
  }
}
MBeanServer getMBeanServer() throws Exception {
  InitialContext ctx = new InitialContext();
  MBeanServer server = (MBeanServer)ctx.lookup("java:comp/env/jmx/runtime");
  return server; 
 }
ObjectName[] getJdbcDataSourceRuntimeMBeans(MBeanServer server) throws Exception {
  ObjectName service = new ObjectName( "com.bea:Name=RuntimeService,Type=weblogic.management.mbeanservers.runtime.RuntimeServiceMBean");
  ObjectName serverRT = (ObjectName)server.getAttribute(service,  "ServerRuntime");
  ObjectName jdbcRT = (ObjectName)server.getAttribute(serverRT,  "JDBCServiceRuntime");
  ObjectName[] dsRTs = (ObjectName[])server.getAttribute(jdbcRT,
    "JDBCDataSourceRuntimeMBeans");
  return dsRTs;
}
では、接続を取得し、ワークを実行し、セッションを切り、リプレイし、その後次の接続を取得して同じことをするアプリケーションを実行します。各接続は一度リプレイすることに成功します。つまり、個々の統計情報が1回のリプレイを表示し、集約された統計情報が2個のリプレイを表示します。以下のような出力となって現れます。
Individual Statistics
TotalCalls=35
TotalCompletedRequests=0
FailedReplayCount=0
TotalRequests=1
TotalCallsTriggeringReplay=1
TotalReplayAttempts=1
TotalProtectedCalls=19
SuccessfulReplayCount=1
TotalCallsAffectedByOutages=1
TotalCallsAffectedByOutagesDuringReplay=0
ReplayDisablingCount=0
 
Roll-up
TotalCalls=83
TotalCompletedRequests=2
FailedReplayCount=0
TotalRequests=4
TotalCallsTriggeringReplay=2
TotalReplayAttempts=2
TotalProtectedCalls=45
SuccessfulReplayCount=2
TotalCallsAffectedByOutages=2
TotalCallsAffectedByOutagesDuringReplay=0
ReplayDisablingCount=0
個数をよく見ると、接続を閉じる(TotalCompletedRequests=0)前に個々のカウントがなされ、roll-upは両方の接続を閉じた後になされていることがわかります。

WLSTを使ってデータソースの統計値を取得することもできます。統計値はWebLogic Server 12.2.1のWebLogic Server管理コンソールやFusion Middleware Controlでは見ることはできません。

0 件のコメント:

コメントを投稿