SMF Explorerによるパフォーマンス情報可視化 - (2) 環境セットアップ

# はじめに
SMF Explorerを利用するために必要な環境のセットアップ手順例を示します。
ここでは、VS Code上のJupyter Notebookからz/OSMF(SMF REST Service)経由でSMFデータにアクセスするための環境構築を目指します。

## 関連記事

[SMF Explorerによるパフォーマンス情報可視化 - (1) 概要](https://qiita.com/tomotagwork/items/3104615be1e0fca0f5bd)
[SMF Explorerによるパフォーマンス情報可視化 - (2) 環境セットアップ](https://qiita.com/tomotagwork/items/5760b218e29aeb7c1a3b)
[SMF Explorerによるパフォーマンス情報可視化 - (3) SMF Explorer使用方法](https://qiita.com/tomotagwork/items/313a1755cb91be5cb57c)
[SMF Explorerによるパフォーマンス情報可視化 - (4) Tipsなど](https://qiita.com/tomotagwork/items/205234eab8e5b9bf74e4)

# 全体像

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/8e2c6036-59e9-47ca-b19e-e7b5071df518.png)

# z/OS側セットアップ例

z/OS側では、SMF REST Serviceを有効化したz/OSMFを構成する必要があります。SMF REST Serviceを有効化すると、他のz/OSMFサービスが利用できなくなりますので、z/OSMFサーバーをSMF REST Service以外で使用している場合は、別途SMF REST Service専用のz/OSMFを構築する必要があります。

また、z/OSはV2.5以降 + PTF:UJ95534 が必要です。
参考: [Prerequisites](https://ibm.github.io/IBM-SMF-Explorer/get-started/#prerequisites)

ここでは、z/OS 3.1上にz/OSMFの構成がすでに存在する前提で、SMF REST Service専用のz/OSMFインスタンスを追加構成する例を示します。



## (参考)既存のz/OS環境

以下のような構成がされているものとします。

### Angel Process

<details><summary><font color="blue">起動プロシージャー</font></summary><div>

```xxx:SYS1.PROCLIB(IZUANG1) 
//IZUANG1  PROC P='',C=N,OUTCLS='*',
//   IZUTIME=NOLIMIT,
//   NAME=IZUANG1,
//   WLPDIR='/usr/lpp/zosmf/liberty'
//*--------------------------------------------------------------*/
//* Startup procedure for the z/OSMF Websphere Liberty Profile   */
//* Angel process.                                               */
//*--------------------------------------------------------------*/
//*
//STEP1   EXEC PGM=BPXBATA2,REGION=0M,
//  TIME=&IZUTIME.,
//  PARM='PGM &WLPDIR./lib/native/zos/s390x/bbgzangl COLD=&C NAME=&NAME
//              &P'
//STDOUT    DD  SYSOUT=&OUTCLS
//STDERR    DD  SYSOUT=&OUTCLS
```

</div></details>

<details><summary><font color="blue">RACF STARTEDクラス: IZUANG1.*</font></summary><div>

```
RLIST STARTED IZUANG1.* STDATA
CLASS      NAME
-----      ----
STARTED    IZUANG1.* (G)

LEVEL  OWNER      UNIVERSAL ACCESS  YOUR ACCESS  WARNING
-----  --------   ----------------  -----------  -------
 00    IBMUSER         NONE               NONE    NO

INSTALLATION DATA
-----------------
NONE

APPLICATION DATA
----------------
NONE

AUDITING
--------
FAILURES(READ)

NOTIFY
------
NO USER TO BE NOTIFIED

STDATA INFORMATION
------------------
USER= IZUSVR
GROUP= IZUADMIN
TRUSTED= NO
PRIVILEGED= NO
TRACE= YES
```

</div></details>

### z/OSMFサーバー

<details><summary><font color="blue">起動プロシージャー</font></summary><div>

```xxx:SYS1.PROCLIB(IZUSVR1) 
//IZUSVR1  PROC PARMS='zosmfServer',     /* Server parms          */
//      ROOT='/usr/lpp/zosmf',           /* z/OSMF installation root */
//      WLPDIR='/usr/lpp/zosmf/liberty', /* Liberty directory        */
//      OUTCLS='*',                      /* SYSOUT class             */
//      USERDIR='/global/zosmf',         /* Configuration directory  */
//      TRACE='N',                       /* Trace option             */
//      KCINDEX='Y',                     /* KC index rebuild flag */
//      IZUPRM='00',                     /* Parmlib suffixes or PREV */
//      SERVER='AUTOSTART',              /* AUTOSTART server         */
//      Z='0',                           /* Reserved for IBM         */
//      IZUMEM=4G                        /* Server memlimit          */
//*
//*--------------------------------------------------------------*/
//* z/OSMF AUTOSTART Websphere Liberty Profile server startup    */
//* procedure                                                    */
//*--------------------------------------------------------------*/
//*------------------------------------------------------------------
//* Parse z/OSMF PARMLIB member
//*------------------------------------------------------------------
//ZPARM   EXEC  PGM=IZUPARMS,REGION=0M,
// PARM='/IZUPRM=&IZUPRM,TRACE=&TRACE,USERDIR=&USERDIR,SERVER=&SERVER,Z
//             =&Z'
//*
//DFLTCFG  DD  PATH='&ROOT./defaults/configuration.defaults'
//*
//STDOUT   DD  SYSOUT=&OUTCLS
//STDERR   DD  SYSOUT=&OUTCLS
//CEEDUMP  DD  SYSOUT=&OUTCLS
//*
//*------------------------------------------------------------------
//* Configure z/OSMF server
//*------------------------------------------------------------------
//CONFZMF EXEC PGM=BPXBATCH,REGION=0M,COND=(0,LT),
// PARM='SH &ROOT./bin/izuconfig.sh &ROOT &USERDIR &TRACE &KCINDEX'
//*
//SYSPRINT DD  SYSOUT=&OUTCLS
//SYSOUT   DD  SYSOUT=&OUTCLS
//STDERR   DD  SYSOUT=&OUTCLS
//STDOUT   DD  SYSOUT=&OUTCLS
//*
//*------------------------------------------------------------------
//* Start the Websphere Liberty Profile server
//*
//* WLPUDIR - PATH DD that points to the Liberty Profile's "user"
//*           directory. If the DD is not allocated, the user
//*           directory location defaults to the wlp/usr directory
//*           in the install tree.
//* STDOUT  - Destination for stdout (System.out)
//* STDERR  - Destination for stderr (System.err)
//* STDENV  - Initial Unix environment - read by the system.  The
//*           installation default and server specific server
//*           environment files will be merged into this environment
//*           before the JVM is launched.
//*------------------------------------------------------------------
//ZOSMF   EXEC  PGM=BPXBATSL,REGION=0M,COND=(0,LT),
//  MEMLIMIT=&IZUMEM.,TIME=NOLIMIT,
//  PARM='PGM &WLPDIR./lib/native/zos/s390x/bbgzsrv --clean &PARMS'
//*
//WLPUDIR  DD  PATH='&USERDIR./configuration'
//*
//STDOUT   DD  SYSOUT=&OUTCLS
//STDERR   DD  SYSOUT=&OUTCLS
//*STDOUT   DD PATH='&ROOT/izusvr1.stdout',
//*            PATHOPTS=(OWRONLY,OCREAT,OTRUNC),
//*            PATHMODE=SIRWXU
//*STDERR   DD PATH='&ROOT/izusvr1.stderr',
//*            PATHOPTS=(OWRONLY,OCREAT,OTRUNC),
//*            PATHMODE=SIRWXU
```

</div></details>


<details><summary><font color="blue">パラメータ(IZUPRMxx)</font></summary><div>

```xxx:SYS1.PARMLIB(IZUPRM00)
HOSTNAME('*')

HTTP_SSL_PORT(10443)

INCIDENT_LOG UNIT('SYSALLDA')

JAVA_HOME('/usr/lpp/java/java17/J17.0_64')

KEYRING_NAME('ZOSMF_RING')

LOGGING('*=warning:com.ibm.zoszmf.*=info:com.ibm.zoszmf.environment.ui=
finer')

RESTAPI_FILE ACCT(IZUACCT) REGION(65536) PROC(IZUFPROC)

COMMON_TSO ACCT(IZUACCT) REGION(50000) PROC(IZUFPROC)

SAF_PREFIX('IZUDFLT')

SEC_GROUPS USER(IZUUSER),ADMIN(IZUADMIN),SECADMIN(IZUSECAD)

SESSION_EXPIRE(495)

TEMP_DIR('/tmp')

UNAUTH_USER(IZUGUEST)

SERVER_PROC('IZUSVR1')

ANGEL_PROC('IZUANG1')

AUTOSTART('CONNECT')

AUTOSTART_GROUP('NONE')

USER_DIR('/global/zosmf')

CLOUD_SEC_ADMIN('IBMUSER')

WLM_CLASSES DEFAULT(IZUGHTTP)
            LONG_WORK(IZUGWORK)

/* Uncomment PLUGINS statement and the names of the plugins you
    wish to use below:                                              */

/* PLUGINS( CAPACITY_PROV,
             COMMSERVER_CFG,
             INCIDENT_LOG,
             ISPF,
             RESOURCE_MON,
             SOFTWARE_MGMT,
             SYSPLEX_MGMT,
             WORKLOAD_MGMT,
             ZERT_ANALYZER)   */

PLUGINS(COMMSERVER_CFG,
        ISPF,
        SOFTWARE_MGMT,
        RESOURCE_MON,
        WORKLOAD_MGMT)
```

</div></details>


<details><summary><font color="blue">DISPLAY IZU</font></summary><div>

参考: [Displaying the z/OSMF server settings](https://www.ibm.com/docs/en/zos/3.1.0?topic=system-displaying-zosmf-server-settings)

`F IZUSVR1,DISPLAY IZU`コマンド実行結果(一部サニタイズしています)

```
VS01      2025070  09:11:45.42            -f IZUSVR1,DISPLAY IZU
VS01      2025070  09:11:45.45  STC00082   +CWWKB0004I: z/OSMF PARMLIBs DISPLAY
                                             IZUG200I The home page of z/OSMF server in SYSTEM(VS01)
                                             https://xxx:10443/zosmf
                                             IZUG041I The server started at  03/09/2025 11:30:08
                                              and has been running for  1 day(s) 21 hour(s) 41 minute(s) 36 second
                                            (s)

                                             Current z/OSMF settings                               Source

                                             HOSTNAME(xxx)                                         IZUPRM00
VS01      2025070  09:11:45.45  STC00082   +CWWKB0061I CONTINUATION 1 FOR MESSAGE IDENTIFIER 18775
                                             HTTP_SSL_PORT(10443)                                  IZUPRM00
                                             LOGGING('*=warning:com.ibm.zoszmf.*=info:com.ibm.zoszm
                                             f.environment.ui=finer')                              IZUPRM00
                                             UNAUTH_USER(IZUGUEST)                                 IZUPRM00
                                             SEC_GROUPS
                                                 ADMIN(IZUADMIN)                                   IZUPRM00
                                                 USER(IZUUSER)                                     IZUPRM00
                                                 SECADMIN(IZUSECAD)                                IZUPRM00
                                             SAF_PREFIX(IZUDFLT)                                   IZUPRM00
VS01      2025070  09:11:45.45  STC00082   +CWWKB0061I CONTINUATION 2 FOR MESSAGE IDENTIFIER 18775
                                             CLOUD_SAF_PREFIX(IYU)                                 DEFAULT
                                             KEYRING_NAME(ZOSMF_RING)                              IZUPRM00
                                             SESSION_EXPIRE(495)                                   IZUPRM00
                                             WLM_CLASSES
                                                 LONG_WORK(IZUGWORK)                               IZUPRM00
                                                 DEFAULT(IZUGHTTP)                                 IZUPRM00
                                             JAVA_HOME(/usr/lpp/java/java17/J17.0_64)              IZUPRM00
                                             TEMP_DIR(/tmp)                                        IZUPRM00
                                             INCIDENT_LOG UNIT(SYSALLDA)                           IZUPRM00
VS01      2025070  09:11:45.45  STC00082   +CWWKB0061I CONTINUATION 3 FOR MESSAGE IDENTIFIER 18775
                                             RESTAPI_FILE
                                                 ACCT(IZUACCT)                                     IZUPRM00
                                                 PROC(IZUFPROC)                                    IZUPRM00
                                                 REGION(65536)                                     IZUPRM00
                                             COMMON_TSO
                                                 ACCT(IZUACCT)                                     IZUPRM00
                                                 PROC(IZUFPROC)                                    IZUPRM00
                                                 REGION(50000)                                     IZUPRM00
                                             AUTOSTART_GROUP(NONE)                                 IZUPRM00
VS01      2025070  09:11:45.46  STC00082   +CWWKB0061I CONTINUATION 4 FOR MESSAGE IDENTIFIER 18775
                                             AUTOSTART(CONNECT)                                    IZUPRM00
                                             SERVER_PROC(IZUSVR1)                                  IZUPRM00
                                             ANGEL_PROC(IZUANG1)                                   IZUPRM00
                                             USER_DIR(/global/zosmf)                               IZUPRM00
                                             CSRF_SWITCH(ON)                                       DEFAULT
                                             CLOUD_SEC_ADMIN(IBMUSER)                              IZUPRM00

                                             Status of z/OSMF plugins

VS01      2025070  09:11:45.46  STC00082   +CWWKB0061I CONTINUATION 5 FOR MESSAGE IDENTIFIER 18775
                                             Configuration Assistant(STARTED)                      IZUPRM00
                                             Capacity Provisioning(UNSPECIFIED)                    DEFAULT
                                             Workload Management(STARTED)                          IZUPRM00
                                             Resource Monitoring(STARTED)                          IZUPRM00
                                             Incident Log(UNSPECIFIED)                             DEFAULT
                                             Software Management(STARTED)                          IZUPRM00
                                             WebISPF(STARTED)                                      IZUPRM00
                                             ZERT(UNSPECIFIED)                                     DEFAULT
                                             Sysplex Management(UNSPECIFIED)                       DEFAULT
VS01      2025070  09:11:45.46  STC00082   +CWWKB0005I: COMMAND RESPONSES COMPLETED SUCCESSFULLY FROM display
                                            izu|setizu Command Handler.
VS01      2025070  09:11:45.46  STC00082   +CWWKB0002I: MODIFY COMMAND DISPLAY IZU COMPLETED SUCCESSFULLY.
```

</div></details>


<details><summary><font color="blue">RACF STARTEDクラス: IZUSVR1.*</font></summary><div>

```
RLIST STARTED IZUSVR1.* STDATA
CLASS      NAME
-----      ----
STARTED    IZUSVR1.* (G)

LEVEL  OWNER      UNIVERSAL ACCESS  YOUR ACCESS  WARNING
-----  --------   ----------------  -----------  -------
 00    IBMUSER         NONE               NONE    NO

INSTALLATION DATA
-----------------
NONE

APPLICATION DATA
----------------
NONE

AUDITING
--------
FAILURES(READ)

NOTIFY
------
NO USER TO BE NOTIFIED

STDATA INFORMATION
------------------
USER= IZUSVR
GROUP= IZUADMIN
TRUSTED= NO
PRIVILEGED= NO
TRACE= YES
```

</div></details>

### USS

<details><summary><font color="blue">zFS</font></summary><div>

```xxx:/global/zosmf 
IBMUSER : /global/zosmf : > df -k | grep zosmf
/global/zosmf  (OMVS.VS01.SIZUUSRD.ZFS)  21458/172800   4294964075 Available

IBMUSER : /global/zosmf : > ls -la
total 64
drwxr-xr-x   4 IZUSVR   IZUADMIN    8192 Jul 16  2021 .
drwxr-xr-x   5 BPXROOT  SSHDG       8192 Mar  9 11:08 ..
drwxrwxr-x   9 IZUSVR   IZUADMIN    8192 Mar  9 11:31 configuration
drwxrwx---  10 IZUSVR   IZUADMIN    8192 Mar  9 11:31 data

IBMUSER : /global/zosmf : > ls -la configuration/servers/zosmfServer
total 192
drwxrwxr-x   4 IZUSVR   IZUADMIN    8192 Mar  9 11:30 .
drwxrwxr-x   3 IZUSVR   IZUADMIN    8192 Jul 17  2021 ..
drwxrwxr-x   2 IZUSVR   IZUADMIN    8192 Mar  9 11:30 apps
-rw-r--r--   1 IZUSVR   IZUADMIN    5581 Mar  9 11:30 bootstrap.properties
-rw-r--r--   1 IZUSVR   IZUADMIN    5581 Mar  9 11:30 bootstrap.properties.old
-rw-r--r--   1 IZUSVR   IZUADMIN     224 Mar  9 11:30 izu.config.properties
-rw-r--r--   1 IZUSVR   IZUADMIN    1299 Mar  9 11:30 jvm.options
lrwxrwxrwx   1 IZUSVR   IZUADMIN      76 Mar  9 11:30 jvm.security.override.properties -> /usr/lpp/zosmf/defaults/servers/zosmfServer/jvm.security.override.properties
-rw-r--r--   1 IZUSVR   IZUADMIN    1174 Mar  9 11:30 kc.properties
drwxrwx---   3 IZUSVR   IZUADMIN    8192 Jul 17  2021 resources
-rw-r--r--   1 IZUSVR   IZUADMIN     714 Mar  9 11:30 server.env
-rwxr-xr-x   1 IZUSVR   IZUADMIN   15835 Mar  9 11:30 server.xml

```

</div></details>



<details><summary><font color="blue">Data Gatherer REST Serviceインストール・パス</font></summary><div>

※APAR [OA66399](https://www.ibm.com/support/pages/apar/OA66399)、[PH61005](https://www.ibm.com/support/pages/apar/PH61005) でインストール・パスが変更されています

```/usr/lpp/grb
IBMUSER : /usr/lpp/grb : > ls -la
total 80
drwxr-xr-x   5 BPXROOT  SSHDG       8192 Sep 16 18:50 .
drwxr-xr-x  62 BPXROOT  SSHDG       8192 Nov 28 02:09 ..
drwxr-xr-x   2 BPXROOT  SSHDG       8192 Aug  5  2024 IBM
drwxr-xr-x   4 BPXROOT  SSHDG       8192 Jul 10  2024 REST
drwxr-xr-x   2 BPXROOT  SSHDG       8192 Aug  1  2024 smf_explorer

IBMUSER : /usr/lpp/grb : > ls -la smf_explorer
total 3200
drwxr-xr-x   2 BPXROOT  SSHDG       8192 Aug  1  2024 .
drwxr-xr-x   5 BPXROOT  SSHDG       8192 Sep 16 18:50 ..
-rwxr-xr-x   1 BPXROOT  SSHDG        462 Aug  1  2024 README.md
-rwxr-xr-x   1 BPXROOT  SSHDG     783177 Aug  1  2024 smf_explorer.zip
-rwxr-xr-x   1 BPXROOT  SSHDG     795089 Aug  1  2024 smfexplorer-1.1.12-py3-none-any.whl
-rwxr-xr-x   1 BPXROOT  SSHDG        894 Aug  1  2024 uss_requirements.txt
```

</div></details>

### SMF

<details><summary><font color="blue">SMFPRMxx</font></summary><div>

```xxx:SYS1.PARMLIB.TEST01(SMFPRM00) 
 ACTIVE,
 DSNAME(SYS1.VS01.MAN1,
        SYS1.VS01.MAN2),
 RECORDING(LOGSTREAM)
 DEFAULTLSNAME(IFASMF.VS01.DATA)
 NOPROMPT,
 REC(PERM),
 MAXDORM(3000),
 MEMLIMIT(6144M),
 STATUS(010000),
 JWT(0510),
 SID(&SYSNAME(1:4))
 SID(UNKN),
 LISTDSN,
 SYS(TYPE(0,2:10,14,15,20,22:24,26,30,32:34,40,42,47:48,64,70:73,
 122,
 74(3:6),75:83,
 84,88,
 90,99,100:102,110,127:134,148:151,161,
 244,245)),
 INTVAL(01),
 SYNCVAL(00),
 SYS(DETAIL,INTERVAL(003000)),
 SYS(EXITS(IEFACTRT,IEFUJI,IEFU83,IEFU84,IEFU85,IEFUJV)),
 SUBSYS(STC,EXITS(IEFU83,IEFU84,IEFU85,IEFU29),
 INTERVAL(SMF,SYNC))
```

</div></details>


<details><summary><font color="blue">DISPLAYコマンド</font></summary><div>

`D SMF`
```
VS01      2025070  13:54:54.61            -d smf
VS01      2025070  13:54:54.62             IFA714I 13.54.54 SMF STATUS 448
                                                     LOGSTREAM NAME               BUFFERS        STATUS
                                                   A-IFASMF.VS01.DATA                13093       CONNECTED
```

`D SMF,O`
```
VS01      2025070  13:55:58.63            -d smf,o
VS01      2025070  13:55:58.63             IEE967I 13.55.58 SMF PARAMETERS 458
                                                   MEMBER = SMFPRM00
                                                   NOWIC -- DEFAULT
                                                   NOHFTSINTVL -- DEFAULT
                                                   NOARECSIGN -- DEFAULT
                                                   NORECSIGN -- DEFAULT
                                                   SMFDLEXIT(USER3(IRRADU86)) -- DEFAULT
                                                   SMFDLEXIT(USER2(IRRADU00)) -- DEFAULT
                                                   SMFDPEXIT(USER3(IRRADU86)) -- DEFAULT
                                                   SMFDPEXIT(USER2(IRRADU00)) -- DEFAULT
                                                   EMPTYEXCPSEC(NOSUPPRESS) -- DEFAULT
                                                   NOPERMFIX -- DEFAULT
                                                   NOSMF30COUNT -- DEFAULT
                                                   MULCFUNC -- DEFAULT
                                                   DSPSIZMAX(2048M) -- DEFAULT
                                                   BUFUSEWARN(25) -- DEFAULT
                                                   BUFSIZMAX(0128M) -- DEFAULT
                                                   DDCONS(YES) -- DEFAULT
                                                   LASTDS(MSG) -- DEFAULT
                                                   NOBUFFS(MSG) -- DEFAULT
                                                   MAXEVENTINTRECS(00) -- DEFAULT
                                                   DUMPABND(RETRY) -- DEFAULT
                                                   SUBSYS(STC,TYPE(0,2:10,14,15,20,22:24,26,30,32:34,40,42,47:48,
                                                   64,70:73,122,74(3:6),75:83,84,88,90,99,100:102,110,127:134,
                                                   148:151,161,244,245)) -- SYS
                                                   SUBSYS(STC,DETAIL) -- SYS
                                                   SUBSYS(STC,INTERVAL(SMF,SYNC)) -- PARMLIB
                                                   SUBSYS(STC,EXITS(IEFU29)) -- PARMLIB
                                                   SUBSYS(STC,EXITS(IEFU85)) -- PARMLIB
                                                   SUBSYS(STC,EXITS(IEFU84)) -- PARMLIB
                                                   SUBSYS(STC,EXITS(IEFU83)) -- PARMLIB
                                                   SYNCVAL(00) -- PARMLIB
                                                   INTVAL(01) -- PARMLIB
                                                   SYS(EXITS(IEFUJV)) -- PARMLIB
                                                   SYS(EXITS(IEFU85)) -- PARMLIB
                                                   SYS(EXITS(IEFU84)) -- PARMLIB
                                                   SYS(EXITS(IEFU83)) -- PARMLIB
                                                   SYS(EXITS(IEFUJI)) -- PARMLIB
                                                   SYS(EXITS(IEFACTRT)) -- PARMLIB
                                                   SYS(INTERVAL(003000)) -- PARMLIB
                                                   SYS(DETAIL) -- PARMLIB
                                                   SYS(TYPE(0,2:10,14,15,20,22:24,26,30,32:34,40,42,47:48,64,
                                                   70:73,122,74(3:6),75:83,84,88,90,99,100:102,110,127:134,
                                                   148:151,161,244,245)) -- PARMLIB
                                                   LISTDSN -- PARMLIB
                                                   SID(VS01) -- PARMLIB
                                                   JWT(0510) -- PARMLIB
                                                   STATUS(010000) -- PARMLIB
                                                   MEMLIMIT(06144M) -- PARMLIB
                                                   MAXDORM(3000) -- PARMLIB
                                                   REC(PERM) -- PARMLIB
                                                   NOPROMPT -- PARMLIB
                                                   DEFAULTLSNAME(IFASMF.VS01.DATA) -- PARMLIB
                                                   RECORDING(LOGSTREAM) -- PARMLIB
                                                   DSNAME(SYS1.VS01.MAN2) -- PARMLIB
                                                   DSNAME(SYS1.VS01.MAN1) -- PARMLIB
                                                   ACTIVE -- PARMLIB
```


</div></details>



-----
参考: 
[Create a z/OSMF nucleus on your system](https://www.ibm.com/docs/en/zos/3.1.0?topic=nucleus-create-zosmf-your-system)
[IZUSVR reference information](https://www.ibm.com/docs/en/zos/3.1.0?topic=system-izusvr-reference-information)
[Displaying the z/OSMF server settings](https://www.ibm.com/docs/en/zos/3.1.0?topic=system-displaying-zosmf-server-settings)
[APAR OA66399: Z/OS DATA GATHERER USS INSTALLATION PATH CORRECTION](https://www.ibm.com/support/pages/apar/OA66399)
[APAR PH61005: Z/OS DATA GATHERER USS INSTALLATION PATH CORRECTION - Z/OSMF](https://www.ibm.com/support/pages/apar/PH61005)
[OA66401: NEW FUNCTION - 2024 2Q Z/OS DATA GATHERER REST SERVICES AND SMF EXPLORER UPDATES AND CORRECTIONS](https://www.ibm.com/support/pages/apar/OA66401)


## z/OSMFインスタンス追加
RACF定義やユーザー/グループなどはなるべく既存の環境のものをそのまま流用する方針とします。
基本的には以下のガイドに従います。
[Configure a separate z/OSMF server instance](https://www.ibm.com/docs/en/zos/3.1.0?topic=configurations-configure-separate-zosmf-server-instance)


### zFS作成
SYS1.SAMPLIB(IZUMKFS)に提供されるサンプルJCLを参考に、zFSの作成、USSへのマウント、フォルダ作成を行います。
ここでは、`OMVS.ZOSMF.SMFEXP.ZFS` というzFSを作成し、USS上に`/var/zosmf`というマウントポイントにマウントします。IPL後も自動マウントされるようにBPXPRMxxにマウントの定義も追加します。
マウント後、ディレクトリ`/var/zosmf/data/home/izusvr`、`/var/zosmf/configuration/workflow`を作成し、Permission設定を行います。

```
mkdir -p /var/zosmf/data/home/izusvr
mkdir -p /var/zosmf/configuration/workflow
chown -R IZUSVR:IZUADMIN /var/zosmf
chmod -R 755 /var/zosmf
```

### 起動プロシージャー

"IZUSVR1"を参考に、以下の新規プロシージャー"IZUSVR2"を作成します。

<details><summary><font color="blue">起動プロシージャー</font></summary><div>

```xxx:SYS1.PROCLIB.TEST01(IZUSVR2) 
//IZUSVR2  PROC PARMS='zosmfServer',     /* Server parms          */
//      ROOT='/usr/lpp/zosmf',           /* z/OSMF installation root */
//      WLPDIR='/usr/lpp/zosmf/liberty', /* Liberty directory        */
//      OUTCLS='*',                      /* SYSOUT class             */
//      USERDIR='/var/zosmf',         /* Configuration directory  */
//      TRACE='N',                       /* Trace option             */
//      KCINDEX='Y',                     /* KC index rebuild flag */
//      IZUPRM='02',                     /* Parmlib suffixes or PREV */
//      SERVER='STANDALONE',              /* AUTOSTART server         */
//      Z='0',                           /* Reserved for IBM         */
//      IZUMEM=4G                        /* Server memlimit          */
//*
//*--------------------------------------------------------------*/
//* z/OSMF AUTOSTART Websphere Liberty Profile server startup    */
//* procedure                                                    */
//*--------------------------------------------------------------*/
//*------------------------------------------------------------------
//* Parse z/OSMF PARMLIB member
//*------------------------------------------------------------------
//ZPARM   EXEC  PGM=IZUPARMS,REGION=0M,
// PARM='/IZUPRM=&IZUPRM,TRACE=&TRACE,USERDIR=&USERDIR,SERVER=&SERVER,Z
//             =&Z'
//*
//DFLTCFG  DD  PATH='&ROOT./defaults/configuration.defaults'
//*
//STDOUT   DD  SYSOUT=&OUTCLS
//STDERR   DD  SYSOUT=&OUTCLS
//CEEDUMP  DD  SYSOUT=&OUTCLS
//*
//*------------------------------------------------------------------
//* Configure z/OSMF server
//*------------------------------------------------------------------
//CONFZMF EXEC PGM=BPXBATCH,REGION=0M,COND=(0,LT),
// PARM='SH &ROOT./bin/izuconfig.sh &ROOT &USERDIR &TRACE &KCINDEX'
//*
//SYSPRINT DD  SYSOUT=&OUTCLS
//SYSOUT   DD  SYSOUT=&OUTCLS
//STDERR   DD  SYSOUT=&OUTCLS
//STDOUT   DD  SYSOUT=&OUTCLS
//*
//*------------------------------------------------------------------
//* Start the Websphere Liberty Profile server
//*
//* WLPUDIR - PATH DD that points to the Liberty Profile's "user"
//*           directory. If the DD is not allocated, the user
//*           directory location defaults to the wlp/usr directory
//*           in the install tree.
//* STDOUT  - Destination for stdout (System.out)
//* STDERR  - Destination for stderr (System.err)
//* STDENV  - Initial Unix environment - read by the system.  The
//*           installation default and server specific server
//*           environment files will be merged into this environment
//*           before the JVM is launched.
//*------------------------------------------------------------------
//ZOSMF   EXEC  PGM=BPXBATSL,REGION=0M,COND=(0,LT),
//  MEMLIMIT=&IZUMEM.,TIME=NOLIMIT,
//  PARM='PGM &WLPDIR./lib/native/zos/s390x/bbgzsrv --clean &PARMS'
//*
//WLPUDIR  DD  PATH='&USERDIR./configuration'
//*
//STDOUT   DD  SYSOUT=&OUTCLS
//STDERR   DD  SYSOUT=&OUTCLS
//*STDOUT   DD PATH='&ROOT/izusvr1.stdout',
//*            PATHOPTS=(OWRONLY,OCREAT,OTRUNC),
//*            PATHMODE=SIRWXU
//*STDERR   DD PATH='&ROOT/izusvr1.stderr',
//*            PATHOPTS=(OWRONLY,OCREAT,OTRUNC),
//*            PATHMODE=SIRWXU
```

</div></details>

主な変更点:
- プロシージャー名: `IZUSVR1` → `IZUSVR2`
- USRDIR: `/global/zosmf` → `/var/zosmf`
- IZUPRM: `00` → `02`
- SERVER: `AUTOSTART` → `STANDALONE`

起動ユーザーを指定するためにSTARTEDクラスのプロファイルも作成しておきます。ここでは、起動ユーザーは既存のIDと同様の'IZUSVR'を使用します。

<details><summary><font color="blue">RACF STARTEDクラス: IZUSVR2.*</font></summary><div>

```xxx:定義例
RDEFINE STARTED IZUSVR2.* UACC(NONE) STDATA(USER(IZUSVR) GROUP(IZUADMIN) PRIVILEGED(NO) TRUSTED(NO) TRACE(YES))

SETROPTS RACLIST(STARTED) REFRESH
```

```xxx:確認
RLIST STARTED IZUSVR2.* STDATA
CLASS      NAME
-----      ----
STARTED    IZUSVR2.* (G)

LEVEL  OWNER      UNIVERSAL ACCESS  YOUR ACCESS  WARNING
-----  --------   ----------------  -----------  -------
 00    IBMUSER         NONE               NONE    NO

INSTALLATION DATA
-----------------
NONE

APPLICATION DATA
----------------
NONE

AUDITING
--------
FAILURES(READ)

NOTIFY
------
NO USER TO BE NOTIFIED

STDATA INFORMATION
------------------
USER= IZUSVR
GROUP= IZUADMIN
TRUSTED= NO
PRIVILEGED= NO
TRACE= YES
```

</div></details>



### IZUPRMxx

"IZUPRM00"を参考に、"IZUPRM02"を作成します。

<details><summary><font color="blue">IZUPRMxx</font></summary><div>

```xxx:SYS1.PARMLIB.TEST01(IZUPRM02) 
HOSTNAME('*')

HTTP_SSL_PORT(20443)

INCIDENT_LOG UNIT('SYSALLDA')

JAVA_HOME('/usr/lpp/java/java17/J17.0_64')

KEYRING_NAME('ZOSMF_RING')

LOGGING('*=warning:com.ibm.zoszmf.*=info:com.ibm.zoszmf.environment.ui=
finer')

RESTAPI_FILE ACCT(IZUACCT) REGION(65536) PROC(IZUFPROC)

COMMON_TSO ACCT(IZUACCT) REGION(50000) PROC(IZUFPROC)

SAF_PREFIX('IZUDFLT')

SEC_GROUPS USER(IZUUSER),ADMIN(IZUADMIN),SECADMIN(IZUSECAD)

SESSION_EXPIRE(495)

TEMP_DIR('/tmp')

UNAUTH_USER(IZUGUEST)

SERVER_PROC('IZUSVR1')

ANGEL_PROC('IZUANG1')

AUTOSTART('CONNECT')

AUTOSTART_GROUP('NONE')

USER_DIR('/var/zosmf')

CLOUD_SEC_ADMIN('IBMUSER')

WLM_CLASSES DEFAULT(IZUGHTTP)
            LONG_WORK(IZUGWORK)

/* Uncomment PLUGINS statement and the names of the plugins you
    wish to use below:                                              */

/* PLUGINS( CAPACITY_PROV,
             COMMSERVER_CFG,
             INCIDENT_LOG,
             ISPF,
             RESOURCE_MON,
             SOFTWARE_MGMT,
             SYSPLEX_MGMT,
             WORKLOAD_MGMT,
             ZERT_ANALYZER)   */

PLUGINS(COMMSERVER_CFG,
        ISPF,
        SOFTWARE_MGMT,
        RESOURCE_MON,
        WORKLOAD_MGMT)
```

</div></details>

主な変更点:
- HTTP_SSL_PORT: `10443` → `20443`
- USER_DIR: `/global/zosmf` → `/var/zosmf`

### Data Gatherer - SMF REST Service設定
基本的には以下のガイドに従います。
[Configure z/OS Data Gatherer: SMF REST Services](https://www.ibm.com/docs/en/zos/3.1.0?topic=services-configure-zos-data-gatherer-smf-rest)

#### RACF
以下のガイドを参考にRACF設定を行います。
[Setting up z/OS Data Gatherer REST services](https://www.ibm.com/docs/en/zos/2.5.0?topic=gatherer-setting-up-zos-data-rest-services)


<details><summary><font color="blue">RACF SERVERクラス: BBG.SECCLASS.DATASET</font></summary><div>

```xxx:定義例
RDEFINE SERVER (BBG.SECCLASS.DATASET) UACC(NONE)
PERMIT BBG.SECCLASS.DATASET CLASS(SERVER) ID(IZUSVR) ACCESS(READ)
SETROPTS RACLIST(SERVER) REFRESH
```

```xxx:確認
RLIST SERVER BBG.SECCLASS.DATASET AUTHUSER
CLASS      NAME
-----      ----
SERVER     BBG.SECCLASS.DATASET

LEVEL  OWNER      UNIVERSAL ACCESS  YOUR ACCESS  WARNING
-----  --------   ----------------  -----------  -------
 00    IBMUSER         NONE               NONE    NO

INSTALLATION DATA
-----------------
NONE

APPLICATION DATA
----------------
NONE

SECLEVEL
--------
NO SECLEVEL

CATEGORIES
----------
NO CATEGORIES

SECLABEL
--------
NO SECLABEL

AUDITING
--------
FAILURES(READ)

NOTIFY
------
NO USER TO BE NOTIFIED

USER      ACCESS   ACCESS COUNT
----      ------   ------ -----
IZUSVR    READ        000000

   ID     ACCESS  ACCESS COUNT  CLASS                   ENTITY  NAME
-------- -------  ------------ -------- ---------------------------------------
NO ENTRIES IN CONDITIONAL ACCESS LIST
```

</div></details>


<details><summary><font color="blue">RACF FACILITYクラス: ERBSDS.MON2DATA</font></summary><div>

※補足
これはMonitor II REST service用の定義なので今回は不要のはずだが、ついでに設定しておく。
ユーザーごとに個別に権限付与する必要があるようなので、ここではIZADMINグループにREAD権限付与する。また、このプロファイルを作成すると、SDSFのDAパネル表示させようとした時にこのプロファイルのチェックが入ってエラーになってしまうので、SYS1グループにもREAD権限を与えておく。

```xxx:定義例
RDEFINE FACILITY (ERBSDS.MON2DATA) UACC(NONE)
PERMIT ERBSDS.MON2DATA CLASS(FACILITY) ID(IZUADMIN) ACCESS(READ)
PERMIT ERBSDS.MON2DATA CLASS(FACILITY) ID(SYS1) ACCESS(READ)
SETROPTS RACLIST(SERVER) REFRESH
```

```xxx:確認
RLIST FACILITY ERBSDS.MON2DATA AUTHUSER
CLASS      NAME
-----      ----
FACILITY   ERBSDS.MON2DATA

LEVEL  OWNER      UNIVERSAL ACCESS  YOUR ACCESS  WARNING
-----  --------   ----------------  -----------  -------
 00    IBMUSER         NONE               READ    NO

INSTALLATION DATA
-----------------
NONE

APPLICATION DATA
----------------
NONE

SECLEVEL
--------
NO SECLEVEL

CATEGORIES
----------
NO CATEGORIES

SECLABEL
--------
NO SECLABEL

AUDITING
--------
FAILURES(READ)

NOTIFY
------
NO USER TO BE NOTIFIED

USER      ACCESS   ACCESS COUNT
----      ------   ------ -----
IZUADMIN  READ        000000
SYS1      READ        000000

   ID     ACCESS  ACCESS COUNT  CLASS                   ENTITY  NAME
-------- -------  ------------ -------- ---------------------------------------
NO ENTRIES IN CONDITIONAL ACCESS LIST
```

</div></details>


<details><summary><font color="blue">RACF DATASETクラス: DEV01.**</font></summary><div>
※SMF REST Service経由で、SMFダンプデータセットにアクセスする際、アクセスしようとしているユーザーが当該SMFダンプデータセットのHLQに対してREAD権限が無いと、アクセス時にエラーとなる。

エラー例(z/OSMFのJOBLOG):

```xxx:IZUSVR1 JOBLOG - STDOUT
2025-02-27 01:01:01.482/GMT | smf | [ERROR] | [LargeThreadPool-thread-5] saf-dataset-authorization-service - 'User 'IBMUSER' is not authorized to access the dataset 'TEST01.SMFDUMP.TAG.D250226.V01''
```

```xxx:IZUSVR1 JOBLOG - STDERR
[ERROR   ] CWWKS2911E: SAF Service RACROUTE_AUTH did not succeed because the resource profile TEST01.SMFDUMP.TAG.D250226.V01 in class DATASET does not exist. SAF return code 0x00000004. RACF return code 0x00000004. RACF reason code 0x00000000.
```

そのため、SMF REST Service経由でSMFダンプデータセットにアクセスするユーザーにはそのデータセットに対するREAD権限を付与しておく。また、ダンプデータセット作成のことも考慮し、今回はIZUADMINグループに対してALTER権限を付与する。
ここでは、`DEV01`というHLQをダンプデータセット用に使用することにする。(RACF DATASETプロファイルを作成する際はDEV01というユーザー、もしくはグループが存在している必要があるので注意！)

```xxx:定義例
ADDSD 'DEV01.**' UACC(NONE)
PERMIT 'DEV01.**' CLASS(DATASET) ID(IZUADMIN) ACCESS(READ)
SETROPTS GENERIC(DATASET) REFRESH
```

```xxx:確認
LISTDSD DATASET('DEV01.**') AUTHUSER
INFORMATION FOR DATASET DEV01.** (G)

LEVEL  OWNER    UNIVERSAL ACCESS   WARNING   ERASE
-----  -------- ----------------   -------   -----
 00    DEV01           NONE          NO      NO

AUDITING
--------
FAILURES(READ)

NOTIFY
--------
NO USER TO BE NOTIFIED

YOUR ACCESS  CREATION GROUP  DATASET TYPE
-----------  --------------  ------------
   ALTER        SYS1           NON-VSAM

NO INSTALLATION DATA

              SECURITY LEVEL
------------------------------------------
NO SECURITY LEVEL

CATEGORIES
----------
NO CATEGORIES

SECLABEL
--------
NO SECLABEL

   ID     ACCESS
--------  -------
IZUADMIN   ALTER

   ID    ACCESS   CLASS                ENTITY NAME
-------- ------- -------- ----------------------------------------------------
NO ENTRIES IN CONDITIONAL ACCESS LIST
```



</div></details>


#### z/OSMF Setting Service構成
SMF REST Serviceを構成する前提として、z/OSMF settings serviceの構成を行う必要があります。以下のガイドに従い構成します。
[Configure the z/OSMF settings service](https://www.ibm.com/docs/en/zos/3.1.0?topic=services-configure-zosmf-settings-service)

こちらは主にSYS1.SAMPLIB(IZUSTSEC)に提供されるサンプルをベースにRACFの各種プロファイル定義、権限設定を行う操作が主となります。
こちらも事前設定済みの想定とするため、詳細は割愛します。

#### SMF REST Service有効化
以下のガイドに従い、z/OSMFの設定としてSMF REST Serviceを有効化します。
[Enabling the service](https://www.ibm.com/docs/en/zos/3.1.0?topic=services-configure-zos-data-gatherer-smf-rest#izuLitezOSDataGathererRESTservices__title__4)

やり方としては、ブラウザからz/OSMFの管理コンソールに接続してGUIにより行う方法と、設定ファイルを更新する方法があります。ここでは後者のやり方で実施します。

`/usr/lpp/zosmf/samples/zosmf.json` を `/var/zosmf/configuration/settings/zosmf/zosmf.json`にコピーして編集します。

```json:/var/zosmf/configuration/settings/zosmf/zosmf.json
{
    "services": {
       "IZU_SMF_CONFIGURE": "Y",
       "IZU_ZM2_CONFIGURE": "Y"
    }
 }
```

※IZU_ZM2_CONFIGUREはMonitorIIアクセス用なので今回の検証スコープとは関係ないので"N"でよいのですが、お試しなので"Y"にしています。

zosmf.jsonファイルのOwner:GroupはIZUSVR:IZUADMINに指定し、文字コードはISO8859-1(ASCII)として作成する必要がありますのでご注意ください。
```sh
IBMUSER : /var/zosmf/configuration/settings/zosmf : > ls -laT
total 48
                    drwxrwx---   2 IZUSVR   IZUADMIN    8192 Mar  9 11:16 .
                    drwxrwxr-x   3 IZUSVR   IZUADMIN    8192 Mar  9 11:16 ..
t ISO8859-1   T=on  -rw-rw----   1 IZUSVR   IZUADMIN      95 Mar  9 11:16 zosmf.json
```

設定後、z/OSMFを再起動します。

### SMFダンプ取得

SMFダンプ取得用サンプルJCL(ログストリームに取得されているSMFのダンプ)

```xxx:SMFDUMP
//SMFDMP   JOB CLASS=A,MSGCLASS=X
//DUMP     EXEC  PGM=IFASMFDL,REGION=0M
//DUMPOUT  DD  DSN=DEV01.SMFDUMP.TAG.D250309.V01,
//             SPACE=(CYL,(200,5),RLSE),
//             DCB=(LRECL=32760,RECFM=VBS,BLKSIZE=0),
//             DISP=(NEW,CATLG,DELETE),UNIT=3390,STORCLAS=SCBASE
//SYSPRINT DD SYSOUT=*
//SYSIN    DD  *
 LSNAME(IFASMF.VS01.DATA,OPTIONS(DUMP))
 OUTDD(DUMPOUT,TYPE(70:79),START(1600),END(1700))
 DATE(2025068,2025068)
/*
```

参考: [Specifying parameters for the SMF log stream dump program](https://www.ibm.com/docs/en/zos/3.1.0?topic=program-specifying-parameters-smf-log-stream-dump)

## 接続確認

z/OSMF提供REST Serviceの基本的な使い方はこちら。
参考: [Using the z/OSMF REST services](https://www.ibm.com/docs/en/zos/3.1.0?topic=guide-using-zosmf-rest-services)

### curlコマンドによる接続確認

```
curl --request GET --insecure --user TAG:xxx --header "X-CSRF-ZOSMF-HEADER:" https://xxx:20443/zosmf/zosdg/smf/v3/api-docs > api_docs.json
```

上のcurlコマンドで、APIドキュメントファイル(json)が取得できればOKです。取得されるAPIドキュメントは以下のような内容です。

```json:api_docs.json抜粋
{
    "openapi": "3.0.1",
    "info": {
        "title": "z/OS Data Gatherer: SMF Data REST Services",
        "description": "z/OS Data Gatherer REST Services \n\n\nThe SMF records must be sorted by following SMF header fields: SMFHDR_Date (SMF date), SMFHDR_Time (SMF time) and SMFHDR_SID (SMF System identification)\n \n\n\n ...",
        "contact": {
            "name": "IBM support",
            "url": "https://www.ibm.com/support"
        },
        "license": {
            "name": "z/OS 3.1",
            "url": "https://www.ibm.com/docs/en/SSLTBW_3.1.0/pdf/e0zf100_v3r1.pdf"
        },
        "version": "v1",
        "x-build-timestamp": "2024-12-03T12:21:31Z",
        "x-modules-version": "1.3.1"
...
```

※curlコマンドで入手されるjsonデータは成形されていません。上の例は改行やインデントにより成形した結果のイメージを記載しています(JSONデータの成形にはjqコマンドや、VSCodeのFormat機能が利用可能です)。

### Swagger UIへのアクセス
ブラウザからSMF REST ServiceのSwagger UIにアクセスしてみます。
URL ```https://xxx:20443/zosmf/zosdg/smf/``` にアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/a16ae556-1477-4f16-bde7-d0a913b3415d.png)

正規の手順でやるのだとすると、証明書を信頼できるルート証明機関に登録してあげるというのが王道だと思いますが、とりあえず今回は「xxxにアクセスする」を選択して先に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/eb2c2028-348e-490b-ac77-36d8a92ab658.png)

下の方にスクロールし、「Authorize」ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/5fc0a3e6-ea24-496f-b447-d10ebbdcc255.png)

ユーザー/パスワードを指定して「Authorize」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/10e6bc78-e267-4c8e-b49a-ab04f3b5223d.png)


さらに下の方にスクロールし、SMF30の GET `/v1/smf/type/30/subtype/1`を展開して「Try it Out」ボタンをクリックし、必須フィールドに値を入れてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/053d5527-8c46-453b-9ad7-f29ae3a5eb03.png)

さらに下の方にスクロールし、「Execute」ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b8bc5d13-1209-4951-acf9-f8b3d664a0cd.png)

HTTP Response: 200が返って、JSONの情報が返されればOK! (SMF REST Service経由で情報取得できたことが確認できました)


# PC側セットアップ例

ここではWindows11上に、VS Code, Python環境を整備し、Jupyter NotebookからSMF Explorerのライブラリを使いz/OSMF(SMF REST Service)経由でSMFデータを取得するための設定を行います。

## VS Code, Pythonインストール

まずは一般的な手順に従って、VS Code、および、Python関連のExtension([Python Extension for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-python.python), [JuPyter Extension for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter))、Python V3.11をインストールします。一応過去に書いた記事で参考になりそうな箇所のリンク記載しますが、もっと分かりやすい記事は色々と転がっていると思います。
参考: https://qiita.com/tomotagwork/items/c9fc5e6adad795bfa175#pc%E5%81%B4%E6%A7%8B%E6%88%90

今回使用するSMF ExplorerがサポートするPythonのバージョンが3.9～3.11であるため、ここでは3.11をインストールすることとします。

参考: [Install Python](https://ibm.github.io/IBM-SMF-Explorer/get-started/installation/#install-python)

具体的な操作はここでは割愛します。

今回の環境では、以下のように複数のバージョンのPythonがインストールされている状況です。
```
C:\>py --list -paths
 -V:3.13 *        Python 3.13 (64-bit)
 -V:3.12          Python 3.12 (64-bit)
 -V:3.11          Python 3.11 (64-bit)
 -V:3.10          Python 3.10 (64-bit)
 ```

## Graphvizのインストール(オプション)
SMF Explorerには取得するフィールドの構造をグラフとして可視化する機能が提供されています。この機能を使用する場合、内部的に[Graphviz](https://graphviz.org/)というツールを使用しますので、このツールをインストールしておく必要があります。

基本的に以下のサイトからインストーラーを入手してインストールすればOKです。
https://graphviz.org/download/

## Python仮想環境のセットアップ

複数バージョンのPythonを使い分けるには、Pythonの仮想環境を利用するのが便利です。
※VS CodeのTerminalを開くとデフォルトではPower Shellが開きますが、Power Shellだとうまく仮想環境のActivateができない場合があるので、普通のコマンドプロンプトで実行します。
参考: [Windows10のVSCodeでvenvを利用するときの注意点](https://qiita.com/Avocado/items/3e71870815d6c54c1eea)

### 仮想環境作成

VS Codeワークスペースのトップのディレクトリで、以下のコマンドを使用し Python V3.11の仮想環境を作成します。(→venv311_test01という名前のディレクトリ以下に仮想環境のファイルが作成される。)
`py -3.11 -m venv venv311_test01`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ffbfa41f-77b7-43a3-b96e-a58ca3458113.png)

※ポップアップで、「We noticed a new environment has been created. Do you want to select it for the workspace folder?」というメッセージが出ますがここでは無視します。

### 仮想環境のActivate

以下のコマンドで仮想環境をActivateします。
`.\venv311_test01\Scripts\activate`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/8f1a2899-035b-4b3d-b4e0-26d396d18c81.png)
プロンプトの先頭に`(venv311_test01)`という仮想環境の名前が表示されればOK

### SMF Explorer関連パッケージの入手

SMF Explorer関連パッケージは、USS上のData Gathererインストール・パス配下に提供されています。
例: `/usr/lpp/grb/smf_explorer/smf_explorer.zip`

これをバイナリー形式でPCに転送して展開すると、以下の2つのファイルが含まれていることが分かります。
- README.md
- smfexplorer-1.1.12-py3-none-any.whl (約777KB)

REAMDE.mdの中身は以下の通りです。

```xxx:README.md
# IBM SMF Explorer with Python

Version : 1.1.12

The **smf_explorer.zip** file contains the **smfexplorer** Python package.
Find further instructions for installing and using the **smfexplorer** on the official documentation page.

https://ibm.github.io/IBM-SMF-Explorer/

### License Specification

See **https://www.ibm.com/docs/en/SSLTBW_3.1.0/pdf/e0zf100_v3r1.pdf** for details on the **IBM Licensed Program Specifications**

Copyright IBM Corp. 2020, 2024
```


### 必要なパッケージのインストール

Activateした仮想環境のTreminalにて、必要なパッケージをインストールします。

SMF Explorer関連のパッケージをインストール
`pip install smf_explorer\smfexplorer-1.1.12-py3-none-any.whl`

その他、適宜必要なパッケージをインストールします。

- ipykernel: VS Code上でJupyter Notebookを使用するために必要
    - `pip install ipykernel`
- graphviz: フィールド構造の可視化
    - `pip install graphviz`
- python-dotenv: 環境変数管理用
    - `pip install python-dotenv`

- ...


## 接続確認

Jupyter Notebookから接続確認してみます。
以下のような単純なPythonスクリプトを含むNotebookを作成します。
※このスクリプトでは、SMF Type 30 Subtype 1のいくつかのフィールドを取得しています。

```py:
import os
import smfexplorer
from smfexplorer.fields import SMF30S1

connection_string = "https://xxx:20443/zosmf/zosdg/smf" # replace with your own connection string
user_name = "TAG"
user_password = "xxxxxxxx"
verify_ssl = 'false'

connection_info = f"mode=dgapi;url={connection_string};verify_ssl={verify_ssl};username={user_name};password={user_password}"
os.environ["SMFPY_CONNECTION_STRING"] = connection_info

dataset_name = "DEV01.SMFDUMP.TAG.D250309.V01"
ctx = smfexplorer.new_context(dataset_name)  

fields = [SMF30S1.timestamp,
          SMF30S1.sid,
          SMF30S1.sys_name,
          SMF30S1.job_name
          ]

ctx.request(fields).run()
```

VS CodeでNotebookを開き、「Select Kernel」をクリック
Select Another Kernelを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/0e0f7791-e900-4ef6-8408-37ff9066b454.png)

Python Environmentsを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/cadc1608-0537-4f0e-ada9-8c2176ed19bb.png)

先ほど作成した3.11の仮想環境"venv311_test01"を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ef13d320-68c0-4296-b31f-29dc01f36965.png)

仮想環境が適用されるので、コードを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9a1dbb9b-a54e-41d3-a9b8-566daa6c7e0d.png)

アクセスが成功してSMFデータが取得できればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2836b7f7-da33-406c-b09c-a5a09462152b.png)

# おわりに
これで一通りセットアップが完了し、PythonスクリプトからSMFデータを取得するところまで確認できました。
あとはこれを利用してどのようにデータ分析/可視化できるのか、もう少し具体的な操作方法について見ていきます。