CDPzを利用したz/OS-ELK連携 - (7)カスタマイズ-CICS

# はじめに
(2)SMF-バッチ編で、CICS関連のSMF情報を取り込む流れを見てみましたが、あの手順だとあまり意味のあるデータは取れていません(まずは、とりあえずデータ取得の流れを示したものですので)。
ここでは、CICSの観点で意味のある情報を取得するためのカスタマイズ方法を、もう少し細かく"モニター情報(CMF)", "統計情報", "Logger", "Joblog" それぞれの観点で見ていきます。


※CDPzはSMFのデータをフィールド単位で取得する仕組みを提供してくれていますが、カスタマイズをする場合、どのようなフィールドがあるのか、参照したいフィールドにどのような形式でデータが格納されているか、といったことはある程度意識する必要があります。つまり、SMFにデータを書き出しているコンポーネント(今回のケースで言えばCICS)の知識が少なからず必要になります。

Memo:各フィールドの型の定義をどこでやるかは選択の余地があります。試行錯誤中だったため、当記事ではLogstashの設定ファイル中でフィールドの型を指定する方法についても記載していますが、事前型定義が必要なものはElasticsearch側のMappingで事前にスキーマを定義するのがよさそう。
当記事では、モニターと統計はLogstash側で型を指定する方法、LoggerについてはElasticsearch側で型を指定する方法で、手順を記載しています。
Elasticsearch側で型を定義する方法は「[(5)カスタマイズ-共通](https://qiita.com/tomotagwork/private/fe76619e8880956aa0e0#index-template)」に記載しています。


## 関連記事
[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)


# モニター情報(CMF)取得
## 製品提供機能によるKPI情報取得
CDPzでは、CICSのトランザクション毎のパフォーマンス関連情報を取得するためのSMF_110_KPIというData Streamを提供しています。これは、大量にあるフィールドのうち一部のパフォーマンス関連のフィールドをまとめて抽出してくれるものです。
ここでは、SMF-バッチ編のポリシー作成時に、そのSMF_110_KPIというData Streamを追加してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/3714aa74-4ac1-8925-3d59-0508e92cd8a7.png)

これで作成されたpolicyファイル、sdeファイルを使用して、バッチでSMFデータをElasticsearchに取り込んで見ます。
取り込み後、Elasticsearchのindexを見ると、cdp-zos-smf_110_1_kpi-...というindexが作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/832c82b6-667a-f987-5f1d-3051321180cb.png)

このindexパターンを作成して、KibanaのDiscoverで見てみます。
こんな感じで情報が取得されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4583964b-227b-bf34-ac39-390f212e1e58.png)

このように、製品提供の定義をそのまま使ってある程度情報をElasticsearchに取り込むことは可能ですが、以下のような課題があります。

課題(1) フィールド
KPIとして用意されているフィールドは、CMFで取得できる全フィールド分用意されている訳ではありません。そのため、追加で参照したいフィールドがある場合は、カスタマイズを行う必要があります。
参考: [Streaming key performance indicators for CICS Transaction Server for z/OS monitoring](https://www.ibm.com/support/knowledgecenter/en/SSGE3R_2.1.0/webui_custom_cics_kpi.html)

課題(2) 型の不一致
ELAPSE_TIMEやCPU_TIMEなどのフィールドが取得できていますが、残念ながら文字列型で取得されてしまっているようです(例: "+8.8118000000000002E-02")。これでは、時間がかかっているトランザクションを見つけたり、平均出したり、といった操作ができませんので、型を数値型に変換してあげないといけないでしょう。
<font color="red">memo: これは「[(5)カスタマイズ-共通](https://qiita.com/tomotagwork/private/fe76619e8880956aa0e0#index-template)」の記事で示しているElasticsearchのindex templateにてnumeric_detectionを有効化することで、ある程度自動変換してくれそうです。これを設定している場合は、以下に記載のLogstashでの明示的な型設定は不要です。</font>

以降の章で、これらの課題に対応するためのカスタマイズをしていきます。

ちなみに、LogstashのFilter(CDPz提供の定義)を通した結果をElasticsearchではなくstdoutに出力させてみると、こんな感じになります。(結果から1レコード分を抽出)。

```
{
             "message" => "15:36:23:41,2019-10-16,2019-10-16 06:35:13.325202,2019-10-16 06:36:19.716521,+6.6391318999999999E+01,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,309,,,CICSUSER,1,+6.6390804713867187E+01,+5.0718749999999999E-04,+3.1560742187499997E-04,+0.0000000000000000,+6.6390812188964841E+01,+1.4839648437500000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.2973632812500000E-06,+0.0000000000000000",
                "port" => 50278,
     "CICS_GEN_APPLID" => "CT54D4A1",
       "JAVA_CPU_TIME" => "+0.0000000000000000",
     "ORIG_ABEND_CODE" => nil,
       "DISPATCH_TIME" => "+5.0718749999999999E-04",
            "CPU_TIME" => "+3.1560742187499997E-04",
    "S8_TCB_DISP_TIME" => "+0.0000000000000000",
        "RLS_CPU_TIME" => "+0.0000000000000000",
      "DISP_CICS_USER" => "+0.0000000000000000",
                "host" => "EPLEX1",
      "TRANSACTION_ID" => "CEMT",
            "SYNCTIME" => "+1.4839648437500000E-04",
                "path" => "SMF/SMF_110_1_KPI",
       "MVS_SYSTEM_ID" => "ZOS1",
            "RMI_TIME" => "+2.2973632812500000E-06",
     "CURR_ABEND_CODE" => nil,
          "systemName" => "ZOS1",
          "sourceName" => "ZOS1-SMF_110_1_KPI",
                 "seq" => {
        "w" => "0",
        "c" => "0"
    },
                "DATE" => "2019-10-16",
        "ELAPSED_TIME" => "+6.6391318999999999E+01",
          "SYNCPOINTS" => "1",
           "TERM_WAIT" => "+6.6390804713867187E+01",
            "timeZone" => "+0900",
       "RMI_SUSP_TIME" => "+0.0000000000000000",
                "TIME" => "15:36:23:41",
    "CICS_SPEC_APPLID" => "CT54D4A1",
     "START_TIMESTAMP" => "2019-10-16 06:35:13.325202",
       "inputsequence" => "20200115105425463:000000",
            "JOB_NAME" => "CT54D4A1",
     "TRANSACTION_NUM" => "309",
    "L8_TCB_DISP_TIME" => "+0.0000000000000000",
           "SUSP_TIME" => "+6.6390812188964841E+01",
            "PGM_NAME" => "DFHEMTP ",
            "@version" => "1",
      "STOP_TIMESTAMP" => "2019-10-16 06:36:19.716521",
          "sourceType" => "zOS-SMF_110_1_KPI",
           "CICS_USER" => "CICSUSER",
          "@timestamp" => 2019-10-16T06:36:23.410Z,
         "sysplexName" => "EPLEX"
}
```

時間関連のフィールドは "...E+01"のような指数表記になっているもの、先頭に+/-の表記があるもの、などがありますが、製品提供のLogstashのFilterではこれらの考慮は特にされていないようで、文字列として取り込まれてしまっているようです。

## カスタマイズ
基本的には、以下の記述に従って、カスタマイズします。
参考: [Streaming key performance indicators for CICS Transaction Server for z/OS monitoring](https://www.ibm.com/support/knowledgecenter/en/SSGE3R_2.1.0/webui_custom_cics_kpi.html)

### 事前準備:取得フィールドの選択
以下から、カスタマイズして利用したいフィールドを確認します。
[Fields for SMF_110_1_CUST data stream](https://www.ibm.com/support/knowledgecenter/en/SSGE3R_2.1.0/webui_smf_110_1_cust_fields.html)

SMFの各フィールドは、どのようなフォーマットでデータが格納されているかを把握しておく必要があります。
CICSのパフォーマンス情報については以下の辺りに記載されています。
[Default CICS dictionary entries](https://www.ibm.com/support/knowledgecenter/en/SSGMCP_5.4.0/monitoring/dfht3_cicsdictionary.html)

例えば、端末からの入力を待つ時間を示す、"TCIOWTT"というフィールドに着目してみます。

```
FIELD-NAME     SIZE  CONNECTOR OFFSET    NICKNAME
...
DFHTERM  S009    12  X'0145'   X'0A58'   TCIOWTT
...
```

FIELD-NAMEの2つ目のパート「<font color="red">**S**</font>009」の先頭が"S"になっているので、Clockタイプのデータ形式で格納されることになります。
Clockタイプのデータについては、以下に記述があります。
参考: [Clocks and time stamps](https://www.ibm.com/support/knowledgecenter/en/SSGMCP_5.4.0/monitoring/dfht3_mon_clocks_timestamps.html)

>Timer component. This is a value giving the accumulated time recorded by the clock. For performance class data, the timer component is a 64-bit value, expressed in local store clock (STCK) units. ... For more information about timer components, see the TOD clock information in [z/Architecture Principles of Operation](http://publibfp.dhe.ibm.com/epubs/pdf/dz9zr011.pdf).

ここで示されている[z/Architecture Principles of Operation](http://publibfp.dhe.ibm.com/epubs/pdf/dz9zr011.pdf)に、TOD Clockのフォーマットについての記述があります。

>The TOD clock nominally is incremented by adding a one  in  bit  position  51  every  microsecond.  In  models having  a  higher  or  lower  resolution,  a  different  bit position is incremented at such a frequency that the rate  of  advancing  the  clock  is  the  same  as  if  a  one were  added  in  bit  position  51  every  microsecond. The  resolution  of  the  TOD  clock  is  such  that  the incrementing  rate  is  comparable  to  the  instruction-execution rate of the model. 
The  stepping  value  of  TOD-clock  bit  position  63,  if implemented, is 2^-12 microseconds, or approximately 244 picoseconds. This value is called a clock unit. 

2^12=4096なので、4096で割算(右bitシフト)してあげるとmicro秒単位になり、さらに10^6で割算すれば秒単位に変換される、というような感じでこれらのデータをハンドリングする必要があります。
(製品提供のData Stream定義でTOD Clockタイプのフィールドの値をハンドリングしている箇所にて"4096E6"で割算している所がありますが、それはTOD Clockタイプの値を秒単位に換算していることになります。)

<font color="gray">※難解ですねぇ...。本当はこういうのはユーザーになるべく意識させないようにして欲しいんですが。残念ながらこういう細かい所が製品で隠蔽しきれていないんですよね。</font>

### SDE定義のカスタマイズ
#### HBOUUKPIのカスタマイズ=>ボツ

マニュアルの記述だと、CDPZ02.V2R1M0.HBODEFS(HBOUUKPI)を CDPZ02.CUSTOM.HBODEFS(HBOUUKPI)にコピーして編集することになり、そうすると、以下のような感じになります。

```xxx:CDPZ02.CUSTOM.HBODEFS(HBOUUKPI)
SET IBM_FILE = 'SMF110XX';

DEFINE UPDATE SMF_110_1_CUST
  VERSION 'CDP.210'
  FROM SMF_CICS_T
  TO &IBM_UPDATE_TARGET
  AS &IBM_FILE_FORMAT SET(ALL);

DEFINE TEMPLATE SMF_110_1_CUST FOR SMF_110_1_CUST
  ORDER
  (SMFMNTME,
   SMFMNDTE,
   START,
   STOP,
   SMFMNSID,
   SMFMNSPN,
   SMFMNPRN,
   SMFMNJBN,
   PGMNAME,
   TRAN,
   TRANNUM,
   TRANNUM_CHAR,
   ABCODEO,
   ABCODEC,
   USERID,
   SPSYNCCT,
   TCIOWTT_TOD,
   USRDISPT_TOD,
   USRCPUT_TOD)
  AS &IBM_FILE_FORMAT;
```

<font color="red">ただ、これだと、TOD Clockフィールドはそのままの値で扱うことになってしまい、また別途どこかで変換処理をかまさないといけなくなってしまいます。そのため、元々提供されているKPIの定義CDPZ02.V2R1M0.SHBODEFS(HBOU110I)をコピーしてカスタマイズすることにします。</font>

#### HBOU110Iのカスタマイズ
ということで、HBOUUKPIではなく、CDPZ02.V2R1M0.SHBODEFS(HBOU110I)をCDPZ02.CUSTOM.SHBODEFS(HBOU110C)にコピーして編集することにします。データセットだけでなく、念のためメンバー名もHBOU110I=>HBOU110Cに変更します。

元々提供されているものに、以下のフィールドを追加してみます。

- T_CHAR
- SCUGETCT
- SCUGETCTE
- SCCGETCT
- SCCGETCTE

```xxx:CDPZ02.CUSTOM.SHBODEFS(HBOU110C)
SET IBM_FILE = 'SMF110XX';

DEFINE UPDATE SMF_110_1_CUST
  VERSION 'CDP.210           '
  FROM SMF_CICS_T
  TO &IBM_UPDATE_TARGET
  AS &IBM_FILE_FORMAT
   LET
    (INT = INTERVAL(START, STOP))
  GROUP BY
    (TIME = SMFMNTME,
    DATE = SMFMNDTE,
    START_TIMESTAMP = TIMESTAMP(START),
    STOP_TIMESTAMP = TIMESTAMP(STOP),
    ELAPSED_TIME = INT,
    MVS_SYSTEM_ID   = SMFMNSID,
    CICS_SPEC_APPLID = SMFMNSPN,
    CICS_GEN_APPLID = SMFMNPRN,
    JOB_NAME = SMFMNJBN,
    PGM_NAME = PGMNAME,
    TRANSACTION_ID  = TRAN)
  SET
    (TRANSACTION_NUM = FIRST(VALUE(DIGITS(TRANNUM),
                         SUBSTR(TRANNUM_CHAR,2,3))),
    ORIG_ABEND_CODE = FIRST(ABCODEO),
    CURR_ABEND_CODE = FIRST(ABCODEC),
    CICS_USER = FIRST(USERID),
    SYNCPOINTS = FIRST(SPSYNCCT),
    TERM_WAIT = FIRST(TCIOWTT_TOD / 4096E6),
    DISPATCH_TIME = FIRST(USRDISPT_TOD / 4096E6),
    CPU_TIME = FIRST(USRCPUT_TOD / 4096E6),
    RLS_CPU_TIME = FIRST(RLSCPUT_TOD / 4096E6),
    SUSP_TIME = FIRST(SUSPTIME_TOD / 4096E6),
    SYNCTIME = FIRST(SYNCTIM_TOD / 4096E6),
    DISP_CICS_USER = FIRST(KY8DISPT_TOD / 4096E6),
    JAVA_CPU_TIME = FIRST(J8CPUT_TOD / 4096E6),
    L8_TCB_DISP_TIME = FIRST(L8CPUT_TOD / 4096E6),
    S8_TCB_DISP_TIME = FIRST(S8CPUT_TOD / 4096E6),
    RMI_TIME = FIRST(RMITIME_TOD / 4096E6),
    RMI_SUSP_TIME = FIRST(RMISUSP_TOD / 4096E6),
    T_CHAR = FIRST(T_CHAR),
    SCUGETCT = FIRST(SCUGETCT),
    SCUGETCTE = FIRST(SCUGETCTE),
    SCCGETCT = FIRST(SCCGETCT),
    SCCGETCTE = FIRST(SCCGETCTE));
```

以下のように、出力先DD名、定義名を変更しています。
SET IBM_FILE = 'SMF110XX';
DEFINE UPDATE SMF_110_1_CUST

また、末尾に以下のフィールド定義を追加しています。
T_CHAR = FIRST(T_CHAR),
SCUGETCT = FIRST(SCUGETCT),
SCUGETCTE = FIRST(SCUGETCTE),
SCCGETCT = FIRST(SCCGETCT),
SCCGETCTE = FIRST(SCCGETCTE)

※GROUP BYをしている意味がよく分からないのだが...これ、必要無いのでは？？？

単発のJCLでCSV化を試してみます(SMFダンプデータセットを入力にCSV化するところまで)。

```
//HBOSMFCB JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//*
//HBOSMFCB EXEC PGM=HBOPDE,REGION=0M,
//         PARM='SHOWINPUT=NO,ZIIPOFFLOAD=NO'
//STEPLIB  DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBOLOAD
//*
//* CONTROL STATEMENTS
//*
//HBOIN    DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOCCSV)
//         DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOCCORY)
//         DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOLLSMF)
//         DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOTCIFI)
//         DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBORS110)
//         DD DISP=SHR,DSN=CDPZ02.CUSTOM.SHBODEFS(HBOU110C)
//*
//* Sample COLLECT statement for processing log data
//*
//         DD *
COLLECT SMF
  COMMIT AFTER END OF FILE;
/*
//HBOLOG   DD DISP=SHR,DSN=CDPZ01.SMFDUMP.D191016.T1
//HBOOUT   DD SYSOUT=*
//HBODUMP  DD SYSOUT=*
//HBODEBUG DD SYSOUT=*
//SMF110XX DD SYSOUT=*,RECFM=V,LRECL=32756
```

HBOIN DDでは、カスタマイズしたCDPZ02.<font color="red">CUSTOM</font>.SHBODEFS(HBOU110I)をしています。
出力用DD名には、SMF110XXを指定しています。

こいつをサブミットして、SMF110XXの結果を確認すると...

```
 14:26:40:63,2019-10-16,2019-10-16 05:26:26.052751,2019-10-16 05:26:26.615020,+5.6226900000000000E-01,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,225,,,CICSUSER,1,+5.6184192675781250E-01,+4.1619531249999995E-04,+2.5321044921874995E-04,+0.0000000000000000,+5.6185334716796874E-01,+7.9862304687499998E-05,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.1782226562499998E-06,+0.0000000000000000,TO,0,0,0,4
 14:26:40:63,2019-10-16,2019-10-16 05:26:28.629236,2019-10-16 05:26:30.354763,+1.7255269999999998E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHECIP ,CECI,226,,,CICSUSER,1,+1.7247811088867187E+00,+7.3657128906249995E-04,+5.3337915039062498E-04,+0.0000000000000000,+1.7247909145507812E+00,+1.4873437500000000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.1767578124999999E-06,+0.0000000000000000,TO,1,3,0,0
 14:26:40:63,2019-10-16,2019-10-16 05:26:32.634812,2019-10-16 05:26:35.607077,+2.9722649999999999E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,227,,,CICSUSER,1,+2.9716771376953124E+00,+5.7749169921874997E-04,+4.2141333007812497E-04,+0.0000000000000000,+2.9716874780273437E+00,+1.3073730468750000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+1.8730468749999998E-06,+0.0000000000000000,TO,0,0,0,6
 15:25:21:23,2019-10-16,2019-10-16 06:24:56.480718,2019-10-16 06:24:58.415231,+1.9345129999999999E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,234,,,CICSUSER,1,+1.9337729287109373E+00,+7.2817919921874997E-04,+4.8072851562499998E-04,+0.0000000000000000,+1.9337849877929687E+00,+1.8760351562500000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.6459960937499999E-06,+0.0000000000000000,TO,0,0,0,6
 15:25:21:23,2019-10-16,2019-10-16 06:24:59.846267,2019-10-16 06:25:04.324002,+4.4777349999999998E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,235,,,CICSUSER,1,+4.4766067729492187E+00,+1.1168886718750000E-03,+6.6918896484374996E-04,+0.0000000000000000,+4.4766186826171874E+00,+1.7628564453125000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.5947265624999999E-06,+0.0000000000000000,TO,0,0,0,7
...
```

こんな感じで「```...,TO,0,0,0,4```」末尾にそれっぽいデータが追加されているのでOKでしょう。

### ポリシーのカスタマイズ
上で定義したData Streamの内容を、ConfigTool上でもCustom Data Streamとして定義します。
参考:[Creating a System Data Engine data stream definition](https://www.ibm.com/support/knowledgecenter/SSGE3R_2.1.0/webui_custom_ds_create_sde.html#webui_custom_ds_create_sde) のProcedure 2～5

ConfigToolでMANAGE CUSTOM DATA STREAM DEFINITIONSボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/caebc588-53af-dec2-78ef-9af42e096b59.png)

Create System Data Engine data stream definitionをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/5db73a0f-fd28-f7e6-f99b-146acac04384.png)

各フィールドに値を設定してOKを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4465c65f-a292-7963-d4e5-3cd9656bacf1.png)
<補足>
**Name**: 新しく追加するData Stream名 (この名前は、SHBODEFメンバーにDEFINE UPDATEで指定したレコード名と合わせる必要がある)
**Description**: 説明
**Group/Subgroup**: 新しく追加するData Streamを配置するグループ名/サブグループ名(任意の名前)。エディターで選択する際に、Custum Data Streams以下にこのグループにカテゴライズされて表示される。
**SHBODEFS dataset members**:このData Streamに関連するSHBODEFSメンバー名

以下のように新しいData Streamが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/5ded6e46-914f-0b6e-4cfa-3090a31ddb77.png)

実体として、USS上に/u/CDP201/cdpConfig/SMF_110_1_CUST.streams.jsonというファイルが作成されます。

```json:/u/CDP201/cdpConfig/SMF_110_1_CUST.streams.json
{
    "groupings": {
        "Custom Data Streams": {
            "CICS Group": {
                "CMF": [
                    "SMF_110_1_CUST"
                ]
            }
        }
    },
    "definitions": [
        {
            "category": "SMF",
            "name": "SMF_110_1_CUST",
            "description": "Customized CICS Performance Monitor Fields",
            "tags": [
                "CSV",
                "Split",
                "Custom"
            ],
            "concatenation": [
                "USER",
                "CDP"
            ],
            "hboin": {
                "all": [
                    "HBOCCORY",
                    "HBOLLSMF",
                    "HBOLLSMF",
                    "HBORS110",
                    "HBOTCIFI",
                    "HBOU110C"
                ]
            },
            "parms": [
                {
                    "displayName": "Data Source Name",
                    "name": "dataSourceName",
                    "defaultValue": "SMF_110_1_CUST",
                    "edit": "Required",
                    "description": "Name of Data Source sent to subscribers",
                    "policyOnly": 1,
                    "unique": true
                },
                {
                    "displayName": "Data Source Type",
                    "name": "dataSourceType",
                    "defaultValue": "zOS-SMF_110_1_CUST",
                    "edit": "Protected",
                    "description": "Type of Data Source sent to subscribers",
                    "policyOnly": 1
                },
                {
                    "displayName": "File Path",
                    "name": "filePath",
                    "defaultValue": "SMF/SMF_110_1_CUST",
                    "edit": "Protected",
                    "description": "Path used for the SMF data",
                    "policyOnly": 1,
                    "unique": true
                }
            ]
        }
    ]
}
```

新しく追加したData Streamを使って、ポリシーを作成します。
新規にポリシー作成する際に、Data Streamを選択するメニューに上で追加したSMF_110_1_CUSTが表示されるので、それを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ec0b3822-6e67-1b48-ac4d-ce6a5c33c221.png)

ユーザー定義のCustom Data Streamを指定した場合、SYSTEM DATA ENGINEボタンを押すと、以下のようにUSER Concaenationという設定が新たに追加指定できるようになります。ここに、カスタマイズしたData Stream定義を配置したPDSデータセット名を指定することになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b2d6717c-ed15-3da2-0ec2-6632b8257176.png)

あとはこれまでと同じ流れでポリシーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f21ee1c4-94e8-9d74-71c4-31d7e13e6250.png)

### Data Streamer(HBODSPRO)の設定変更
Data Streamer起動プロシージャーで参照するポリシーファイルの指定を、上で生成されたポリシーファイルに置き換えて起動します。

### Logstash構成ファイルのカスタマイズ

Linux側で稼働させるLogstashの構成ファイルも、追加したフィールドの分、カスタマイズします。
それぞれ以下のようにコピーして編集します。
H_SMF_110_1_KPI.lsh => H_SMF_110_1_CUST.lsh
N_SMF_110_1_KPI.lsh => N_SMF_110_1_CUST.lsh

```xxx:H_SMF_110_1_CUST.lsh
filter {
   if [sourceType] == "zOS-SMF_110_1_CUST" {

        csv{
                columns => [  "TIME", "DATE", "START_TIMESTAMP", "STOP_TIMESTAMP", "ELAPSED_TIME", "MVS_SYSTEM_ID", "CICS_SPEC_APPLID", "CICS_GEN_APPLID", "JOB_NAME", "PGM_NAME", "TRANSACTION_ID", "TRANSACTION_NUM", "ORIG_ABEND_CODE", "CURR_A
BEND_CODE", "CICS_USER", "SYNCPOINTS", "TERM_WAIT", "DISPATCH_TIME", "CPU_TIME", "RLS_CPU_TIME", "SUSP_TIME", "SYNCTIME", "DISP_CICS_USER", "JAVA_CPU_TIME", "L8_TCB_DISP_TIME", "S8_TCB_DISP_TIME", "RMI_TIME", "RMI_SUSP_TIME", "T_CHAR", "SCUGE
TCT", "SCUGETCTE", "SCCGETCT", "SCCGETCTE" ]
                separator => ","
                convert => {
                        "ELAPSED_TIME" => "float"
                        "SYNCPOINTS" => "integer"
                        "TERM_WAIT" => "float"
                        "DISPATCH_TIME" => "float"
                        "CPU_TIME" => "float"
                        "RLS_CPU_TIME" => "float"
                        "SUSP_TIME" => "float"
                        "SYNCTIME" => "float"
                        "DISP_CICS_USER" => "float"
                        "JAVA_CPU_TIME" => "float"
                        "L8_TCB_DISP_TIME" => "float"
                        "S8_TCB_DISP_TIME" => "float"
                        "RMI_TIME" => "float"
                        "RMI_SUSP_TIME" => "float"
                        "SCUGETCT" => "integer"
                        "SCUGETCTE" => "integer"
                        "SCCGETCT" => "integer"
                        "SCCGETCTE" => "integer"
                }
        }
   }
}
```

"convert"というオプションを追加して、数値フィールドについては型を明示的に指定してあげます。基本的には、CPU時間などはfloat型、カウントなどを表すものはinteger型を指定します。
<font color="red">型の指定は、「[(5)カスタマイズ-共通](https://qiita.com/tomotagwork/private/fe76619e8880956aa0e0#index-template)」の記事で示しているElasticsearchのindex templateにて型を明示指定することもできますし、numeric_detectionを有効化することである程度自動変換もしてくれます。Elasticsearch のIndex templateで型の対応をしている場合は、ここに記載のLogstashでの明示的な型設定は不要です。</font>

```xxx:N_SMF_110_1_CUST.lsh
filter {
   if [sourceType] == "zOS-SMF_110_1_CUST" {
      mutate{ add_field => {
         "[@metadata][timestamp]" => "%{DATE} %{TIME}"
        }}

      date{ match => [
             "[@metadata][timestamp]", "yyyy-MM-dd HH:mm:ss:SS"
        ]}
   }
}
```

一旦、outputをElasticsearchではなくstdoutにして、Logstashのレベルでフォーマットできるか確認してみると...

```
{
            "timeZone" => "+0900",
                 "seq" => {
        "w" => "1",
        "c" => "0"
    },
              "T_CHAR" => "TO",
          "@timestamp" => 2019-10-16T06:36:23.410Z,
             "message" => "15:36:23:41,2019-10-16,2019-10-16 06:35:12.749281,2019-10-16 06:35:12.977761,+2.2848000000000000E-01,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,308,,,CICSUSER,1,+2.2802571191406250E-01,+4.4702246093749996E-04,+2.2888208007812500E-04,+0.0000000000000000,+2.2803313623046874E-01,+8.2666992187499997E-05,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+1.8715820312499998E-06,+0.0000000000000000,TO,0,0,0,4",
          "systemName" => "ZOS1",
           "TERM_WAIT" => 0.2280257119140625,
    "S8_TCB_DISP_TIME" => 0.0,
     "START_TIMESTAMP" => "2019-10-16 06:35:12.749281",
      "STOP_TIMESTAMP" => "2019-10-16 06:35:12.977761",
       "inputsequence" => "20200122064722774:000000",
       "DISPATCH_TIME" => 0.00044702246093749996,
         "sysplexName" => "EPLEX",
     "CICS_GEN_APPLID" => "CT54D4A1",
      "DISP_CICS_USER" => 0.0,
          "SYNCPOINTS" => 1,
            "SCUGETCT" => 0,
     "ORIG_ABEND_CODE" => nil,
            "CPU_TIME" => 0.000228882080078125,
       "MVS_SYSTEM_ID" => "ZOS1",
     "TRANSACTION_NUM" => "308",
           "SCCGETCTE" => 4,
     "CURR_ABEND_CODE" => nil,
                "host" => "EPLEX1",
            "@version" => "1",
            "PGM_NAME" => "DFHEMTP ",
                "path" => "SMF/SMF_110_1_CUST",
          "sourceName" => "ZOS1-SMF_110_1_CUST",
      "TRANSACTION_ID" => "CEMT",
            "SYNCTIME" => 8.266699218749999e-05,
           "SCUGETCTE" => 0,
            "RMI_TIME" => 1.8715820312499998e-06,
        "ELAPSED_TIME" => 0.22848,
        "RLS_CPU_TIME" => 0.0,
       "JAVA_CPU_TIME" => 0.0,
                "port" => 59006,
                "TIME" => "15:36:23:41",
            "JOB_NAME" => "CT54D4A1",
    "CICS_SPEC_APPLID" => "CT54D4A1",
                "DATE" => "2019-10-16",
    "L8_TCB_DISP_TIME" => 0.0,
           "CICS_USER" => "CICSUSER",
          "sourceType" => "zOS-SMF_110_1_CUST",
            "SCCGETCT" => 0,
       "RMI_SUSP_TIME" => 0.0,
           "SUSP_TIME" => 0.22803313623046875
}
{
            "timeZone" => "+0900",
                 "seq" => {
        "w" => "1",
        "c" => "0"
    },
              "T_CHAR" => "TO",
          "@timestamp" => 2019-10-16T06:36:23.410Z,
             "message" => "15:36:23:41,2019-10-16,2019-10-16 06:35:13.325202,2019-10-16 06:36:19.716521,+6.6391318999999999E+01,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,309,,,CICSUSER,1,+6.6390804713867187E+01,+5.0718749999999999E-04,+3.1560742187499997E-04,+0.0000000000000000,+6.6390812188964841E+01,+1.4839648437500000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.2973632812500000E-06,+0.0000000000000000,TO,0,0,0,4",
          "systemName" => "ZOS1",
           "TERM_WAIT" => 66.39080471386718,
    "S8_TCB_DISP_TIME" => 0.0,
     "START_TIMESTAMP" => "2019-10-16 06:35:13.325202",
      "STOP_TIMESTAMP" => "2019-10-16 06:36:19.716521",
       "inputsequence" => "20200122064722774:000000",
       "DISPATCH_TIME" => 0.0005071875,
         "sysplexName" => "EPLEX",
     "CICS_GEN_APPLID" => "CT54D4A1",
      "DISP_CICS_USER" => 0.0,
          "SYNCPOINTS" => 1,
            "SCUGETCT" => 0,
     "ORIG_ABEND_CODE" => nil,
            "CPU_TIME" => 0.00031560742187499997,
       "MVS_SYSTEM_ID" => "ZOS1",
     "TRANSACTION_NUM" => "309",
           "SCCGETCTE" => 4,
     "CURR_ABEND_CODE" => nil,
                "host" => "EPLEX1",
            "@version" => "1",
            "PGM_NAME" => "DFHEMTP ",
                "path" => "SMF/SMF_110_1_CUST",
          "sourceName" => "ZOS1-SMF_110_1_CUST",
      "TRANSACTION_ID" => "CEMT",
            "SYNCTIME" => 0.000148396484375,
           "SCUGETCTE" => 0,
            "RMI_TIME" => 2.29736328125e-06,
        "ELAPSED_TIME" => 66.391319,
        "RLS_CPU_TIME" => 0.0,
       "JAVA_CPU_TIME" => 0.0,
                "port" => 59006,
                "TIME" => "15:36:23:41",
            "JOB_NAME" => "CT54D4A1",
    "CICS_SPEC_APPLID" => "CT54D4A1",
                "DATE" => "2019-10-16",
    "L8_TCB_DISP_TIME" => 0.0,
           "CICS_USER" => "CICSUSER",
          "sourceType" => "zOS-SMF_110_1_CUST",
            "SCCGETCT" => 0,
       "RMI_SUSP_TIME" => 0.0,
           "SUSP_TIME" => 66.39081218896484
}
```

T_CHARやCCGETCTEという追加したフィールドにきちんと値が入っているのでOKでしょう。数値フィールドもうまくハンドリングできているようです。ということで、Elasticsearchにぶちこんで、Kibanaで見てみます。

### Kibana Discoverでの確認
Elasticsearchにデータを取り込むと、cdp-zos-smf_110_1_cust-*という名前のindexに取り込まれるので、index patternを作ってDiscoverで確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/3066facc-823d-2878-6481-92ccd71249ad.png)

追加したフィールドが確認できました！数値フィールドもきちんとハンドリングできているようです！

## 補足:Data Streamaerから送信されてくるデータの確認

問題判別の参考に、Data StreamerからLogstashに対してどのようなフォーマットでデータが送られてくるのかを確認してみます。

以下のLogstash構成ファイルを用意して、データをstdoutに出力させてみます。

```
input{
        tcp{
                port => 8081
        }
}

filter {
        json { source => "message" }
}

output {
        stdout{ }
}
```

結果は以下のようなイメージになります。

```
{
             "host" => "EPLEX1",
       "systemName" => "ZOS1",
          "message" => [
        [ 0] "14:26:40:63,2019-10-16,2019-10-16 05:26:26.052751,2019-10-16 05:26:26.615020,+5.6226900000000000E-01,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,225,,,CICSUSER,1,+5.6184192675781250E-01,+4.1619531249999995E-04,+2.5321044921874995E-04,+0.0000000000000000,+5.6185334716796874E-01,+7.9862304687499998E-05,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.1782226562499998E-06,+0.0000000000000000,TO,0,0,0,4",
        [ 1] "14:26:40:63,2019-10-16,2019-10-16 05:26:28.629236,2019-10-16 05:26:30.354763,+1.7255269999999998E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHECIP ,CECI,226,,,CICSUSER,1,+1.7247811088867187E+00,+7.3657128906249995E-04,+5.3337915039062498E-04,+0.0000000000000000,+1.7247909145507812E+00,+1.4873437500000000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.1767578124999999E-06,+0.0000000000000000,TO,1,3,0,0",
        [ 2] "14:26:40:63,2019-10-16,2019-10-16 05:26:32.634812,2019-10-16 05:26:35.607077,+2.9722649999999999E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,227,,,CICSUSER,1,+2.9716771376953124E+00,+5.7749169921874997E-04,+4.2141333007812497E-04,+0.0000000000000000,+2.9716874780273437E+00,+1.3073730468750000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+1.8730468749999998E-06,+0.0000000000000000,TO,0,0,0,6",
        [ 3] "15:25:21:23,2019-10-16,2019-10-16 06:24:56.480718,2019-10-16 06:24:58.415231,+1.9345129999999999E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,234,,,CICSUSER,1,+1.9337729287109373E+00,+7.2817919921874997E-04,+4.8072851562499998E-04,+0.0000000000000000,+1.9337849877929687E+00,+1.8760351562500000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.6459960937499999E-06,+0.0000000000000000,TO,0,0,0,6",
        [ 4] "15:25:21:23,2019-10-16,2019-10-16 06:24:59.846267,2019-10-16 06:25:04.324002,+4.4777349999999998E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,235,,,CICSUSER,1,+4.4766067729492187E+00,+1.1168886718750000E-03,+6.6918896484374996E-04,+0.0000000000000000,+4.4766186826171874E+00,+1.7628564453125000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.5947265624999999E-06,+0.0000000000000000,TO,0,0,0,7",
        [ 5] "15:25:21:23,2019-10-16,2019-10-16 06:25:06.899497,2019-10-16 06:25:08.452892,+1.5533949999999999E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,236,,,CICSUSER,1,+1.5526840727539062E+00,+6.9926074218749999E-04,+4.4962695312499999E-04,+0.0000000000000000,+1.5526964975585937E+00,+1.3585839843750000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.7021484374999999E-06,+0.0000000000000000,TO,0,0,0,6",
        [ 6] "15:25:21:23,2019-10-16,2019-10-16 06:25:09.641692,2019-10-16 06:25:10.957045,+1.3153530000000000E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,237,,,CICSUSER,1,+1.3147200776367187E+00,+6.2336279296874999E-04,+4.0250317382812498E-04,+0.0000000000000000,+1.3147298642578125E+00,+1.1918554687500000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.0751953124999999E-06,+0.0000000000000000,TO,0,0,0,6",
        [ 7] "15:25:21:23,2019-10-16,2019-10-16 06:25:11.693911,2019-10-16 06:25:12.152630,+4.5871900000000000E-01,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,238,,,CICSUSER,1,+4.5820498876953124E-01,+5.0387255859374997E-04,+3.3403295898437499E-04,+0.0000000000000000,+4.5821500683593749E-01,+1.2238867187500000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+1.8779296874999998E-06,+0.0000000000000000,TO,0,0,0,6",
        [ 8] "15:25:21:23,2019-10-16,2019-10-16 06:25:14.020450,2019-10-16 06:25:17.548744,+3.5282939999999998E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHECIP ,CECI,239,,,CICSUSER,1,+3.5273268320312499E+00,+9.5226025390625000E-04,+6.6098193359374999E-04,+0.0000000000000000,+3.5273413598632812E+00,+1.3654882812500000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.8388671874999999E-06,+0.0000000000000000,TO,1,3,0,0",
        [ 9] "15:25:21:23,2019-10-16,2019-10-16 06:25:18.002336,2019-10-16 06:25:18.282884,+2.8054800000000001E-01,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHAPATT,CSSY,241,,,CICSUSER,1,+0.0000000000000000,+6.5547851562499997E-05,+6.5927734374999997E-05,+0.0000000000000000,+2.8048292480468749E-01,+1.3471679687500000E-05,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+1.7583007812499998E-06,+0.0000000000000000,U ,0,0,0,1",
        [10] "15:25:21:23,2019-10-16,2019-10-16 06:25:18.001721,2019-10-16 06:25:20.372911,+2.3711899999999999E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHECIP ,CECI,240,,,CICSUSER,1,+2.3703299291992186E+00,+8.4818359374999998E-04,+5.9662841796874998E-04,+0.0000000000000000,+2.3703422392578124E+00,+1.4539404296875000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.5825195312499999E-06,+0.0000000000000000,TO,1,3,0,0",
        ...
        [75] "15:36:23:41,2019-10-16,2019-10-16 06:35:12.749281,2019-10-16 06:35:12.977761,+2.2848000000000000E-01,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,308,,,CICSUSER,1,+2.2802571191406250E-01,+4.4702246093749996E-04,+2.2888208007812500E-04,+0.0000000000000000,+2.2803313623046874E-01,+8.2666992187499997E-05,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+1.8715820312499998E-06,+0.0000000000000000,TO,0,0,0,4",
        [76] "15:36:23:41,2019-10-16,2019-10-16 06:35:13.325202,2019-10-16 06:36:19.716521,+6.6391318999999999E+01,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,309,,,CICSUSER,1,+6.6390804713867187E+01,+5.0718749999999999E-04,+3.1560742187499997E-04,+0.0000000000000000,+6.6390812188964841E+01,+1.4839648437500000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.2973632812500000E-06,+0.0000000000000000,TO,0,0,0,4"
    ],
         "@version" => "1",
             "port" => 58998,
    "inputsequence" => "20200122054718784:000000",
       "sourceType" => "zOS-SMF_110_1_CUST",
              "seq" => {
        "w" => "1",
        "c" => "1"
    },
       "@timestamp" => 2020-01-22T05:47:11.906Z,
      "sysplexName" => "EPLEX",
         "timeZone" => "+0900",
       "sourceName" => "ZOS1-SMF_110_1_CUST",
             "path" => "SMF/SMF_110_1_CUST"
}
```

# 統計情報取得

## カスタマイズ

### 事前準備: 取得フィールドの選択

CDPzが用意しているSMF_110_2というData Streamは、一見統計情報が取得できるように見えますが、ここで取得されるフィールドは、以下に示される、いわゆるヘッダー部分に相当するデータのみです。
参考: [SMF Header and SMF Prodcut section](https://www.ibm.com/support/knowledgecenter/en/SSGMCP_5.4.0/system-programming/cics/dfha3c00332.html)
本来取得したい統計情報は、以下に示されるData Sectionと呼ばれる部分で、これらのフィールドを取得するにはカスタマイズが必要になります。
参考: [CICS statistics data section](https://www.ibm.com/support/knowledgecenter/en/SSGMCP_5.4.0/system-programming/cics/dfha37r.html)
上に示されているように、STIDと呼ばれるカテゴリ単位に多数のフィールドが用意されており、SDEの定義でもSTID毎にレコードが定義されています。

例えば、STID:10は「Transaction Manager Global Stats」を表し、このカテゴリに含まれるフィールドについての詳細は、以下のデータエリアの説明から確認できます。
参考: フィールドの型の情報 => [XMGDS - Transaction Manager Global Stats](https://www.ibm.com/support/knowledgecenter/SSGMCP_5.4.0/reference/data-areas/DFHXMGKS.html)
取り扱いたいフィールドの型の情報はここから判断することになります。
それぞれのフィールドの意味合いについては、以下の箇所を参照する必要があります。
参考: フィールドの説明 => [Transaction manager: Global statistics](https://www.ibm.com/support/knowledgecenter/en/SSGMCP_5.4.0/reference/statistics/dfht3_stats_tranmgr_global.html)

各STIDをハンドリングするためのSDEの定義は、CDPZ02.V2R1M0.HSBODEFS(HBOR1102)で提供されています。
STID:10(Transaction Manager Global Stats)に関する定義の抜粋は以下の通りです。

```xxx:HBOR1102抜粋
/*----------------------------------------------------*/
/* SMF_110_2_10 record, created by record procedure   */
/* HBO2CIST for sections with STID=10. Was STID = 3   */
/* for CICS/ESA 3.3 and earlier.                      */
/*                                                    */
/* Transaction Manager Global Statistics              */
/*                                           PN63456  */
/*----------------------------------------------------*/
DEFINE RECORD SMF_110_2_10
    VERSION 'CDP.RW066419'                                      -- @13C
  IN LOG SMF                     /* PN63456 */
  BUILT BY HBO2CIST                                             -- @13C
  IDENTIFIED BY REC_STID = 10
  FIELDS
   (REC_LEN  LENGTH 2 BINARY,   -- copy of SMFSTLEN
    REC_STID LENGTH 2 BINARY,   -- copy of STID
-----------------------------------------------------------------------
-- SMF HEADER
-----------------------------------------------------------------------
    SMFSTLEN LENGTH 2 BINARY,
    SMFSTSEQ LENGTH 2 BINARY,
    SMFSTFLG LENGTH 1 BIT,
    SMFSTRTY LENGTH 1 BINARY,
    SMFSTTME TIME(1/100S),
    SMFSTDTE DATE(0CYYDDDF),
    SMFSTSID LENGTH 4 CHAR,
    SMFSTSSI LENGTH 4 CHAR,
    SMFSTSTY LENGTH 2 BINARY,
    SMFSTTRN LENGTH 2 BINARY,
    *        LENGTH 2 BINARY,
    SMFSTAPS LENGTH 4 BINARY,
    SMFSTLPS LENGTH 2 BINARY,
    SMFSTNPS LENGTH 2 BINARY,
    SMFSTASS LENGTH 4 BINARY,
    SMFSTASL LENGTH 2 BINARY,
    SMFSTASN LENGTH 2 BINARY,   -- end of SMF header
    SMFSTRVN LENGTH 2 HEX,      -- VSN, eg '0410'  Product section
    SMFSTPRN LENGTH 8 CHAR,     -- Generic Applid
    SMFSTSPN LENGTH 8 CHAR,     -- Specific Applid
    SMFSTMFL LENGTH 2 HEX,
    *        LENGTH 2 BINARY,
    *        LENGTH 2 BINARY,
    SMFSTDTK LENGTH 4 BINARY,   -- Domain Token
    SMFSTDID LENGTH 2 CHAR,     -- Domain ID
    SMFSTRQT LENGTH 3 CHAR,     -- Type of statistics record
    SMFSTICD LENGTH 3 CHAR,     -- Yes if record incomplete
    SMFSTDAT OFFSET 84 LENGTH 6 DATE(MMDDYY), -- Not Meaningful PQ03356
    SMFSTCLT OFFSET 90 LENGTH 6 TIME(HHMMSS), -- for CICS<V510  PQ03356
    *        OFFSET 96 LENGTH 2 HEX,
    SMFSNDAT OFFSET 84 LENGTH 8 DATE(MMDDYYYY), --Meaningful forPQ03356
    SMFSNCLT OFFSET 92 LENGTH 6 TIME(HHMMSS),   --for CICS>=V510PQ03356
    SMFSTINT LENGTH 6 TIME(HHMMSS),
    SMFSTINO LENGTH 4 BINARY,
    SMFSTRTK LENGTH 8 HEX,
    SMFSTLRT LENGTH 6 TIME(HHMMSS),
    SMFSTCST TIMESTAMP(TOD),
    SMFSTJBN LENGTH 8 CHAR,
    SMFSTRSD DATE(0CYYDDDF),
    SMFSTRST TIME(1/100S),
    SMFSTUIF LENGTH 8 CHAR,
    SMFSTPDN LENGTH 8 CHAR,
    STILEN   LENGTH 2 BINARY,   -- Beginning of data section
    STID     LENGTH 2 BINARY,
    STIVERS  LENGTH 1 HEX,
    *        LENGTH 3 BINARY)
 
-----------------------------------------------------------------------
-- STATISTICS DATA SECTION
-----------------------------------------------------------------------
  SECTION GLOB_TRAN_MANAGER
    OFFSET SMFSTASS
    LENGTH SMFSTASL
    FIELDS (XMGNUM      LENGTH 4 BINARY,
                               -- total user+system txns           @13A
            XMGMXT      LENGTH 4 BINARY,
                               -- current MAXTASKS limit           @13A
            XMGCAT      LENGTH 4 BINARY,
                               -- active user transactions         @13A
            XMGCQT      LENGTH 4 BINARY,
                               -- current # queued user txns       @13A
            XMGTAMXT    LENGTH 4 BINARY,
                               -- number of times MAXTASKS reached @13A
            XMGPAT      LENGTH 4 BINARY,
                               -- peak MAXTASKS queued user txns   @13A
            XMGPQT      LENGTH 4 BINARY,
                               -- peak number of active user txns  @13A
            XMGTAT      LENGTH 4 BINARY,
                               -- total number of active user txns @13A
            XMGTDT      LENGTH 4 BINARY,
                               -- number of user txns queued for   @13A
                               -- MAXTASK does not include XMGCQT  @13A
            XMGTQTME    TIMESTAMP(TOD),
                               -- queuing time for txns counted    @13A
                               -- by XMGTDT                        @13A
            XMGCQTME    TIMESTAMP(TOD),
                               -- queuing time for txns counted    @13A
                               -- by XMGCQT                        @13A
            *           LENGTH 4 BINARY,
            XMGTNUM     LENGTH 8 BINARY,                        --  @08C
                               -- total txns attached since last   @13A
                               -- stats reset, XMGNUM + XMGTNUM is @13A
                               -- total txns attached so far       @13A
            XMGGTAT     TIMESTAMP(TOD),                         -- 2@08A
                               -- time last txn attached (GMT)
            XMGLTAT     TIMESTAMP(TOD),                         -- 2@08A
                               -- time last txn attached(local)
            XMGGSMXT    TIMESTAMP(TOD),                         -- 2@08A
                               -- time MXT set (GMT)
            XMGLSMXT    TIMESTAMP(TOD),                         -- 2@08A
                               -- time MXT set (local)
            XMGGAMXT    TIMESTAMP(TOD),                         -- 2@08A
                               -- time MXT reached (GMT)
            XMGLAMXT    TIMESTAMP(TOD),                         -- 2@08A
                               -- time MXT reached (local)
            XMGATMXT    LENGTH 1 BIT,                           -- 3@08A
                               -- at MXT indicator
                               -- X'80' currently at MXT
            *           LENGTH 7 CHAR);                         -- 2@08A
                               -- Reserved
 
COMMENT ON RECORD SMF_110_2_10   IS
     'CICS/ESA global transaction stats';
```

さて、ここでは、STID:10(Transaction Manager Global Stats)、および、STID:11(Transaction Manager Transaction Stats)の各フィールドを追加してみたいと思います。

### SDE定義のカスタマイズ

抽出したいフィールドの型の情報をチェックします。例えば、STID:10の、XMGTQTMEというフィールドに着目してみます。このフィールドの説明、型の情報を見ると、以下のようになっています。

>Total MAXTASK queuing time
>is the total time spent waiting by those user transactions that had to queue for MXT reasons. This value does not include the time spent by those transactions that are currently queueing for MXT (see XMGCQTME). 

>THE FOLLOWING CL8 DEFINITIONS ARE REALLY "STORE CLOCK" FORMAT

つまり、MXTに達してキューイングされていた合計時間がTOD Clockフォーマットで格納されていることになります。ところが、製品提供のSDEの定義(HBOR1102)では、```XMGTQTME    TIMESTAMP(TOD)```となっており、このフィールドがタイムスタンプであるかのように定義されています。TIMESTAMP(TOD)型で定義されてしまうと、"1900-01-01 00:00:00.000000"といった形式にフォーマットされてしまいます。本来であれば、キューイングされていた時間(数値型)としてハンドリングして欲しいので、この定義は不適切と判断されます(製品不具合???)。

このフィールド定義の型を変更したいので、CDPZ02.V2R1M0.HSBODEFS(HBOR1102) => CDPZ02.CUSTOM.HSBODEFS(HBOR1102)にコピーして編集します。

```HBOR1102カスタマイズ
...
XMGTQTME    LENGTH    8 BINARY UNSIGNED,                            
...     
XMGCQTME    LENGTH    8 BINARY UNSIGNED,      
...                      
```

XMGCQTMEも同じ位置づけなので、同じように変更します。

次に、各STIDを出力させるための定義を追加します。これはデフォルトでは定義されていないので、新規にCDPZ02.CUSTOM.SHBODEFS(HBOU1102)というメンバーを作成します。他の定義に倣って、以下のような定義を作成します。

```xxx:CDPZ02.CUSTOM.SHBODEFS(HBOU1102)
/**********************************************************************/
/*  Name: HBOU1102                                                    */
/**********************************************************************/

-- HBORS1102_10 records

SET IBM_FILE = 'S1102010';

DEFINE UPDATE SMF_110_2_10
  VERSION 'CDP.110           '
  FROM SMF_110_2_10
  TO &IBM_UPDATE_TARGET
  AS &IBM_FILE_FORMAT
  GROUP BY NONE  
  SET
    (REC_STID = FIRST(REC_STID),
     SMFSTTME = FIRST(SMFSTTME),
     SMFSTDTE = FIRST(SMFSTDTE),
     SMFSTSID = FIRST(SMFSTSID),
     SMFSTSSI = FIRST(SMFSTSSI),
     SMFSTLRT = FIRST(SMFSTLRT),
     SMFSTCST = FIRST(SMFSTCST),
     SMFSTJBN = FIRST(SMFSTJBN),
     SMFSTRSD = FIRST(SMFSTRSD),
     SMFSTRST = FIRST(SMFSTRST),
     XMGNUM   = FIRST(XMGNUM),
     XMGMXT   = FIRST(XMGMXT),
     XMGCAT   = FIRST(XMGCAT),
     XMGCQT   = FIRST(XMGCQT),
     XMGTAMXT = FIRST(XMGTAMXT),
     XMGPAT   = FIRST(XMGPAT),
     XMGPQT   = FIRST(XMGPQT),
     XMGTAT   = FIRST(XMGTAT),
     XMGTDT   = FIRST(XMGTDT),
     XMGTQTME = FIRST(XMGTQTME / 4096E6),
     XMGCQTME = FIRST(XMGCQTME / 4096E6),
     XMGTNUM  = FIRST(XMGTNUM));

-- HBORS1102_11 records

SET IBM_FILE = 'S1102011';

DEFINE UPDATE SMF_110_2_11
  VERSION 'CDP.110           '
  FROM SMF_110_2_11
  TO &IBM_UPDATE_TARGET
  AS &IBM_FILE_FORMAT SET(ALL);

DEFINE TEMPLATE SMF_110_2_11 FOR SMF_110_2_11
  ORDER
    (REC_STID,
     SMFSTTME,
     SMFSTDTE,
     SMFSTSID,
     SMFSTSSI,
     SMFSTLRT,
     SMFSTCST,
     SMFSTJBN,
     SMFSTRSD,
     SMFSTRST,
     XMRTI,
     XMRPN,
     XMRTCL,
     XMRRNAM,
     XMRRSYS,
     XMRPRTY,
     XMRDYN,
     XMRAC,
     XMRRC,
     XMRDLC,
     XMRDRC,
     XMRRSC,
     XMRSVC,
     XMRITV,
     XMRIWO,
     XMRIAC)
  AS &IBM_FILE_FORMAT;
```

ここで、STID:10については、TOD Clock型のフィールドについて秒換算する必要があるため、SET節で抽出したいフィールドを明示指定して計算処理を含めています。
STID:11については変換処理を行う必要がなさそうなので、TEMPLATEを定義して必要なフィールドを抽出しています。

※ここで、割算とか型変換を行わせたい場合、恐らくUPDATE文のSET節を使う必要があると思われる(UPDATEでGROUP BY NONEを指定することで、各レコードを1グループとして扱うことになるので、実質グルーピングは行われずに、計算処理だけ行わせることができる)。フィールドの変換をする必要が無いのであればDEFINE TEMPLETEでよい。

参考: [Language reference for System Data Engine](https://www.ibm.com/support/knowledgecenter/ja/SSGE3R_2.1.0/sde_lang_reference.html)

バッチで、この定義を使って意図した通りCSV化ができるかどうかを確認します。
以下のJCLを作成してサブミットします。

```
//HBOSMFCB JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//*
//HBOSMFCB EXEC PGM=HBOPDE,REGION=0M,
//         PARM='SHOWINPUT=NO,ZIIPOFFLOAD=NO'
//STEPLIB  DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBOLOAD
//*
//* CONTROL STATEMENTS
//*
//HBOIN    DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOCCSV)
//         DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOLLSMF)
//         DD DISP=SHR,DSN=CDPZ02.CUSTOM.SHBODEFS(HBOR1102)
//         DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOR1103)
//         DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOTDSPE)
//         DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOTDWEK)
//         DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOTPERI)
//         DD DISP=SHR,DSN=CDPZ02.CUSTOM.SHBODEFS(HBOU1102)
//*
//* Sample COLLECT statement for processing log data
//*
//         DD *
COLLECT SMF
  COMMIT AFTER END OF FILE;
/*
//HBOLOG   DD DISP=SHR,DSN=CDPZ01.SMFDUMP.D191016.T1
//HBOOUT   DD SYSOUT=*
//HBODUMP  DD SYSOUT=*
//HBODEBUG DD SYSOUT=*
//S1102010 DD SYSOUT=*,RECFM=V,LRECL=32756
//S1102011 DD SYSOUT=*,RECFM=V,LRECL=32756
```

※HBOIN DDで、カスタマイズした以下のメンバーを指定しています！
DD DISP=SHR,DSN=CDPZ02.**CUSTOM**.SHBODEFS(HBOR1102)
DD DISP=SHR,DSN=CDPZ02.**CUSTOM**.SHBODEFS(HBOU1102)

JOBLOGを確認します。

```xxx:S1102010
 10,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,199,50,1,0,0,1,0,124,0,+0.0000000000000000,+0.0000000000000000,+1.2600000000000000E+02
 10,18:00:46:84,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,199,50,1,0,0,1,0,124,0,+0.0000000000000000,+0.0000000000000000,+1.2600000000000000E+02
 10,18:00:48:07,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,199,50,1,0,0,1,0,124,0,+0.0000000000000000,+0.0000000000000000,+1.2600000000000000E+02
 10,18:00:49:25,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,200,50,1,0,0,1,0,125,0,+0.0000000000000000,+0.0000000000000000,+1.2600000000000000E+02
 10,18:00:50:34,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,201,50,1,0,0,1,0,126,0,+0.0000000000000000,+0.0000000000000000,+1.2600000000000000E+02
```

```xxx:S1102011 
 11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CADP,DFHDPLU ,        ,        ,    ,1,N,0,0,0,0,0,0,0,Y,B
 11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CATA,DFHZATA ,        ,        ,    ,255,N,2,0,0,0,0,0,0,Y,B
 11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CATD,DFHZATD ,        ,        ,    ,255,N,1,0,0,0,0,0,0,Y,B
 11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CATR,DFHZATR ,        ,        ,    ,255,N,0,0,0,0,0,0,0,Y,B
 11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CBAM,DFHECBAM,        ,        ,    ,255,N,0,0,0,0,0,0,0,Y,B
 11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CCIN,DFHZCN1 ,DFHCOMCL,        ,    ,254,N,0,0,0,0,0,0,0,Y,B
...
```

### ポリシーのカスタマイズ
上で定義したData Streamの内容を、ConfigTool上でもCustom Data Streamとして定義します。
参考:[Creating a System Data Engine data stream definition](https://www.ibm.com/support/knowledgecenter/SSGE3R_2.1.0/webui_custom_ds_create_sde.html#webui_custom_ds_create_sde) のProcedure 2～5

ConfigToolでMANAGE CUSTOM DATA STREAM DEFINITIONSボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/caebc588-53af-dec2-78ef-9af42e096b59.png)

Create System Data Engine data stream definitionをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/5db73a0f-fd28-f7e6-f99b-146acac04384.png)

この定義は、追加したいSTID単位に作成します。
以下、STID:10 用のData Stream定義例です。各フィールドに値を設定してOKを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7d2903b3-7e60-534a-413c-8cca5aab7647.png)

同様に、STID:11用の定義も追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/49b9dde7-435b-381f-0153-889221b792cd.png)

<補足>
**Name**: 新しく追加するData Stream名
**Description**: 説明
**Group/Subgroup**: 新しく追加するData Streamを配置するグループ名/サブグループ名(任意の名前)。エディターで選択する際に、Custum Data Streams以下にこのグループにカテゴライズされて表示される。
**SHBODEFS dataset members**:このData Streamに関連するSHBODEFSメンバー名

実体として、USS上に以下のようなJSONファイルが作成されます。
/u/CDP201/cdpConfig/SMF_110_2_10.streams.json
/u/CDP201/cdpConfig/SMF_110_2_11.streams.json

```json:/u/CDP201/cdpConfig/SMF_110_2_10.streams.json
{
    "groupings": {
        "Custom Data Streams": {
            "CICS Group": {
                "Statistics": [
                    "SMF_110_2_10"
                ]
            }
        }
    },
    "definitions": [
        {
            "category": "SMF",
            "name": "SMF_110_2_10",
            "description": "Customized Statstics STID 10",
            "tags": [
                "CSV",
                "Split",
                "Custom"
            ],
            "concatenation": [
                "USER",
                "CDP"
            ],
            "hboin": {
                "all": [
                    "HBOCCORY",
                    "HBOLLSMF",
                    "HBOR1102",
                    "HBOR1103",
                    "HBOTDSPE",
                    "HBOTDWEK",
                    "HBOTPERI",
                    "HBOU1102"
                ]
            },
            "parms": [
                {
                    "displayName": "Data Source Name",
                    "name": "dataSourceName",
                    "defaultValue": "SMF_110_2_10",
                    "edit": "Required",
                    "description": "Name of Data Source sent to subscribers",
                    "policyOnly": 1,
                    "unique": true
                },
                {
                    "displayName": "Data Source Type",
                    "name": "dataSourceType",
                    "defaultValue": "zOS-SMF_110_2_10",
                    "edit": "Protected",
                    "description": "Type of Data Source sent to subscribers",
                    "policyOnly": 1
                },
                {
                    "displayName": "File Path",
                    "name": "filePath",
                    "defaultValue": "SMF/SMF_110_2_10",
                    "edit": "Protected",
                    "description": "Path used for the SMF data",
                    "policyOnly": 1,
                    "unique": true
                }
            ]
        }
    ]
}
```

新しく追加したData Streamを使って、ポリシーを作成します。
新規にポリシー作成する際に、Data Streamを選択するメニューに上で追加したSMF_110_2_10, SMF_110_2_11が表示されるので、それを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/3debb543-8293-00f2-a75e-20f8ba7960b6.png)

ユーザー定義のCustom Data Streamを指定した場合、SYSTEM DATA ENGINEボタンを押すと、以下のようにUSER Concaenationという設定が新たに追加指定できるようになります。ここに、カスタマイズしたData Stream定義を配置したPDSデータセット名を指定することになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/76a8010d-af9a-3d37-2a5d-1d00dc0ef6be.png)

あとはこれまでと同じ流れでポリシーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/95bdf8a3-3c01-316d-f7fe-1f455204080e.png)


### Data Streamer(HBODSPRO)の設定変更

Data Streamer起動プロシージャーで参照するポリシーファイルの指定を、上で生成されたポリシーファイルに置き換えて起動します。

### Logstash構成ファイルのカスタマイズ

一旦、どのような形式でデータが送信されてくるか確認します。
例によって以下のLogstash構成ファイルにて確認します。

```
input{
        tcp{
                port => 8081
        }
}

filter {
        json { source => "message" }
}

output {
        stdout{ }
}
```

結果

```
{
       "sourceName" => "ZOS1-SMF_110_2_10",
          "message" => [
        [0] "10,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,199,50,1,0,0,1,0,124,0,+0.0000000000000000,+0.0000000000000000,+1.26000
00000000000E+02",
        [1] "10,18:00:46:84,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,199,50,1,0,0,1,0,124,0,+0.0000000000000000,+0.0000000000000000,+1.26000
00000000000E+02",
        [2] "10,18:00:48:07,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,199,50,1,0,0,1,0,124,0,+0.0000000000000000,+0.0000000000000000,+1.26000
00000000000E+02",
        [3] "10,18:00:49:25,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,200,50,1,0,0,1,0,125,0,+0.0000000000000000,+0.0000000000000000,+1.26000
00000000000E+02",
        [4] "10,18:00:50:34,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,201,50,1,0,0,1,0,126,0,+0.0000000000000000,+0.0000000000000000,+1.26000
00000000000E+02"
    ],
       "sourceType" => "zOS-SMF_110_2_10",
             "port" => 41576,
         "@version" => "1",
             "host" => "EPLEX1",
             "path" => "SMF/SMF_110_2_10",
         "timeZone" => "+0900",
              "seq" => {
        "w" => "2",
        "c" => "0"
    },
      "sysplexName" => "EPLEX",
    "inputsequence" => "20200123022216080:000000",
       "@timestamp" => 2020-01-23T02:22:09.306Z,
       "systemName" => "ZOS1"
}
{
       "sourceName" => "ZOS1-SMF_110_2_11",
          "message" => [
        [  0] "11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CADP,DFHDPLU ,        ,        ,    ,1,N,0,0,0,0,0,0,0,Y,B",
        [  1] "11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CATA,DFHZATA ,        ,        ,    ,255,N,2,0,0,0,0,0,0,Y,B",
        [  2] "11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CATD,DFHZATD ,        ,        ,    ,255,N,1,0,0,0,0,0,0,Y,B",
        [  3] "11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CATR,DFHZATR ,        ,        ,    ,255,N,0,0,0,0,0,0,0,Y,B",
        [  4] "11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CBAM,DFHECBAM,        ,        ,    ,255,N,0,0,0,0,0,0,0,Y,B",
        [  5] "11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CCIN,DFHZCN1 ,DFHCOMCL,        ,    ,254,N,0,0,0,0,0,0,0,Y,B",
...
        [978] "11,18:00:50:34,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CXRT,DFHCRT  ,        ,        ,    ,1,N,0,0,0,0,0,0,0,Y,B",
        [979] "11,18:00:50:34,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,DSNC,DFHD2CM1,        ,        ,    ,255,N,0,0,0,0,0,0,0,Y,B"
    ],
       "sourceType" => "zOS-SMF_110_2_11",
             "port" => 41576,
         "@version" => "1",
             "host" => "EPLEX1",
             "path" => "SMF/SMF_110_2_11",
         "timeZone" => "+0900",
              "seq" => {
        "w" => "0",
        "c" => "1"
    },
      "sysplexName" => "EPLEX",
    "inputsequence" => "20200123022216131:000000",
       "@timestamp" => 2020-01-23T02:22:09.338Z,
       "systemName" => "ZOS1"
}
```

STID:10, STID:11それぞれについて、Logstashの構成ファイルを作成します(製品提供のファイル群には含まれていないので、一から作成する必要があります)。
<font color="red">型の指定は、「[(5)カスタマイズ-共通](https://qiita.com/tomotagwork/private/fe76619e8880956aa0e0#index-template)」の記事で示しているElasticsearchのindex templateにて型を明示指定することもできますし、numeric_detectionを有効化することである程度自動変換もしてくれます。Elasticsearch のIndex templateで型の対応をしている場合は、以下に記載のLogstashでの明示的な型設定は不要です。</font>

**STID:10用定義作成**

```xxx:H_SMF_110_2_10.lsh
filter {
   if [sourceType] == "zOS-SMF_110_2_10" {

        csv{
                columns => [ "REC_STID", "SMFSTTME", "SMFSTDTE", "SMFSTSID", "SMFSTSSI", "SMFSTLRT", "SMFSTCST", "SMFSTJBN", "SMFSTRSD", "SMFSTRST", "XMGNUM", "XMGMXT", "XMGCAT", "XMGCQT", "XMGTAMXT", "XMGPAT", "XMGPQT", "XM
GTAT", "XMGTDT", "XMGTQTME", "XMGCQTME", "XMGTNUM" ]
                separator => ","
                convert => {
                        "XMGNUM" => "integer"
                        "XMGMXT" => "integer"
                        "XMGCAT" => "integer"
                        "XMGCQT" => "integer"
                        "XMGTAMXT" => "integer"
                        "XMGPAT" => "integer"
                        "XMGPQT" => "integer"
                        "XMGTAT" => "integer"
                        "XMGTDT" => "integer"
                        "XMGTQTME" => "float"
                        "XMGCQTME" => "float"
                        "XMGTNUM" => "float"
                }
        }
   }
}
```

```xxx:N_SMF_110_2_10.lsh
filter {
   if [sourceType] == "zOS-SMF_110_2_10" {
      mutate{ add_field => {
         "[@metadata][timestamp]" => "%{SMFSTDTE} %{SMFSTTME}"
        }}

      date{ match => [
             "[@metadata][timestamp]", "yyyy-MM-dd HH:mm:ss:SS"
        ]}
   }
}
```

**STID:10用定義作成**

```xxx:H_SMF_110_2_11.lsh
filter {
   if [sourceType] == "zOS-SMF_110_2_11" {

        csv{
                columns => [ "REC_STID", "SMFSTTME", "SMFSTDTE", "SMFSTSID", "SMFSTSSI", "SMFSTLRT", "SMFSTCST", "SMFSTJBN", "SMFSTRSD", "SMFSTRST", "XMRTI", "XMRPN", "XMRTCL", "XMRRNAM", "XMRRSYS", "XMRPRTY", "XMRDYN", "XMRAC", "XMRRC", "XMRDLC", "XMRDRC", "XMRRSC", "XMRSVC", "XMRITV", "XMRIWO", "XMRIAC" ]
                separator => ","
                convert => {
                        "XMRAC" => "integer"
                        "XMRRC" => "integer"
                        "XMRDLC" => "integer"
                        "XMRDRC" => "integer"
                        "XMRRSC" => "integer"
                        "XMRSVC" => "integer"
                        "XMRITV" => "integer"
                }
        }
   }
}
```

```xxx:N_SMF_110_2_11.lsh
filter {
   if [sourceType] == "zOS-SMF_110_2_11" {
      mutate{ add_field => {
         "[@metadata][timestamp]" => "%{SMFSTDTE} %{SMFSTTME}"
        }}

      date{ match => [
             "[@metadata][timestamp]", "yyyy-MM-dd HH:mm:ss:SS"
        ]}
   }
}
```

一旦、outputをElasticsearchではなくstdoutにして、Logstashのレベルでフォーマットできるか確認してみると...

```
{
         "@version" => "1",
              "seq" => {
        "w" => "1",
        "c" => "0"
    },
           "XMGPQT" => 0,
           "XMGMXT" => 50,
         "XMGCQTME" => 0.0,
         "SMFSTSSI" => "CICS",
         "timeZone" => "+0900",
          "message" => "10,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,199,50,1,0,0,1,0,124,0,+0.0000000000000000,+0.00000000000000
00,+1.2600000000000000E+02",
           "XMGCQT" => 0,
             "port" => 41578,
         "SMFSTCST" => "2019-10-15 17:45:43.317175",
          "XMGTNUM" => 126.0,
       "systemName" => "ZOS1",
         "SMFSTSID" => "ZOS1",
           "XMGPAT" => 1,
         "REC_STID" => "10",
           "XMGCAT" => 1,
             "host" => "EPLEX1",
    "inputsequence" => "20200123022757604:000000",
         "SMFSTJBN" => "CT54D4A1",
       "sourceType" => "zOS-SMF_110_2_10",
         "SMFSTDTE" => "2019-10-16",
         "SMFSTRSD" => "2019-10-15",
         "SMFSTRST" => "17:45:41:86",
           "XMGTDT" => 0,
             "path" => "SMF/SMF_110_2_10",
         "SMFSTLRT" => "00:00:00",
       "@timestamp" => 2019-10-16T09:00:44.780Z,
         "SMFSTTME" => "18:00:44:78",
         "XMGTQTME" => 0.0,
       "sourceName" => "ZOS1-SMF_110_2_10",
           "XMGTAT" => 124,
           "XMGNUM" => 199,
      "sysplexName" => "EPLEX",
         "XMGTAMXT" => 0
}
...
{
         "@version" => "1",
              "seq" => {
        "w" => "2",
        "c" => "1"
    },
           "XMRSVC" => 0,
         "SMFSTSSI" => "CICS",
         "timeZone" => "+0900",
          "message" => "11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CATA,DFHZATA ,        ,        ,    ,255,N,2,0,0,0,0,0,0,Y,B
",
           "XMRTCL" => "        ",
          "XMRPRTY" => "255",
             "port" => 41578,
         "SMFSTCST" => "2019-10-15 17:45:43.317175",
           "XMRDYN" => "N",
       "systemName" => "ZOS1",
         "SMFSTSID" => "ZOS1",
            "XMRAC" => 2,
         "REC_STID" => "11",
           "XMRRSC" => 0,
             "host" => "EPLEX1",
    "inputsequence" => "20200123022757655:000000",
         "SMFSTJBN" => "CT54D4A1",
            "XMRPN" => "DFHZATA ",
       "sourceType" => "zOS-SMF_110_2_11",
           "XMRDRC" => 0,
         "SMFSTDTE" => "2019-10-16",
         "SMFSTRSD" => "2019-10-15",
         "SMFSTRST" => "17:45:41:86",
          "XMRRSYS" => "    ",
             "path" => "SMF/SMF_110_2_11",
         "SMFSTLRT" => "00:00:00",
       "@timestamp" => 2019-10-16T09:00:44.780Z,
         "SMFSTTME" => "18:00:44:78",
          "XMRRNAM" => "        ",
           "XMRITV" => 0,
       "sourceName" => "ZOS1-SMF_110_2_11",
           "XMRIWO" => "Y",
            "XMRRC" => 0,
           "XMRDLC" => 0,
      "sysplexName" => "EPLEX",
           "XMRIAC" => "B",
            "XMRTI" => "CATA"
}
```

うまく取れてそうなのでOKでしょう。ということで、Elasticsearchにぶちこんで、Kibanaで見てみます。

### Kibana Discoverでの確認

Elasticsearchにデータを取り込むと、cdp-zos-smf_110_2_10-* および cdp-zos-smf_110_2_10-*という名前のindexに取り込まれるので、index patternを作ってDiscoverで確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/70328773-9c8b-6339-ea8f-3766d901010c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9b6558b9-f4f1-a4d2-4977-b186d6cbb831.png)

それぞれ取り込めてそうです。

# Logger情報取得

CICS関連のパフォーマンス情報を確認する際は、上に挙げたモニター、統計情報以外に、Loggerに関する情報も合わせて参照することも多いです。LoggerはCICS自体の機能ではなくOS提供の機能(IXGLOGR)が利用されます。

## Logger関連SMF補足

### SMF Type 88
Logger関連の情報は、SMF Type 88として取得されます。
参考: [Record Type 88 (58) — System Logger Data](https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.ieag200/rt8858.htm)
参考: [System Logger interim storage related I/O activity](https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.ieag200/cfio.htm)
参考: [Monitoring the logger environment](https://www.ibm.com/support/knowledgecenter/en/SSGMCP_5.4.0/tuning/dfht39f.html)

### SMF関連設定
LoggerはOS提供コンポーネントのため、データ書き込みのインターバルなどの設定はOSの設定に依存します。

参考: [Statements and parameters for SMFPRMxx](https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.ieae200/smfparm.htm)
参考: [Displaying SMF data](https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.ieag100/d3smf.htm)
参考: [SETSMF command](https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.ieag100/setsmf.htm)

D SMF,O 
SETSMF INTVAL(01)

### Logger関連SMFデータの確認

SMF Type 88のダンプ用JCLサンプル

```
//SMFDUMP  JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//***************************************************************
//SMFDUMP  EXEC  PGM=IFASMFDP
//INDD1    DD DSN=SYS1.ZOS1.MAN3,DISP=SHR
//OUTDD1   DD DSN=CDPZ02.SMFDUMP.D200127.LOGR,DISP=(NEW,CATLG,DELETE),
//            SPACE=(CYL,(10,5)),VOL=SER=ZSPK01
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
  INDD(INDD1,OPTIONS(DUMP))
  OUTDD(OUTDD1,TYPE(88))
/*
```

Logger関連SMFデータフォーマット用JCLサンプル
参考: [Sample JCL procedures and functions in SYS1.SAMPLIB](https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.ieav200/iea3v2_Sample_JCL_procedures_and_functions_in_SYS1.SAMPLIB.htm)
参考: [IXGRPT1 SAMPLIB program](https://www.ibm.com/support/knowledgecenter/SSLTBW_2.3.0/com.ibm.zos.v2r3.ieag200/logrpt.htm)

```
//IXGRPT1J  JOB  CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)                      00010000
//* ******************************************************************* 00030000
//* TO REPLACE THE SET STATEMENTS, FOLLOW THE INSTRUCTIONS BELOW IN   * 00040000
//* THE SUGGESTED MODIFICATION SECTION.                               * 00050000
//* ******************************************************************* 00060000
//   SET    SMFIN1=CDPZ02.SMFDUMP.D200127.LOGR                          00070001
//   SET    LIBPRFX=CEE                                                 00080000
//   SET    RPTOBJ=SYS1.SAMPLIB(IXGRPT1L)                               00090000
//*                                                                     00100000
//* ******************************************************************* 01120500
//* SORT STEP: USE ROUTINE SPECIFIED BY YOUR SITE. ONE POSSIBILITY      01130000
//* WOULD BE DFSORT:                                                    01140000
//* ******************************************************************* 01150000
//*                                                                     01160000
//* SORT EACH SMF INPUT DSN BY TIMESTAMP AND LOGSTREAM NAME             01170000
//SORT1    EXEC PGM=SORT                                                01180000
//SYSOUT   DD  SYSOUT=*                                                 01190000
//SORTIN   DD  DSN=&SMFIN1,DISP=(OLD,KEEP)                              01200000
//SORTOUT  DD  DSN=&&TEMP1,DISP=(NEW,PASS),UNIT=SYSDA,                  01210000
//             SPACE=(CYL,(1,1))                                        01220000
//SYSIN    DD  *                                                        01230000
   OPTION VLSHRT                                                        01240000
   SORT  FIELDS=(133,8,BI,A,                                            01250000
                 105,26,CH,A)                                           01260000
   INCLUDE COND=(23,2,BI,EQ,X'0001',AND,241,10,CH,EQ,C'*DASDONLY*')     01270002
/*                                                                      01280000
//*                                                                @L1C 01281000
//*                                                                @L1C 01283001
//* USE THE SORT AND INCLUDE OPTIONS ABOVE AT THE HBB6603 AND HIGHER    01290000
//* RELEASE LEVELS. SEE DEPENDENCIES FOR OTHER RELEASE AND LOGSTREAM    01300000
//* REPORTING OPTIONS.                                                  01310000
//* ******************************************************************* 01320000
//* ASSEMBLE SUBROUTINE IXGR1A.                                         01330000
//* ******************************************************************* 01340000
//ASMC        EXEC PGM=ASMA90,REGION=0M,PARM='OBJECT,NODECK'   *  @01C  01350000
//SYSLIB      DD DSN=SYS1.MACLIB,DISP=SHR          * LIBRARY DSN        01360000
//SYSLIN      DD DSN=&&OBJ(IXGR1A),SPACE=(TRK,(10,30,10),,,ROUND),      01370000
//            UNIT=3390,DISP=(MOD,PASS),                                01380000
//            DCB=(BLKSIZE=3120,LRECL=80,RECFM=FB) * ASM OBJ            01390000
//SYSPRINT    DD SYSOUT=*                                               01400000
//SYSUT1      DD UNIT=SYSDA,SPACE=(CYL,(5,5))                           01410000
//SYSIN       DD DSN=SYS1.SAMPLIB(IXGR1A),DISP=SHR * ASM SOURCE         01420000
//*                                                                     01430000
//* ******************************************************************* 01440000
//* LINK/EDIT, AND EXECUTE OBJECT SAMPLIB MEMBER USING LE LIBRARIES.    01450000
//* ******************************************************************* 01460000
//LKED     EXEC PGM=IEWL,REGION=1024K                                   01470000
//SYSLIB   DD  DSN=&LIBPRFX..SCEELKED,DISP=SHR    * CATALOGUED PROC     01480000
//SYSPRINT DD  SYSOUT=*                                                 01490000
//SYSLIN   DD  DSN=&RPTOBJ.,DISP=SHR              *               @01C  01500000
//         DD  DDNAME=SYSIN                                             01510000
//SYSLMOD  DD  DSN=&&LOADMOD(GO),DISP=(MOD,PASS),UNIT=SYSDA,            01520000
//             SPACE=(1024,(50,20,1))             * LOAD MODULE         01530000
//SYSUT1   DD  DSN=&&SYSUT1,UNIT=SYSDA,SPACE=(1024,(200,20)),           01540000
//             DCB=BLKSIZE=1024                                         01550000
//SYSIN    DD  DSN=*.ASMC.SYSLIN,DISP=(MOD,PASS)  * ASM OBJ (IN)        01560000
//GO       EXEC PGM=*.LKED.SYSLMOD,COND=(4,LT,LKED),                    01570000
//             REGION=2048K                                             01580000
//STEPLIB  DD  DSN=&LIBPRFX..SCEERUN,DISP=SHR     * CATALOGUED PROC     01590000
//SYSPRINT DD  SYSOUT=*                                                 01600000
//CEEDUMP  DD  SYSOUT=*                                                 01610000
//SYSUDUMP DD  SYSOUT=*                                                 01620000
//SMFDATA  DD DSN=*.SORT1.SORTOUT,DISP=(MOD,PASS)                       01630000
//RPORT88  DD SYSOUT=*                            * IXGRPT1 OUTPUT      01640000
//*//* ***************************************************************  01650000
```

上のJCLでフォーマットした結果例

```

                                               SYSTEM LOGGER ACTIVITY REPORT (IXGRPT1)
                                                                                                                    PAGE    1

                                                BYT WRITTN  BYT WRITTN  BYT WRITTN                                            AVERAGE
                                                 BY USERS   TO INTERIM    TO DASD    #WRITES    ---# WRITES COMPLETED------   BUFFER
  --LOGSTREAM NAME------------ STRUCTURE NAME--  IXGWRITES   STORAGE                 INVOKED     TYPE1     TYPE2     TYPE3    SIZE

                                                BYT DELETD  # DELETES   BYT DELETD  # DELETS     ---------------EVENT---------------
                                                INTERIM ST   W/O DASD   INTERIM ST      W/       OFF- DASD STRC NTRY STG  STG   RE-
                                                W/O DASD     WRITE      W/DASD        WRITE      LOAD SHFT FULL FULL THLD FULL  BLD
  ___________________________________________________________________________________________________________________________________

...
  01/27/20  6:41:00 AM  (SMF INTERVAL TIMESTAMP 'D7629ACAD1700000'X)
    CT54D0CM.DFHLOG            *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D0CM.DFHSHUNT          *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D4A1.DFHLOG            *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D4A1.DFHSHUNT          *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D6A1.DFHLOG            *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D6A1.DFHSHUNT          *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D6A2.DFHLOG            *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D6A2.DFHSHUNT          *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
  01/27/20  6:42:00 AM  (SMF INTERVAL TIMESTAMP 'D7629B0409E00000'X)
    CT54D0CM.DFHLOG            *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D0CM.DFHSHUNT          *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D4A1.DFHLOG            *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D4A1.DFHSHUNT          *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D6A1.DFHLOG            *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
0 ___________________________________________________________________________________________________________________________________
1
                                               SYSTEM LOGGER ACTIVITY REPORT (IXGRPT1)
                                                                                                                    PAGE    2

                                                BYT WRITTN  BYT WRITTN  BYT WRITTN                                            AVERAGE
                                                 BY USERS   TO INTERIM    TO DASD    #WRITES    ---# WRITES COMPLETED------   BUFFER
  --LOGSTREAM NAME------------ STRUCTURE NAME--  IXGWRITES   STORAGE                 INVOKED     TYPE1     TYPE2     TYPE3    SIZE

                                                BYT DELETD  # DELETES   BYT DELETD  # DELETS     ---------------EVENT---------------
                                                INTERIM ST   W/O DASD   INTERIM ST      W/       OFF- DASD STRC NTRY STG  STG   RE-
                                                W/O DASD     WRITE      W/DASD        WRITE      LOAD SHFT FULL FULL THLD FULL  BLD
  ___________________________________________________________________________________________________________________________________

    CT54D6A1.DFHSHUNT          *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D6A2.DFHLOG            *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D6A2.DFHSHUNT          *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
...

  01/27/20  7:42:00 AM  (SMF INTERVAL TIMESTAMP 'D762A86D44200000'X)
    CT54D0CM.DFHLOG            *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D0CM.DFHSHUNT          *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D4A1.DFHLOG            *DASDONLY*            21027      135168           0        33       33         0         0       637
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D4A1.DFHSHUNT          *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D6A1.DFHLOG            *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D6A1.DFHSHUNT          *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D6A2.DFHLOG            *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D6A2.DFHSHUNT          *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
  01/27/20  7:43:00 AM  (SMF INTERVAL TIMESTAMP 'D762A8A67C900000'X)
    CT54D0CM.DFHLOG            *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D0CM.DFHSHUNT          *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D4A1.DFHLOG            *DASDONLY*            13130       86016           0        21       21         0         0       625
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D4A1.DFHSHUNT          *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D6A1.DFHLOG            *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D6A1.DFHSHUNT          *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D6A2.DFHLOG            *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
    CT54D6A2.DFHSHUNT          *DASDONLY*                0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0
0
0 ___________________________________________________________________________________________________________________________________
1
                                               SYSTEM LOGGER ACTIVITY REPORT (IXGRPT1)
                                                                                                                    PAGE    6

                                                BYT WRITTN  BYT WRITTN  BYT WRITTN                                            AVERAGE
                                                 BY USERS   TO INTERIM    TO DASD    #WRITES    ---# WRITES COMPLETED------   BUFFER
  --LOGSTREAM NAME------------ STRUCTURE NAME--  IXGWRITES   STORAGE                 INVOKED     TYPE1     TYPE2     TYPE3    SIZE

                                                BYT DELETD  # DELETES   BYT DELETD  # DELETS     ---------------EVENT---------------
                                                INTERIM ST   W/O DASD   INTERIM ST      W/       OFF- DASD STRC NTRY STG  STG   RE-
                                                W/O DASD     WRITE      W/DASD        WRITE      LOAD SHFT FULL FULL THLD FULL  BLD
  ___________________________________________________________________________________________________________________________________


  REPORT SUMMARY: ===================================================================================================================

    MAX VAL SEEN (ANY INTERVL)                       21027      135168           0        33       33         0         0       637
                                                         0           0           0         0        0    0    0    0    0    0    0

    MIN VAL SEEN (ANY INTERVL)                           0           0           0         0        0         0         0         0
                                                         0           0           0         0        0    0    0    0    0    0    0

    AVG VAL SEEN (ANY INTERVL)                        2627       17014           0         4        4         0         0       632
                                                         0           0           0         0        0    0    0    0    0    0    0


    TOTALS     CUM-BYT-WRT-USERS      CUM-BYT-WRT-INTERIM       CUM-BYT-WRT-DASD
                           34157                   221184                      0

               CUM-IXGWRITE      CUM-TYPE-1      CUM-TYPE-2      CUM-TYPE-3
                         54              54               0               0

               CUM-BYT-DEL-NO-WRT      CUM-DEL-NO-WRT       CUM-BYT-DEL-AFTR-WRT      CUM-DEL-AFTR-WRT
                                0                   0                          0                     0

               CUM-OFFLOAD      CUM-DASD-SHFT      CUM-STRC-FULL      CUM-NTRY-FULL      CUM-STG-THLD      CUM-ST-FULL      CUM-REBLD
                         0                  0                  0                  0                 0                0


    NUMBER OF INTERVALS:             13
    SMF FIRST/LAST INTERVAL TIMESTAMP:       01/27/20  6:39:52 AM /  01/27/20  7:43:00 AM

    NUMBER OF SMF RECORDS:          104
```

## カスタマイズ

### 事前準備:取得フィールドの選択
参考: [Record Type 88 (58) — System Logger Data](https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.ieag200/rt8858.htm)

今回は、以下のフィールドを抽出することにします。

- **SMF88DTE**: Date when the record was moved into the SMF buffer, in the form 0cyydddF. See Standard and Extended SMF record headers for a detailed description.
- **SMF88TME**: Time since midnight, in hundredths of a second, that the record was built into the SMF buffer.
- **SMF88LSN**: Log stream name
- **SMF88LWB**: Bytes requested by user application(s) on IXGWRITE macro invocations for this log stream during the expiring SMF interval (FORMAT=LONG FLOATING POINT).
- **SMF88SAB**: Current after bytes count. Count of bytes deleted from interim storage during this interval, after being offloaded (FORMAT=LONG FLOATING POINT). This field is incremented by system logger's internal management of interim storage.
- **SMF88EO**: Number of successful offloads (greater than one byte of data) performed for this log stream on this system during the expiring interval. (FORMAT=32 bits)


### SDE定義のカスタマイズ

/usr/lpp/IBM/zcdp/v2r1m0/UI/LIB/sde.streams.jsonを確認します。

```json:/usr/lpp/IBM/zcdp/v2r1m0/UI/LIB/sde.streams.json抜粋
...
		{
			"category": "SMF",
			"name": "SMF_088",
			"description": "System logger",
			"tags": [
				"CSV",
				"Split"
			],
			"concatenation": [
				"CDP"
			],
			"hboin": {
				"all": [
					"HBOCCORY",
					"HBOLLSMF",
					"HBORS088",
					"HBOUS088"
				]
			},

...
```

デフォルトの定義では、HBORS088, HBOUS088がSDE定義として使われることが確認できます。
CDPZ02.V2R1M0.SHBODEFS(HBOUS088) => CDPZ02.CUSTOM.SHBODEFS(HBOU088C) にコピーして編集します。

```xxx:CDPZ02.CUSTOM.SHBODEFS(HBOU088C)
SET IBM_FILE = 'SMF088C';

DEFINE UPDATE SMF_088_CUST
  VERSION 'CDP.110           '
  FROM SMF_088
  TO &IBM_UPDATE_TARGET
  AS &IBM_FILE_FORMAT SET(ALL);

DEFINE TEMPLATE SMF_088_CUST FOR SMF_088_CUST
  ORDER
    (SMF88DTE,
     SMF88TME,
     SMF88LSN,
     SMF88LWB,
     SMF88SAB,
     SMF88EO)
AS &IBM_FILE_FORMAT;
```


単発のバッチで、CSV化を試してみます。

```
//HBOSMFCB JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//*
//HBOSMFCB EXEC PGM=HBOPDE,REGION=0M,
//         PARM='SHOWINPUT=NO,ZIIPOFFLOAD=NO'
//STEPLIB  DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBOLOAD
//*
//* CONTROL STATEMENTS
//*
//HBOIN    DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOCCSV)
//         DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOLLSMF)
//         DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBORS088)
//         DD DISP=SHR,DSN=CDPZ02.CUSTOM.SHBODEFS(HBOU088C)
//*
//* Sample COLLECT statement for processing log data
//*
//         DD *
COLLECT SMF
  COMMIT AFTER END OF FILE;
/*
//HBOLOG   DD DISP=SHR,DSN=CDPZ02.SMFDUMP.D200127.LOGR
//HBOOUT   DD SYSOUT=*
//HBODUMP  DD SYSOUT=*
//HBODEBUG DD SYSOUT=*
//SMF088C  DD SYSOUT=*,RECFM=V,LRECL=32756
```

上のようなJCLを作って、SMF Type88のデータがダンプされたデータセットを入力に、CSV化してみます。
結果確認。

```
...
 2020-01-27,16:42:00:08,ATR.EPLEX.MAIN.UR         ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:42:00:08,ATR.EPLEX.DELAYED.UR      ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:42:00:08,ATR.EPLEX.ARCHIVE         ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:42:00:08,,,,
 2020-01-27,16:42:00:08,ATR.EPLEX.RM.DATA         ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:42:00:08,ATR.EPLEX.RESTART         ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:42:00:08,,,,
 2020-01-27,16:42:00:08,CT54D4A1.DFHLOG           ,+2.1027000000000000E+04,+0.0000000000000000,0
 2020-01-27,16:42:00:08,CT54D6A2.DFHSHUNT         ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:42:00:08,CT54D4A1.DFHSHUNT         ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:42:00:08,CT54D6A1.DFHLOG           ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:42:00:08,CT54D6A1.DFHSHUNT         ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:42:00:08,CT54D6A2.DFHLOG           ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:42:00:08,CT54D0CM.DFHLOG           ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:42:00:08,CT54D0CM.DFHSHUNT         ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:43:00:07,ATR.EPLEX.MAIN.UR         ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:43:00:07,ATR.EPLEX.DELAYED.UR      ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:43:00:07,ATR.EPLEX.ARCHIVE         ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:43:00:07,,,,
 2020-01-27,16:43:00:07,ATR.EPLEX.RM.DATA         ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:43:00:07,ATR.EPLEX.RESTART         ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:43:00:07,,,,
 2020-01-27,16:43:00:07,CT54D4A1.DFHLOG           ,+1.3130000000000000E+04,+0.0000000000000000,0
 2020-01-27,16:43:00:07,CT54D6A2.DFHSHUNT         ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:43:00:07,CT54D4A1.DFHSHUNT         ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:43:00:07,CT54D6A1.DFHLOG           ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:43:00:07,CT54D6A1.DFHSHUNT         ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:43:00:07,CT54D6A2.DFHLOG           ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:43:00:07,CT54D0CM.DFHLOG           ,+0.0000000000000000,+0.0000000000000000,0
 2020-01-27,16:43:00:07,CT54D0CM.DFHSHUNT         ,+0.0000000000000000,+0.0000000000000000,0
...
```

抽出したフィールドについて、CSV化できてるっぽいです。


### ポリシーのカスタマイズ

上でカスタマイズした定義に沿ったDATA STREAMを定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b7e4acf6-fd5c-d468-6bbf-db3c7262f99a.png)

このDATA STREAMを取得するポリシーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6dfbdc55-c7de-3456-72a2-abd8133c6e43.png)

### Data Streamer(HBODSPRO)の設定変更

Data Streamer起動プロシージャーで参照するポリシーファイルの指定を、上で生成されたポリシーファイルに置き換えて起動します。

### Logstash構成ファイルのカスタマイズ

Linux側で稼働させるLogstashの構成ファイルも、追加したフィールドの分、カスタマイズします。
それぞれ以下のようにコピーして編集します。
H_SMF_088.lsh => H_SMF_088_CUST.lsh
N_SMF_088.lsh => N_SMF_088_CUST.lsh

```xxx:H_SMF_088_CUST.lsh
filter {
   if [sourceType] == "zOS-SMF_088_CUST" {

      csv{ columns => [  "SMF88DTE", "SMF88TME", "log_stream_name", "byt_wrt_by_user", "byt_offload_to_dasd", "num_offload" ]
         separator => "," }
   }
}
```

```xxx:N_SMF_088_CUST.lsh
filter {
   if [sourceType] == "zOS-SMF_088_CUST" {
      mutate{ add_field => {
         "[@metadata][timestamp]" => "%{SMF88DTE} %{SMF88TME}"
        }}

      date{ match => [
             "[@metadata][timestamp]", "yyyy-MM-dd HH:mm:ss:SS"
        ]}
   }
}
```

一旦、outputをElasticsearchではなくstdoutにして、Logstashのレベルでフォーマットできるか確認してみると...

```
...
{
               "timeZone" => "+0900",
        "log_stream_name" => "CT54D4A1.DFHLOG           ",
            "sysplexName" => "EPLEX",
          "inputsequence" => "20200129061846506:000000",
               "SMF88TME" => "16:43:00:07",
        "byt_wrt_by_user" => "+1.3130000000000000E+04",
             "systemName" => "ZOS1",
                   "port" => 55614,
    "byt_offload_to_dasd" => "+0.0000000000000000",
               "@version" => "1",
             "sourceType" => "zOS-SMF_088_CUST",
                   "host" => "EPLEX1",
               "SMF88DTE" => "2020-01-27",
                   "path" => "SMF/SMF_088_CUST",
             "@timestamp" => 2020-01-27T07:43:00.070Z,
             "sourceName" => "ZOS1-SMF_088_CUST",
            "num_offload" => "0",
                    "seq" => {
        "c" => "0",
        "w" => "1"
    },
                "message" => "2020-01-27,16:43:00:07,CT54D4A1.DFHLOG           ,+1.3130000000000000E+04,+0.0000000000000000,0"
}
...
```

OKそうです。Elasticsearchに取り込む前に、Elasticsearch側にMapping情報を定義しておきます。

### Elasticsearchのカスタマイズ
index templateを追加して、Mapping情報を定義します。

Elasticsearchにデータを取り込むと、cdp-zos-smf_088_cust-*という名前のindexに取り込まれるので、このindexに対するtemplateを作成して、Mapping情報を設定しておきます。

CDPz共通設定(既に定義してあれば不要)

```
PUT _template/cdp_common
{
  "index_patterns": ["cdp-*"],
  "order" : 0,
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas" : 0
  },
  "mappings": {
    "numeric_detection": true
  }
}
```

SMF Type88用の追加設定

```
PUT _template/cdp_smf088cust
{
  "index_patterns": ["cdp-*smf_088_cust*"],
  "order" : 1,
  "mappings": {
    "properties": {
      "log_stream_name": {
        "type": "keyword"
      },
      "byt_wrt_by_user": {
        "type": "float"
      },
      "byt_offload_to_dasd": {
        "type": "float"
      },
      "num_offload": {
        "type": "integer"
      }
    }
  }
}
```

上のindex templateを作成した後、Logstash経由でElasticsearchにデータを取り込みます。

### Kibana Discoverでの確認

Elasticsearchにデータを取り込むと、cdp-zos-smf_088_cust-*という名前のindexが作成されるので、index patternを作成してDixcoverで確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6b6c1fb7-7427-afd0-dcd3-65706682b7e8.png)

意図した通りに取り込めていることが確認できました。

# JOBLOG取得

SYSLOG取得と同じような手順で、Logforwarder経由でJOBLOGを取得することもできます。

## Policy

Policyの設定で、CICS User Messages YMD をData Streamとして指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/802b252f-c40a-3b30-b29d-33057694a689.png)

data streamの設定で、取得したいJOB名(ワイルドカード指定可)などを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c131b765-73a1-da6f-b9a6-5d0a5a3df774.png)

その他はSYSLOGと同様です。

Logstashに送られるメッセージを見てみます。例えば以下のようなメッセージがCICSのJOBLOGのMSGUSに出力されたものとします。

```xxx:MSGUSR
DFHPG0101 01/22/2020 09:59:34 CT54D4A1 TCP00040 CICSUSER CEDA Resource definition for TGSTA01 has been added.   
DFHRD0101 01/22/2020 09:59:34 CT54D4A1 TCP00040 CICSUSER CEDA INSTALL PROGRAM(TGSTA01)                          
0040     CEDA CICSUSER 01/22/20 09:59:34 INSTALL PROGRAM(TGSTA01) GROUP(TAGGRP)                                 
```

CDPz経由でLogstashに送られたデータは以下のような構造になっています。

```xxx:Logstash
{
         "@version" => "1",
             "port" => 59914,
             "host" => "EPLEX1",
          "message" => [
        [0] "DFHPG0101 01/22/2020 09:59:34 CT54D4A1 TCP00040 CICSUSER CEDA Resource definition for TGSTA01 has been added. \n",
        [1] "DFHRD0101 01/22/2020 09:59:34 CT54D4A1 TCP00040 CICSUSER CEDA INSTALL PROGRAM(TGSTA01)\n",
        [2] "0040     CEDA CICSUSER 01/22/20 09:59:34 INSTALL PROGRAM(TGSTA01) GROUP(TAGGRP)\n",
        [3] "\u0000 "
    ],
      "sysplexName" => "EPLEX",
       "sourceType" => "zOS-CICS-MSGUSRYMD",
       "systemName" => "ZOS1",
       "@timestamp" => 2020-01-22T00:59:34.801Z,
       "sourceName" => "ZOS1-JOB-CT54_CT54D4A1_MSGUSR",
             "path" => "JOB001/MSGUSR/YMD/CT54D4A1/MSGUSR",
    "inputsequence" => "20200122005941802:000000",
              "seq" => {
        "c" => "2",
        "w" => "0"
    },
         "timeZone" => "+0900"
}
```

messageの各配列はCSV化されている訳では無く、単なるひと塊の文字列としてハンドリングされることになります。SYSLOGと同様、必要であればメッセージIDハンドリングのためのカスタマイズを行うことになります。