CDPzを利用したz/OS-ELK連携 - (3)SMF-バッチ編

# はじめに
CDPzを使用してSMFデータをElasticsearchに送り込む方法としては、手動でバッチジョブを実行する方法と、Log Forwarderのように常駐のアドレススペースを起動しておいてリアルタイムに取得する方法があります。
ここでは、バッチでSMFデータをハンドリングする方法を試してみます。
扱うのはCICS関連のSMFデータです。

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


# 利用コンポーネント
今回扱うのは、以下の赤枠の範囲のイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/cbdca4ec-c495-2d12-50df-5c9832d0c5ac.png)

上の(4) System Data Engine部分を、バッチジョブとして手動実行します。

# 構成
## CDPz側構成
### SMFデータ取得用ポリシーの作成
ここでは、SMFに取得されたCICSのモニター、統計情報辺りの情報を取得することにします。

z/OSMF上のConfig Toolから、Create a new policy を選択し、名前を指定して、DATA STREAMをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/96fec0d8-2db8-1954-473c-3bbcdabc020c.png)

DATA STREAMを追加します。ここでは、CICS関連の主要な項目(モニター、統計情報)をチェックし、SELECT。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/dd9af4f1-7d7f-9d8f-493b-ae34315758df.png)

選択項目名と説明が分かりにくい(一部間違っている)ので、補足します。
恐らくこんな感じだと思われます。

|Name|Desctiption|
|----------|----------------------------------------------------------------------|
|SMF_110_0 |ジャーナリング? (SMF Type110 SubType0)  |
|SMF_110_1|<モニター情報> CICS TS V3.2 up (SMF Type110 SubType1 SMFMNRVM>=0650)|
|SMF_110_1_FIELD|<モニター情報> フィールドコネクター?|
|SMF_110_1_DICT|<モニター情報> ディクショナリーレコード|
|SMF_110_1_6|<モニター情報> IDクラスデータ|
|SMF_110_E|<モニター情報> 例外クラスデータ|
|SMF_110_1_5|<モニター情報> トランザクションリソースクラスデータ|
|SMF_110_2|<統計情報> CICS|
|SMF_110_3|<統計情報> TSデータ共用サーバー|
|SMF_110_4|<統計情報> CFDTサーバー|
|SMF_110_5|<統計情報> Named Counterサーバー|
|SMF_111|<統計情報> CTG|
|SMF_110_1_KPI|	<モニター情報> 主要な項目を独自に集計してくれているっぽい|

参考
モニター: https://www.ibm.com/support/knowledgecenter/ja/SSGMCP_5.4.0/monitoring/dfht3_monformats.html
統計: https://www.ibm.com/support/knowledgecenter/ja/SSGMCP_5.4.0/system-programming/cics/dfha37r.html

Subscriberボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/fbc65051-ae5c-cf9a-b9c6-94df18210a9c.png)

ADD SUBSCRIBERボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/eedf2a8f-5eab-b58b-edb4-f9fc6be0e2a5.png)

各種値を指定してOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4b46073c-5ac9-946d-153c-8895df2e14ff.png)

※Logstashの構成では、8081ポートをListenする構成にしていますので、ここではLogstashのホスト名、ポート番号を指定すべきです。しかし今回使用しているテスト環境の制約のため、ホスト=>Linuxへのコネクションが直接張れません。そこで、ポートフォワードの設定をして、ローカルの8081ポートをLinuxの8081へフォワードする設定を別途実施しています。そのため、ここではlocalhost:8081を宛先として指定しています。

UPDATE SUBSCRIPTIONSをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4de349fb-53a3-142f-99ff-01c58a1c9b4b.png)

my_elasticsearchが作成されるので、そのSubscriberボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/e62017fa-014e-4d13-c9e2-f04bf359ee34.png)

全てのStreamを選択し、UPDATE SUBSCRIPTIONをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/342823ce-28b4-106a-fd30-b0fef0742e7d.png)

以下のように、Data StreamとSubscriberが線で繋がれ、関連付けされました。次にSYSTEM DATA ENGINEをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ff8f1f43-651b-5014-5750-37436c289730.png)

インストール先のSHBODEFSデータセット名を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/84ec7a8f-b410-0f3b-d2ef-5cba5f3a137d.png)

最後にSAVEをクリックして作成したポリシーを保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/01163c1b-9394-3a49-b7c1-9ae32e9dad4c.png)

ポリシーが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2009e042-65a1-18bb-b674-6bb590f79bae.png)

結果、/u/CDP201/cdpConfig/以下に、上の設定に基づいて各種構成ファイルが生成されます。

```
[CICS004@EPLEX1:/u/CDP201/cdpConfig] ls -la | grep Test02
-rw-r-----   1 0        IZUADMIN    1032 Jan  8 11:00 Test02_CICS01.layout
-rw-r-----   1 0        IZUADMIN   19408 Jan  8 11:00 Test02_CICS01.policy
-rw-r-----   1 0        IZUADMIN 1035173 Jan  8 11:00 Test02_CICS01.sde
```

ここで生成されるTest02_CICS01.sdeは、USS上のファイルとして生成されていますが、中身は順次ファイルのようなのでそのままでは内容確認できません。なので、以下のようなJCLで無理やりTest02_CICS01.sde => CDP02.TEMP.TEST02.SDEというデータセットにコピーして中身確認してみました。

```
//IEBGENER JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//COPY1    EXEC PGM=IEBGENER
//SYSPRINT DD  SYSOUT=*
//SYSIN    DD  DUMMY
//SYSUT1   DD  PATH='/u/CDP201/cdpConfig/Test02_CICS01.sde',RECFM=V,
//         LRECL=255,BLKSIZE=259,PATHDISP=(KEEP),FILEDATA=RECORD
//SYSUT2   DD  DSN=CDPZ02.TEMP.TEST02.SDE,DISP=(NEW,CATLG,DELETE),
//             VOL=SER=ZSPK01,SPACE=(CYL,(10,1)),RECFM=V,LRECL=255
```

すると、この中身は、CDPZ02.V2R1M0.SHBODEFSに提供されているメンバーのうち、ConfigToolで選択したData Stream(今回の場合CICSのモニターや統計情報)に関連するメンバーを連結したものになっているようです。
このsdeファイルから、/* Name: xxx  */という行を抜粋すると、以下のようになっています。

```Test02_CICS01.sdeからの抜粋
/*  Name: HBOCCORY                                                    */
/* Name: HBOLLSMF                                                     */
/*  Name: HBORS110                                                    */
/*  Name: HBOR110T                                                    */
/*  Name: HBOR1102                                                    */
/*  Name: HBOR1103                                                    */
/*  Name: HBOTDSPE                                                    */
/*  Name: HBOTDWEK                                                    */
/*  Name: HBOTPERI                                                    */
/*  NAME: HBOTCIFI                                                    */
/*  Name: HBOUS110                                                    */
```

つまり、この順番でSHBODEFSメンバーの内容がコンカチされているようです。
ConfigToolでDataStreamとしてどの情報を取得するかというのを選択した際に(SMF_110_2など)、その選択した項目を取得するのに、どのSHBODEFSメンバーが必要になるかという情報は、恐らく/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_110_2",
			"description": "Subtype 2. CICS statistics",
			"tags": [
				"CSV",
				"Split"
			],
			"concatenation": [
				"CDP"
			],
			"hboin": {
				"all": [
					"HBOCCORY",
					"HBOLLSMF",
					"HBORS110",
					"HBOR110T",
					"HBOR1102",
					"HBOR1103",
					"HBOTDSPE",
					"HBOTDWEK",
					"HBOTPERI",
					"HBOTCIFI",
					"HBOUS110"
				]
			},
...
```

### JCL作成 (to dataset)
参考: [Creating the System Data Engine batch job for writing SMF data to data sets](https://www.ibm.com/support/knowledgecenter/ja/SSGE3R_2.1.0/sde_batch.html)

<font color="red">※このJCLを流すにあたっては、上で示したポリシーを作成する必要はありません。入力となるSMFデータセットがあれば単発で動作確認できます。</font>

SMFを取得するバッチですが、datasetに出力するためのサンプルJCLというのが提供されているので、まずはこれを動かしてみます(いきなりData Streamer => Logstash に送るのはハードル高いので、事前テストの意味で、単発で確認できるJCL作って動作を確認します)。

CDPZ02.V2R1M0.SHBOSAMP(HBOJBCOL)をコピーして編集します。上で選択したSMF Type(CICS関連)のデータを取得する場合、以下のようなJCLになります。

```xxx:HBOJBCOL
//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(HBORS110)
//         DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOR110T)
//         DD DISP=SHR,DSN=CDPZ02.V2R1M0.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.V2R1M0.SHBODEFS(HBOTCIFI)
//         DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOUS110)
//*
//* 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=*
//SMF11000 DD SYSOUT=*,RECFM=V,LRECL=32756
//SMF11001 DD SYSOUT=*,RECFM=V,LRECL=32756
//SMF110FC DD SYSOUT=*,RECFM=V,LRECL=32756
//SMF110DD DD SYSOUT=*,RECFM=V,LRECL=32756
//SMF11016 DD SYSOUT=*,RECFM=V,LRECL=32756
//SMF110EX DD SYSOUT=*,RECFM=V,LRECL=32756
//SMF110TX DD SYSOUT=*,RECFM=V,LRECL=32756
//SMF11015 DD SYSOUT=*,RECFM=V,LRECL=32756
//SMF11002 DD SYSOUT=*,RECFM=V,LRECL=32756
//SMF11003 DD SYSOUT=*,RECFM=V,LRECL=32756
//SMF11004 DD SYSOUT=*,RECFM=V,LRECL=32756
//SMF11005 DD SYSOUT=*,RECFM=V,LRECL=32756
```

#### カスタマイズ箇所についての補足:

##### HBOIN DD
HBOIN DDには、上のセクションで確認したように、sde.streams.jsonファイルから、必要なHBODEFSのメンバーを判断して指定します(取得したいSMF Typeに応じたメンバーを全てコンカチ)。
ここで指定するメンバーは順番を意識する必要があるので注意！最初に、HBOCCSV, HBOLLSMFを指定し、その後、HBORx, HBOTx, HBOUx の順に指定します。(CICS以外はちゃんと見てません。他のコンポーネントだと別途考慮しなければいけないことがあるかも...)

##### HBOLOG DD
ここでは、入力となるSMFデータセット(もしくは必要なSMFデータのみダンプしたデータセット)を指定します。

##### 結果出力用DD
出力用のDD名に何を指定すればいいのかも分かりにくいのですが、HBOIN DDに指定したメンバーの定義から判断する必要があります(SET IBM_FILE = 'xxx' で指定されている名前)。

SHBODEFSメンバーの構造としてはこんな感じになっています。

HBOCCSVを最初に指定することで、CSVフォーマットでファイル(Data StreamerではなくDD)に出力するものと判断されます。

```xxx:HBOCCSV
SET IBM_UPDATE_TARGET = 'FILE &IBM_FILE';
SET IBM_FILE_FORMAT = 'CSV';
```

HBOUxxxxというメンバーには、以下のように出力先を上書きする命令(DEFINE UPDATE)が含まれており、その直前に出力先DD名がIMB_FILE=で指定されています。

```xxx:HBOU110抜粋
-- HBOR1102 records                
                                   
SET IBM_FILE = 'SMF11002';         
                                   
DEFINE UPDATE SMF_110_2            
  VERSION 'CDP.110           '     
  FROM SMF_110_2                   
  TO &IBM_UPDATE_TARGET            
  &IBM_CORRELATION                 
  AS &IBM_FILE_FORMAT SET(ALL);    
```

つまり、上のJCLの出力用DD名には、このIBM_FILEに設定されている名前を指定すればよいことになります。
ちなみに、HBOU110から IBM_FILE= xxxの行を抜き出すとこんな感じです。

```xxx:HBOU110抜粋
SET IBM_FILE = 'SMF11000';
SET IBM_FILE = 'SMF11001';
SET IBM_FILE = 'SMF110FC';
SET IBM_FILE = 'SMF110DD';
SET IBM_FILE = 'SMF11016';
SET IBM_FILE = 'SMF110EX';
SET IBM_FILE = 'SMF110TX';
SET IBM_FILE = 'SMF11015';
SET IBM_FILE = 'SMF11002';
SET IBM_FILE = 'SMF11003';
SET IBM_FILE = 'SMF11004';
SET IBM_FILE = 'SMF11005';
```

これらをJCLの結果出力用DD名として指定しています。

#### JCL実行！

上のJCLをサブミットしてみます。

```xxx:JCL実行結果例
NP   DDNAME   StepName ProcStep DSID Owner    C Dest               Rec-Cnt Page-Cnt Byte-Cnt CC   Rmt  Node O-Grp-N  SecLabel PrMod
     JESMSGLG JES2                 2 CICS004  X LOCAL                   20             1,189  1           1 1                 LINE 
     JESJCL   JES2                 3 CICS004  X LOCAL                   79             5,184  1           1 1                 LINE 
     JESYSMSG JES2                 4 CICS004  X LOCAL                   85             4,176  1           1 1                 LINE 
     HBOOUT   HBOSMFCB           102 CICS004  X LOCAL                  367            26,630  1           1 1                 LINE 
     HBODUMP  HBOSMFCB           103 CICS004  X LOCAL                   38             2,899  1           1 1                 LINE 
     SMF11001 HBOSMFCB           106 CICS004  X LOCAL                   13             3,090  1           1 1                 LINE 
     SMF110FC HBOSMFCB           107 CICS004  X LOCAL                3,920           534,420  1           1 1                 LINE 
     SMF110DD HBOSMFCB           108 CICS004  X LOCAL                1,176           191,827  1           1 1                 LINE 
     SMF110TX HBOSMFCB           111 CICS004  X LOCAL                   77           684,483  1           1 1                 LINE 
     SMF11002 HBOSMFCB           113 CICS004  X LOCAL                  161            42,910  1           1 1                 LINE 
```

HBOOUT DDには、SMFを処理した内容が出力されます。各SMFレコードが何件あったか、というような情報も出力されているようです。

```xxx:HBOOUT抜粋
 2020-01-08 17:06:25 HBO0102I Log SMF was successfully defined.
 2020-01-08 17:06:25 HBO0125I SMF_110_1_C was successfully defined.
 2020-01-08 17:06:25 HBO0165I The record procedure HBO2COMP is defined.
 2020-01-08 17:06:25 HBO0125I SMF_110_1_CO was successfully defined.
 2020-01-08 17:06:25 HBO0572I A comment is present in the language statement.
 2020-01-08 17:06:25 HBO0125I SMF_110_E was successfully defined.
 2020-01-08 17:06:25 HBO0572I A comment is present in the language statement.
 2020-01-08 17:06:25 HBO0125I SMF_110_0 was successfully defined.
 2020-01-08 17:06:25 HBO0572I A comment is present in the language statement.
 2020-01-08 17:06:25 HBO0165I The record procedure HBOSD110 is defined.
 2020-01-08 17:06:25 HBO0165I The record procedure HBO2CCMF is defined.
...
 2020-01-08 17:06:26 HBO0300I System Data Engine Collect started.
 2020-01-08 17:06:26 HBO0302I Processing CDPZ01.SMFDUMP.D191016.T1 on ZSPK01
 2020-01-08 17:06:26 HBO0341I The first-record timestamp is 2019-10-16 14:26:40.630000
 2020-01-08 17:06:26 HBO0342I The last-record timestamp is 2019-10-16 18:00:50.340000
 2020-01-08 17:06:26 HBO0310I Buffer processing started after 176 records due to end of log.
 2020-01-08 17:06:26 HBO0003I
 2020-01-08 17:06:26 HBO0315I Records read from the log or built by log procedure:
 2020-01-08 17:06:26 HBO0317I Record name        |    Number
 2020-01-08 17:06:26 HBO0318I -------------------|----------
 2020-01-08 17:06:26 HBO0319I SMF_110_0          |         0
 2020-01-08 17:06:26 HBO0319I SMF_110_1_C        |        13
 2020-01-08 17:06:26 HBO0319I SMF_110_2          |       161
 2020-01-08 17:06:26 HBO0319I SMF_110_3          |         0
 2020-01-08 17:06:26 HBO0319I SMF_110_4          |         0
 2020-01-08 17:06:26 HBO0319I SMF_110_5          |         0
 2020-01-08 17:06:26 HBO0320I Unrecognized       |         2
 2020-01-08 17:06:26 HBO0318I -------------------|----------
 2020-01-08 17:06:26 HBO0321I Total              |       176
 2020-01-08 17:06:26 HBO0318I -------------------|----------
 2020-01-08 17:06:26 HBO0383I Unrecognized records are records that are in the data stream but are not defined in the
                              active policy.
 2020-01-08 17:06:26 HBO0003I
 2020-01-08 17:06:26 HBO0316I Records built by record procedures:
 2020-01-08 17:06:26 HBO0317I Record name        |    Number
 2020-01-08 17:06:26 HBO0318I -------------------|----------
 2020-01-08 17:06:26 HBO0319I SMF_CICS_T         |        77
 2020-01-08 17:06:26 HBO0319I SMF_110_E          |         0
 2020-01-08 17:06:26 HBO0319I SMF_110_1_CO       |        13
 2020-01-08 17:06:26 HBO0319I SMF_110_1_5        |         0
 2020-01-08 17:06:26 HBO0319I SMF_110_1_6        |         0
 2020-01-08 17:06:26 HBO0318I -------------------|----------
 2020-01-08 17:06:26 HBO0321I Total              |        90
 2020-01-08 17:06:26 HBO0003I
 2020-01-08 17:06:26 HBO0323I                                        -------Buffer------ --Stream-
 2020-01-08 17:06:26 HBO0324I Stream name                          |   Inserts   Updates    Writes
 2020-01-08 17:06:26 HBO0325I -------------------------------------|------------------------------
 2020-01-08 17:06:26 HBO0326I SMF110DD                             |      1176         0      1176
 2020-01-08 17:06:26 HBO0326I SMF110EX                             |         0         0         0
 2020-01-08 17:06:26 HBO0326I SMF110FC                             |      3920         0      3920
 2020-01-08 17:06:26 HBO0326I SMF110TX                             |        77         0        77
 2020-01-08 17:06:26 HBO0326I SMF11000                             |         0         0         0
 2020-01-08 17:06:26 HBO0326I SMF11001                             |        13         0        13
 2020-01-08 17:06:26 HBO0326I SMF11002                             |       161         0       161
 2020-01-08 17:06:26 HBO0326I SMF11003                             |         0         0         0
 2020-01-08 17:06:26 HBO0326I SMF11004                             |         0         0         0
 2020-01-08 17:06:26 HBO0326I SMF11005                             |         0         0         0
 2020-01-08 17:06:26 HBO0326I SMF11015                             |         0         0         0
 2020-01-08 17:06:26 HBO0326I SMF11016                             |         0         0         0
 2020-01-08 17:06:26 HBO0325I -------------------------------------|------------------------------
 2020-01-08 17:06:26 HBO0327I Total                                |      5347         0      5347
 2020-01-08 17:06:26 HBO0337I For 161 records or rows in an update of SMF11002 one or more values were set to null because
                              of errors.
 2020-01-08 17:06:26 HBO0301I System Data Engine Collect ended.
 2020-01-08 17:06:26 HBO0182I Product deregistration is successful.
```

HBODUMP DDにはエラーの情報が出力されています。データがnullになっていてフォーマットに失敗しているレコードがあったようです。

```xxx:HBODUMP抜粋
 Record 8 in the log, of type SMF_110_2,
 results in null in data field(s):
 Value for target field SMFSTINT was set to null due to error

 COUT Record 1C49A116  02160000 DE6E0054 E1400119 289FE9D6  *.....>... ....ZO*
                +0010  E2F1C3C9 C3E20002 00020000 0000002C  *S1CICS..........*
                +0020  00720001 0000009E 01780001 0710C3E3  *..............CT*
                +0030  F5F4C4F4 C1F1C3E3 F5F4C4F4 C1F10000  *54D4A1CT54D4A1..*
                +0040  00000000 00000010 C1D7E4E2 E2000000  *........APUSS...*
                +0050  F1F0F1F6 F2F0F1F9 F1F5F2F7 F0F60000  *10162019152706..*
                +0060  00000000 00000000 00000000 00000000  *................*
                +0070  F0F0F0F0 F0F0D6E0 6D66936B 7908C3E3  *000000O._.l,..CT*
                +0080  F5F4C4F4 C1F10119 288F0061 914A4040  *54D4A1...../j.  *
                +0090  40404040 4040E2D7 F74BF24B F3400178  *      SP7.2.3 ..*
                +00A0  00430100 0000C4C6 C8C3E2C4 40400000  *......DFHCSD  ..*
                +00B0  40000000 00000000 000C0000 000CC3C9  * .............CI*
                +00C0  C3E2E3E2 F5F44BC3 C9C3E24B C4C6C8C3  *CSTS54.CICS.DFHC*
                +00D0  E2C44040 40404040 40404040 40404040  *SD              *
                +00E0  40404040 40404040 40400000 00040000  *          ......*
                +00F0  00000000 000D0000 00000000 00000000  *................*
                +0100  00000000 00000000 00020000 00030000  *................*
                +0110  00000000 00000000 00000000 00000000  *................*
                +0120  00000000 00000000 00000000 00000000  *................*
                +0130  00000000 00000000 00000000 00000000  *................*
                +0140  00000000 00000000 00000000 00000000  *................*
                +0150  00000000 00000000 00000000 00000000  *................*
                +0160  00000000 00000000 00000100 000A0000  *................*
                +0170  00000000 00000000 0000D200 00000000  *..........K.....*
                +0180  00000000 00000000 00000000 00000000  *................*
                +0190  00000000 00000000 00000000 00000000  *................*
                +01A0  00000000 00000000 00000000 0000D6E1  *..............O.*
                +01B0  903BBBE1 EA8CD6E1 9048DF74 2B68D6E1  *......O.......O.*
                +01C0  1788AFA1 EA8CD6E1 1795D334 2B680000  *.h....O..nL.....*
                +01D0  00000000 00000000 00000000 00000000  *................*
                +01E0  00000000 00000000 0000E2E8 E2E3C5D4  *..........SYSTEM*
                +01F0  4040D6E0 6D672376 C608C3C9 C3E2E4E2  *  O._...F.CICSUS*
                +0200  C5D90007 0007D6E0 6D672376 C608C3C9  *ER....O._...F.CI*
                +0210  C3E2E4E2 C5D900BC                    *CSUSER..        *
```

各SMFxxx DDにCSV化された結果が出力されます。


```xxx:SMF11001抜粋
10350,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,10192,1,0710,CT54D4A1,CT54D4A1,0000,1,0,0,0,158,26,392,0,30899,+0.0000000000000000,+1.327104000000000
0E+14,96,CT54D4A1,2019-10-15,17:45:41:86,        ,SP7.2.3
 11334,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,11176,1,0710,CT54D4A1,CT54D4A1,0000,3,158,2,392,942,3464,3,0,30899,+0.0000000000000000,+1.32710400000
00000E+14,96,CT54D4A1,2019-10-15,17:45:41:86,        ,SP7.2.3
 10350,0,11011110,110,15:25:21:23,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,10192,1,0710,CT54D4A1,CT54D4A1,0000,1,0,0,0,158,26,392,0,30899,+0.0000000000000000,+1.327104000000000
0E+14,96,CT54D4A1,2019-10-15,17:45:41:86,        ,SP7.2.3
 32118,0,11011110,110,15:25:21:23,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,31960,1,0710,CT54D4A1,CT54D4A1,0000,3,158,2,392,942,3464,9,0,30899,+0.0000000000000000,+1.32710400000
00000E+14,96,CT54D4A1,2019-10-15,17:45:41:86,        ,SP7.2.3
 32118,0,11011110,110,15:26:05:06,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,31960,1,0710,CT54D4A1,CT54D4A1,0000,3,158,2,392,942,3464,9,0,30899,+0.0000000000000000,+1.32710400000
00000E+14,96,CT54D4A1,2019-10-15,17:45:41:86,        ,SP7.2.3
 14798,0,11011110,110,15:26:23:38,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,14640,1,0710,CT54D4A1,CT54D4A1,0000,3,158,2,392,942,3464,4,0,30899,+0.0000000000000000,+1.32710400000
00000E+14,96,CT54D4A1,2019-10-15,17:45:41:86,        ,SP7.2.3
 10350,0,11011110,110,15:28:18:01,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,10192,1,0710,CT54D4A1,CT54D4A1,0000,1,0,0,0,158,26,392,0,30899,+0.0000000000000000,+1.327104000000000
0E+14,96,CT54D4A1,2019-10-15,17:45:41:86,        ,SP7.2.3
 32118,0,11011110,110,15:28:18:01,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,31960,1,0710,CT54D4A1,CT54D4A1,0000,3,158,2,392,942,3464,9,0,30899,+0.0000000000000000,+1.32710400000
00000E+14,96,CT54D4A1,2019-10-15,17:45:41:86,        ,SP7.2.3
 32118,0,11011110,110,15:35:01:57,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,31960,1,0710,CT54D4A1,CT54D4A1,0000,3,158,2,392,942,3464,9,0,30899,+0.0000000000000000,+1.32710400000
00000E+14,96,CT54D4A1,2019-10-15,17:45:41:86,        ,SP7.2.3
 32118,0,11011110,110,15:35:04:46,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,31960,1,0710,CT54D4A1,CT54D4A1,0000,3,158,2,392,942,3464,9,0,30899,+0.0000000000000000,+1.32710400000
00000E+14,96,CT54D4A1,2019-10-15,17:45:41:86,        ,SP7.2.3
 32118,0,11011110,110,15:35:07:53,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,31960,1,0710,CT54D4A1,CT54D4A1,0000,3,158,2,392,942,3464,9,0,30899,+0.0000000000000000,+1.32710400000
00000E+14,96,CT54D4A1,2019-10-15,17:45:41:86,        ,SP7.2.3
 32118,0,11011110,110,15:35:10:44,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,31960,1,0710,CT54D4A1,CT54D4A1,0000,3,158,2,392,942,3464,9,0,30899,+0.0000000000000000,+1.32710400000
00000E+14,96,CT54D4A1,2019-10-15,17:45:41:86,        ,SP7.2.3
 25190,0,11011110,110,15:36:23:41,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,25032,1,0710,CT54D4A1,CT54D4A1,0000,3,158,2,392,942,3464,7,0,30899,+0.0000000000000000,+1.32710400000
00000E+14,96,CT54D4A1,2019-10-15,17:45:41:86,        ,SP7.2.3
```

```xxx:SMF110FC抜粋
 11334,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,11176,1,0710,CT54D4A1,CT54D4A1,0000,3,158,2,392,942,3464,3,1
 11334,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,11176,1,0710,CT54D4A1,CT54D4A1,0000,3,158,2,392,942,3464,3,2
 11334,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,11176,1,0710,CT54D4A1,CT54D4A1,0000,3,158,2,392,942,3464,3,3
 11334,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,11176,1,0710,CT54D4A1,CT54D4A1,0000,3,158,2,392,942,3464,3,4
 11334,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,11176,1,0710,CT54D4A1,CT54D4A1,0000,3,158,2,392,942,3464,3,5
 11334,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,11176,1,0710,CT54D4A1,CT54D4A1,0000,3,158,2,392,942,3464,3,6
 11334,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,11176,1,0710,CT54D4A1,CT54D4A1,0000,3,158,2,392,942,3464,3,7
 11334,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,11176,1,0710,CT54D4A1,CT54D4A1,0000,3,158,2,392,942,3464,3,8
 11334,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,11176,1,0710,CT54D4A1,CT54D4A1,0000,3,158,2,392,942,3464,3,9
 11334,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,11176,1,0710,CT54D4A1,CT54D4A1,0000,3,158,2,392,942,3464,3,10
```

```xxx:SMF110DD抜粋
 10350,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,10192,1,0710,CT54D4A1,CT54D4A1,0000,1,0,0,0,158,26,392,DFHTASK ,C,001,4,1,0,TRAN
 10350,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,10192,1,0710,CT54D4A1,CT54D4A1,0000,1,0,0,0,158,26,392,DFHTERM ,C,002,4,2,4,TERM
 10350,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,10192,1,0710,CT54D4A1,CT54D4A1,0000,1,0,0,0,158,26,392,DFHCICS ,C,089,8,3,8,USERID
 10350,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,10192,1,0710,CT54D4A1,CT54D4A1,0000,1,0,0,0,158,26,392,DFHTASK ,C,004,4,4,16,TTYPE
 10350,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,10192,1,0710,CT54D4A1,CT54D4A1,0000,1,0,0,0,158,26,392,DFHCICS ,T,005,8,5,20,START
 10350,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,10192,1,0710,CT54D4A1,CT54D4A1,0000,1,0,0,0,158,26,392,DFHCICS ,T,006,8,6,28,STOP
 10350,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,10192,1,0710,CT54D4A1,CT54D4A1,0000,1,0,0,0,158,26,392,DFHTASK ,P,031,4,7,36,TRANNUM
 10350,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,10192,1,0710,CT54D4A1,CT54D4A1,0000,1,0,0,0,158,26,392,DFHTASK ,A,109,4,8,40,TRANPRI
 10350,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,10192,1,0710,CT54D4A1,CT54D4A1,0000,1,0,0,0,158,26,392,DFHTASK ,C,166,8,9,44,TCLSNAME
 10350,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,10192,1,0710,CT54D4A1,CT54D4A1,0000,1,0,0,0,158,26,392,DFHTERM ,C,111,8,10,52,LUNAME
 10350,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,10192,1,0710,CT54D4A1,CT54D4A1,0000,1,0,0,0,158,26,392,DFHPROG ,C,071,8,11,60,PGMNAME
 10350,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,10192,1,0710,CT54D4A1,CT54D4A1,0000,1,0,0,0,158,26,392,DFHTASK ,C,097,20,12,68,NETUOWPX
 10350,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,10192,1,0710,CT54D4A1,CT54D4A1,0000,1,0,0,0,158,26,392,DFHTASK ,C,098,8,13,88,NETUOWSX
 10350,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,10192,1,0710,CT54D4A1,CT54D4A1,0000,1,0,0,0,158,26,392,DFHCICS ,C,130,4,14,96,RSYSID
 10350,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,10192,1,0710,CT54D4A1,CT54D4A1,0000,1,0,0,0,158,26,392,DFHCICS ,A,131,4,15,100,PERRECNT
 10350,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,10192,1,0710,CT54D4A1,CT54D4A1,0000,1,0,0,0,158,26,392,DFHTASK ,T,132,8,16,104,RMUOWID
 10350,0,11011110,110,14:26:40:63,2019-10-16,ZOS1,CICS,1,2,44,114,1,158,10192,1,0710,CT54D4A1,CT54D4A1,0000,1,0,0,0,158,26,392,DFHCICS ,C,167,8,17,112,SRVCLSNM
```


```xxx:SMF1102抜粋
 534,0,11011110,110,15:27:06:88,2019-10-16,ZOS1,CICS,2,2,44,114,1,158,376,1,0710,CT54D4A1,CT54D4A1,0000,16,AP,USS,,2020-10-16,19:15:27,2019-10-16,15:27:06,,0,0000000000000000,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,        ,SP7.2.3 
 188,0,11011110,110,15:27:06:88,2019-10-16,ZOS1,CICS,2,2,44,114,1,158,30,1,0710,CT54D4A1,CT54D4A1,0000,16,AP,USS,,2020-10-16,19:15:27,2019-10-16,15:27:06,,0,0000000000000000,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,        ,SP7.2.3 
 1178,0,11011110,110,15:27:06:88,2019-10-16,ZOS1,CICS,2,2,44,114,1,158,1020,1,0710,CT54D4A1,CT54D4A1,0000,16,AP,USS,,2020-10-16,19:15:27,2019-10-16,15:27:06,,0,0000000000000000,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,        ,SP7.2.3 
 534,0,11011110,110,15:27:09:08,2019-10-16,ZOS1,CICS,2,2,44,114,1,158,376,1,0710,CT54D4A1,CT54D4A1,0000,16,AP,USS,,2020-10-16,19:15:27,2019-10-16,15:27:09,,0,0000000000000000,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,        ,SP7.2.3 
 188,0,11011110,110,15:27:09:08,2019-10-16,ZOS1,CICS,2,2,44,114,1,158,30,1,0710,CT54D4A1,CT54D4A1,0000,16,AP,USS,,2020-10-16,19:15:27,2019-10-16,15:27:09,,0,0000000000000000,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,        ,SP7.2.3 
 1178,0,11011110,110,15:27:09:08,2019-10-16,ZOS1,CICS,2,2,44,114,1,158,1020,1,0710,CT54D4A1,CT54D4A1,0000,16,AP,USS,,2020-10-16,19:15:27,2019-10-16,15:27:09,,0,0000000000000000,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,        ,SP7.2.3 
```

こんな感じでCSVで出力できればとりあえずOKです。

### JCL作成 (to Data Streamer)
参考: [Creating the System Data Engine batch job for sending SMF data to the Data Streamer](https://www.ibm.com/support/knowledgecenter/en/SSGE3R_2.1.0/sde_batch_to_ds.html)

先に作成したポリシーの定義に従ってSMFデータを処理し、Data Streamerにデータを流し込むJCLを作成します。

<font color="gray">※補足
CDPZ02.V2R1M0.SHBOCNTL(HBOJBCO2)をコピーして編集...と思ったら、SHBOCNTLというデータセットがない。ちなみに、CDPz V1.1では、CDPZ01.V1R1M0.SHBOCNTL(HBOJBCOL)というのが提供されているが、どうやらV2.1ではSHBOCNTLをSHBOSAMPに統合したものと思われる。PTFを適用したら、SHBOSAMPにHBOJBCO2が追加された。
HBOJBCO2はUJ01485というPTFに含まれている。
参考: https://www-01.ibm.com/support/docview.wss?uid=isg1OA58659
</font>

CDPZ02.V2R1M0.SHBOSAMP(HBOJBCO2)をコピーして編集します。上で選択したSMF Type(CICS関連)のデータを取得する場合、以下のようなJCLになります。

```xxx:HBOJBCO2
//HBOJBCO2 JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//*
//HBOTCAFF EXEC PGM=BPXTCAFF,PARM=
//*
//*
//HBOSMFCL EXEC PGM=HBOPDE,REGION=0M,
//         PARM='SHOWINPUT=NO,ZIIPOFFLOAD=NO'
//STEPLIB  DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBOLOAD
//*
//* CONTROL STATEMENTS
//* The control statement file must be customized to match
//* the target of the Common Data Provider configuration utility.
//*
//HBOIN    DD *
SET IBM_UPDATE_TARGET = 'PORT 50401';
SET IBM_FILE_FORMAT = 'CSV';
//         DD  PATH='/u/CDP201/cdpConfig/Test02_CICS01.sde',
//         PATHDISP=(KEEP),RECFM=V,LRECL=255,FILEDATA=RECORD
//*
//* Sample COLLECT statement for SMF 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=*
```

※ここではまだ実行はしません！

#### カスタマイズ箇所についての補足:

##### HBOIN DD
SET IBM_UPDATE_TARGET には、Data StreamerがListenするポート番号を指定します。
PATH='xxx.sde' には、ポリシー作成時に生成されたsdeファイルを指定します。

##### HBOLOG DD
ここでは、入力となるSMFデータセット(もしくは必要なSMFデータのみダンプしたデータセット)を指定します。

### Data Streamer構成
Data Streamerのプロシージャー SYS0.PROCLIB(HBODSPRO)を編集して、ポリシー作成時に生成されたTest02_CICS01.policyのパスを指定します。必要に応じてData StreamerがListenするポート番号も変更します。

```xxx:HBODSPRO
//HBODSPRO  PROC
//*
//ZLOGOUT EXEC PGM=BPXBATSL,REGION=0M,TIME=NOLIMIT
//*
//* Output and error data sets
//*
//STDOUT  DD   SYSOUT=*
//STDERR  DD   SYSOUT=*
//*
//* Parameter data
//*
//STDPARM  DD *
PGM /bin/sh
/usr/lpp/IBM/zcdp/v2r1m0/DS/LIB/startup.sh
/u/CDP201/cdpConfig/Test02_CICS01.policy
50401 start=w trace=n
//*
//* Environment data
//*
//STDENV DD *
JAVA_HOME=/usr/lpp/java/J8.0_64
CDP_HOME=/usr/lpp/IBM/zcdp/v2r1m0/cdp_work
TZ=JST-9
#DEFAULT_HEAP=4g
#MAXIMUM_HEAP=4g
#RESOLVER_CONFIG=//'USER.TCPIP(TCPDATA)'
#_BPXK_SETIBMOPT_TRANSPORT=TCPIPOE
//*
//      PEND
```

## ELK側構成

### Logstash

/etc/logstash/pipelines.ymlを以下のように編集

```yml:/etc/logstash/pipelines.yml
- pipeline.id: main
  path.config: "/etc/logstash/conf.d_cics01"
```

/etc/logstash/conf.d_cics01ディレクトリを作成し、CDPzで提供されているファイルのうち、共通のものとCICS用(SMF_110)のフィルターのファイルをこのディレクトリにコピーします。

```
[root@test08 /etc/logstash/conf.d_cics01]# ls -la
合計 136
drwxr-xr-x. 2 root root  4096  1月 15 14:27 .
drwxr-xr-x. 7 root root  4096  1月 15 14:35 ..
-rwxr--r--. 1 root root   358  1月 15 10:21 B_CDPz_Input.lsh
-rwxr--r--. 1 root root   469  1月 15 10:21 E_CDPz_Index.lsh
-rw-r--r--. 1 root root   727  1月 15 14:27 H_SMF_110_0.lsh
-rw-r--r--. 1 root root   842  1月 15 14:27 H_SMF_110_1.lsh
-rw-r--r--. 1 root root   846  1月 15 14:27 H_SMF_110_1_5.lsh
-rw-r--r--. 1 root root   846  1月 15 14:27 H_SMF_110_1_6.lsh
-rw-r--r--. 1 root root   816  1月 15 14:27 H_SMF_110_1_DICT.lsh
-rw-r--r--. 1 root root   747  1月 15 14:27 H_SMF_110_1_FIELD.lsh
-rw-r--r--. 1 root root   831  1月 15 14:27 H_SMF_110_1_KPI.lsh
-rw-r--r--. 1 root root   855  1月 15 14:27 H_SMF_110_2.lsh
-rw-r--r--. 1 root root   855  1月 15 14:27 H_SMF_110_3.lsh
-rw-r--r--. 1 root root   831  1月 15 14:27 H_SMF_110_4.lsh
-rw-r--r--. 1 root root   831  1月 15 14:27 H_SMF_110_5.lsh
-rw-r--r--. 1 root root  1212  1月 15 14:27 H_SMF_110_E.lsh
-rw-r--r--. 1 root root 16014  1月 15 14:27 H_SMF_110_T.lsh
-rw-r--r--. 1 root root   532  1月 15 14:27 N_SMF_110_0.lsh
-rw-r--r--. 1 root root   536  1月 15 14:27 N_SMF_110_1.lsh
-rw-r--r--. 1 root root   540  1月 15 14:27 N_SMF_110_1_5.lsh
-rw-r--r--. 1 root root   540  1月 15 14:27 N_SMF_110_1_6.lsh
-rw-r--r--. 1 root root   546  1月 15 14:27 N_SMF_110_1_DICT.lsh
-rw-r--r--. 1 root root   548  1月 15 14:27 N_SMF_110_1_FIELD.lsh
-rw-r--r--. 1 root root   536  1月 15 14:27 N_SMF_110_1_KPI.lsh
-rw-r--r--. 1 root root   536  1月 15 14:27 N_SMF_110_2.lsh
-rw-r--r--. 1 root root   536  1月 15 14:27 N_SMF_110_3.lsh
-rw-r--r--. 1 root root   536  1月 15 14:27 N_SMF_110_4.lsh
-rw-r--r--. 1 root root   536  1月 15 14:27 N_SMF_110_5.lsh
-rw-r--r--. 1 root root   536  1月 15 14:27 N_SMF_110_E.lsh
-rw-r--r--. 1 root root   536  1月 15 14:27 N_SMF_110_T.lsh
-rwxr--r--. 1 root root   429  1月 15 14:27 Q_CDPz_Elastic.lsh
```

# 実行

## ELK側

### Logstash起動
※Elasticsearch, Kibanaは事前に稼働中の想定

とりあえずテストなので手動でlogstashコマンド打って起動させます。

```
[root@test08 /etc/logstash]# /usr/share/logstash/bin/logstash --path.settings /etc/logstash
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.headius.backport9.modules.Modules (file:/usr/share/logstash/logstash-core/lib/jars/jruby-complete-9.2.7.0.jar) to field java.io.FileDescriptor.fd
WARNING: Please consider reporting this to the maintainers of com.headius.backport9.modules.Modules
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Thread.exclusive is deprecated, use Thread::Mutex
Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties
[2020-01-15T14:35:39,377][INFO ][logstash.runner          ] Starting Logstash {"logstash.version"=>"7.2.0"}
[2020-01-15T14:35:46,919][INFO ][logstash.outputs.elasticsearch] Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://localhost:9200/]}}
[2020-01-15T14:35:47,116][WARN ][logstash.outputs.elasticsearch] Restored connection to ES instance {:url=>"http://localhost:9200/"}
[2020-01-15T14:35:47,167][INFO ][logstash.outputs.elasticsearch] ES Output version determined {:es_version=>7}
[2020-01-15T14:35:47,170][WARN ][logstash.outputs.elasticsearch] Detected a 6.x and above cluster: the `type` event field won't be used to determine the document _type {:es_version=>7}
[2020-01-15T14:35:47,190][INFO ][logstash.outputs.elasticsearch] New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["//localhost"]}
[2020-01-15T14:35:47,264][INFO ][logstash.outputs.elasticsearch] Using default mapping template
[2020-01-15T14:35:47,319][WARN ][org.logstash.instrument.metrics.gauge.LazyDelegatingGauge] A gauge metric of an unknown type (org.jruby.specialized.RubyArrayOneObject) has been create for key: cluster_uuids. This may result in invalid serialization.  It is recommended to log an issue to the responsible developer/development team.
[2020-01-15T14:35:47,322][INFO ][logstash.javapipeline    ] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>6, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50, "pipeline.max_inflight"=>750, :thread=>"#<Thread:0x460ce848 run>"}
[2020-01-15T14:35:47,384][INFO ][logstash.outputs.elasticsearch] Attempting to install template {:manage_template=>{"index_patterns"=>"logstash-*", "version"=>60001, "settings"=>{"index.refresh_interval"=>"5s", "number_of_shards"=>1}, "mappings"=>{"dynamic_templates"=>[{"message_field"=>{"path_match"=>"message", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false}}}, {"string_fields"=>{"match"=>"*", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false, "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}}}}], "properties"=>{"@timestamp"=>{"type"=>"date"}, "@version"=>{"type"=>"keyword"}, "geoip"=>{"dynamic"=>true, "properties"=>{"ip"=>{"type"=>"ip"}, "location"=>{"type"=>"geo_point"}, "latitude"=>{"type"=>"half_float"}, "longitude"=>{"type"=>"half_float"}}}}}}}
[2020-01-15T14:35:47,636][INFO ][logstash.javapipeline    ] Pipeline started {"pipeline.id"=>"main"}
[2020-01-15T14:35:47,787][INFO ][logstash.inputs.tcp      ] Starting tcp input listener {:address=>"0.0.0.0:8081", :ssl_enable=>"false"}
[2020-01-15T14:35:47,875][INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2020-01-15T14:35:48,098][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}
```

8081ポートがListenされているか確認。

```
[root@test08 /etc/logstash]# netstat -an | grep 8081
tcp6       0      0 :::8081                 :::*                    LISTEN
```


### ポートフォワード設定
※ちょっと特殊な環境なので、Linuxからz/OS USSにssh接続してポートフォワードの設定をします。

```
[root@test08 /etc/logstash]# ssh -f -N -R 8081:localhost:8081 CICS004@eplex1
```

z/OS USSに接続して、8081ポートがListenされているか確認。

```
[CICS004@EPLEX1:/] netstat -a | grep 8081
SSHD7    00787559 127.0.0.1..8081        0.0.0.0..0             Listen
```

## CDPz側

### Data Streamer起動

参考: [Running the Data Streamer](https://www.ibm.com/support/knowledgecenter/ja/SSGE3R_2.1.0/ds_start.html)
Data Stremerを起動します

```                                                            
S HBODSPRO                                                              
$HASP100 HBODSPRO ON STCINRDR                                           
IEF695I START HBODSPRO WITH JOBNAME HBODSPRO IS ASSIGNED TO USER CDP201 
 , GROUP SYS1                                                           
$HASP373 HBODSPRO STARTED                                               
IEF403I HBODSPRO - STARTED - TIME=12.49.39                              
HBO6000I Data Streamer - Version: V2R1M0, Build ID: 1,021, APAR: OA58659
                                                                        
HBO6119I Default Heap:4G Maximum Heap:4G                                
HBO6001I The Data Streamer started successfully in Warm start mode.        

F HBODSPRO,APPL=DISPLAY,POLICY                                          
HBO6076I The current policy is /u/CDP201/cdpConfig/Test02_CICS01.policy.
```

### JCL実行
上で作成したJCL(to Data Streamer)をSubmit!

JOBLOGのHBOOUT DDからの抜粋。

```xxx:HBOOUT抜粋
 2020-01-15 14:37:07 HBO0181I Product registration is successful.
 2020-01-15 14:37:07 HBO0096I    Z Common Data Provider 2.1.0
 2020-01-15 14:37:07 HBO0097I          Build Number: 20191111-1408m
 2020-01-15 14:37:07 HBO0098I          APAR Name: OA58659
 2020-01-15 14:37:07 HBO0102I Log SMF was successfully defined.
 2020-01-15 14:37:07 HBO0125I SMF_110_1_C was successfully defined.
 2020-01-15 14:37:07 HBO0165I The record procedure HBO2COMP is defined.
 2020-01-15 14:37:07 HBO0125I SMF_110_1_CO was successfully defined.
 2020-01-15 14:37:07 HBO0572I A comment is present in the language statement.
 2020-01-15 14:37:07 HBO0125I SMF_110_E was successfully defined.
 2020-01-15 14:37:07 HBO0572I A comment is present in the language statement.
 2020-01-15 14:37:07 HBO0125I SMF_110_0 was successfully defined.
 2020-01-15 14:37:07 HBO0572I A comment is present in the language statement.
 2020-01-15 14:37:07 HBO0165I The record procedure HBOSD110 is defined.
 2020-01-15 14:37:07 HBO0165I The record procedure HBO2CCMF is defined.
 2020-01-15 14:37:08 HBO0125I SMF_CICS_T was successfully defined.
...
 2020-01-15 14:37:08 HBO0201I Update SMF_110_2 was successfully defined.
 2020-01-15 14:37:08 HBO0300I System Data Engine Collect started.
 2020-01-15 14:37:08 HBO0302I Processing CDPZ01.SMFDUMP.D191016.T1 on ZSPK01
 2020-01-15 14:37:08 HBO0341I The first-record timestamp is 2019-10-16 14:26:40.630000
 2020-01-15 14:37:08 HBO0342I The last-record timestamp is 2019-10-16 18:00:50.340000
 2020-01-15 14:37:08 HBO0310I Buffer processing started after 176 records due to end of log.
 2020-01-15 14:37:08 HBO5200I Using port 50401 on host 9.188.216.204 (EPLEX1)
 2020-01-15 14:37:08 HBO5201I Connected to the Data Streamer on host 9.188.216.204 (EPLEX1) service 50401
 2020-01-15 14:37:08 HBO0003I
 2020-01-15 14:37:08 HBO0315I Records read from the log or built by log procedure:
 2020-01-15 14:37:08 HBO0317I Record name        |    Number
 2020-01-15 14:37:08 HBO0318I -------------------|----------
 2020-01-15 14:37:08 HBO0319I SMF_110_1_C        |        13
 2020-01-15 14:37:08 HBO0319I SMF_110_2          |       161
 2020-01-15 14:37:08 HBO0320I Unrecognized       |         2
 2020-01-15 14:37:08 HBO0318I -------------------|----------
 2020-01-15 14:37:08 HBO0321I Total              |       176
 2020-01-15 14:37:08 HBO0318I -------------------|----------
 2020-01-15 14:37:08 HBO0383I Unrecognized records are records that are in the data stream but are not defined in the
                              active policy.
 2020-01-15 14:37:08 HBO0003I
 2020-01-15 14:37:08 HBO0316I Records built by record procedures:
 2020-01-15 14:37:08 HBO0317I Record name        |    Number
 2020-01-15 14:37:08 HBO0318I -------------------|----------
 2020-01-15 14:37:08 HBO0319I SMF_110_1_CO       |        13
 2020-01-15 14:37:08 HBO0318I -------------------|----------
 2020-01-15 14:37:08 HBO0321I Total              |        13
 2020-01-15 14:37:08 HBO0003I
 2020-01-15 14:37:08 HBO0323I                                        -------Buffer------ --Stream-
 2020-01-15 14:37:08 HBO0324I Stream name                          |   Inserts   Updates    Writes
 2020-01-15 14:37:08 HBO0325I -------------------------------------|------------------------------
 2020-01-15 14:37:08 HBO0326I SMF_110_1                            |        13         0        13
 2020-01-15 14:37:08 HBO0326I SMF_110_1_DICT                       |      1176         0      1176
 2020-01-15 14:37:08 HBO0326I SMF_110_1_FIELD                      |      3920         0      3920
 2020-01-15 14:37:08 HBO0326I SMF_110_2                            |       161         0       161
 2020-01-15 14:37:08 HBO0325I -------------------------------------|------------------------------
 2020-01-15 14:37:08 HBO0327I Total                                |      5270         0      5270
 2020-01-15 14:37:08 HBO0337I For 161 records or rows in an update of SMF_110_2 one or more values were set to null
                              because of errors.
 2020-01-15 14:37:08 HBO0003I
 2020-01-15 14:37:08 HBO0394I -------------- TCP/IP Statistics ---------------
 2020-01-15 14:37:08 HBO0395I -------------------------------------|----------
 2020-01-15 14:37:08 HBO0396I Total Data Transmitted (Kilo-Bytes)  |      1014
 2020-01-15 14:37:08 HBO0397I Total Write Time (Milliseconds)      |        16
 2020-01-15 14:37:08 HBO0398I Maximum Payload Size (Bytes)         |    732073
 2020-01-15 14:37:08 HBO0395I -------------------------------------|----------
 2020-01-15 14:37:08 HBO0301I System Data Engine Collect ended.
 2020-01-15 14:37:08 HBO0182I Product deregistration is successful.
```

これにより、指定したSMFダンプデータセットからデータを抽出して、Data Streamer => LogStash => Elasticsearchという流れで格納されていきます。

# 確認

Kibanaの画面から、Elasticsearchに取り込まれたCICS関連SMFデータを確認してみます。

## Elasticsearch Index確認

Kibanaの左側メニューの一番下のManagementを選択 - ElasticsearchのIndex Managementを選択します。
ここで、検索窓にcdp-zos-smfというキーワードを入れてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/cbe86f86-a28e-bbf2-f52d-bfbe9812e84e.png)

そうすると、上のようなIndexが作成されていることが確認できます。
(データがElasticsearchに取り込まれて、この名前でIndexが作成されたことが分かります。)

## Intex Pattern作成

次に、KibanaのIndex Patternsを選択し、Create Index Patternsボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/09314cfd-38d4-0331-f898-0cc73c2a13d1.png)

Index Patternとして、"cdp-zos-smf_110_1-*"を指定し、Next stepボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2aa4adea-7c70-1736-f373-cd834db94dfd.png)

Time filter field nameに、"@timestamp"を指定し、Create index patternボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9dc94479-7099-2e03-5585-698dedaa0276.png)

Index Patternが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/534a7e71-8e79-1471-862d-16dc96ece3ef.png)

他のIndexについても同様に実施。


## Discover画面での確認

左側メニューの一番上のDiscoverを選択し、適宜画面をカスタマイズし、取得したSMFデータが表示されることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ac0fe361-06a1-9388-81be-8eafa274c3c8.png)

これで、一通り、SMFをElasticsearchに取り込んでKibanaで参照する、という所まで確認できました。


# 補足: Embulk
当記事で想定しているシナリオは、SMFの情報をリアルタイムに取得するのではなく、過去に取得されたSMFデータをSMFデータセット(or SMFをダンプしたデータセット)を入力として、ある範囲のデータをまとめてバッチでElasticsearchに投入しようとするものです。
ここで選択するSMFデータの種類や対象データによっては非常に膨大なデータがドカンと一気に送付されることになります。例えば、CICSのモニター情報やDb2の会計情報についてはトランザクション単位の情報となるため、処理がピークの時間帯でのSMFデータは肥大しがちです。
Logstashやfluentd等のデータ転送の仕組みはどちらかというとストリーミング処理を想定したものなので、このような大量データ転送には向かない場合があります。

一方で大量データをデータソースに投入する目的で提供されている[Embulk](https://www.embulk.org/docs/)というOSSがあります。
当記事中で確認目的で使っていますが、CDPzではLogstashに向けてTCPで転送するだけではなく、CSVファイルに出力させることもできます。
バッチ的に大量データを取り込む場合、以下のような経路で取り込むことも検討した方がよいと思います。
SMF => CDPz => CSVファイル === ftp転送 ===> Embulk => Elasticsearch
参考: [Embulkを使用してCSVファイルをElasticsearchに取り込む](https://qiita.com/tomotagwork/items/61e5cc9eada98ec9e9e0)