用于将 XML 监视器信息作为格式化文本来查看的界面

根据您想如何查看或使用由监视器界面所生成的 XML 文档中包含的数据,可以采用多种方法来查看这些数据。 可以使用 XQuery 来查询和处理由监视器接口返回的 XML 文档。还可以使用表函数来格式化 XML 文档,以便更容易阅读。

XQuery 提供了一个功能强大并且灵活的界面来查询和处理 XML 数据。但是,有时候您可能想采用基于文本的格式来查看元素数据。根据您的需要,可以采用面向列的格式或者面向行的格式来查看 XML 文档中所包含的监视元素。如果您知道要查看哪些监视元素,那么采用面向列的格式很有用。如果您事先不知道要检查哪些监视元素(例如,当您想查看最靠前的五种类型的等待时间时),那么采用面向行的格式很有用。接下来的章节描述了您可以采用两种方式将 XML 文档中所包含的监视数据作为格式化文本来查看。

查看采用面向列的格式的监视元素

XMLTABLE 表函数将 XML 文档作为输入并将它转换为关系表,以便所选择的每个 XML 文档元素都显示为一列。如果您知道要显示哪些监视元素,那么此方法很有用。例如,假定您已经创建了一个称为 DBSTATS 的统计事件监视器,用来收集 event_scstats 逻辑数据组中的信息。对此事件监视器进行了定义,以将其输出写入到表,且缺省情况下,输出表名为 SCSTATS_DBSTATS。 (请参阅 event_scstats 逻辑数据组,以了解有关与此逻辑数据组相关联的监视元素的更多信息。)此逻辑组中的监视元素包括 details_xml,它实际上是一个 XML 文档,它本身包含组成 system_metrics 监视元素的指标。(请参阅 system_metrics,以了解有关与 system_metrics 监视元素相关联的监视元素的更多信息。)要查看 details_xml 中包含的特定 system_metrics 监视元素(例如,rows_returned、total_section_time 或 total_cpu_time),可以使用 XMLTABLE 表函数来格式化从统计事件监视器所返回的 details_xml 文档中选择的监视元素。以下示例对此进行了说明。(为了便于表示,SQL 将仅返回特定服务类的结果。)

SELECT partition_number, 
       service_class_id, 
       statistics_timestamp, 
       event.rows_returned, 
       event.total_section_time, 
       event.total_cpu_time
 FROM  SCSTATS_DBSTATS as DBSTATS,
 XMLTABLE( XMLNAMESPACES( DEFAULT 'http://www.ibm.com/xmlns/prod/db2/mon' ),
           '$metrics/system_metrics' PASSING XMLPARSE( DOCUMENT DBSTATS.METRICS ) as "metrics"
           COLUMNS
           rows_returned         BIGINT      PATH 'rows_returned',
           total_section_time    BIGINT      PATH 'total_section_time',
           total_cpu_time        BIGINT      PATH 'total_cpu_time'
          ) AS EVENT 
 WHERE service_class_id = 12;

以下输出显示了此查询的结果:


PARTITION_NUMBER SERVICE_CLASS_ID STATISTICS_TIMESTAMP       ROWS_RETURNED        TOTAL_SECTION_TIME   TOTAL_CPU_TIME
---------------- ---------------- -------------------------- -------------------- -------------------- --------------------
               0               12 2010-01-05-12.14.37.001717                  402                  990              1531250
               0               12 2010-01-05-12.15.00.035409                  402                  990              1531250
               0               12 2010-01-05-12.20.00.021884                  412                 1064              1609375
               0               12 2010-01-05-12.25.00.039175                  422                 1075              1687500
               0               12 2010-01-05-12.29.59.950137                  432                 1104              1765625
               0               12 2010-01-05-12.34.59.948979                  442                 1130              1796875
               0               12 2010-01-05-12.39.59.903928                  452                 1149              1890625
               0               12 2010-01-05-12.44.59.953596                  462                 1178              1953125
               0               12 2010-01-05-12.49.59.970059                  473                 1207              2062500
               0               12 2010-01-05-12.54.59.971990                  483                 1230              2109375

  10 record(s) selected.
在此实例中,前三列将直接显示在由统计事件监视器生成的 SCSTATS_DBSTATS 表中。最后三列是从该表的 DETAILS_XML 列中的 XML 文档抽取的指标监视元素。

有关使用 XMLTABLE 的更多信息,请参阅有关该函数的文档。还可以在有关各种 MON_GET_*_DETAILS 函数的文档中查看有关使用 XMLTABLE 来查看监视元素的示例。

查看采用面向行的格式的监视元素

使用名称格式为 MON_FORMAT_XML_* _BY_ROW 的表函数,能够快速显示 XML 文档中所包含的指标监视元素。它们采用基于行的格式报告指标,每个监视元素都单独占用一行。此组中包括下列函数:
  • MON_FORMAT_XML_COMPONENT_TIMES_BY_ROW
  • MON_FORMAT_XML_TIMES_BY_ROW
  • MON_FORMAT_XML_WAIT_TIMES_BY_ROW
  • MON_FORMAT_XML_METRICS_BY_ROW
例如,统计事件监视器 DETAILS_XML 所返回的 XML 文档看起来可能与 图 1 的第一部分中所显示的内容相似。如果您使用 MON_FORMAT_XML_WAIT_TIMES_BY_ROW 函数来调整 DETAILS_XML 内容的格式,那么输出看起来将与该图底部的表相似。
图 1. 包含由其中一个 MON_FORMAT_XML_* 函数处理的监视数据的 XML 文件. 此示例说明了如何使用 MON_FORMAT_XML_WAIT_TIMES_BY_ROW 函数。将只返回等待时间;此特定函数将排除 XML 文件中所包含的其他指标(例如,wlm_queue_assignments_total)。
说明了如何将 XML 转换为面向行的格式的流程图。
METRIC_NAME                          TOTAL_TIME_VALUE     COUNT                PARENT_METRIC_NAME           
------------------------------------ -------------------- -------------------- -----------------------------
WLM_QUEUE_TIME_TOTAL                                    0                    0 TOTAL_WAIT_TIME              
FCM_TQ_RECV_WAIT_TIME                                   0                    0 FCM_RECV_WAIT_TIME           
FCM_MESSAGE_RECV_WAIT_TIME                              0                    0 FCM_RECV_WAIT_TIME           
FCM_TQ_SEND_WAIT_TIME                                   0                    0 FCM_SEND_WAIT_TIME           
FCM_MESSAGE_SEND_WAIT_TIME                              0                    0 FCM_SEND_WAIT_TIME           
AGENT_WAIT_TIME                                         0                    0 TOTAL_WAIT_TIME              
LOCK_WAIT_TIME                                          0                    0 TOTAL_WAIT_TIME              
DIRECT_READ_TIME                                        0                    0 TOTAL_WAIT_TIME              
DIRECT_WRITE_TIME                                       0                    0 TOTAL_WAIT_TIME              
LOG_BUFFER_WAIT_TIME                                    0                    0 TOTAL_WAIT_TIME              
LOG_DISK_WAIT_TIME                                      0                    0 TOTAL_WAIT_TIME              
       ⋮
根据您使用的特定函数不同,返回的列数也将不同。例如,MON_FORMAT_XML_METRICS_BY_ROW 将返回两列,一列用于显示指标名称,一列用于显示其相应值:
METRIC_NAME               VALUE
------------------------- --------------------
WLM_QUEUE_TIME_TOTAL                         0
WLM_QUEUE_ASSIGNMENTS_TOT                    0
FCM_TQ_RECV_WAIT_TIME                        0
FCM_MESSAGE_RECV_WAIT_TIM                    0
FCM_TQ_SEND_WAIT_TIME                        0
         ⋮
相比之下,MON_FORMAT_XML_TIMES_BY_ROW 将返回四列:
METRIC_NAME                    TOTAL_TIME_VALUE     COUNT      PARENT_METRIC_NAME     
------------------------------ -------------------- ---------- -----------------------
WLM_QUEUE_TIME_TOTAL                              0          0 TOTAL_WAIT_TIME        
FCM_TQ_RECV_WAIT_TIME                             0          0 FCM_RECV_WAIT_TIME     
FCM_MESSAGE_RECV_WAIT_TIME                        0          0 FCM_RECV_WAIT_TIME     
FCM_TQ_SEND_WAIT_TIME                             0          0 FCM_SEND_WAIT_TIME     
FCM_MESSAGE_SEND_WAIT_TIME                        0          0 FCM_SEND_WAIT_TIME     
          ⋮                                                                                              
当您不知道要查看哪些元素时,MON_FORMAT_XML_* _BY_ROW 函数就很有用。例如,您可能想查看名为 CLPWORKLOAD 的工作负载的前 10 个等待时间监视元素。要收集此信息,可以创建一个称为 DBSTATS 的统计事件监视器(event_wlstats 逻辑数据组)。假定您设置此事件监视器以写入某个表,缺省情况下,它会将指标记录在表 WLSTATS_DBSTATS 的列 DETAILS_XML 中。 一旦使用监视数据填充了事件监视器的输出表,就可以构造一个使用 MON_FORMAT_XML_WAIT_TIMES_BY_ROW 函数来抽取您要查看的监视元素的查询。

SELECT SUBSTR(STATS.WORKLOAD_NAME,1,15) AS WORKLOAD_NAME,
       SUBSTR(METRICS.METRIC_NAME,1,30) AS METRIC_NAME, 
       SUM(METRICS.TOTAL_TIME_VALUE) AS TOTAL_TIME_VALUE
FROM   WLSTATS_DBSTATS AS STATS, 
       TABLE(MON_FORMAT_XML_WAIT_TIMES_BY_ROW(STATS.DETAILS_XML)) AS METRICS 
WHERE  WORKLOAD_NAME='CLPWORKLOAD' AND (PARENT_METRIC_NAME='TOTAL_WAIT_TIME')
GROUP  BY WORKLOAD_NAME,METRIC_NAME 
ORDER  BY TOTAL_TIME_VALUE DESC
FETCH FIRST 10 ROWS ONLY
切记: “耗用时间”监视元素按层次结构进行组织。在此示例中,为了避免存在重复计算的等待时间,将只包括会累积到 total_wait_time 中的监视元素(请参阅前一个 SQL 语句中的 WHERE 子句)。否则,total_wait_time 本身也会包括在结果中,total_wait_time 包括若干个单独的等待时间。
下面的输出显示上述查询的结果可能为如下所示:
WORKLOAD_NAME   METRIC_NAME                    TOTAL_TIME_VALUE
--------------- ------------------------------ --------------------
CLPWORKLOAD     LOCK_WAIT_TIME                             15138541
CLPWORKLOAD     DIRECT_READ_TIME                            6116231
CLPWORKLOAD     POOL_READ_TIME                              6079458
CLPWORKLOAD     DIRECT_WRITE_TIME                            452627
CLPWORKLOAD     POOL_WRITE_TIME                              386208
CLPWORKLOAD     IPC_SEND_WAIT_TIME                           283172
CLPWORKLOAD     LOG_DISK_WAIT_TIME                           103888
CLPWORKLOAD     DIAGLOG_WRITE_WAIT_TIME                       78198
CLPWORKLOAD     IPC_RECV_WAIT_TIME                            15612
CLPWORKLOAD     TCPIP_SEND_WAIT_TIME                           3291

  10 record(s) selected.
注: MON_FORMAT_XML_*_BY_ROW 函数仅返回用于跟踪测量值或指标的监视元素。这些监视元素包括用于跟踪等待时间、组件时间以及计数器的监视元素。它们不会返回 XML 文档中包含的非度量值监视器元素(例如,uow_id 或 activity_id)。

可以使用 XMLTABLE 函数来查看 XML 文档中包含的任何元素(包括非指标元素在内)。但是,最常用的非指标监视元素是由以 MON_GET_* 开头的监视函数(例如,MON_GET_UNIT_OF_WORK 或 MON_GET_CONNECTION)以列的形式返回的。如果不熟悉 XML,那么您可能会发现使用这些函数来创建查询,比使用 XMLTABLE 函数从 XML 文档中抽取监视元素更快并且更容易。

总结:如果您希望查看非指标监视元素,那么可能可以将表函数的 MON_GET_* 系列作为 XMLTABLE 函数的良好替代者。如果您希望查看指标监视元素,那么 MON_FORMAT_XML_*_BY_ROW 表函数可能会满足您的需要。

1 注意:在这些主题中,以小写字母显示的 details_xml 指的是 XML 文档 details_xml。而以大写字母显示的 DETAILS_XML 指的是名为 DETAILS_XML 的关系表中的一列,此关系表中包含 details_xml 文档。