CDPzを利用したz/OS-ELK連携 - (8)カスタマイズ-RMF Monitor III

# はじめに
Logforwarderを利用して、RMF Monitor IIIの情報を取得することができます。ここでは、RM Monitor IIIの情報の取り込みを行ってみます。
ちなみに、CDPz V2.1では、RMF Monitor IIIのうち、以下の4つのレポートの取得が可能です。
CPC - CPC Capacity Report
DELAY - Delay Report
PROCU - Processor Usage Report
SYSINFO - System Information Report

※SYSLOGと同様、稼働状況をリアルタイムに取得することになるので、後からバッチ的に情報をElasticsearchに取り込むことはできません。

## 関連記事
[CDPzを利用したz/OS-ELK連携 - (1)セットアップ編](https://qiita.com/tomotagwork/private/f4fbb6d3e8b6ad084b34)
[CDPzを利用したz/OS-ELK連携 - (2)SYSLOG取得編](https://qiita.com/tomotagwork/private/5cd1d97dadaaf999c9cb)
[CDPzを利用したz/OS-ELK連携 - (3)SMF-バッチ編](https://qiita.com/tomotagwork/private/629c8bbbc95f9733e297)
[CDPzを利用したz/OS-ELK連携 - (4)SMF-リアルタイム編](https://qiita.com/tomotagwork/private/b339779769f7a5092b5a)
[CDPzを利用したz/OS-ELK連携 - (5)カスタマイズ-共通](https://qiita.com/tomotagwork/private/fe76619e8880956aa0e0)
[CDPzを利用したz/OS-ELK連携 - (6)カスタマイズ-SYSLOG](https://qiita.com/tomotagwork/private/b8e9fad37730703ef1a7)
[CDPzを利用したz/OS-ELK連携 - (7)カスタマイズ-CICS](https://qiita.com/tomotagwork/private/38091c17da9b13a4ee45)
[CDPzを利用したz/OS-ELK連携 - (8)カスタマイズ-RMF Monitor III](https://qiita.com/tomotagwork/private/7be3c192e5e1c1d7e3bc)
[CDPzを利用したz/OS-ELK連携 - (9)カスタマイズ-fluentdの利用](https://qiita.com/tomotagwork/private/241369db2958fdb0fcf4)

# 利用コンポーネント
今回扱うのは、以下の赤枠の範囲のイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/bbdd1910-646e-69ec-993f-d304eff20c49.png)


Logforwarderは、RMFからMonitor IIIの情報をDDS(Distributed Data Server)経由で取得します。そのため、RMFの設定として、Monitor III,および、DDSを有効化しておく必要があります。また、CDPzからDDSに対するアクセスが行えるようにしておく必要があります。

# RMF関連設定

RMF自体は稼働している前提とします。


## RMF Monitor III

参考: 
 [Defining parameters for Monitor III](https://www.ibm.com/support/knowledgecenter/SSLTBW_2.3.0/com.ibm.zos.v2r3.erbb200/moniiip.htm)
[Description of Monitor III data gatherer options](https://www.ibm.com/support/knowledgecenter/SSLTBW_2.3.0/com.ibm.zos.v2r3.erbb200/dgopt.htm)

### 設定
関連するプロシージャー、PARMLIBは以下の辺り。
PROCLIB(RMFGAT)
PARMLIB(ERBRMF04)

主なパラメーター

```xxx:ERBRMF04
...
 CYCLE(1000)
 MINTIME(60)
...
```

CYCLE: サンプル取得単位(millisec)
MINTIME: 集約単位(sec)
上の例だと、1秒単位でサンプル取得して、レポート上は1分単位に集約して出力されます。
CDPzから情報取得する際も、この設定に依存するため、1分単位に集約された情報が取得されることになります。


### 操作

開始  /F RMF,START III
停止  /F RMF,STOP III
確認  
  /F RMF,D ACTIVE
  /F RMF,D ALL

```xxx:開始時メッセージ例
F RMF,START III                                                          
IEE252I MEMBER ERBRMF04 FOUND IN SYS0.PARMLIB                            
ERB115I START RMFGAT MONITOR III SESSION III                             
$HASP100 RMFGAT   ON STCINRDR                                            
IEF695I START RMFGAT   WITH JOBNAME RMFGAT   IS ASSIGNED TO USER IBMUSER 
 , GROUP SYS1                                                            
$HASP373 RMFGAT   STARTED                                                
IEF403I RMFGAT - STARTED - TIME=14.17.41                                 
ERB105I III: DATA GATHERER ACTIVE                                        
ERB100I III: ACTIVE                                                      
ERB425I III: UNABLE TO GATHER RESOURCE HSM         
```

## DDS(Distributed Data Server)

参考: [Setting up the Distributed Data Server for z/OS](https://www.ibm.com/support/knowledgecenter/SSLTBW_2.3.0/com.ibm.zos.v2r3.erbb200/admdds.htm)

### 設定

関連するプロシージャー、PARMLIBは以下の辺り。
PROCLIB(GPMSERVE)
PARMLIB(GPMSRV00)

### PassTicketの構成
CDPzからDDSにアクセスできるよう、PassTicketの構成をしておきます。
参考: [Configuring PassTicket support for the Distributed Data Server](https://www.ibm.com/support/knowledgecenter/SSLTBW_2.3.0/com.ibm.zos.v2r3.erbb200/pastick.htm)

```xxx:実行例
[CICS004@EPLEX1:/u/cics004] tsocmd "RDEFINE PTKTDATA GPMSERVE SSIGNON(KEYMASKED(0000000000000000))"
RDEFINE PTKTDATA GPMSERVE SSIGNON(KEYMASKED(0000000000000000))
ICH10006I RACLISTED PROFILES FOR PTKTDATA WILL NOT REFLECT THE ADDITION(S) UNTIL A SETROPTS REFRESH IS ISSUED.

[CICS004@EPLEX1:/u/cics004] tsocmd "SETROPTS RACLIST(PTKTDATA) REFRESH"
SETROPTS RACLIST(PTKTDATA) REFRESH
```

### 操作

開始  /F RMF,DDS
停止  /F RMF,NODDS

```xxx:開始時メッセージ例
F RMF,DDS                                                                 
ERB140I RMF: DDS OPTION ACCEPTED                                          
IEA631I  OPERATOR CICS004  NOW INACTIVE, SYSTEM=ZOS1    , LU=09552FEC     
S GPMSERVE.RMFDDS01                                                       
ERB141I RMF: STARTING DISTRIBUTED DATA SERVER                             
$HASP100 GPMSERVE ON STCINRDR                                             
IEF695I START GPMSERVE WITH JOBNAME GPMSERVE IS ASSIGNED TO USER IBMUSER  
 , GROUP SYS1                                                             
$HASP373 GPMSERVE STARTED                                                 
IEF403I GPMSERVE - STARTED - TIME=09.05.31                                
```

## 参考
CDPzでは、RMF Monitor IIIのうち、以下の4つのレポートのみ取得可能です。それぞれの詳細情報は以下のリンクから確認可能です。

**CPC - CPC Capacity Report**
https://www.ibm.com/support/knowledgecenter/SSLTBW_2.3.0/com.ibm.zos.v2r3.erbb500/cfc3.htm#erbb500-gen77
https://www.ibm.com/support/knowledgecenter/SSLTBW_2.3.0/com.ibm.zos.v2r3.erbb700/erbb700132.htm
**DELAY - Delay Report**
https://www.ibm.com/support/knowledgecenter/SSLTBW_2.3.0/com.ibm.zos.v2r3.erbb500/delay.htm#erbb500-gen80
https://www.ibm.com/support/knowledgecenter/SSLTBW_2.3.0/com.ibm.zos.v2r3.erbb700/erbb700133.htm
**PROCU - Processor Usage Report**
https://www.ibm.com/support/knowledgecenter/SSLTBW_2.3.0/com.ibm.zos.v2r3.erbb500/erbb500177.htm
https://www.ibm.com/support/knowledgecenter/SSLTBW_2.3.0/com.ibm.zos.v2r3.erbb700/erbb700151.htm
**SYSINFO - System Information Report**
https://www.ibm.com/support/knowledgecenter/SSLTBW_2.3.0/com.ibm.zos.v2r3.erbb500/erbb500238.htm
https://www.ibm.com/support/knowledgecenter/SSLTBW_2.3.0/com.ibm.zos.v2r3.erbb700/erbb700165.htm



# CDPz側構成

## RMF DDSとの接続用構成
参考: [CDPz - Configuring the z/OS RMF Distributed Data Server to collect RMF Monitor III reports](https://www.ibm.com/support/knowledgecenter/en/SSGE3R_2.1.0/lf_rmf3.html)

CDPzからDDSにアクセスするため、CDPz実行ユーザー(ここではCDP201)に対してRACF権限設定を行う。

```xxx:実行例
[CICS004@EPLEX1:/u/cics004] tsocmd "RDEFINE PTKTDATA IRRPTAUTH.GPMSERVE.* UACC(NONE)"
RDEFINE PTKTDATA IRRPTAUTH.GPMSERVE.* UACC(NONE)
ICH10006I RACLISTED PROFILES FOR PTKTDATA WILL NOT REFLECT THE ADDITION(S) UNTIL A SETROPTS REFRESH IS ISSUED.

[CICS004@EPLEX1:/u/cics004] tsocmd "PERMIT IRRPTAUTH.GPMSERVE.* CLASS(PTKTDATA) ID(CDP201)ACCESS(UPDATE)"
PERMIT IRRPTAUTH.GPMSERVE.* CLASS(PTKTDATA) ID(CDP201)ACCESS(UPDATE)
ICH06011I RACLISTED PROFILES FOR PTKTDATA WILL NOT REFLECT THE UPDATE(S) UNTIL A SETROPTS REFRESH IS ISSUED

[CICS004@EPLEX1:/u/cics004] tsocmd "SETROPTS RACLIST(PTKTDATA) REFRESH"
SETROPTS RACLIST(PTKTDATA) REFRESH
```

## Policy作成

Syslogの例と同じようにRMF III関連のData Streamを追加してPolicyを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6e549819-8bf7-09b0-93a5-c786e663eba0.png)

## DataStreamer/Logforwarder構成

Syslogの例と同様。

# ELK側構成
## Logstash関連構成

DELAY, SYSINFOでは、数値として扱いたいフィールドに、"N/A"という文字列が入ってくるフィールドが多々ある。型の不一致で取り込みに不具合が生じるため、DELAY, SYSINFOについては、一律で"N/A"文字列を""(nil)に変換することとする。

以下のようにLogstash設定ファイルを修正(いずれも、csvプラグインの前に、mutateプラグインを追加)。

```ruby:H_RMF_DELAY.lsh
filter {
   if [sourceType] == "zOS-RMF_DELAY" {

      mutate {
        gsub => [ "message", "N/A", "" ]
      }

      csv{ columns => [  "LOCALSTART", "LOCALEND", "JDELDAN", "JDELASI", "JDETYPX", "JDEPSVCL", "JDEGMIP", "JDELWFL", "JDELUSG", "JDELDEL", "JDELIDL",
 "JDELUKN", "JDELPROC", "JDELDEV", "JDELSTOR", "JDELSUBS", "JDELOPER", "JDELENQ", "JDELJES", "JDELHSM", "JDELXCF", "JDELMNT", "JDELMES", "JDELQUI", "J
DELCAP", "JDELCP", "JDELCBP", "JDELSUP", "JDELIFA", "JDELREAS" ]
         separator => "," }

   }
}
```

```ruby:H_RMF_SYSINFO.lsh
filter {
   if [sourceType] == "zOS-RMF_SYSINFO" {

      mutate {
        gsub => [ "message", "N/A", "" ]
      }

      csv{ columns => [  "LOCALSTART", "LOCALEND", "SYSPARVC", "SYSMODVC", "SYSMDLVC", "SYSTSVVC", "SYSPOLVC", "SYSPRVVC", "SYSCUVVC", "SYSTSEVC", "SY
SPADVC", "SYSPROVC", "SYSLCPVC", "SYSAPOVC", "SYSPATVC", "SYSPRTVC", "SYSAPTVC", "SYSAOCVC", "SYSATCVC", "SYSLOAVG", "SYSCVAVC", "SYSCUAVC", "SYSMUAVC
", "SYSCUOVC", "SYSMUOVC", "SYSCUIVC", "SYSMUIVC", "SYSAHPVC", "SYSIHPVC", "SYSPKCVC", "SYSPKAVC", "SYSPKOVC", "SYSPKIVC", "SYSPRIVC", "SYSAPIVC", "SY
SICVVC", "SYSAICVC", "SYSIPVVC", "SYSOPVVC", "SYSVEPVC", "SYSTCTVC", "SYSUCTVC", "SYSCCTVC", "SYSCULVC", "SYSNAMVC", "SYSTYPVC", "SYSWFLVC", "SYSTUSVC
", "SYSAUSVC", "SYSTRSVC", "SYSAFCVC", "SYSRSPM", "SYSAUPVC", "SYSAUDVC", "SYSADPVC", "SYSADDVC", "SYSADSVC", "SYSADUVC", "SYSADOVC", "SYSADEVC", "SYS
ADJVC", "SYSADHVC", "SYSADXVC", "SYSADNVC", "SYSADMVC", "SYSCPUVC", "SYSSRBVC", "SYSTCBVC", "SYSIFAVC", "SYSCPVC", "SYSIFCVC", "SYSRSPVC", "SYSVELVC",
 "SYSUGMVC", "SYSUGPVC", "SYSUGDVC", "SYSWGDVC", "SYSWGPVC", "SYSDGMVC", "SYSUJMVC", "SYSDJMVC", "SYSDGEVC", "SYSDGHVC", "SYSDGDVC", "SYSDGJVC", "SYSD
GOVC", "SYSDGPVC", "SYSDGSVC", "SYSDGUVC", "SYSDGXVC", "SYSDDSIN", "SYSDDSIT", "SYSDDSIP", "SYSRCTNT", "SYSEAPVC", "SYSLPIVC", "SYSSUPVC", "SYSSUCVC",
 "SYSPDPVC", "SYSTODVC", "SYSCPDVC", "SYSAPDVC", "SYSIPDVC", "SYSRGCVC", "SYSDLYVC", "SYSMEMUS", "SYSCBPVC", "SYSCBCVC", "SYSCBDVC", "SYSVECVC" ]
         separator => "," }

   }
}
```

また、PROCUのPRUPCLPフィールドには"`*`"が入るケースがあるため、"`*`"の場合は当該フィールドを削除するロジックを追加。

```ruby:H_RMF_PROCU.lsh
filter {
   if [sourceType] == "zOS-RMF_PROCU" {

      csv{ columns => [  "LOCALSTART", "LOCALEND", "PRUPJOB", "PRUPASI", "PRUPCLA", "PRUPCLAX", "PRUPSVCL", "PRUPCLP", "PRUPCPT", "PRUPAACT", "PRUPCBC
T", "PRUPIICT", "PRUPCPE", "PRUPAAPE", "PRUPCBPE", "PRUPIIPE", "PRUPTOTC", "PRUPTOTE", "PRUPTCB", "PRUPSRB", "PRUPPCS", "PRUPEPS", "PRUTCPUT" ]
         separator => "," }

      if [PRUPCLP] == "*" {
        mutate { remove_field => [ "PRUPCLP" ] }
      }

   }
}
```