IBM Operational Decision Manager メモ - (7) zODM環境補足

# はじめに
この記事では、z/OS上のODMに関して主にインフラ観点で気になるところ、分かりにくそうなところを補足していこうと思います。

## 関連記事

[IBM Operational Decision Manager メモ - (1) 概要、Linuxへのインストール](https://qiita.com/tomotagwork/items/2bdcc13cc5a896b6a3a1)
[IBM Operational Decision Manager メモ - (2) ルール開発から実行までの流れ](https://qiita.com/tomotagwork/items/446975617acfdb0eda5f)
[IBM Operational Decision Manager メモ - (3) Decision Center利用の流れ](https://qiita.com/tomotagwork/items/5e8b1efbe0072cf5af6b)
[IBM Operational Decision Manager メモ - (4) Linux上での環境セットアップ](https://qiita.com/tomotagwork/items/dd9dc49ed6a67ff876bb)
[IBM Operational Decision Manager メモ - (5) z/OS上での環境セットアップ](https://qiita.com/tomotagwork/items/73ceaf84fb89b5d2af7b)
[IBM Operational Decision Manager メモ - (6) z/OS上でのルール呼び出し](https://qiita.com/tomotagwork/items/577895e05f9ec5e40c06)
[IBM Operational Decision Manager メモ - (7) zODM環境補足](https://qiita.com/tomotagwork/items/fdda485b28c55edae6e6)


# zODM構成作業の全体像

今回構成したz/OS上のODM関連コンポーネントの概要図は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/e99f3ad3-dd9f-178e-eb4b-a0460af5cb34.png)

「[(5) z/OS上での環境セットアップ](https://qiita.com/tomotagwork/items/73ceaf84fb89b5d2af7b)」の記事で、マニュアルに沿って一連の環境構築作業を実施したときのログを記載していますが、各作業のイメージが分かりにくい面もあるかと思いますので全体像を整理しておきます。

zODMをインストールした後、実施すべき構成作業としては大きく以下の3つくらいに分類されます。

(1) パラメーターを設定して構成用JCLを生成
(2) 生成されたJCLをカスタマイズして実行
(3) その他追加構成作業

それぞれの作業イメージを整理していきます。

## (1) パラメーターを設定して構成用JCLを生成
ここの作業を図示すると以下のようなイメージとなります。(図中の青字は「[(5) z/OS上での環境セットアップ](https://qiita.com/tomotagwork/items/73ceaf84fb89b5d2af7b)」の記事でも示しているマニュアル上のStepを表しています。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2010012f-ef7e-7425-8604-f7551ecd6a51.png)

zODMそのもの、および、関連コンポーネント(ここではCICS、Db2)について、構成上必要なパラメーターを設定していきます(HBRINSTをカスタマイズ)。これは各変数に対して値を設定していくことになります。

次に、構成したいトポロジーに合わせて、"どのようなコンポーネントをどのように構成するか" という情報をzODM固有の作法で定義していきます(HBRCTRLをカスタマイズ)。
今回の例では、以下のようなコンポーネントについての情報を設定をしています。

- ① **RES Console**: O8B0というSSIDでRES Consoleを構成する
- ② **zRES**: ルール実行環境としてO8B1, O8B2というSSIDの2つのzRESを構成する
- ③ **CICS**: ルール呼び出し元としてCICS TS V5.6を使用する

この"パラメーター"と"構成情報"をインプットにして HBRUUPTIというJCLをカスタマイズして実行すると、HBRCTRLで指定したデータセットに構成用のJCLやパラメーターの雛形が生成されます。
※このHBRUUPTIは実体としてはREXXのスクリプトが実行されます。

RES Console, zRES, CICSそれぞれで、構成に必要な情報が生成されるので、それらを使用して具体的な構成を行っていきます。

### 補足: HBRWORKPATHパラメーターについて

HBRINSTに指定する `++HBRWORKPATH++`パラメーターに指定したディレクトリは、RES ConsoleやzRESで使用するUSS上のファイルが配置されるベースのディレクトリとして使用されます。
今回の例ではこのOS区画に構成するRES Console, zRESのサーバーグループのセットは1組だけの想定なので、シンプルに `/var/zDM/V8R11ML`としています。このようなセットを同一OS上に複数持たせるような場合は、そのグループを識別するディレクトリをもう1階層作ってそれをHBRWORKPATHに指定することをおすすめします。
例: `/var/zDM/V8R11ML/GROUP01` 
こうすることで、論理的に関連性のあるコンポーネントの情報がUSS上はこのディレクトリ配下にまとめられるので管理がしやすくなります。


## (2) 生成されたJCLをカスタマイズして実行
今回はRES Console, zRES, CICSという3つのコンポーネントについての定義を行っていますのでそれぞれについて見ていきます。

### (2)-① RES Console関連設定

(1)で、RES Console用にODM811.WORK.O8B0.xxxというPDSデータセットが作成され、その配下に各種JCLやパラメーターの雛形が生成されます。これらはHBRINSTに設定された値を元に生成されています。
各データセットに含まれるメンバーの意味合いは以下のイメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d3966950-3da5-dde3-c3d3-3308d1c7a698.png)

ODM811.WORK.O8B0.SHBRJCL 以下には、USSの設定用JCL、および、ODM関連のデータを保管するためDb2構成用のJCLが生成されています。
これらを実行することで、USS上に必要なディレクトリ、ファイルが作成され、また、Db2上にはODM管理に必要なオブジェクト(DB, Tableなど)が作成されます。

ODM811.WORK.O8B0.SHBRPROCにはRES Console起動プロシージャーの雛形が生成されます。また、RES Console起動時に参照される起動パラメーターがODM811.WORK.O8B0.SHBRPROC以下に生成されます。
起動プロシージャーはシステム上適切なライブラリ(SYS1.PROCLIBなど)にコピー&リネームして使用することになります。

### (2)-② zRES関連設定
(1)で、RES Console用にODM811.WORK.O8B1.xxx、ODM811.WORK.ODM82.xxx というPDSデータセットが作成され、その配下に各種起動プロシージャーやパラメーターの雛形が生成されます。これらはHBRINSTに設定された値を元に生成されています。
各データセットに含まれるメンバーの意味合いは以下のイメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9504c43c-a4f8-23d5-464c-64f04f1bb7b3.png)

ここではzRESは2つのインスタンス(O8B1,O8B2)を構成することにしているので、それぞれの起動プロシージャーと起動パラメーターが生成されます。
起動プロシージャーはシステム上適切なライブラリ(SYS1.PROCLIBなど)にコピー&リネームして使用することになります。

### (2)-③ CICS関連設定
(1)で、CICS構成用にODM811.WORK.CICS.xxx というPDSデータセットが作成され、その配下に各種起動プロシージャーやパラメーターの雛形が生成されます。これらはHBRINSTに設定された値を元に生成されています。
各データセットに含まれるメンバーとCICSの関係は以下のイメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/51209c98-af3b-3504-c42c-96e8d17efcd6.png)

ODM811.WORK.CICS.SHBRJCL以下には、CICSアプリからODMアクセスする際に必要なCICS資源定義を追加するためのJCLが生成されます。これをSubmitすることで、ODMアクセス用の資源定義がCSDに追加されます。具体的には、HBRGROUPという資源グループ、および、HBRGROUPが含まれるHBRLISTというグループリストが作成されます。SITパラメーター:GRPLISTにHBRLISTを指定することでCICSリージョン起動時にODMアクセスに必要な資源定義がインストールされることになります。

また、ODM811.WORK.CICS.SHBRPARM以下にODMアクセスに必要なパラメーターが生成されます。CICS起動プロシージャーのHBRENVPR DDで、これらのメンバーを指定します。

## (3) その他追加構成作業

大まかな流れとしては上に示した通りですが、その他に以下の設定を行うことになります。

- Angel Process構成: RES Consoleは実体はLibertyとして稼働するため、セキュリティ管理のためにAngel Processの構成が必要
- Subsystem登録
- 各種RACF設定

# 各コンポーネントの構成情報整理

## RES Console

各種構成ファイルとの相関図を以下に示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7e6bed28-6c41-d11d-9cce-4d86e7f28237.png)

### 起動パラメーター補足(PDSメンバー)
PDSメンバーとして提供される各種起動パラメーターについて補足します。

※各パラメーターの詳細は以下のマニュアルも参照のこと。
参考: [ODM V811 - z/OS runtime variables](https://www.ibm.com/docs/en/odm/8.11.0?topic=configuring-zos-runtime-variables)

#### HBRMSTR(全般)

<details><summary><font color="blue">ODM811.WORK.O8B0.SHBRPARM(HBRMSTR)サンプル</font></summary><div>

```
HBRSSID=O8B0
HBRWORKPATH=/var/zDM/V8R11ML
HBRINSTPATH=/usr/lpp/zDM/V8R11ML
HBRMODE=CONSOLE,HTDS
HBRPORT=34114
HBRSECUREPORT=24114
HBRWLPANGELNAME=O8B0ANGL
HBRWLPSTRICTTRANSPORT=false
HBRSSLKEYSTORE=JAVA
HBRARMENABLED=NO
HBRSMFST100=YES
HBRPRINTWTO=YES
HBRLOGTIMEOUTS=NO
HBRLOGLONGEXECTIME=0
HBRLOGLONGEXECPARMS=NO
HBRCONFIG=YES
JAVA_OPTIONS=-Xms128M -Xmx768M
JAVA_HOME=/usr/lpp/java/J8.0_64
LIBPATH_SUFFIX=
CLASSPATH_SUFFIX=
HBRBAIENABLE=false
HBRBAITOPIC=bai-odm-z-example
HBRBAIBOOTSTRAPSERVERS=bootstrap.example.com
HBRBAISECURITYPROTOCOL=SASL_SSL
HBRBAISSLTRUSTSTORELOCATION=/u/rules/truststore.jks
HBRBAISSLTRUSTSTOREPASSWORD=password
HBRBAISSLTRUSTSTOREPROTOCOL=TLSv1.2
HBRBAISASLMECHANISM=PLAIN
HBRBAISASLJAASCONFIGMODULE=plain.PlainLoginModule
HBRBAISASLJAASCONFIGOPTIONS=required
HBRBAISASLJAASCONFIGUSERNAME=kafkauser
HBRBAISASLJAASCONFIGPASSWORD=kafkapass
```

</div></details>

主要ないくつかのパラメーターについて補足します。

- **HBRSSID**: サブシステムID
- **HBRWORKPATH**: USS上に管理される構成ファイルやログなどを配置するディレクトリ。
- **HBRMODE**: 当該コンポーネントの稼働モードを指定。上の例だとRES Consoleとして稼働し、かつ、HTDS(Hosted Transparent Decision Service)機能を提供するサーバーとして稼働させることを意味する。
- **HBRPORT**: RES ConsoleとしてListenするポート番号。
- **HBRSECUREPORT**: RES ConsoleとしてListenするポート番号(セキュア接続用)。
- **HBRWLPANGELNAME**: 接続するANGEL Process名
- **HBRCONFIG**: USS上の構成ファイルを自動生成するかどうかを指定。デフォルトYES。YESの場合USS上の各種構成ファイル(後述)が起動時に自動生成される。例えば、初回起動時はHBRCONFIG=YESを指定し、生成されたファイルをカスタマイズした後、2回目以降の起動の際はHBRCONFIG=NOを指定して起動する運用を行う。
- **JAVA_OPTIONS**: JVMのオプション。
- **HBRBAIxx**: BAI(Business Automation Insight)機能関連のパラメーター。今回はBAIの利用は想定していないので無視。

#### HBRPSIST(Db2関連)

<details><summary><font color="blue">ODM811.WORK.O8B0.SHBRPARM(HBRPSIST)サンプル</font></summary><div>

```
HBRPERSISTENCETYPE=DB2
HBRFILEPATH=/var/zDM/V8R11ML/res_data
HBRXOMFILEPATH=/var/zDM/V8R11ML/res_xom
DB2SERVNAME=localhost
DB2PORT=5040
DB2LOCATION=DALLASC
DB2SCHEMA=ODM811
DB2JARLOCN=/usr/lpp/db2c10/jdbc/classes
DB2NATIVELOC=/usr/lpp/db2c10/jdbc/lib
DB2SUBSYSTEM=DBCG
HBRDBURL=jdbc:db2://+
           localhost:+
           5040/+
           DALLASC:+
           currentSchema=ODM811;
HBRDBT2URL=jdbc:db2:+
           DALLASC:+
           currentSchema=ODM811;+
           fullyMaterializeLobData=false;
HBRDBCONTYPE=4
HBRDBUSER=IBMUSER
HBRDBPASSWORD=xxx
HBRDBJARS=/usr/lpp/db2c10/jdbc/classes/db2jcc.jar:+
          /usr/lpp/db2c10/jdbc/classes/db2jcc_license_cisuz.jar
```

</div></details>

ここでは、ODM関連のデータ保管用に使用するDb2アクセス情報を指定します。Db2へのアクセスにはJDBCが使用されますので、JDBC接続に必要な各種パラメーターを設定することになります。


#### HBRCMMN(通信関連)

<details><summary><font color="blue">ODM811.WORK.O8B0.SHBRPARM(HBRCMMN)サンプル</font></summary><div>

```
HBRLANG=En_US
HBRCCSID=1047
HBRCONSOLECOM=YES
HBRCONSOLECOMPORT=44114
HBRCONSOLECOMHOST=localhost
HBRINTERCEPTORS=NO
HBRIFAUSAGE=YES
HBRTRACELEVEL=WARNING
HBRLOGFILESIZE=10000000
HBRLOGFILENUM=3
HBRLOGFILEAPPEND=true
```

</div></details>

RES Console - zRESサーバー間通信、およびトレース・レベルについての設定を行います。
主要ないくつかのパラメーターについて補足します。

- **HBRCONSOLECOMPORT**: RES ConsoleとzRESサーバー通信に使用するConsole側がListenするポート番号
- **HBRCONSOLECOMHOST**: RES ConsoleがzRESサーバーとの通信用ポートをバインドするホスト名
- **HBRTRACELEVEL**: 実行時のトレース・レベルを指定(ALL|FINE|INFO|WARNING|SEVERE|OFF)

### USSファイル補足

RES Consoleは実体としてはLiberty上のアプリケーションとして稼働しますので、Liberty用の構成が必要になります。また、ログ関連の構成ファイルも作成されます。
これらはHBRMSTRのパラメーターでHBRCONFIG=YES指定で起動した際に自動で作成されます。
※HBRCONFIG=YESで起動すると既存のファイルは上書きされてしまうので、カスタマイズ後はHBRCONFIG=NOで起動する必要があります。

#### Liberty関連

Liberty用の構成としてUSS上に以下のようなディレクトリ、構成ファイルが作成されます。

```
TAGUCHI:/S0W1/var/zDM/V8R11ML/servers/O8B0: >ls -la
total 368
drwxrwxrwx   7 ODMUSER  SYS1        8192 Jan 30  2022 .
drwxrwxrwx   3 OMVSKERN SYS1        8192 Jan 29  2022 ..
-rw-rw-rw-   1 ODMUSER  SYS1         629 Aug 28 04:11 MlzContent.xml
-rw-rw-rw-   1 ODMUSER  SYS1         733 Aug 28 04:11 bootstrap.properties
-rw-rw-rw-   1 ODMUSER  SYS1         701 Aug 28 04:11 common.xml
-rw-rw-rw-   1 ODMUSER  SYS1         602 Aug 28 04:11 db2Type2.xml
-rw-rw-rw-   1 ODMUSER  SYS1         638 Aug 28 04:11 db2Type4.xml
-rw-rw-rw-   1 ODMUSER  SYS1         815 Aug 28 04:11 dr.xml
-rw-rw-rw-   1 ODMUSER  SYS1         412 Aug 28 04:11 ds.xml
-rw-rw-rw-   1 ODMUSER  SYS1         213 Aug 28 04:11 features18.xml
drwxrwxrwx   4 ODMUSER  SYS1        8192 Aug 28 04:26 logs
drwxrwxrwx   4 ODMUSER  SYS1        8192 Jan 29  2022 odm
-rw-rw-rw-   1 ODMUSER  SYS1         580 Aug 28 04:11 rc.xml
-rw-rw-rw-   1 ODMUSER  SYS1         173 Aug 28 04:12 resconsole.properties
drwxrwxrwx   3 ODMUSER  SYS1        8192 Jan 29  2022 resources
-rw-rw-rw-   1 ODMUSER  SYS1         288 Aug 28 04:11 securitySAF.xml
-rw-rw-rw-   1 ODMUSER  SYS1         596 Aug 28 04:11 securityWLP.xml
-rw-rw-rw-   1 ODMUSER  SYS1         471 Aug 28 04:11 server.xml
-rw-rw-rw-   1 ODMUSER  SYS1         270 Jan 29  2022 sslJava.xml
-rw-rw-rw-   1 ODMUSER  SYS1         414 Jan 29  2022 sslSAF.xml
drwxrwxrwx   4 ODMUSER  SYS1        8192 Jan 30  2022 tranlog
-rw-rw-rw-   1 ODMUSER  SYS1         156 Jan 29  2022 user.xml
drwxrwxrwx   5 ODMUSER  SYS1        8192 Aug 28 04:13 workarea
```

各構成ファイルサンプル:

<details><summary><font color="blue">server.xml</font></summary><div>

```xml:server.xml
<!-- This file was automatically generated on : 28/08/2022 09:11:03 -->
<server description="ODM Embedded Liberty Server O8B0">

    <include location="common.xml"/>
    <include location="user.xml"/>
    <include location="features18.xml"/>
    <include location="sslJava.xml"/>
    <include location="securitySAF.xml"/>
    <include location="rc.xml"/>
    <include location="dr.xml"/>
    <include location="ds.xml"/>
    <include location="db2Type4.xml"/>

</server>
```

</div></details>

<details><summary><font color="blue">common.xml</font></summary><div>

```xml:common.xml
<!-- This file was automatically generated on : 28/08/2022 09:11:03 -->
<server description="Common Liberty server information">

    <httpEndpoint id="defaultHttpEndpoint"
        host="*"
        httpPort="${WLPPORT}"
        httpsPort="${WLPSECUREPORT}"
        onError="FAIL"/>

    <library id="HBR">
        <fileset dir="${HBRINSTPATH}/zexecutionserver/lib/" includes="*.jar"/>
        <fileset dir="${HBRINSTPATH}/lib/" includes="*.so" />
    </library>

    <zosLogging disableWtoMessages="true" messageLogDD="WLPMSG"/>

    <config updateTrigger="disabled"/>
    <applicationMonitor updateTrigger="disabled" dropinsEnabled="false"/>

    <webContainer deferServletLoad="false" />

</server>
```

</div></details>

<details><summary><font color="blue">user.xml</font></summary><div>

```xml:user.xml
<server description="User defined Liberty server information">

  <!--  User Liberty configuration should be placed here  -->

</server>
```

</div></details>

<details><summary><font color="blue">features18.xml</font></summary><div>

```xml:features18.xml
<server description="Liberty 18 feature information">

  <featureManager>
    <feature>jsp-2.3</feature>
    <feature>servlet-3.1</feature>
    <feature>appSecurity-2.0</feature>
  </featureManager>

</server>
```

</div></details>

<details><summary><font color="blue">sslJava.xml</font></summary><div>

```xml:sslJava.xml
<server description="WLP SSL Java">

  <featureManager>
    <feature>ssl-1.0</feature>
  </featureManager>

  <ssl id="defaultSSLConfig" keyStoreRef="defaultKeyStore" sslProtocol="SSL_TLSv2"/>

  <keyStore id="defaultKeyStore" password="defaultPassword"/>

</server>
```

</div></details>

<details><summary><font color="blue">securitySAF.xml</font></summary><div>

```xml:securitySAF.xml
<server description="SAF security">

  <featureManager>
    <feature>zosSecurity-1.0</feature>
  </featureManager>

  <safRegistry id="saf"  />
  <safAuthorization id="saf" />
  <safCredentials profilePrefix="${WLPSAFPREF}"/>
  <safCredentials unauthenticatedUser="WSGUEST"/>

</server>
```

</div></details>

<details><summary><font color="blue">rc.xml</font></summary><div>

```xml:rc.xml
<server description="RES Console">

  <application type="war" id="res" name="res" location="${HBRINSTPATH}/executionserver/applicationservers/WLP/res.war">
    <classloader delegation="${WLPRCPOLICY}"/>
    <application-bnd>
    <security-role name="resAdministrators">
      <group name="resAdministrators"/>
    </security-role>
    <security-role name="resDeployers">
      <group name="resDeployers"/>
    </security-role>
    <security-role name="resMonitors">
      <group name="resMonitors"/>
     </security-role>
    </application-bnd>
  </application>

</server>
```

</div></details>

<details><summary><font color="blue">dr.xml</font></summary><div>

```xml:dr.xml
<server description="Decision Runner and testing">

  <featureManager>
    <feature>concurrent-1.0</feature>
  </featureManager>

  <managedExecutorService jndiName="concurrent/drExecutorService"/>

  <library id="drRaXml">
    <folder dir="${server.config.dir}/odm/dr" />
  </library>

  <application type="war" id="DecisionRunner" name="DecisionRunner" location="${HBRINSTPATH}/executionserver/applicationservers/WLP/DecisionRunner.war">
    <classloader delegation="${WLPDRPOLICY}" privateLibraryRef="HBR,drRaXml"/>
    <application-bnd>
      <security-role name="resAdministrators">
        <group name="resAdministrators"/>
      </security-role>
      <security-role name="resDeployers">
        <group name="resDeployers"/>
      </security-role>
    </application-bnd>
  </application>

</server>
```

</div></details>

<details><summary><font color="blue">ds.xml</font></summary><div>

```xml:ds.xml
<server description="Decision Service">

  <library id="dsRaXml">
    <folder dir="${server.config.dir}/odm/ds" />
  </library>

  <application type="war" id="DecisionService" name="DecisionService" location="${HBRINSTPATH}/executionserver/applicationservers/WLP/DecisionService.war">
    <classloader delegation="${WLPDSPOLICY}" privateLibraryRef="HBR,dsRaXml"/>
  </application>

</server>
```

</div></details>

<details><summary><font color="blue">db2Type4.xml</font></summary><div>

```xml:db2Type4.xml
<server description="DB2 type 4">

  <featureManager>
    <feature>jdbc-4.1</feature>
  </featureManager>

  <jdbcDriver id="DB2T4" libraryRef="DB2T4LibRef" />

  <library id="DB2T4LibRef">
    <fileset dir="${DB2JARLOCN}"  />
    <fileset dir="${DB2NATIVELOC}"  />
  </library>

  <dataSource id="jdbc/resdatasource" jndiName="jdbc/resdatasource" jdbcDriverRef="DB2T4" type="javax.sql.DataSource" >
    <properties.db2.jcc driverType="4" databaseName="${DB2LOCATION}" currentSchema="${DB2SCHEMA}" serverName="${DB2SERVNAME}"
        portNumber="${DB2PORT}" user="${DB2USER}" password="${DB2PSWD}" />
  </dataSource>

</server>
```

</div></details>

<details><summary><font color="blue">bootstrap.properties</font></summary><div>

```bootstrap.properties
# This file was automatically generated on : 28/08/2022 09:11:03
# Bootstrap.properties for Embedded Liberty

websphere.os.extension=zosNoConsoleExtensions-1.0
com.ibm.ws.logging.console.log.level=OFF
com.ibm.ws.zos.core.angelRequired=true
com.ibm.ws.zos.core.angelName=O8B0ANGL

#
# Liberty Information
#
WLPSAFPREF=O8B0
WLPPORT=34114
WLPSECUREPORT=24114

#
# DB2 Information
#
DB2JARLOCN=/usr/lpp/db2c10/jdbc/classes
DB2NATIVELOC=/usr/lpp/db2c10/jdbc/lib
DB2LOCATION=DALLASC
DB2SCHEMA=ODM811
DB2SERVNAME=localhost
DB2PORT=5040
DB2USER=IBMUSER
DB2PSWD=SYS1
DB2SUBSYSTEM=DBCG

#
# ODM Information
#
HBRINSTPATH=/usr/lpp/zDM/V8R11ML

#
# Class Loading Policies
#
WLPDRPOLICY=parentLast
WLPRCPOLICY=parentLast
WLPDSPOLICY=parentLast
```

</div></details>

<details><summary><font color="blue">resconsole.properties</font></summary><div>

```resconsole.properties
# This file has been automatically generated

management.protocol=tcpip
management.tcpip.port=44114

resconsole-logging-config-filename=O8B0-resconsole.logging.properties
```

</div></details>

#### ログ・ファイル関連

RES ConsoleはLiberty上のアプリケーションとして稼働します。RES Console上にはzRES機能も含まれますので、関連するログファイルとしては以下の3つがあります。

##### (1) Libertyが出力するログ
Liberty構成用のディレクトリ下のlogsディレクトリに、messages.logファイルが出力されます。
例: `/var/zDM/V8R11ML/servers/O8B0/logs/messages.log`

Libertyが出力するものですのでログ出力についての制御はLibertyの構成で行うことになります(Libertyのドキュメント要確認)。

##### (2) RES Console機能が出力するログ

ログファイルの制御は、`/var/zDM/V8R11ML/config/console/O8B0-resconsole.logging.properties`で設定されたパラメーターを元に行われます。

<details><summary><font color="blue">O8B0-resconsole.logging.properties例</font></summary><div>

```O8B0-resconsole.logging.properties
# This file has been automatically generated

res-console-logging-file=/var/zDM/V8R11ML/servers/O8B0/logs/res-console
res-console-logging-count=2
res-console-logging-append=false
res-console-logging-limit=10000000
```

</div></details>

参考: [Setting the granularity of log messages](https://www.ibm.com/docs/en/odm/8.11.0?topic=events-setting-granularity-log-messages)

デフォルトでは`/var/zDM/V8R11ML/servers/O8B0/logs/res-console0.log` に出力されます。

##### (3) zRES機能が出力するログ

ログファイルの制御は、`/var/zDM/V8R11ML/config/res/O8B0.logging.properties`で設定されたパラメーターを元に行われます。

<details><summary><font color="blue">O8B0.logging.properties例</font></summary><div>

```O8B0.logging.properties
# This file has been automatically generated

# The logging level is set by the HBRTRACELEVEL parameter, as defined in ++HBRWORKDS++.SHBRPARM(HBRCMMN)
.level = WARNING
com.ibm.ws.level = WARNING
com.ibm.websphere.level = WARNING
com.sun.level = WARNING
com.ibm.wsspi.level = WARNING

# Which handlers are in use
handlers=java.util.logging.FileHandler

# Naming style for the output file:
java.util.logging.FileHandler.pattern=/var/zDM/V8R11ML/logs/O8B0-runtime-%g.log

# Limiting size of output file in bytes:
java.util.logging.FileHandler.limit=10000000

# Number of output files to cycle through, by appending an integer to the base file name:
java.util.logging.FileHandler.count=3

# Append to the existing logs or not
java.util.logging.FileHandler.append=true

# Style of output (Simple or XML):
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
```

</div></details>


デフォルトでは`/var/zDM/V8R11ML/logs/O8B0-runtime-0.log` に出力されます。

## zRES

各種構成ファイルとの相関図を以下に示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/62d87edc-1a04-5562-7645-ce69f9a754e6.png)

### 起動パラメーター補足(PDSメンバー)
PDSメンバーとして提供される各種起動パラメーターについて補足します。

※各パラメーターの詳細は以下のマニュアルも参照のこと。
参考: [ODM V811 - z/OS runtime variables](https://www.ibm.com/docs/en/odm/8.11.0?topic=configuring-zos-runtime-variables)

#### HBRMSTR(全般)

<details><summary><font color="blue">ODM811.WORK.O8B1.SHBRPARM(HBRMSTR)サンプル</font></summary><div>

```
HBRSSID=O8B1
HBRWORKPATH=/var/zDM/V8R11ML
HBRINSTPATH=/usr/lpp/zDM/V8R11ML
HBRMODE=RULE
HBRPORT=34114
HBRSECUREPORT=24114
HBRWLPANGELNAME=O8B0ANGL
HBRWLPSTRICTTRANSPORT=false
HBRSSLKEYSTORE=JAVA
HBRARMENABLED=NO
HBRSMFST100=YES
HBRPRINTWTO=YES
HBRLOGTIMEOUTS=NO
HBRLOGLONGEXECTIME=0
HBRLOGLONGEXECPARMS=NO
HBRCONFIG=YES
JAVA_OPTIONS=-Xms128M -Xmx768M
JAVA_HOME=/usr/lpp/java/J8.0_64
LIBPATH_SUFFIX=
CLASSPATH_SUFFIX=
HBRBAIENABLE=false
HBRBAITOPIC=bai-odm-z-example
HBRBAIBOOTSTRAPSERVERS=bootstrap.example.com
HBRBAISECURITYPROTOCOL=SASL_SSL
HBRBAISSLTRUSTSTORELOCATION=/u/rules/truststore.jks
HBRBAISSLTRUSTSTOREPASSWORD=password
HBRBAISSLTRUSTSTOREPROTOCOL=TLSv1.2
HBRBAISASLMECHANISM=PLAIN
HBRBAISASLJAASCONFIGMODULE=plain.PlainLoginModule
HBRBAISASLJAASCONFIGOPTIONS=required
HBRBAISASLJAASCONFIGUSERNAME=kafkauser
HBRBAISASLJAASCONFIGPASSWORD=kafkapass
```

</div></details>

主要ないくつかのパラメーターについて補足します。

- **HBRSSID**: サブシステムID
- **HBRWORKPATH**: USS上に管理される構成ファイルやログなどを配置するディレクトリ。
- **HBRMODE**: 当該コンポーネントの稼働モードを指定。上の例だとzRESとして稼働させることを意味する。
- **HBRCONFIG**: USS上の構成ファイルを自動生成するかどうかを指定。デフォルトYES。YESの場合USS上の各種構成ファイル(後述)が起動時に自動生成される。例えば、初回起動時はHBRCONFIG=YESを指定し、生成されたファイルをカスタマイズした後、2回目以降の起動の際はHBRCONFIG=NOを指定して起動する運用を行う。
- **JAVA_OPTIONS**: JVMのオプション。
- **HBRBAIxx**: BAI(Business Automation Insight)機能関連のパラメーター。今回はBAIの利用は想定していないので無視。

#### HBRPSIST(Db2関連)

<details><summary><font color="blue">ODM811.WORK.O8B1.SHBRPARM(HBRPSIST)サンプル</font></summary><div>

```
HBRPERSISTENCETYPE=DB2
HBRFILEPATH=/var/zDM/V8R11ML/res_data
HBRXOMFILEPATH=/var/zDM/V8R11ML/res_xom
DB2SERVNAME=localhost
DB2PORT=5040
DB2LOCATION=DALLASC
DB2SCHEMA=ODM811
DB2JARLOCN=/usr/lpp/db2c10/jdbc/classes
DB2NATIVELOC=/usr/lpp/db2c10/jdbc/lib
DB2SUBSYSTEM=DBCG
HBRDBURL=jdbc:db2://+
           localhost:+
           5040/+
           DALLASC:+
           currentSchema=ODM811;
HBRDBT2URL=jdbc:db2:+
           DALLASC:+
           currentSchema=ODM811;+
           fullyMaterializeLobData=false;
HBRDBCONTYPE=4
HBRDBUSER=IBMUSER
HBRDBPASSWORD=SYS1
HBRDBJARS=/usr/lpp/db2c10/jdbc/classes/db2jcc.jar:+
          /usr/lpp/db2c10/jdbc/classes/db2jcc_license_cisuz.jar
```

</div></details>

ここでは、ODM関連のデータ保管用に使用するDb2アクセス情報を指定します。Db2へのアクセスにはJDBCが使用されますので、JDBC接続に必要な各種パラメーターを設定することになります。

#### HBRCMMN(通信関連)

<details><summary><font color="blue">ODM811.WORK.O8B1.SHBRPARM(HBRCMMN)サンプル</font></summary><div>

```
HBRLANG=En_US
HBRCCSID=1047
HBRCONSOLECOM=YES
HBRCONSOLECOMPORT=44114
HBRCONSOLECOMHOST=localhost
HBRINTERCEPTORS=NO
HBRIFAUSAGE=YES
HBRTRACELEVEL=WARNING
HBRLOGFILESIZE=10000000
HBRLOGFILENUM=3
HBRLOGFILEAPPEND=true
```

</div></details>

RES Console - zRESサーバー間通信、およびトレース・レベルについての設定を行います。
主要ないくつかのパラメーターについて補足します。

- **HBRCONSOLECOMPORT**: RES ConsoleとzRESサーバー通信に使用するConsole側がListenするポート番号
- **HBRCONSOLECOMHOST**: RES ConsoleがListenしているポートがバインドされているホスト名
- **HBRTRACELEVEL**: 実行時のトレース・レベルを指定(ALL|FINE|INFO|WARNING|SEVERE|OFF)

### USSファイル補足

zRESのログ・ファイル関連の構成ファイルなどが生成されます。
これらはHBRMSTRのパラメーターでHBRCONFIG=YES指定で起動した際に自動で作成されます。
※HBRCONFIG=YESで起動すると既存のファイルは上書きされてしまうので、カスタマイズ後はHBRCONFIG=NOで起動する必要があります。

#### ログ・ファイル関連

ログファイルの制御は、`/var/zDM/V8R11ML/config/res/O8B1.logging.properties`で設定されたパラメーターを元に行われます。

<details><summary><font color="blue">O8B1.logging.properties例</font></summary><div>

```O8B1.logging.properties
# This file has been automatically generated

# The logging level is set by the HBRTRACELEVEL parameter, as defined in ++HBRWORKDS++.SHBRPARM(HBRCMMN)
.level = WARNING

# Which handlers are in use
handlers=java.util.logging.FileHandler

# Naming style for the output file:
java.util.logging.FileHandler.pattern=/var/zDM/V8R11ML/logs/O8B1-runtime-%g.log

# Limiting size of output file in bytes:
java.util.logging.FileHandler.limit=10000000

# Number of output files to cycle through, by appending an integer to the base file name:
java.util.logging.FileHandler.count=3

# Append to the existing logs or not
java.util.logging.FileHandler.append=true

# Style of output (Simple or XML):
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
```

</div></details>


デフォルトでは`/var/zDM/V8R11ML/logs/O8B1-runtime-0.log` に出力されます。

## CICS

各種構成ファイルとの相関図を以下に示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/db966e38-d916-3e41-2015-c21f7d31c15c.png)


### 起動パラメーター補足(PDSメンバー)
PDSメンバーとして提供される各種起動パラメーターについて補足します。

※各パラメーターの詳細は以下のマニュアルも参照のこと。
参考: [ODM V811 - z/OS runtime variables](https://www.ibm.com/docs/en/odm/8.11.0?topic=configuring-zos-runtime-variables)

#### HBRMSTR(全般)

<details><summary><font color="blue">ODM811.WORK.CICS.SHBRPARM(HBRCICSZ)サンプル</font></summary><div>

```
* The zRule Execution Server to connect to
HBRSSIDLIST=O8B1,O8B2

* Specifies the target for rule execution. Change this to
* RCICSJVM to connect this CICS to a CICS ROR
HBRTARGETRES=ZRES

* Specifies the number of seconds to wait for a response
* from the zRule Execution Server stand alone
* 0 = No timeout
* 1 - 60000 = Seconds to wait for rule execution to complete
* (Use property HBRLOGTIMEOUTS in the HBRMSTR parms
*  member to record client timeouts in the server's log)
HBRTIMEOUT=0
```

</div></details>

主要ないくつかのパラメーターについて補足します。

- **HBRSSIDLIST**: 接続先のzRESのSSIDのリストを指定します。基本的に先頭に指定されたzRESを使用します。先頭のzRESが使用できない場合に後続のzRESが使用されます。
- **HBRTARGETRES**: 接続先がzRESであることを指定。

#### HBRCMMN(通信関連)

<details><summary><font color="blue">ODM811.WORK.CICS.SHBRPARM(HBRCMMN)サンプル</font></summary><div>

```
HBRLANG=En_US
HBRCCSID=1047
HBRCONSOLECOM=YES
HBRCONSOLECOMPORT=44114
HBRCONSOLECOMHOST=localhost
HBRINTERCEPTORS=NO
HBRIFAUSAGE=YES
HBRTRACELEVEL=WARNING
HBRLOGFILESIZE=10000000
HBRLOGFILENUM=3
HBRLOGFILEAPPEND=true
```

</div></details>

HBRCMMNは、基本的にRES Console - zRESサーバー間通信についての設定を行うものです。今回の構成ではCICSはルールを呼び出すクライアント・アプリケーションの稼働環境として使用する想定なので、RES Consoleとの通信は行いません。そのため実質的にはここではHBRCOMMNは使われないはずですが、マニュアル上これを設定する手順になっているのでガイドに従ってCICS起動プロシージャーのHBRENVPR DDにコンカチしておきます。
(HBRCMMNはCICS上でzRESを稼働させる構成の場合には使用されることになります。)


# 各種情報取得

## 統計情報
RES Consoleを使用して、ルールセットごとに統計情報を確認することができます。

RES Consoleの「エクスプローラー」タブからルールセットを選択し、ルール・セット・ビュー内の「統計値の表示」タブをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/5f9c677b-b6ac-d069-874c-a8dd3190fc00.png)

全体、およびRESごとに、呼び出された回数、平均/最大/最小/直近の処理時間などが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/5652abce-9a37-14af-f405-ac56231c78c5.png)

## 意思決定トレース
RES Consoleを使用して、ルールセットごとに意思決定のトレースを制御することができます。
ここでは先にセットアップしたCOBOLバッチから呼ばれるルールについてのトレースを取得する流れを具体的に見ていきます。
参考: [(6) z/OS上でのルール呼び出し](https://qiita.com/tomotagwork/items/577895e05f9ec5e40c06)

### 意思決定トレースの有効化
RES Consoleの「エクスプローラー」タブからルールセットを選択し、ルール・セット・ビュー内の「意思決定ウェアハウス・オプション」の欄の編集アイコンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d029ab03-d80c-2f6d-ff6e-221f09fa59de.png)

「意思決定ウェアハウスでのトレースを使用可能にする」にチェックし、「ネイティブフォーマット」を選択
その他トレースオプションは適宜選択して、保存。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/1768741d-b70d-f463-3e61-939100fe4530.png)

上のトレース設定をして保存すると、プロパティーとして以下の項目が自動的に設定されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7fa38d26-c018-2a4e-8035-6eab8626a28b.png)

### ルール呼び出し

トレースを取得したいルールが呼び出されるテストシナリオを実行します。
ここでは、前の記事で作成したバッチ呼び出しのJCLを実行します。
[(6) z/OS上でのルール呼び出し - Task 6: Executing the COBOL application](https://qiita.com/tomotagwork/items/577895e05f9ec5e40c06#task-6-executing-the-cobol-application)

### トレース確認
RES Consoleの「意思決定ウェアハウス」タブを開いて検索ボタンをクリック。
※トレース結果が大量にある場合は適宜各フィールドにフィルター条件を設定して絞り込みが行えます。何も指定しなければ全件検索されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b8d20958-8f27-6ad1-0f58-763796225bd6.png)

検索結果から確認したいトレースの「意思決定の詳細を表示」のリンクをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/3143f514-ff35-a9e3-cb5c-c4c548249cb3.png)

実行されたルール・フローのタスク、入出力パラメーターなどが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/68173673-a33b-8f24-fbb8-ec44fd4baaa5.png)

### トレース無効化
トレースが不要になったら無効化しておきます。
RES Consoleの「エクスプローラー」タブからルールセットを選択し、ルール・セット・ビュー内の「意思決定ウェアハウス・オプション」の欄の編集アイコンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/32e6a908-7f03-16a1-2280-a56188b07ce9.png)

「意思決定ウェアハウスでのトレースを使用可能にする」のチェックをはずして保存。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/358aa13e-be22-5d0f-f60b-10fbca99fb85.png)

「プロパティー」の欄に、"monitoring.enabled", "ruleset.sequential.trace.enabled" が残っているので、これらを選択して削除ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/720015c5-c574-e780-4ae4-1eee755ddeab.png)

確認ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/fe5d4821-9e37-bc49-152b-b6855d0b9086.png)

## GCログ
RES ConsoleやzRESはJavaが使用されていますのでJavaの観点でヒープサイズのチューニングなどを実施する必要があります。これはzODMに特化した考え方ではなく、一般的なJVMの管理と同じようにGCの状況を元にして実施することになります。(JVMのオプションでGCログの出力をさせ、それをツールに取り込んで分析するということになります。)

参考: 
[IBM SDK Java Technology Edition 8 - Garbage collection](https://www.ibm.com/docs/en/sdk-java-technology/8?topic=management-garbage-collection-gc)
[IBM SDK Java Technology Edition 8 - Verbose garbage collection logs](https://www.ibm.com/docs/en/sdk-java-technology/8?topic=gc-verbose-logs)
[IBM SDK Java Technology Edition 8 - Standard command-line options](https://www.ibm.com/docs/en/sdk-java-technology/8?topic=options-standard)
[IBM SDK Java Technology Edition 8 - -Xverbosegclog](https://www.ibm.com/docs/en/sdk-java-technology/8?topic=options-xverbosegclog)
[IBMのWASはJVMやGCをどのように扱っているのか？](https://atmarkit.itmedia.co.jp/ait/articles/0708/02/news122_2.html)

### GCログ取得設定例

RES Console, zRES の HBRMSTRメンバーにて以下のようにJVMのオプションを指定

```HBRMSTR設定例
...
JAVA_OPTIONS=-Xms128M -Xmx768M +
             -verbose:gc +
             -Xverbosegclog:/var/zDM/V8R11ML/logs/verbosegc.O8B1.%Y%m%d.%H%M%S.%pid.txt
...
```

- **-verbose:gc** GCログの取得を有効化
- **-Xverbosegclog** GCログ出力先のUSSファイルを指定


### GCログの可視化例

Eclipseのプラグインとして提供されるGCVMを用いてGCログを可視化した例
参考: [IBM Monitoring and Diagnostic Tools - Garbage Collection and Memory Visualizer (GCMV)](https://marketplace.eclipse.org/content/ibm-monitoring-and-diagnostic-tools-garbage-collection-and-memory-visualizer-gcmv)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/5b819ecf-bcd2-0ffe-8b92-d9a3a73a05ab.png)