CDPzを利用したz/OS-ELK連携: セットアップ(CDPz V1.1)

#はじめに
※追記: 新しいバージョン(CDPz V2.1)をベースにした記事を書き直しました => [CDPzを利用したz/OS-ELK連携 - (1)セットアップ編 (CDPz V2.1)](https://qiita.com/tomotagwork/items/f4fbb6d3e8b6ad084b34)


以前、z/OSのシステム管理系の情報をOSSであるELKスタックに取り込んで管理できるといいんじゃないかということで、スクリプト作ってSYSLOGを取り込んだりしてみました。
この辺↓
- [z/OSの新しい管理方法を探る - (1)DAパネル情報のElasticsearchへの取り込み](https://qiita.com/tomotagwork/items/362b0db5d4479eecebac)
- [z/OSの新しい管理方法を探る - (2)SYSLOGのElasticsearchへの取り込み](https://qiita.com/tomotagwork/items/867dd353cf8c985eab76)
- [z/OSの新しい管理方法を探る - (3)CICSヒストリカルデータのElasticsearchへの取り込み](https://qiita.com/tomotagwork/items/c7cd4b9e5ffcb8ede0f1)

これは、なるべく追加の製品機能を使わずにz/OS上のログ系の情報をElasticsearchに情報を取り込んでみるという試みでした。

実は、z/OS上の管理情報を分析系のプラットフォームに流し込むのをサポートしてくれる、CDPz(Common Data Provider for System z)という有償製品があります。今回は、上の記事の発展形ということで、このCDPzなるものを使ってどういったことができるのかを試そうと思い、とりあえずCDPzをセットアップしたのでログを残しておきます。

# やりたいこと
z/OSのSYSLOGや、SMFの情報をElasticsearchに取り込んで、Kibanaで楽に可視化したい！
CDPzは、SYSLOGやJOBLOG, SMFのデータなどを、データ分析基盤(SplunkやELK)に連携する機能が提供されているらしいのです！
ミドルウェアのパフォーマンステスト結果なんかを分析/レポーティングするのが楽になったらうれしいな。

# 全体像

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b76e4a32-360e-c9b1-01fc-a116020bcee9.png)
(箱の下の数字は各コンポーネントがListenするポート番号)

#CDPzの導入
参考: [Installing Common Data Provider for z Systems](https://www.ibm.com/support/knowledgecenter/ja/SSGE3R_1.1.0/cdp_install.html)

CDPzは、上の全体像に図示した通り、主に4つのコンポーネントから成ります。
(1) Configuration Tool: 構成ツール
(2) Data Streamer: 収集したデータを別の分析基盤に送る
(3) Log Forwder: データ収集機能の1つ。主にSyslogやJobLogなどのデータを収集。
(4) System Data Engine: データ収集機能の1つ。SMSのデータを収集。

これらのコンポーネントは、以下のようなくくりでプログラムディレクトリに記載されており、それぞれFMIDが付与されています。(ちょっと分かりにくい...)

- Common Data Handler
    - Configuration Tool / Data Streamer => FMID: HHBO110
    - Log Forwarder => FMID: HGLA310
- System Data Engine => FMID: HHBO11E,HHBO11D

それぞれプログラム・ディレクトリの記述に従い、SMP/Eで導入作業を行います。
導入作業はSMP/Eで、基本的に他のプロダクトと大きな差異は無いと思います。この辺は環境依存のところが多いので、ここでは具体的な手順は割愛します。

>※どうでもいいけど、この導入手順も一向に簡素化されませんね。とりあえず動かしたいだけなのにどうして「次へ」「次へ」でインストールできるようにならないのだろうか？製品1つインストールするのに、サンプルはあるにせよ結局10個以上ものJCLをカスタマイズ/実行しなければならないという...。しかもPTF適用でまたしても手こずる...。この煩雑な手順は本当に妥当なものなのか全く疑問で仕方がない。いつまでたっても慣れません。いつも心が折れそうになる...。ブツブツ...。

#CDPzのセットアップ
導入が済んだら各コンポーネントの初期セットアップをしていきます。

## (1) Configuration Tool

参考: [Getting started with the Configuration Tool on z/OSMF](https://www.ibm.com/support/knowledgecenter/ja/SSGE3R_1.1.0/weibui_zosmf.html)
WebのUIを持つ構成ツールが提供されていて、z/OSMFに組み込んで利用できるようです。まずはこのツールを使うための構成を行います。

### ユーザー作成
構成用のユーザーを作成します。
UID=0でユーザー"CDP001"を作成し、z/OSMFの管理グループ(IZUADMIN)権限付与します(TSOコマンド```CONNECT CDP001 GROUP(IZUADMIN)```)。

### 作業ディレクトリの設定

参考: [Setting up a working directory for the Configuration Tool](https://www.ibm.com/support/knowledgecenter/ja/SSGE3R_1.1.0/webui_workingdir.html)
ここで、savingpolicy.shを流すように記載されているので、それに従って実行。

```xxx:実行例
[CDP001@EPLEX1:/u/CDP001] sh /usr/lpp/IBM/cdpz/v1r1m0/UI/LIB/savingpolicy.sh
If you are deploying the Configuration tool on z/OSMF, please input '1'.
If you are deploying the Configuration tool directly in Liberty server, please input '2'.
1

You may enter a blank value to accept the default values in parentheses.

The Configuration Tool will be deployed in z/OSMF
Before running this script, ensure you are in the z/OSMF Administrator
group (IZUADMIN by default for z/OSMF).
The Configuration Tool requires a workspace where it can output
completed policy files. Please enter the full path of the directory you
would like to create.

Policy file directory (default: /u/error for uid: 0/cdpConfig): /u/CDP001/cdpConfig
User ID to own the policy file directory (default: Error for uid: 0): CDP001
Group containing administrators (default: IZUADMIN):
*** Important: the default value for the next parameter represents absolute
directory. If the default directory will become invalid after the next IPL,
provide a directory path that does not change between IPLs. Otherwise accept
the default value.
The Configuration Tool Source Script Directory (default: /V1R11/usr/lpp/IBM/cdpz/v1r1m0/UI/LIB):
The Configuration Tool has been successfully implemented.

You may now import the following file in the z/OSMF Import Manager:
/u/CDP001/cdpConfig/HBOCDEUI/v1r1m0/LIB/cdpConfig.properties
```

これで、/u/CDP001/cdpConfig/HBOCDEUI/v1r1m0/LIB/に以下のようなファイルが作成される。

```
[CDP001@EPLEX1:/u/CDP001/cdpConfig/HBOCDEUI/v1r1m0/LIB] ls -la
total 40
drwxrwx---   2 0        IZUADMIN    8192 Sep 19 18:02 .
drwxrwx---   4 0        IZUADMIN    8192 Sep 19 18:02 ..
lrwxrwxrwx   1 0        STC           53 Sep 19 18:02 CDPUIServer.war -> /V1R11/usr/lpp/IBM/cdpz/v1r1m0/UI/LIB/CDPUIServer.war
lrwxrwxrwx   1 0        STC           51 Sep 19 18:02 Sample.layout -> /V1R11/usr/lpp/IBM/cdpz/v1r1m0/UI/LIB/Sample.layout
lrwxrwxrwx   1 0        STC           51 Sep 19 18:02 Sample.policy -> /V1R11/usr/lpp/IBM/cdpz/v1r1m0/UI/LIB/Sample.policy
lrwxrwxrwx   1 0        STC           67 Sep 19 18:02 cdp-starter-sets.streams.json -> /V1R11/usr/lpp/IBM/cdpz/v1r1m0/UI/LIB/cdp-starter-sets.streams.json
lrwxrwxrwx   1 0        STC           56 Sep 19 18:02 cdp.protocols.json -> /V1R11/usr/lpp/IBM/cdpz/v1r1m0/UI/LIB/cdp.protocols.json
lrwxrwxrwx   1 0        STC           57 Sep 19 18:02 cdp.transforms.json -> /V1R11/usr/lpp/IBM/cdpz/v1r1m0/UI/LIB/cdp.transforms.json
-rw-rw----   1 0        IZUADMIN      91 Sep 19 18:02 cdpConfig.json
lrwxrwxrwx   1 0        STC           58 Sep 19 18:02 cdpConfig.properties -> /V1R11/usr/lpp/IBM/cdpz/v1r1m0/UI/LIB/cdpConfig.properties
lrwxrwxrwx   1 0        STC           65 Sep 19 18:02 cdpConfig.remove.properties -> /V1R11/usr/lpp/IBM/cdpz/v1r1m0/UI/LIB/cdpConfig.remove.properties
lrwxrwxrwx   1 0        STC           58 Sep 19 18:02 cdpConfigVersion.txt -> /V1R11/usr/lpp/IBM/cdpz/v1r1m0/UI/LIB/cdpConfigVersion.txt
lrwxrwxrwx   1 0        STC           54 Sep 19 18:02 cdpui.properties -> /V1R11/usr/lpp/IBM/cdpz/v1r1m0/UI/LIB/cdpui.properties
lrwxrwxrwx   1 0        STC           49 Sep 19 18:02 defracf.cmd -> /V1R11/usr/lpp/IBM/cdpz/v1r1m0/UI/LIB/defracf.cmd
lrwxrwxrwx   1 0        STC           50 Sep 19 18:02 en.i18n.json -> /V1R11/usr/lpp/IBM/cdpz/v1r1m0/UI/LIB/en.i18n.json
lrwxrwxrwx   1 0        STC           54 Sep 19 18:02 ims.streams.json -> /V1R11/usr/lpp/IBM/cdpz/v1r1m0/UI/LIB/ims.streams.json
lrwxrwxrwx   1 0        STC           48 Sep 19 18:02 index.html -> /V1R11/usr/lpp/IBM/cdpz/v1r1m0/UI/LIB/index.html
lrwxrwxrwx   1 0        STC           64 Sep 19 18:02 log-forwarder.streams.json -> /V1R11/usr/lpp/IBM/cdpz/v1r1m0/UI/LIB/log-forwarder.streams.json
lrwxrwxrwx   1 0        STC           52 Sep 19 18:02 main.bundle.js -> /V1R11/usr/lpp/IBM/cdpz/v1r1m0/UI/LIB/main.bundle.js
lrwxrwxrwx   1 0        STC           57 Sep 19 18:02 polyfills.bundle.js -> /V1R11/usr/lpp/IBM/cdpz/v1r1m0/UI/LIB/polyfills.bundle.js
lrwxrwxrwx   1 0        STC           54 Sep 19 18:02 sde.streams.json -> /V1R11/usr/lpp/IBM/cdpz/v1r1m0/UI/LIB/sde.streams.json
lrwxrwxrwx   1 0        STC           48 Sep 19 18:02 server.xml -> /V1R11/usr/lpp/IBM/cdpz/v1r1m0/UI/LIB/server.xml
lrwxrwxrwx   1 0        STC           54 Sep 19 18:02 vendor.bundle.js -> /V1R11/usr/lpp/IBM/cdpz/v1r1m0/UI/LIB/vendor.bundle.js
```

```xxx:/u/CDP001/cdpConfig/HBOCDEUI/v1r1m0/LIB/cdpConfig.properties
importType=plugin

izu.externalapp.file.version=v1r1m0
izu.externalapp.local.context.root=cdp
izu.externalapp.code.root=.

pluginId=com.ibm.zos.cdp
pluginDefaultName=Common Data Provider
pluginDescription=Configuration tool for IBM Common Data Provider
aboutPanelPath=cdpConfigVersion.txt

taskId1=CONFIGURE
taskVersion1=1.0
taskCategoryId1=4
taskDispName1=Common Data Provider
taskDispDesc1=Interface for configuring IBM Common Data Provider
taskSAFResourceName1=ZOSMF.IBM_CDP.CONFIG.CDPConfiguration
taskMultiSysplexScope1=false
taskHandlerEligible1=false
taskAuthenticatedGuestEligible1=true
taskNavigationURL1=/index.html
taskBundleUrl1=/
taskBundleFileName1=/main.bundle.js
taskMinZOS1=03.23.00
taskMinZOSMF1=03.23.00
```

### Installing the Configuration Tool
参考: [Installing the Configuration Tool](https://www.ibm.com/support/knowledgecenter/ja/SSGE3R_1.1.0/webui_install.html)

ブラウザから、上で作成したCDP001ユーザーでz/OSMFにログインし、z/OSMF管理 - インポート・マネージャーを選択

プロパティーファイルとして、上で作成した/u/CDP001/cdpConfig/HBOCDEUI/v1r1m0/LIB/cdpConfig.propertiesを指定して「表示」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b80cad34-110b-d74d-0efd-cf0552bbd2f8.png)


中身を確認したら「インポート」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f30bc4c0-b470-0458-22f4-eb9feb4ba73a.png)

「インポート済みプラグイン」タブで、Common Data Providerを選択し、アクションのメニューから「サーバーの関連付け」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/641b2954-9c6f-74d3-51b1-970b6285769b.png)

アプリケーション・サーバーから該当するサーバーを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/83af9fdd-5dcb-9845-66e9-6d61f70d6923.png)




以下のTSOコマンド実行

```
[CICS004@EPLEX1:/] tsocmd "RDEFINE ZMFAPLA IZUDFLT.ZOSMF.IBM_CDP.CONFIG.CDPConfiguration UACC(NONE)"
RDEFINE ZMFAPLA IZUDFLT.ZOSMF.IBM_CDP.CONFIG.CDPConfiguration UACC(NONE)
ICH10006I RACLISTED PROFILES FOR ZMFAPLA WILL NOT REFLECT THE ADDITION(S) UNTIL A SETROPTS REFRESH IS ISSUED.

[CICS004@EPLEX1:/] tsocmd "SETROPTS REFRESH RACLIST(ZMFAPLA)"
SETROPTS REFRESH RACLIST(ZMFAPLA)

[CICS004@EPLEX1:/] tsocmd "PERMIT IZUDFLT.ZOSMF.IBM_CDP.CONFIG.CDPConfiguration CLASS(ZMFAPLA) ID(IZUADMIN) ACCESS(CONTROL)"
PERMIT IZUDFLT.ZOSMF.IBM_CDP.CONFIG.CDPConfiguration CLASS(ZMFAPLA) ID(IZUADMIN) ACCESS(CONTROL)
ICH06011I RACLISTED PROFILES FOR ZMFAPLA  WILL NOT REFLECT THE UPDATE(S) UNTIL A SETROPTS REFRESH IS ISSUED

[CICS004@EPLEX1:/] tsocmd "PERMIT IZUDFLT.ZOSMF.IBM_CDP.CONFIG.CDPConfiguration CLASS(ZMFAPLA) ID(IZUUSER) ACCESS(READ)"
PERMIT IZUDFLT.ZOSMF.IBM_CDP.CONFIG.CDPConfiguration CLASS(ZMFAPLA) ID(IZUUSER) ACCESS(READ)
ICH06011I RACLISTED PROFILES FOR ZMFAPLA  WILL NOT REFLECT THE UPDATE(S) UNTIL A SETROPTS REFRESH IS ISSUED

[CICS004@EPLEX1:/] tsocmd "SETROPTS REFRESH RACLIST(ZMFAPLA)"
SETROPTS REFRESH RACLIST(ZMFAPLA)
```


z/OSMFの画面をリフレッシュすると、左側のメニューの"構成"以下に"Common Data Provider"という項目が追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/cdaa0c8a-fa03-215a-75ea-a95e18b6db9b.png)

こいつをクリックすると、以下のエラーが出ちゃいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/33c8d84f-c4dd-0b49-853a-db72aed21266.png)

調べてみると、以下のようなTechNoteを発見。
https://www.ibm.com/support/pages/receive-hbo6501w-error-web-browser-when-attempting-open-cdp-zosmf-configuration

SYSLOGには以下のようなエラーがたくさん出てました。

```
ICH408I USER(CDP001  ) GROUP(SYS1    ) NAME(CDP001              ) 372   
  CEA.CEATSO.TSOREQUEST CL(SERVAUTH)                                    
  INSUFFICIENT ACCESS AUTHORITY                                         
  ACCESS INTENT(READ   )  ACCESS ALLOWED(NONE   )                       
```

とりあえず上のTechNoteに記載されている、CEA.CEA... というプロファイルが無かったので定義を追加し、IZUADMIN, IZUUSERグループにUPDATE権限を付与しました。

```xxx:TSOコマンド例
RDEFINE SERVAUTH CEA.CEADOCMD UACC(NONE)
PERMIT CEA.CEADOCMD CLASS(SERVAUTH) ID(IZUADMIN) ACCESS(UPDATE)
PERMIT CEA.CEADOCMD CLASS(SERVAUTH) ID(IZUUSER) ACCESS(UPDATE)
...
SETROPTS REFRESH RACLIST(SERVAUTH)
```

追加で、エラーが出ていたCEA.CEATSO.TSOREQUESTプロファイルにも同様にUPDATE権限付与します(READ権限だけでよさそうだけど、とりあえずテスト環境なのでUPDATE付けちゃいます)。

再度、左側のメニューから、構成 - Common Data Provider を選択すると、管理画面が表示されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/05f1587c-740b-39bb-3e51-9c4a12b958bb.png)

これで構成ツールが使えそうなところまで確認できました。


## (2) Data Streamer
参考: [Configuring the Data Streamer](https://www.ibm.com/support/knowledgecenter/ja/SSGE3R_1.1.0/ds_config.html)

CDPZ01.V1R1M0.SHBOSAMP(HBODSPRO)に提供されるプロシージャーのサンプルを自環境の適当なPROCLIBにコピーして編集。

```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/cdpz/v1r1m0/DS/LIB/startup.sh
/usr/lpp/IBM/cdpz/v1r1m0/UI/LIB/Sample.policy
50401 start=w trace=n
//*
//* Environment data
//*
//STDENV DD *
JAVA_HOME=/usr/lpp/java/J8.0_64
CDP_HOME=/usr/lpp/IBM/cdpz/cdp_work
TZ=JST-9
#DEFAULT_HEAP=4g
#MAXIMUM_HEAP=4g
#RESOLVER_CONFIG=//'USER.TCPIP(TCPDATA)'
#_BPXK_SETIBMOPT_TRANSPORT=TCPIPOE
//*
//      PEND
//*********************************************************************
```

Data StreamerがListenするポートは50401とする。
また、CDP_HOMEとして/usr/lpp/IBM/cdpz/cdp_work を指定したので、それに合わせてUSS上にこのディレクトリを作成しておく。
Sample.policyは後でポリシー作成後に置き換えるので、一旦はこのまま。

Data StreamerをSTARTED TASKとして実行する際のユーザーとしてCDP001を指定しておく。

```xxx:RACF設定例
[CICS004@EPLEX1:/] tsocmd "RDEFINE STARTED HBODSPRO.* STDATA(USER(CDP001))"
RDEFINE STARTED HBODSPRO.* STDATA(USER(CDP001))
ICH10006I RACLISTED PROFILES FOR STARTED WILL NOT REFLECT THE ADDITION(S) UNTIL A SETROPTS REFRESH IS ISSUED.

[CICS004@EPLEX1:/] tsocmd "SETROPTS REFRESH GENERIC(STARTED) RACLIST(STARTED)"
SETROPTS REFRESH GENERIC(STARTED) RACLIST(STARTED)
```

## (3) Log Forwarder

参考: [Configuring the Log Forwarder](https://www.ibm.com/support/knowledgecenter/ja/SSGE3R_1.1.0/lf_config.html)

OPERLOG設定有無によってセットアップ手順が異なります。ここでは、OPERLOG設定なしの想定とします。
ガイドにあるポリシーの作成(Configuration Toolの利用)は後回しにします。

CDPZ01.V1R1M0.SGLASAMP(GLAPROC)に提供されるプロシージャーのサンプルを自環境の適当なPROCLIBにコピーして編集。

```
//*********************************************************************
//GLAPROC  PROC OPT=''
//* The ENVDIR is defaulted to /usr/lpp/IBM/zscala/V3R1/samples in the
//* startup.sh script.
//*
//* Set GLABASE to the directory where the startup.sh script resides.
//* The default directory for startup.sh is listed below.
// SET GLABASE='/usr/lpp/IBM/zscala/V3R1/samples'
//*
//* Uncomment and set ENVDIR to the directory where the zlf.conf
//* environment file resides (do not remove the -e at the beginning of
//* the variable). If not uncommented, startup.sh will use the default
//* directory value, listed below.
//* SET ENVDIR='-e /usr/lpp/IBM/zscala/V3R1/samples'
// SET ENVDIR='-e /u/CDP001/cdpConfig'
//*
//***** GLAPROC PROC *************************************************
//*
//ZLOGOUT EXEC PGM=BPXBATSL,REGION=0M,TIME=NOLIMIT,
// PARM=('PGM /bin/sh &GLABASE./startup.sh &OPT &ENVDIR')
//* Output data sets
//STDOUT  DD   SYSOUT=*
//STDERR  DD   SYSOUT=*
//*
//      PEND
//*********************************************************************
```

ENVDIRとして、/u/CDP001/cdpConfigを指定(ポリシーファイルがここに作成される想定)。

GLABASEは、startup.shのディレクトリを指定してますが、インストールディレクトリパスはデフォルトのままにしているので、そのまま。


Log ForwarderをSTARTED TASKとして実行する際のユーザーとしてCDP001を指定しておく。さらに、マニュアル記述の通り、FACILITYクラスの BPX.CONSOLEプロファイルにREAD権限付与する。

```xxx:RACF設定例
[CICS004@EPLEX1:/] tsocmd "RDEFINE STARTED GLAPROC.* STDATA(USER(CDP001))"
RDEFINE STARTED GLAPROC.* STDATA(USER(CDP001))
ICH10006I RACLISTED PROFILES FOR STARTED WILL NOT REFLECT THE ADDITION(S) UNTIL A SETROPTS REFRESH IS ISSUED.
[CICS004@EPLEX1:/] tsocmd "SETROPTS REFRESH GENERIC(STARTED) RACLIST(STARTED)"
SETROPTS REFRESH GENERIC(STARTED) RACLIST(STARTED)

[CICS004@EPLEX1:/] tsocmd "PERMIT BPX.CONSOLE CLASS(FACILITY) ID(CDP001) ACCESS(READ)"
PERMIT BPX.CONSOLE CLASS(FACILITY) ID(CDP001) ACCESS(READ)
ICH06011I RACLISTED PROFILES FOR FACILITY WILL NOT REFLECT THE UPDATE(S) UNTIL A SETROPTS REFRESH IS ISSUED
[CICS004@EPLEX1:/] tsocmd "SETROPTS REFRESH RACLIST(FACILITY)"
SETROPTS REFRESH RACLIST(FACILITY)
```

SYSLOGデータ取得用User Exitを追加します。
OPERLOGなし、JES3利用なし、の環境なのでGLASYSGというユーザーExitを追加します。

LPALSTxxにSGLALPAを登録し、PROGxxにてEXITを登録する。以下IPL時に有効化される静的定義の例。

```xxx:SYS0.PARMLIB(LPALST01)
...
CDPZ01.V1R1M0.SGLALPA(ZSPK01),
...
```

```xxx:SYS0.PARMLIB(PROG02)
...
EXIT ADD EXITNAME(CNZ_MSGTOSYSLOG) MODNAME(GLASYSG)                            
...
```

必要に応じて動的設定もしくはIPL実施。


## (4) System Data Engine
参考: [Configuring the System Data Engine](https://www.ibm.com/support/knowledgecenter/ja/SSGE3R_1.1.0/sde_config.html)

SMFを取り込む際に、対象とするデータソースの形式によりセットアップ方法が異なります。ここでは、LogstreamではなくSYS1.MANxデータセットを取り込む想定とします。
ガイドにあるポリシーの作成(Configuration Toolの利用)は後回しにします。

PROGxxにAPF登録をします。

```xxx:SYS0.PARMLIB(PROG02)
...
 APF ADD                                                                   
     DSNAME(CDPZ01.V1R1M0.SHBOLOAD)                       VOLUME(ZSPK01)                           
...
```

CDPZ01.V1R1M0.SHBOCNTL(HBOSMF)に提供されるプロシージャーのサンプルを自環境の適当なPROCLIBにコピーして編集。

```
//HBOSMFCL EXEC PGM=HBOPDE,REGION=0M,TIME=1440,
//         PARM='SHOWINPUT=NO,ZIIPOFFLOAD=YES'
//STEPLIB  DD DISP=SHR,DSN=CDPZ01.V1R1M0.SHBOLOAD
//*
//* CONTROL STATEMENTS
//* The control statement file must be customised to match
//* the target of the Common Data Provider configuration utility.
//*
//HBOIN    DD *
SET IBM_SDE_INTERVAL = '1 MINUTES';
SET IBM_UPDATE_TARGET = 'PORT 50401';
SET IBM_FILE_FORMAT = 'CSV';
SET IBM_RESOURCE = 'EXIT';
//         DD  PATH='/etc/cdpConfig/hboin.sde',
//         PATHDISP=(KEEP),RECFM=V,LRECL=255,FILEDATA=RECORD
//*
//* Sample COLLECT statement for processing real-time SMF data
//*
//         DD *
COLLECT SMF FROM &IBM_RESOURCE
  EVERY &IBM_SDE_INTERVAL;
/*
//HBOOUT   DD SYSOUT=*
//HBODUMP  DD SYSOUT=*
```

```//STEPLIB  DD DISP=SHR,DSN=CDPZ01.V1R1M0.SHBOLOAD``` => データセット名変更
```SET IBM_UPDATE_TARGET = 'PORT 50401'; ``` => Data Streamerのポート番号指定
```SET IBM_RESOURCE = 'EXIT';```  => MANxデータセットをEXITにて取得する想定なので、"EXIT"で固定
```//         DD  PATH='/etc/cdpConfig/hboin.sde' ```  => ポリシーファイル名は後で変更


System Data EngineをSTARTED TASKとして実行する際のユーザーとしてCDP001を指定しておく。

```xxx:RACF設定例
[CICS004@EPLEX1:/] tsocmd "RDEFINE STARTED HBOSMF.* STDATA(USER(CDP001))"
RDEFINE STARTED HBOSMF.* STDATA(USER(CDP001))
ICH10006I RACLISTED PROFILES FOR STARTED WILL NOT REFLECT THE ADDITION(S) UNTIL A SETROPTS REFRESH IS ISSUED.

[CICS004@EPLEX1:/] tsocmd "SETROPTS REFRESH GENERIC(STARTED) RACLIST(STARTED)"
SETROPTS REFRESH GENERIC(STARTED) RACLIST(STARTED)
```


LPALST登録

```xxx:SYS0.PARMLIB(LPALST01)
...
CDPZ01.V1R1M0.SHBOLPA(ZSPK01),  
...
```

EXIT登録

```xxx:SYS0.PARMLIB(PROG02)
...
EXIT ADD EXITNAME(SYS.IEFU83) MODNAME(HBOSMFEX)  
EXIT ADD EXITNAME(SYS.IEFU84) MODNAME(HBOSMFEX)  
EXIT ADD EXITNAME(SYS.IEFU85) MODNAME(HBOSMFEX)                              
...
```

必要に応じて動的設定もしくはIPL実施。

##補足

各種z/OS関連設定の確認

APF登録
xxx.SHBOLOADが含まれることを確認

```xxx:例
D PROG,APF
...
499  ZSPK01 CDPZ01.V1R1M0.SHBOLOAD
...
```

EXIT
CNZ_MSGTOSYSLOG
SYS.IEFU82, SYS.IEFU84, SYS.IEFU85が含まれることを確認

```xxx:例
D PROG,EXIT
...
EXIT             DEF EXIT             DEF EXIT             DEF    
CNZ_MSGTOSYSLOG   E  SYS.IEFU83        E  SYS.IEFU84        E     
SYS.IEFU85        I  CSVDYLPA          E  CSVDYNEX          E     
...

D PROG,EXIT,MODNAME=HBOSMFEX                           
CSV462I 17.18.32 PROG,EXIT DISPLAY 821                 
MODULE  HBOSMFEX                                       
EXIT(S) SYS.IEFU83       SYS.IEFU84       SYS.IEFU85   
```

LPA
xxx.SGLALPA以下、および、xxx.SHBOLPA以下のモジュールが登録されていることを確認

```xxx:例
D PROG,LPA,MOD=HBOSMFEX                                   
CSV550I 17.12.23 LPA DISPLAY 808                          
FLAGS  MODULE    ENTRY PT  LOAD PT   LENGTH    DIAG       
   P   HBOSMFEX  8407A218  0407A130  00000ED0  04027998   
```


#ELK側の準備

参考: [Preparing to send data to Elasticsearch](https://www.ibm.com/support/knowledgecenter/ja/SSGE3R_1.1.0/elasticsearch_prep.html)
サポートされるELKスタックのバージョンが5.1.2 - 5.2.1なので(古っ!)、V5.2.1の環境を用意する。

## インストール
以下からV5.2.1のElasticsearch, Logstash, KibanaのRPMファイルを入手する
https://www.elastic.co/jp/downloads/past-releases

手元にあったCentOS V7 の環境を使う。

```
[root@Test05 /media/sf_Inst_Image/Elastic]# rpm -ivh elasticsearch-5.2.1.rpm
警告: elasticsearch-5.2.1.rpm: ヘッダー V4 RSA/SHA512 Signature、鍵 ID d88e42b4: NOKEY
準備しています...              ################################# [100%]
Creating elasticsearch group... OK
Creating elasticsearch user... OK
更新中 / インストール中...
   1:elasticsearch-0:5.2.1-1          ################################# [100%]
### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd
 sudo systemctl daemon-reload
 sudo systemctl enable elasticsearch.service
### You can start elasticsearch service by executing
 sudo systemctl start elasticsearch.service

[root@Test05 /media/sf_Inst_Image/Elastic]# rpm -ivh logstash-5.2.1.rpm
警告: logstash-5.2.1.rpm: ヘッダー V4 RSA/SHA512 Signature、鍵 ID d88e42b4: NOKEY
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:logstash-1:5.2.1-1               ################################# [100%]
Using provided startup.options file: /etc/logstash/startup.options
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
Successfully created system startup script for Logstash

[root@Test05 /media/sf_Inst_Image/Elastic]# rpm -ivh kibana-5.2.1-x86_64.rpm
警告: kibana-5.2.1-x86_64.rpm: ヘッダー V4 RSA/SHA512 Signature、鍵 ID d88e42b4: NOKEY
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:kibana-5.2.1-1                   ################################# [100%]
```

##構成

最低限の構成

###Elasticsearch
/etc/elasticsearch/elasticsearch.yml 編集

```yml:elasticsearch.yml抜粋
http.port: 9200
http.host: 0.0.0.0
```

###Kibana
/etc/kibana/kibana.yml 編集

```yml:kibana.yml抜粋
server.port: 5601
server.host: "0.0.0.0"
```

###Logstash
参考: [Preparing to send data to Elasticsearch](https://www.ibm.com/support/knowledgecenter/ja/SSGE3R_1.1.0/elasticsearch_prep.html)

Elasticsearchに取り込むためのLogstash構成ファイルが、USS上の/usr/lpp/IBM/cdpz/v1r1m0/DS/LIB/ibm_cdpz_ELK.tar.gzに提供されています。
これをバイナリーモードでLinux側にコピーして展開します。取り込むデータ毎に各種Logstash構成ファイルが含まれています。

デフォルトのlogstash構成確認ておきます。
systemdのlogstash.serviceを見てみると...

```/etc/systemd/system/logstash.service
[Unit]
Description=logstash

[Service]
Type=simple
User=logstash
Group=logstash
# Load env vars from /etc/default/ and /etc/sysconfig/ if they exist.
# Prefixing the path with '-' makes it try to load, but if the file doesn't
# exist, it continues onward.
EnvironmentFile=-/etc/default/logstash
EnvironmentFile=-/etc/sysconfig/logstash
ExecStart=/usr/share/logstash/bin/logstash "--path.settings" "/etc/logstash"
Restart=always
WorkingDirectory=/
Nice=19
LimitNOFILE=16384

[Install]
WantedBy=multi-user.target
```

```--path.settings``` として/etc/logstashディレクトリが指定されています。
[Running Logstash from the Command Line](https://www.elastic.co/guide/en/logstash/5.2/running-logstash-command-line.html)

このディレクトリ下のlogstash.ymlが構成ファイルとして使われます。

```yml:/etc/logstash/logstash.yml
...
# Where to fetch the pipeline configuration for the main pipeline
#
path.config: /etc/logstash/conf.d
...
```

path.configに/etc/logstash/conf.dというディレクトリが指定されているので、このディレクトリ下に構成ファイルを配置することになります。(このディレクトリ下に配置された全てのファイルが辞書順にコンカチされて構成ファイルとして使われる)

Logstashの構成は後回し...


###firewalld

9200と5601ポートにアクセスできるよう穴をあける。

```
[root@Test05 /etc/firewalld/zones]# firewall-cmd --zone=public --add-port=9200/tcp --permanent
success

[root@Test05 /etc/firewalld/zones]# firewall-cmd --zone=public --add-port=5601/tcp --permanent
success

[root@Test05 /etc/firewalld/zones]# cat public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="dhcpv6-client"/>
  <port protocol="tcp" port="9200"/>
  <port protocol="tcp" port="5601"/>
</zone>

[root@Test05 /etc/firewalld/zones]# firewall-cmd --reload
success
```

### SSHポートフォワード
今回お試しで利用する環境は、z/OSのマシンと、ELKスタックを乗せるLinuxマシンが、別のネットワークセグメントにあり、z/OS側がよりセキュアなネットワークとなっています。そのため、z/OS側からLinuxマシンに対してTCPのコネクションを張ることが制限されています(Linuxからz/OSへのSSH接続は可)。これを回避するために、テストをする時だけ一時的にSSHポートフォワードの構成を行うことにします。

ポートフォワードを行うためにLinux上で発行するコマンド例
```ssh -f -N -R 8081:localhost:8081 <user>@eplex1```

公開鍵認証の設定をしておくか、上のコマンド実行時にパスワードを入力する必要があります。
これをテスト実行するときだけ有効にする想定です。


##起動

```
[root@Test05 ~]# systemctl start elasticsearch.service
[root@Test05 ~]# systemctl status elasticsearch.service
● elasticsearch.service - Elasticsearch
   Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; disabled; vendor preset: disabled)
   Active: active (running) since 火 2019-10-08 18:23:51 JST; 14s ago
     Docs: http://www.elastic.co
  Process: 2136 ExecStartPre=/usr/share/elasticsearch/bin/elasticsearch-systemd-pre-exec (code=exited, status=0/SUCCESS)
 Main PID: 2138 (java)
   CGroup: /system.slice/elasticsearch.service
           mq2138 /bin/java -Xms2g -Xmx2g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInit...

10月 08 18:23:51 Test05 systemd[1]: Starting Elasticsearch...
10月 08 18:23:51 Test05 systemd[1]: Started Elasticsearch.
10月 08 18:23:52 Test05 elasticsearch[2138]: OpenJDK 64-Bit Server VM warning: If the number of processors is exp...ads=N
Hint: Some lines were ellipsized, use -l to show in full.


[root@Test05 ~]# systemctl start kibana.service
[root@Test05 ~]# systemctl status kibana.service
● kibana.service - Kibana
   Loaded: loaded (/etc/systemd/system/kibana.service; disabled; vendor preset: disabled)
   Active: active (running) since 火 2019-10-08 18:24:40 JST; 5s ago
 Main PID: 2239 (node)
   CGroup: /system.slice/kibana.service
           mq2239 /usr/share/kibana/bin/../node/bin/node --no-warnings /usr/share/kibana/bin/../src/cli -c /etc/kibana/...

10月 08 18:24:40 Test05 systemd[1]: Started Kibana.
10月 08 18:24:40 Test05 systemd[1]: Starting Kibana...
10月 08 18:24:45 Test05 kibana[2239]: {"type":"log","@timestamp":"2019-10-08T09:24:45Z","tags":["status","plugin...ized"}
10月 08 18:24:45 Test05 kibana[2239]: {"type":"log","@timestamp":"2019-10-08T09:24:45Z","tags":["status","plugin...ized"}
10月 08 18:24:45 Test05 kibana[2239]: {"type":"log","@timestamp":"2019-10-08T09:24:45Z","tags":["status","plugin...ized"}
10月 08 18:24:46 Test05 kibana[2239]: {"type":"log","@timestamp":"2019-10-08T09:24:46Z","tags":["status","plugin...ized"}
10月 08 18:24:46 Test05 kibana[2239]: {"type":"log","@timestamp":"2019-10-08T09:24:46Z","tags":["listening","inf...5601"}
10月 08 18:24:46 Test05 kibana[2239]: {"type":"log","@timestamp":"2019-10-08T09:24:46Z","tags":["status","ui set...ized"}
Hint: Some lines were ellipsized, use -l to show in full.


```

Elasticsearchにアクセスしてみる

```
[root@Test05 ~]# curl -X GET http://localhost:9200
{
  "name" : "XMyGObu",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "bLWcxWLzSrWYM95qmZu52g",
  "version" : {
    "number" : "5.2.1",
    "build_hash" : "db0d481",
    "build_date" : "2017-02-09T22:05:32.386Z",
    "build_snapshot" : false,
    "lucene_version" : "6.4.1"
  },
  "tagline" : "You Know, for Search"
}
```

Kibanaにアクセスしてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/556ee931-aee2-955a-f8f8-9b570e567588.png)




# データ取り込みのための構成(Overview)
さて、上の手順で基本的なセットアップは済んだので、ここから、実際にデータを取得するための構成をしていくことになります。
何のデータをどこに流し込むか、ということを色々カスタマイズできるようなのですが、バリエーションも豊富で仕組みも結構複雑なので、まず、ここでは全体像を押さえて、具体的なデータ取得は別の記事で取り上げることにします。連携先はタイトルにあるようにELKスタックを前提としていますが、一旦ここではELK側は置いておいて、CDPz側にフォーカスします。

ざっくり言うと、以下のステップを踏むことになります。
1.Config Toolで"ポリシー"と呼ばれる定義を作成します。"ポリシー"とは、何のデータをどのように取得して、それをどこにどうやって送るか、というような情報を保持するものです。
2.作成されたポリシーの情報を元にして、CDPzの各コンポーネントを稼働させます。

ホスト側コンポーネントおさらい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/04f67676-d5b1-6753-00f5-76227695aebe.png)


以降、以下の省略形を使う場合があります。
DS: Data Streamer
LF: Log Forwarder
SDE: System Data Engine



## 1.Config Toolによるポリシーの作成
z/OSMFのプラグインとして、CDPzの構成ツールをセットアップしましたので、まずはそれを使ってポリシーを作成します。
※製品が事前に用意しているメニューから取得したい情報を選択して定義を作成していきますが、全ての情報がメニューとして用意されている訳ではありません。用意されていない項目を取得したい場合、追加でカスタマイズが必要となりますが、ここでは一旦用意されているメニューを取得するイメージで記載します。

### ポリシーエディター
Create New policyを選択すると、Policy Profile Editの画面となり、ここでGUIベースでポリシーを定義することができます。以下のようなイメージでポリシーを作成していきます。

図1:ポリシー編集画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/1114fc28-061b-156e-9961-0f40f0138100.png)

左側に縦に並んでいる青い箱は、何のデータを取得したいか、ということを表しています(LFもしくはSDE関連の情報)。SYSLOGやSMF Type110 Subtype1のデータなど、取得したいデータを選んでいきます。
※これら取得するデータの情報は"Data Stream"と呼ばれていますが、"Data Streamer"とは別物ですのでご注意ください！(まったくネーミングが紛らわしい！！！)
製品が用意しているメニューとしては、以下のようなものがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/3c11d6b5-b405-a4a1-8f88-4ebf7aa1768b.png)


図1の右側にある緑色の箱は、データをどこにどうやって送るかという情報を設定するもので(DS関連の情報)、Subscriberと呼ばれています。
※ネーミングに一貫性が無くて分かりにくい！！！

DataStreamとSubscriberはそれぞれ関連付けされて、どのデータをどこに送るかというのを定義していくことになります。

ポリシー編集画面で定義をしていく流れを図にするとこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/cc09cfcf-6cb3-51eb-6667-f465fad45459.png)

上の図中の(1)-1, (1)-2で示されているLog Forwarder用の設定、System Data Engine用の設定はそれぞれ以下の通り。

(1)-1 LOG FORWARDER
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9e4e9f94-c28d-d943-acc5-09cb12593c72.png)

(1)-2 SYSTEM DATA ENGINE
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ee2683d0-3c78-a5bf-9ee0-23575e71ad33.png)

### 生成物
上のエディターでGUIベースでポリシーを作成して保存すると、定義内容が反映されたファイルがUSS上に作成されます。
出力先はConfig Toolセットアップ時に指定したPolicy file directoryです。ここでは/u/CDP001/cdpConfig/

| ファイル | 説明 |
|:-----------|:------------|
|\<policyName\>.policy    | Data Streamer関連情報を管理(どのデータをどこに送付するか)。Data Streamer起動プロシージャーで、このファイル名を指定。|
|\<policyName\>.config.properties <br> \<policyName\>.zlf.conf| Log Forwarder関連情報を管理(Log Fowarder関連ライブラリ、使用するData Streamerのポート番号など)。Log Forwader起動プロシージャーの”ENVDIR”で示されたディレクトリ下に適切な名前で配置する必要がある。|
|\<policyName\>.sde | System Data Engine関連情報を管理(取得するデータの情報)。実体は、ポリシーに追加したData Streamに紐づくSHBODEFSデータセットのメンバー(Data Streamとしての処理を独自言語で実装したもの)をコンカチしたもの。System Data Engine起動プロシージャーで、このファイル名を指定。|
|\<policyName\>.layout | ポリシーエディターの画面レイアウト情報を保持|


## 2.CDPz各コンポーネントの起動

上で生成されたファイルを使用して、CDPzの各コンポーネントを実行することになります。
そのため、起動プロシージャーを編集し、上で生成したファイルを参照するようにします。

Data Streamer: HBODSPRO => xxx.policyファイル
Log Forwarder: GLAPROC => xxx.config.properties, xxx.zlf.confファイルのディレクトリ
System Data Engine: HBOSMF => xxx.sdeファイル


## 補足: オブジェクト相関図

なかなか全体像を捉えるのが難しく、名前も混乱しやすいので、各オブジェクトの相関を整理してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2bbc1bc9-3d0f-bdff-581f-36b5cd89dc71.png)