はじめに
(2)SMF-バッチ編で、CICS関連のSMF情報を取り込む流れを見てみましたが、あの手順だとあまり意味のあるデータは取れていません(まずは、とりあえずデータ取得の流れを示したものですので)。
ここでは、CICSの観点で意味のある情報を取得するためのカスタマイズ方法を、もう少し細かく"モニター情報(CMF)", "統計情報", "Logger", "Joblog" それぞれの観点で見ていきます。
※CDPzはSMFのデータをフィールド単位で取得する仕組みを提供してくれていますが、カスタマイズをする場合、どのようなフィールドがあるのか、参照したいフィールドにどのような形式でデータが格納されているか、といったことはある程度意識する必要があります。つまり、SMFにデータを書き出しているコンポーネント(今回のケースで言えばCICS)の知識が少なからず必要になります。
Memo:各フィールドの型の定義をどこでやるかは選択の余地があります。試行錯誤中だったため、当記事ではLogstashの設定ファイル中でフィールドの型を指定する方法についても記載していますが、事前型定義が必要なものはElasticsearch側のMappingで事前にスキーマを定義するのがよさそう。
当記事では、モニターと統計はLogstash側で型を指定する方法、LoggerについてはElasticsearch側で型を指定する方法で、手順を記載しています。
Elasticsearch側で型を定義する方法は「(5)カスタマイズ-共通」に記載しています。
関連記事
CDPzを利用したz/OS-ELK連携 - (1)セットアップ編
CDPzを利用したz/OS-ELK連携 - (2)SYSLOG取得編
CDPzを利用したz/OS-ELK連携 - (3)SMF-バッチ編
CDPzを利用したz/OS-ELK連携 - (4)SMF-リアルタイム編
CDPzを利用したz/OS-ELK連携 - (5)カスタマイズ-共通
CDPzを利用したz/OS-ELK連携 - (6)カスタマイズ-SYSLOG
CDPzを利用したz/OS-ELK連携 - (7)カスタマイズ-CICS
CDPzを利用したz/OS-ELK連携 - (8)カスタマイズ-RMF Monitor III
CDPzを利用したz/OS-ELK連携 - (9)カスタマイズ-fluentdの利用
モニター情報(CMF)取得
製品提供機能によるKPI情報取得
CDPzでは、CICSのトランザクション毎のパフォーマンス関連情報を取得するためのSMF_110_KPIというData Streamを提供しています。これは、大量にあるフィールドのうち一部のパフォーマンス関連のフィールドをまとめて抽出してくれるものです。
ここでは、SMF-バッチ編のポリシー作成時に、そのSMF_110_KPIというData Streamを追加してみます。
これで作成されたpolicyファイル、sdeファイルを使用して、バッチでSMFデータをElasticsearchに取り込んで見ます。
取り込み後、Elasticsearchのindexを見ると、cdp-zos-smf_110_1_kpi-...というindexが作成されています。
このindexパターンを作成して、KibanaのDiscoverで見てみます。
こんな感じで情報が取得されています。
このように、製品提供の定義をそのまま使ってある程度情報をElasticsearchに取り込むことは可能ですが、以下のような課題があります。
課題(1) フィールド
KPIとして用意されているフィールドは、CMFで取得できる全フィールド分用意されている訳ではありません。そのため、追加で参照したいフィールドがある場合は、カスタマイズを行う必要があります。
参考: Streaming key performance indicators for CICS Transaction Server for z/OS monitoring
課題(2) 型の不一致
ELAPSE_TIMEやCPU_TIMEなどのフィールドが取得できていますが、残念ながら文字列型で取得されてしまっているようです(例: "+8.8118000000000002E-02")。これでは、時間がかかっているトランザクションを見つけたり、平均出したり、といった操作ができませんので、型を数値型に変換してあげないといけないでしょう。
memo: これは「(5)カスタマイズ-共通」の記事で示しているElasticsearchのindex templateにてnumeric_detectionを有効化することで、ある程度自動変換してくれそうです。これを設定している場合は、以下に記載のLogstashでの明示的な型設定は不要です。
以降の章で、これらの課題に対応するためのカスタマイズをしていきます。
ちなみに、LogstashのFilter(CDPz提供の定義)を通した結果をElasticsearchではなくstdoutに出力させてみると、こんな感じになります。(結果から1レコード分を抽出)。
{
"message" => "15:36:23:41,2019-10-16,2019-10-16 06:35:13.325202,2019-10-16 06:36:19.716521,+6.6391318999999999E+01,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,309,,,CICSUSER,1,+6.6390804713867187E+01,+5.0718749999999999E-04,+3.1560742187499997E-04,+0.0000000000000000,+6.6390812188964841E+01,+1.4839648437500000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.2973632812500000E-06,+0.0000000000000000",
"port" => 50278,
"CICS_GEN_APPLID" => "CT54D4A1",
"JAVA_CPU_TIME" => "+0.0000000000000000",
"ORIG_ABEND_CODE" => nil,
"DISPATCH_TIME" => "+5.0718749999999999E-04",
"CPU_TIME" => "+3.1560742187499997E-04",
"S8_TCB_DISP_TIME" => "+0.0000000000000000",
"RLS_CPU_TIME" => "+0.0000000000000000",
"DISP_CICS_USER" => "+0.0000000000000000",
"host" => "EPLEX1",
"TRANSACTION_ID" => "CEMT",
"SYNCTIME" => "+1.4839648437500000E-04",
"path" => "SMF/SMF_110_1_KPI",
"MVS_SYSTEM_ID" => "ZOS1",
"RMI_TIME" => "+2.2973632812500000E-06",
"CURR_ABEND_CODE" => nil,
"systemName" => "ZOS1",
"sourceName" => "ZOS1-SMF_110_1_KPI",
"seq" => {
"w" => "0",
"c" => "0"
},
"DATE" => "2019-10-16",
"ELAPSED_TIME" => "+6.6391318999999999E+01",
"SYNCPOINTS" => "1",
"TERM_WAIT" => "+6.6390804713867187E+01",
"timeZone" => "+0900",
"RMI_SUSP_TIME" => "+0.0000000000000000",
"TIME" => "15:36:23:41",
"CICS_SPEC_APPLID" => "CT54D4A1",
"START_TIMESTAMP" => "2019-10-16 06:35:13.325202",
"inputsequence" => "20200115105425463:000000",
"JOB_NAME" => "CT54D4A1",
"TRANSACTION_NUM" => "309",
"L8_TCB_DISP_TIME" => "+0.0000000000000000",
"SUSP_TIME" => "+6.6390812188964841E+01",
"PGM_NAME" => "DFHEMTP ",
"@version" => "1",
"STOP_TIMESTAMP" => "2019-10-16 06:36:19.716521",
"sourceType" => "zOS-SMF_110_1_KPI",
"CICS_USER" => "CICSUSER",
"@timestamp" => 2019-10-16T06:36:23.410Z,
"sysplexName" => "EPLEX"
}
時間関連のフィールドは "...E+01"のような指数表記になっているもの、先頭に+/-の表記があるもの、などがありますが、製品提供のLogstashのFilterではこれらの考慮は特にされていないようで、文字列として取り込まれてしまっているようです。
カスタマイズ
基本的には、以下の記述に従って、カスタマイズします。
参考: Streaming key performance indicators for CICS Transaction Server for z/OS monitoring
事前準備:取得フィールドの選択
以下から、カスタマイズして利用したいフィールドを確認します。
Fields for SMF_110_1_CUST data stream
SMFの各フィールドは、どのようなフォーマットでデータが格納されているかを把握しておく必要があります。
CICSのパフォーマンス情報については以下の辺りに記載されています。
Default CICS dictionary entries
例えば、端末からの入力を待つ時間を示す、"TCIOWTT"というフィールドに着目してみます。
FIELD-NAME SIZE CONNECTOR OFFSET NICKNAME
...
DFHTERM S009 12 X'0145' X'0A58' TCIOWTT
...
FIELD-NAMEの2つ目のパート「S009」の先頭が"S"になっているので、Clockタイプのデータ形式で格納されることになります。
Clockタイプのデータについては、以下に記述があります。
参考: Clocks and time stamps
Timer component. This is a value giving the accumulated time recorded by the clock. For performance class data, the timer component is a 64-bit value, expressed in local store clock (STCK) units. ... For more information about timer components, see the TOD clock information in z/Architecture Principles of Operation.
ここで示されているz/Architecture Principles of Operationに、TOD Clockのフォーマットについての記述があります。
The TOD clock nominally is incremented by adding a one in bit position 51 every microsecond. In models having a higher or lower resolution, a different bit position is incremented at such a frequency that the rate of advancing the clock is the same as if a one were added in bit position 51 every microsecond. The resolution of the TOD clock is such that the incrementing rate is comparable to the instruction-execution rate of the model.
The stepping value of TOD-clock bit position 63, if implemented, is 2^-12 microseconds, or approximately 244 picoseconds. This value is called a clock unit.
2^12=4096なので、4096で割算(右bitシフト)してあげるとmicro秒単位になり、さらに10^6で割算すれば秒単位に変換される、というような感じでこれらのデータをハンドリングする必要があります。
(製品提供のData Stream定義でTOD Clockタイプのフィールドの値をハンドリングしている箇所にて"4096E6"で割算している所がありますが、それはTOD Clockタイプの値を秒単位に換算していることになります。)
※難解ですねぇ...。本当はこういうのはユーザーになるべく意識させないようにして欲しいんですが。残念ながらこういう細かい所が製品で隠蔽しきれていないんですよね。
SDE定義のカスタマイズ
HBOUUKPIのカスタマイズ=>ボツ
マニュアルの記述だと、CDPZ02.V2R1M0.HBODEFS(HBOUUKPI)を CDPZ02.CUSTOM.HBODEFS(HBOUUKPI)にコピーして編集することになり、そうすると、以下のような感じになります。
SET IBM_FILE = 'SMF110XX';
DEFINE UPDATE SMF_110_1_CUST
VERSION 'CDP.210'
FROM SMF_CICS_T
TO &IBM_UPDATE_TARGET
AS &IBM_FILE_FORMAT SET(ALL);
DEFINE TEMPLATE SMF_110_1_CUST FOR SMF_110_1_CUST
ORDER
(SMFMNTME,
SMFMNDTE,
START,
STOP,
SMFMNSID,
SMFMNSPN,
SMFMNPRN,
SMFMNJBN,
PGMNAME,
TRAN,
TRANNUM,
TRANNUM_CHAR,
ABCODEO,
ABCODEC,
USERID,
SPSYNCCT,
TCIOWTT_TOD,
USRDISPT_TOD,
USRCPUT_TOD)
AS &IBM_FILE_FORMAT;
ただ、これだと、TOD Clockフィールドはそのままの値で扱うことになってしまい、また別途どこかで変換処理をかまさないといけなくなってしまいます。そのため、元々提供されているKPIの定義CDPZ02.V2R1M0.SHBODEFS(HBOU110I)をコピーしてカスタマイズすることにします。
HBOU110Iのカスタマイズ
ということで、HBOUUKPIではなく、CDPZ02.V2R1M0.SHBODEFS(HBOU110I)をCDPZ02.CUSTOM.SHBODEFS(HBOU110C)にコピーして編集することにします。データセットだけでなく、念のためメンバー名もHBOU110I=>HBOU110Cに変更します。
元々提供されているものに、以下のフィールドを追加してみます。
- T_CHAR
- SCUGETCT
- SCUGETCTE
- SCCGETCT
- SCCGETCTE
SET IBM_FILE = 'SMF110XX';
DEFINE UPDATE SMF_110_1_CUST
VERSION 'CDP.210 '
FROM SMF_CICS_T
TO &IBM_UPDATE_TARGET
AS &IBM_FILE_FORMAT
LET
(INT = INTERVAL(START, STOP))
GROUP BY
(TIME = SMFMNTME,
DATE = SMFMNDTE,
START_TIMESTAMP = TIMESTAMP(START),
STOP_TIMESTAMP = TIMESTAMP(STOP),
ELAPSED_TIME = INT,
MVS_SYSTEM_ID = SMFMNSID,
CICS_SPEC_APPLID = SMFMNSPN,
CICS_GEN_APPLID = SMFMNPRN,
JOB_NAME = SMFMNJBN,
PGM_NAME = PGMNAME,
TRANSACTION_ID = TRAN)
SET
(TRANSACTION_NUM = FIRST(VALUE(DIGITS(TRANNUM),
SUBSTR(TRANNUM_CHAR,2,3))),
ORIG_ABEND_CODE = FIRST(ABCODEO),
CURR_ABEND_CODE = FIRST(ABCODEC),
CICS_USER = FIRST(USERID),
SYNCPOINTS = FIRST(SPSYNCCT),
TERM_WAIT = FIRST(TCIOWTT_TOD / 4096E6),
DISPATCH_TIME = FIRST(USRDISPT_TOD / 4096E6),
CPU_TIME = FIRST(USRCPUT_TOD / 4096E6),
RLS_CPU_TIME = FIRST(RLSCPUT_TOD / 4096E6),
SUSP_TIME = FIRST(SUSPTIME_TOD / 4096E6),
SYNCTIME = FIRST(SYNCTIM_TOD / 4096E6),
DISP_CICS_USER = FIRST(KY8DISPT_TOD / 4096E6),
JAVA_CPU_TIME = FIRST(J8CPUT_TOD / 4096E6),
L8_TCB_DISP_TIME = FIRST(L8CPUT_TOD / 4096E6),
S8_TCB_DISP_TIME = FIRST(S8CPUT_TOD / 4096E6),
RMI_TIME = FIRST(RMITIME_TOD / 4096E6),
RMI_SUSP_TIME = FIRST(RMISUSP_TOD / 4096E6),
T_CHAR = FIRST(T_CHAR),
SCUGETCT = FIRST(SCUGETCT),
SCUGETCTE = FIRST(SCUGETCTE),
SCCGETCT = FIRST(SCCGETCT),
SCCGETCTE = FIRST(SCCGETCTE));
以下のように、出力先DD名、定義名を変更しています。
SET IBM_FILE = 'SMF110XX';
DEFINE UPDATE SMF_110_1_CUST
また、末尾に以下のフィールド定義を追加しています。
T_CHAR = FIRST(T_CHAR),
SCUGETCT = FIRST(SCUGETCT),
SCUGETCTE = FIRST(SCUGETCTE),
SCCGETCT = FIRST(SCCGETCT),
SCCGETCTE = FIRST(SCCGETCTE)
※GROUP BYをしている意味がよく分からないのだが...これ、必要無いのでは???
単発のJCLでCSV化を試してみます(SMFダンプデータセットを入力にCSV化するところまで)。
//HBOSMFCB JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//*
//HBOSMFCB EXEC PGM=HBOPDE,REGION=0M,
// PARM='SHOWINPUT=NO,ZIIPOFFLOAD=NO'
//STEPLIB DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBOLOAD
//*
//* CONTROL STATEMENTS
//*
//HBOIN DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOCCSV)
// DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOCCORY)
// DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOLLSMF)
// DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOTCIFI)
// DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBORS110)
// DD DISP=SHR,DSN=CDPZ02.CUSTOM.SHBODEFS(HBOU110C)
//*
//* Sample COLLECT statement for processing log data
//*
// DD *
COLLECT SMF
COMMIT AFTER END OF FILE;
/*
//HBOLOG DD DISP=SHR,DSN=CDPZ01.SMFDUMP.D191016.T1
//HBOOUT DD SYSOUT=*
//HBODUMP DD SYSOUT=*
//HBODEBUG DD SYSOUT=*
//SMF110XX DD SYSOUT=*,RECFM=V,LRECL=32756
HBOIN DDでは、カスタマイズしたCDPZ02.CUSTOM.SHBODEFS(HBOU110I)をしています。
出力用DD名には、SMF110XXを指定しています。
こいつをサブミットして、SMF110XXの結果を確認すると...
14:26:40:63,2019-10-16,2019-10-16 05:26:26.052751,2019-10-16 05:26:26.615020,+5.6226900000000000E-01,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,225,,,CICSUSER,1,+5.6184192675781250E-01,+4.1619531249999995E-04,+2.5321044921874995E-04,+0.0000000000000000,+5.6185334716796874E-01,+7.9862304687499998E-05,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.1782226562499998E-06,+0.0000000000000000,TO,0,0,0,4
14:26:40:63,2019-10-16,2019-10-16 05:26:28.629236,2019-10-16 05:26:30.354763,+1.7255269999999998E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHECIP ,CECI,226,,,CICSUSER,1,+1.7247811088867187E+00,+7.3657128906249995E-04,+5.3337915039062498E-04,+0.0000000000000000,+1.7247909145507812E+00,+1.4873437500000000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.1767578124999999E-06,+0.0000000000000000,TO,1,3,0,0
14:26:40:63,2019-10-16,2019-10-16 05:26:32.634812,2019-10-16 05:26:35.607077,+2.9722649999999999E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,227,,,CICSUSER,1,+2.9716771376953124E+00,+5.7749169921874997E-04,+4.2141333007812497E-04,+0.0000000000000000,+2.9716874780273437E+00,+1.3073730468750000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+1.8730468749999998E-06,+0.0000000000000000,TO,0,0,0,6
15:25:21:23,2019-10-16,2019-10-16 06:24:56.480718,2019-10-16 06:24:58.415231,+1.9345129999999999E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,234,,,CICSUSER,1,+1.9337729287109373E+00,+7.2817919921874997E-04,+4.8072851562499998E-04,+0.0000000000000000,+1.9337849877929687E+00,+1.8760351562500000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.6459960937499999E-06,+0.0000000000000000,TO,0,0,0,6
15:25:21:23,2019-10-16,2019-10-16 06:24:59.846267,2019-10-16 06:25:04.324002,+4.4777349999999998E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,235,,,CICSUSER,1,+4.4766067729492187E+00,+1.1168886718750000E-03,+6.6918896484374996E-04,+0.0000000000000000,+4.4766186826171874E+00,+1.7628564453125000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.5947265624999999E-06,+0.0000000000000000,TO,0,0,0,7
...
こんな感じで「...,TO,0,0,0,4
」末尾にそれっぽいデータが追加されているのでOKでしょう。
ポリシーのカスタマイズ
上で定義したData Streamの内容を、ConfigTool上でもCustom Data Streamとして定義します。
参考:Creating a System Data Engine data stream definition のProcedure 2~5
ConfigToolでMANAGE CUSTOM DATA STREAM DEFINITIONSボタンをクリック。
Create System Data Engine data stream definitionをクリック。
各フィールドに値を設定してOKを押します。
<補足>
Name: 新しく追加するData Stream名 (この名前は、SHBODEFメンバーにDEFINE UPDATEで指定したレコード名と合わせる必要がある)
Description: 説明
Group/Subgroup: 新しく追加するData Streamを配置するグループ名/サブグループ名(任意の名前)。エディターで選択する際に、Custum Data Streams以下にこのグループにカテゴライズされて表示される。
SHBODEFS dataset members:このData Streamに関連するSHBODEFSメンバー名
実体として、USS上に/u/CDP201/cdpConfig/SMF_110_1_CUST.streams.jsonというファイルが作成されます。
{
"groupings": {
"Custom Data Streams": {
"CICS Group": {
"CMF": [
"SMF_110_1_CUST"
]
}
}
},
"definitions": [
{
"category": "SMF",
"name": "SMF_110_1_CUST",
"description": "Customized CICS Performance Monitor Fields",
"tags": [
"CSV",
"Split",
"Custom"
],
"concatenation": [
"USER",
"CDP"
],
"hboin": {
"all": [
"HBOCCORY",
"HBOLLSMF",
"HBOLLSMF",
"HBORS110",
"HBOTCIFI",
"HBOU110C"
]
},
"parms": [
{
"displayName": "Data Source Name",
"name": "dataSourceName",
"defaultValue": "SMF_110_1_CUST",
"edit": "Required",
"description": "Name of Data Source sent to subscribers",
"policyOnly": 1,
"unique": true
},
{
"displayName": "Data Source Type",
"name": "dataSourceType",
"defaultValue": "zOS-SMF_110_1_CUST",
"edit": "Protected",
"description": "Type of Data Source sent to subscribers",
"policyOnly": 1
},
{
"displayName": "File Path",
"name": "filePath",
"defaultValue": "SMF/SMF_110_1_CUST",
"edit": "Protected",
"description": "Path used for the SMF data",
"policyOnly": 1,
"unique": true
}
]
}
]
}
新しく追加したData Streamを使って、ポリシーを作成します。
新規にポリシー作成する際に、Data Streamを選択するメニューに上で追加したSMF_110_1_CUSTが表示されるので、それを選択します。
ユーザー定義のCustom Data Streamを指定した場合、SYSTEM DATA ENGINEボタンを押すと、以下のようにUSER Concaenationという設定が新たに追加指定できるようになります。ここに、カスタマイズしたData Stream定義を配置したPDSデータセット名を指定することになります。
Data Streamer(HBODSPRO)の設定変更
Data Streamer起動プロシージャーで参照するポリシーファイルの指定を、上で生成されたポリシーファイルに置き換えて起動します。
Logstash構成ファイルのカスタマイズ
Linux側で稼働させるLogstashの構成ファイルも、追加したフィールドの分、カスタマイズします。
それぞれ以下のようにコピーして編集します。
H_SMF_110_1_KPI.lsh => H_SMF_110_1_CUST.lsh
N_SMF_110_1_KPI.lsh => N_SMF_110_1_CUST.lsh
filter {
if [sourceType] == "zOS-SMF_110_1_CUST" {
csv{
columns => [ "TIME", "DATE", "START_TIMESTAMP", "STOP_TIMESTAMP", "ELAPSED_TIME", "MVS_SYSTEM_ID", "CICS_SPEC_APPLID", "CICS_GEN_APPLID", "JOB_NAME", "PGM_NAME", "TRANSACTION_ID", "TRANSACTION_NUM", "ORIG_ABEND_CODE", "CURR_A
BEND_CODE", "CICS_USER", "SYNCPOINTS", "TERM_WAIT", "DISPATCH_TIME", "CPU_TIME", "RLS_CPU_TIME", "SUSP_TIME", "SYNCTIME", "DISP_CICS_USER", "JAVA_CPU_TIME", "L8_TCB_DISP_TIME", "S8_TCB_DISP_TIME", "RMI_TIME", "RMI_SUSP_TIME", "T_CHAR", "SCUGE
TCT", "SCUGETCTE", "SCCGETCT", "SCCGETCTE" ]
separator => ","
convert => {
"ELAPSED_TIME" => "float"
"SYNCPOINTS" => "integer"
"TERM_WAIT" => "float"
"DISPATCH_TIME" => "float"
"CPU_TIME" => "float"
"RLS_CPU_TIME" => "float"
"SUSP_TIME" => "float"
"SYNCTIME" => "float"
"DISP_CICS_USER" => "float"
"JAVA_CPU_TIME" => "float"
"L8_TCB_DISP_TIME" => "float"
"S8_TCB_DISP_TIME" => "float"
"RMI_TIME" => "float"
"RMI_SUSP_TIME" => "float"
"SCUGETCT" => "integer"
"SCUGETCTE" => "integer"
"SCCGETCT" => "integer"
"SCCGETCTE" => "integer"
}
}
}
}
"convert"というオプションを追加して、数値フィールドについては型を明示的に指定してあげます。基本的には、CPU時間などはfloat型、カウントなどを表すものはinteger型を指定します。
型の指定は、「(5)カスタマイズ-共通」の記事で示しているElasticsearchのindex templateにて型を明示指定することもできますし、numeric_detectionを有効化することである程度自動変換もしてくれます。Elasticsearch のIndex templateで型の対応をしている場合は、ここに記載のLogstashでの明示的な型設定は不要です。
filter {
if [sourceType] == "zOS-SMF_110_1_CUST" {
mutate{ add_field => {
"[@metadata][timestamp]" => "%{DATE} %{TIME}"
}}
date{ match => [
"[@metadata][timestamp]", "yyyy-MM-dd HH:mm:ss:SS"
]}
}
}
一旦、outputをElasticsearchではなくstdoutにして、Logstashのレベルでフォーマットできるか確認してみると...
{
"timeZone" => "+0900",
"seq" => {
"w" => "1",
"c" => "0"
},
"T_CHAR" => "TO",
"@timestamp" => 2019-10-16T06:36:23.410Z,
"message" => "15:36:23:41,2019-10-16,2019-10-16 06:35:12.749281,2019-10-16 06:35:12.977761,+2.2848000000000000E-01,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,308,,,CICSUSER,1,+2.2802571191406250E-01,+4.4702246093749996E-04,+2.2888208007812500E-04,+0.0000000000000000,+2.2803313623046874E-01,+8.2666992187499997E-05,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+1.8715820312499998E-06,+0.0000000000000000,TO,0,0,0,4",
"systemName" => "ZOS1",
"TERM_WAIT" => 0.2280257119140625,
"S8_TCB_DISP_TIME" => 0.0,
"START_TIMESTAMP" => "2019-10-16 06:35:12.749281",
"STOP_TIMESTAMP" => "2019-10-16 06:35:12.977761",
"inputsequence" => "20200122064722774:000000",
"DISPATCH_TIME" => 0.00044702246093749996,
"sysplexName" => "EPLEX",
"CICS_GEN_APPLID" => "CT54D4A1",
"DISP_CICS_USER" => 0.0,
"SYNCPOINTS" => 1,
"SCUGETCT" => 0,
"ORIG_ABEND_CODE" => nil,
"CPU_TIME" => 0.000228882080078125,
"MVS_SYSTEM_ID" => "ZOS1",
"TRANSACTION_NUM" => "308",
"SCCGETCTE" => 4,
"CURR_ABEND_CODE" => nil,
"host" => "EPLEX1",
"@version" => "1",
"PGM_NAME" => "DFHEMTP ",
"path" => "SMF/SMF_110_1_CUST",
"sourceName" => "ZOS1-SMF_110_1_CUST",
"TRANSACTION_ID" => "CEMT",
"SYNCTIME" => 8.266699218749999e-05,
"SCUGETCTE" => 0,
"RMI_TIME" => 1.8715820312499998e-06,
"ELAPSED_TIME" => 0.22848,
"RLS_CPU_TIME" => 0.0,
"JAVA_CPU_TIME" => 0.0,
"port" => 59006,
"TIME" => "15:36:23:41",
"JOB_NAME" => "CT54D4A1",
"CICS_SPEC_APPLID" => "CT54D4A1",
"DATE" => "2019-10-16",
"L8_TCB_DISP_TIME" => 0.0,
"CICS_USER" => "CICSUSER",
"sourceType" => "zOS-SMF_110_1_CUST",
"SCCGETCT" => 0,
"RMI_SUSP_TIME" => 0.0,
"SUSP_TIME" => 0.22803313623046875
}
{
"timeZone" => "+0900",
"seq" => {
"w" => "1",
"c" => "0"
},
"T_CHAR" => "TO",
"@timestamp" => 2019-10-16T06:36:23.410Z,
"message" => "15:36:23:41,2019-10-16,2019-10-16 06:35:13.325202,2019-10-16 06:36:19.716521,+6.6391318999999999E+01,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,309,,,CICSUSER,1,+6.6390804713867187E+01,+5.0718749999999999E-04,+3.1560742187499997E-04,+0.0000000000000000,+6.6390812188964841E+01,+1.4839648437500000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.2973632812500000E-06,+0.0000000000000000,TO,0,0,0,4",
"systemName" => "ZOS1",
"TERM_WAIT" => 66.39080471386718,
"S8_TCB_DISP_TIME" => 0.0,
"START_TIMESTAMP" => "2019-10-16 06:35:13.325202",
"STOP_TIMESTAMP" => "2019-10-16 06:36:19.716521",
"inputsequence" => "20200122064722774:000000",
"DISPATCH_TIME" => 0.0005071875,
"sysplexName" => "EPLEX",
"CICS_GEN_APPLID" => "CT54D4A1",
"DISP_CICS_USER" => 0.0,
"SYNCPOINTS" => 1,
"SCUGETCT" => 0,
"ORIG_ABEND_CODE" => nil,
"CPU_TIME" => 0.00031560742187499997,
"MVS_SYSTEM_ID" => "ZOS1",
"TRANSACTION_NUM" => "309",
"SCCGETCTE" => 4,
"CURR_ABEND_CODE" => nil,
"host" => "EPLEX1",
"@version" => "1",
"PGM_NAME" => "DFHEMTP ",
"path" => "SMF/SMF_110_1_CUST",
"sourceName" => "ZOS1-SMF_110_1_CUST",
"TRANSACTION_ID" => "CEMT",
"SYNCTIME" => 0.000148396484375,
"SCUGETCTE" => 0,
"RMI_TIME" => 2.29736328125e-06,
"ELAPSED_TIME" => 66.391319,
"RLS_CPU_TIME" => 0.0,
"JAVA_CPU_TIME" => 0.0,
"port" => 59006,
"TIME" => "15:36:23:41",
"JOB_NAME" => "CT54D4A1",
"CICS_SPEC_APPLID" => "CT54D4A1",
"DATE" => "2019-10-16",
"L8_TCB_DISP_TIME" => 0.0,
"CICS_USER" => "CICSUSER",
"sourceType" => "zOS-SMF_110_1_CUST",
"SCCGETCT" => 0,
"RMI_SUSP_TIME" => 0.0,
"SUSP_TIME" => 66.39081218896484
}
T_CHARやCCGETCTEという追加したフィールドにきちんと値が入っているのでOKでしょう。数値フィールドもうまくハンドリングできているようです。ということで、Elasticsearchにぶちこんで、Kibanaで見てみます。
Kibana Discoverでの確認
Elasticsearchにデータを取り込むと、cdp-zos-smf_110_1_cust-*という名前のindexに取り込まれるので、index patternを作ってDiscoverで確認してみます。
追加したフィールドが確認できました!数値フィールドもきちんとハンドリングできているようです!
補足:Data Streamaerから送信されてくるデータの確認
問題判別の参考に、Data StreamerからLogstashに対してどのようなフォーマットでデータが送られてくるのかを確認してみます。
以下のLogstash構成ファイルを用意して、データをstdoutに出力させてみます。
input{
tcp{
port => 8081
}
}
filter {
json { source => "message" }
}
output {
stdout{ }
}
結果は以下のようなイメージになります。
{
"host" => "EPLEX1",
"systemName" => "ZOS1",
"message" => [
[ 0] "14:26:40:63,2019-10-16,2019-10-16 05:26:26.052751,2019-10-16 05:26:26.615020,+5.6226900000000000E-01,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,225,,,CICSUSER,1,+5.6184192675781250E-01,+4.1619531249999995E-04,+2.5321044921874995E-04,+0.0000000000000000,+5.6185334716796874E-01,+7.9862304687499998E-05,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.1782226562499998E-06,+0.0000000000000000,TO,0,0,0,4",
[ 1] "14:26:40:63,2019-10-16,2019-10-16 05:26:28.629236,2019-10-16 05:26:30.354763,+1.7255269999999998E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHECIP ,CECI,226,,,CICSUSER,1,+1.7247811088867187E+00,+7.3657128906249995E-04,+5.3337915039062498E-04,+0.0000000000000000,+1.7247909145507812E+00,+1.4873437500000000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.1767578124999999E-06,+0.0000000000000000,TO,1,3,0,0",
[ 2] "14:26:40:63,2019-10-16,2019-10-16 05:26:32.634812,2019-10-16 05:26:35.607077,+2.9722649999999999E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,227,,,CICSUSER,1,+2.9716771376953124E+00,+5.7749169921874997E-04,+4.2141333007812497E-04,+0.0000000000000000,+2.9716874780273437E+00,+1.3073730468750000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+1.8730468749999998E-06,+0.0000000000000000,TO,0,0,0,6",
[ 3] "15:25:21:23,2019-10-16,2019-10-16 06:24:56.480718,2019-10-16 06:24:58.415231,+1.9345129999999999E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,234,,,CICSUSER,1,+1.9337729287109373E+00,+7.2817919921874997E-04,+4.8072851562499998E-04,+0.0000000000000000,+1.9337849877929687E+00,+1.8760351562500000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.6459960937499999E-06,+0.0000000000000000,TO,0,0,0,6",
[ 4] "15:25:21:23,2019-10-16,2019-10-16 06:24:59.846267,2019-10-16 06:25:04.324002,+4.4777349999999998E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,235,,,CICSUSER,1,+4.4766067729492187E+00,+1.1168886718750000E-03,+6.6918896484374996E-04,+0.0000000000000000,+4.4766186826171874E+00,+1.7628564453125000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.5947265624999999E-06,+0.0000000000000000,TO,0,0,0,7",
[ 5] "15:25:21:23,2019-10-16,2019-10-16 06:25:06.899497,2019-10-16 06:25:08.452892,+1.5533949999999999E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,236,,,CICSUSER,1,+1.5526840727539062E+00,+6.9926074218749999E-04,+4.4962695312499999E-04,+0.0000000000000000,+1.5526964975585937E+00,+1.3585839843750000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.7021484374999999E-06,+0.0000000000000000,TO,0,0,0,6",
[ 6] "15:25:21:23,2019-10-16,2019-10-16 06:25:09.641692,2019-10-16 06:25:10.957045,+1.3153530000000000E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,237,,,CICSUSER,1,+1.3147200776367187E+00,+6.2336279296874999E-04,+4.0250317382812498E-04,+0.0000000000000000,+1.3147298642578125E+00,+1.1918554687500000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.0751953124999999E-06,+0.0000000000000000,TO,0,0,0,6",
[ 7] "15:25:21:23,2019-10-16,2019-10-16 06:25:11.693911,2019-10-16 06:25:12.152630,+4.5871900000000000E-01,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,238,,,CICSUSER,1,+4.5820498876953124E-01,+5.0387255859374997E-04,+3.3403295898437499E-04,+0.0000000000000000,+4.5821500683593749E-01,+1.2238867187500000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+1.8779296874999998E-06,+0.0000000000000000,TO,0,0,0,6",
[ 8] "15:25:21:23,2019-10-16,2019-10-16 06:25:14.020450,2019-10-16 06:25:17.548744,+3.5282939999999998E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHECIP ,CECI,239,,,CICSUSER,1,+3.5273268320312499E+00,+9.5226025390625000E-04,+6.6098193359374999E-04,+0.0000000000000000,+3.5273413598632812E+00,+1.3654882812500000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.8388671874999999E-06,+0.0000000000000000,TO,1,3,0,0",
[ 9] "15:25:21:23,2019-10-16,2019-10-16 06:25:18.002336,2019-10-16 06:25:18.282884,+2.8054800000000001E-01,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHAPATT,CSSY,241,,,CICSUSER,1,+0.0000000000000000,+6.5547851562499997E-05,+6.5927734374999997E-05,+0.0000000000000000,+2.8048292480468749E-01,+1.3471679687500000E-05,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+1.7583007812499998E-06,+0.0000000000000000,U ,0,0,0,1",
[10] "15:25:21:23,2019-10-16,2019-10-16 06:25:18.001721,2019-10-16 06:25:20.372911,+2.3711899999999999E+00,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHECIP ,CECI,240,,,CICSUSER,1,+2.3703299291992186E+00,+8.4818359374999998E-04,+5.9662841796874998E-04,+0.0000000000000000,+2.3703422392578124E+00,+1.4539404296875000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.5825195312499999E-06,+0.0000000000000000,TO,1,3,0,0",
...
[75] "15:36:23:41,2019-10-16,2019-10-16 06:35:12.749281,2019-10-16 06:35:12.977761,+2.2848000000000000E-01,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,308,,,CICSUSER,1,+2.2802571191406250E-01,+4.4702246093749996E-04,+2.2888208007812500E-04,+0.0000000000000000,+2.2803313623046874E-01,+8.2666992187499997E-05,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+1.8715820312499998E-06,+0.0000000000000000,TO,0,0,0,4",
[76] "15:36:23:41,2019-10-16,2019-10-16 06:35:13.325202,2019-10-16 06:36:19.716521,+6.6391318999999999E+01,ZOS1,CT54D4A1,CT54D4A1,CT54D4A1,DFHEMTP ,CEMT,309,,,CICSUSER,1,+6.6390804713867187E+01,+5.0718749999999999E-04,+3.1560742187499997E-04,+0.0000000000000000,+6.6390812188964841E+01,+1.4839648437500000E-04,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+0.0000000000000000,+2.2973632812500000E-06,+0.0000000000000000,TO,0,0,0,4"
],
"@version" => "1",
"port" => 58998,
"inputsequence" => "20200122054718784:000000",
"sourceType" => "zOS-SMF_110_1_CUST",
"seq" => {
"w" => "1",
"c" => "1"
},
"@timestamp" => 2020-01-22T05:47:11.906Z,
"sysplexName" => "EPLEX",
"timeZone" => "+0900",
"sourceName" => "ZOS1-SMF_110_1_CUST",
"path" => "SMF/SMF_110_1_CUST"
}
統計情報取得
カスタマイズ
事前準備: 取得フィールドの選択
CDPzが用意しているSMF_110_2というData Streamは、一見統計情報が取得できるように見えますが、ここで取得されるフィールドは、以下に示される、いわゆるヘッダー部分に相当するデータのみです。
参考: SMF Header and SMF Prodcut section
本来取得したい統計情報は、以下に示されるData Sectionと呼ばれる部分で、これらのフィールドを取得するにはカスタマイズが必要になります。
参考: CICS statistics data section
上に示されているように、STIDと呼ばれるカテゴリ単位に多数のフィールドが用意されており、SDEの定義でもSTID毎にレコードが定義されています。
例えば、STID:10は「Transaction Manager Global Stats」を表し、このカテゴリに含まれるフィールドについての詳細は、以下のデータエリアの説明から確認できます。
参考: フィールドの型の情報 => XMGDS - Transaction Manager Global Stats
取り扱いたいフィールドの型の情報はここから判断することになります。
それぞれのフィールドの意味合いについては、以下の箇所を参照する必要があります。
参考: フィールドの説明 => Transaction manager: Global statistics
各STIDをハンドリングするためのSDEの定義は、CDPZ02.V2R1M0.HSBODEFS(HBOR1102)で提供されています。
STID:10(Transaction Manager Global Stats)に関する定義の抜粋は以下の通りです。
/*----------------------------------------------------*/
/* SMF_110_2_10 record, created by record procedure */
/* HBO2CIST for sections with STID=10. Was STID = 3 */
/* for CICS/ESA 3.3 and earlier. */
/* */
/* Transaction Manager Global Statistics */
/* PN63456 */
/*----------------------------------------------------*/
DEFINE RECORD SMF_110_2_10
VERSION 'CDP.RW066419' -- @13C
IN LOG SMF /* PN63456 */
BUILT BY HBO2CIST -- @13C
IDENTIFIED BY REC_STID = 10
FIELDS
(REC_LEN LENGTH 2 BINARY, -- copy of SMFSTLEN
REC_STID LENGTH 2 BINARY, -- copy of STID
-----------------------------------------------------------------------
-- SMF HEADER
-----------------------------------------------------------------------
SMFSTLEN LENGTH 2 BINARY,
SMFSTSEQ LENGTH 2 BINARY,
SMFSTFLG LENGTH 1 BIT,
SMFSTRTY LENGTH 1 BINARY,
SMFSTTME TIME(1/100S),
SMFSTDTE DATE(0CYYDDDF),
SMFSTSID LENGTH 4 CHAR,
SMFSTSSI LENGTH 4 CHAR,
SMFSTSTY LENGTH 2 BINARY,
SMFSTTRN LENGTH 2 BINARY,
* LENGTH 2 BINARY,
SMFSTAPS LENGTH 4 BINARY,
SMFSTLPS LENGTH 2 BINARY,
SMFSTNPS LENGTH 2 BINARY,
SMFSTASS LENGTH 4 BINARY,
SMFSTASL LENGTH 2 BINARY,
SMFSTASN LENGTH 2 BINARY, -- end of SMF header
SMFSTRVN LENGTH 2 HEX, -- VSN, eg '0410' Product section
SMFSTPRN LENGTH 8 CHAR, -- Generic Applid
SMFSTSPN LENGTH 8 CHAR, -- Specific Applid
SMFSTMFL LENGTH 2 HEX,
* LENGTH 2 BINARY,
* LENGTH 2 BINARY,
SMFSTDTK LENGTH 4 BINARY, -- Domain Token
SMFSTDID LENGTH 2 CHAR, -- Domain ID
SMFSTRQT LENGTH 3 CHAR, -- Type of statistics record
SMFSTICD LENGTH 3 CHAR, -- Yes if record incomplete
SMFSTDAT OFFSET 84 LENGTH 6 DATE(MMDDYY), -- Not Meaningful PQ03356
SMFSTCLT OFFSET 90 LENGTH 6 TIME(HHMMSS), -- for CICS<V510 PQ03356
* OFFSET 96 LENGTH 2 HEX,
SMFSNDAT OFFSET 84 LENGTH 8 DATE(MMDDYYYY), --Meaningful forPQ03356
SMFSNCLT OFFSET 92 LENGTH 6 TIME(HHMMSS), --for CICS>=V510PQ03356
SMFSTINT LENGTH 6 TIME(HHMMSS),
SMFSTINO LENGTH 4 BINARY,
SMFSTRTK LENGTH 8 HEX,
SMFSTLRT LENGTH 6 TIME(HHMMSS),
SMFSTCST TIMESTAMP(TOD),
SMFSTJBN LENGTH 8 CHAR,
SMFSTRSD DATE(0CYYDDDF),
SMFSTRST TIME(1/100S),
SMFSTUIF LENGTH 8 CHAR,
SMFSTPDN LENGTH 8 CHAR,
STILEN LENGTH 2 BINARY, -- Beginning of data section
STID LENGTH 2 BINARY,
STIVERS LENGTH 1 HEX,
* LENGTH 3 BINARY)
-----------------------------------------------------------------------
-- STATISTICS DATA SECTION
-----------------------------------------------------------------------
SECTION GLOB_TRAN_MANAGER
OFFSET SMFSTASS
LENGTH SMFSTASL
FIELDS (XMGNUM LENGTH 4 BINARY,
-- total user+system txns @13A
XMGMXT LENGTH 4 BINARY,
-- current MAXTASKS limit @13A
XMGCAT LENGTH 4 BINARY,
-- active user transactions @13A
XMGCQT LENGTH 4 BINARY,
-- current # queued user txns @13A
XMGTAMXT LENGTH 4 BINARY,
-- number of times MAXTASKS reached @13A
XMGPAT LENGTH 4 BINARY,
-- peak MAXTASKS queued user txns @13A
XMGPQT LENGTH 4 BINARY,
-- peak number of active user txns @13A
XMGTAT LENGTH 4 BINARY,
-- total number of active user txns @13A
XMGTDT LENGTH 4 BINARY,
-- number of user txns queued for @13A
-- MAXTASK does not include XMGCQT @13A
XMGTQTME TIMESTAMP(TOD),
-- queuing time for txns counted @13A
-- by XMGTDT @13A
XMGCQTME TIMESTAMP(TOD),
-- queuing time for txns counted @13A
-- by XMGCQT @13A
* LENGTH 4 BINARY,
XMGTNUM LENGTH 8 BINARY, -- @08C
-- total txns attached since last @13A
-- stats reset, XMGNUM + XMGTNUM is @13A
-- total txns attached so far @13A
XMGGTAT TIMESTAMP(TOD), -- 2@08A
-- time last txn attached (GMT)
XMGLTAT TIMESTAMP(TOD), -- 2@08A
-- time last txn attached(local)
XMGGSMXT TIMESTAMP(TOD), -- 2@08A
-- time MXT set (GMT)
XMGLSMXT TIMESTAMP(TOD), -- 2@08A
-- time MXT set (local)
XMGGAMXT TIMESTAMP(TOD), -- 2@08A
-- time MXT reached (GMT)
XMGLAMXT TIMESTAMP(TOD), -- 2@08A
-- time MXT reached (local)
XMGATMXT LENGTH 1 BIT, -- 3@08A
-- at MXT indicator
-- X'80' currently at MXT
* LENGTH 7 CHAR); -- 2@08A
-- Reserved
COMMENT ON RECORD SMF_110_2_10 IS
'CICS/ESA global transaction stats';
さて、ここでは、STID:10(Transaction Manager Global Stats)、および、STID:11(Transaction Manager Transaction Stats)の各フィールドを追加してみたいと思います。
SDE定義のカスタマイズ
抽出したいフィールドの型の情報をチェックします。例えば、STID:10の、XMGTQTMEというフィールドに着目してみます。このフィールドの説明、型の情報を見ると、以下のようになっています。
Total MAXTASK queuing time
is the total time spent waiting by those user transactions that had to queue for MXT reasons. This value does not include the time spent by those transactions that are currently queueing for MXT (see XMGCQTME).
THE FOLLOWING CL8 DEFINITIONS ARE REALLY "STORE CLOCK" FORMAT
つまり、MXTに達してキューイングされていた合計時間がTOD Clockフォーマットで格納されていることになります。ところが、製品提供のSDEの定義(HBOR1102)では、XMGTQTME TIMESTAMP(TOD)
となっており、このフィールドがタイムスタンプであるかのように定義されています。TIMESTAMP(TOD)型で定義されてしまうと、"1900-01-01 00:00:00.000000"といった形式にフォーマットされてしまいます。本来であれば、キューイングされていた時間(数値型)としてハンドリングして欲しいので、この定義は不適切と判断されます(製品不具合???)。
このフィールド定義の型を変更したいので、CDPZ02.V2R1M0.HSBODEFS(HBOR1102) => CDPZ02.CUSTOM.HSBODEFS(HBOR1102)にコピーして編集します。
...
XMGTQTME LENGTH 8 BINARY UNSIGNED,
...
XMGCQTME LENGTH 8 BINARY UNSIGNED,
...
XMGCQTMEも同じ位置づけなので、同じように変更します。
次に、各STIDを出力させるための定義を追加します。これはデフォルトでは定義されていないので、新規にCDPZ02.CUSTOM.SHBODEFS(HBOU1102)というメンバーを作成します。他の定義に倣って、以下のような定義を作成します。
/**********************************************************************/
/* Name: HBOU1102 */
/**********************************************************************/
-- HBORS1102_10 records
SET IBM_FILE = 'S1102010';
DEFINE UPDATE SMF_110_2_10
VERSION 'CDP.110 '
FROM SMF_110_2_10
TO &IBM_UPDATE_TARGET
AS &IBM_FILE_FORMAT
GROUP BY NONE
SET
(REC_STID = FIRST(REC_STID),
SMFSTTME = FIRST(SMFSTTME),
SMFSTDTE = FIRST(SMFSTDTE),
SMFSTSID = FIRST(SMFSTSID),
SMFSTSSI = FIRST(SMFSTSSI),
SMFSTLRT = FIRST(SMFSTLRT),
SMFSTCST = FIRST(SMFSTCST),
SMFSTJBN = FIRST(SMFSTJBN),
SMFSTRSD = FIRST(SMFSTRSD),
SMFSTRST = FIRST(SMFSTRST),
XMGNUM = FIRST(XMGNUM),
XMGMXT = FIRST(XMGMXT),
XMGCAT = FIRST(XMGCAT),
XMGCQT = FIRST(XMGCQT),
XMGTAMXT = FIRST(XMGTAMXT),
XMGPAT = FIRST(XMGPAT),
XMGPQT = FIRST(XMGPQT),
XMGTAT = FIRST(XMGTAT),
XMGTDT = FIRST(XMGTDT),
XMGTQTME = FIRST(XMGTQTME / 4096E6),
XMGCQTME = FIRST(XMGCQTME / 4096E6),
XMGTNUM = FIRST(XMGTNUM));
-- HBORS1102_11 records
SET IBM_FILE = 'S1102011';
DEFINE UPDATE SMF_110_2_11
VERSION 'CDP.110 '
FROM SMF_110_2_11
TO &IBM_UPDATE_TARGET
AS &IBM_FILE_FORMAT SET(ALL);
DEFINE TEMPLATE SMF_110_2_11 FOR SMF_110_2_11
ORDER
(REC_STID,
SMFSTTME,
SMFSTDTE,
SMFSTSID,
SMFSTSSI,
SMFSTLRT,
SMFSTCST,
SMFSTJBN,
SMFSTRSD,
SMFSTRST,
XMRTI,
XMRPN,
XMRTCL,
XMRRNAM,
XMRRSYS,
XMRPRTY,
XMRDYN,
XMRAC,
XMRRC,
XMRDLC,
XMRDRC,
XMRRSC,
XMRSVC,
XMRITV,
XMRIWO,
XMRIAC)
AS &IBM_FILE_FORMAT;
ここで、STID:10については、TOD Clock型のフィールドについて秒換算する必要があるため、SET節で抽出したいフィールドを明示指定して計算処理を含めています。
STID:11については変換処理を行う必要がなさそうなので、TEMPLATEを定義して必要なフィールドを抽出しています。
※ここで、割算とか型変換を行わせたい場合、恐らくUPDATE文のSET節を使う必要があると思われる(UPDATEでGROUP BY NONEを指定することで、各レコードを1グループとして扱うことになるので、実質グルーピングは行われずに、計算処理だけ行わせることができる)。フィールドの変換をする必要が無いのであればDEFINE TEMPLETEでよい。
参考: Language reference for System Data Engine
バッチで、この定義を使って意図した通りCSV化ができるかどうかを確認します。
以下のJCLを作成してサブミットします。
//HBOSMFCB JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//*
//HBOSMFCB EXEC PGM=HBOPDE,REGION=0M,
// PARM='SHOWINPUT=NO,ZIIPOFFLOAD=NO'
//STEPLIB DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBOLOAD
//*
//* CONTROL STATEMENTS
//*
//HBOIN DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOCCSV)
// DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOLLSMF)
// DD DISP=SHR,DSN=CDPZ02.CUSTOM.SHBODEFS(HBOR1102)
// DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOR1103)
// DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOTDSPE)
// DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOTDWEK)
// DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOTPERI)
// DD DISP=SHR,DSN=CDPZ02.CUSTOM.SHBODEFS(HBOU1102)
//*
//* Sample COLLECT statement for processing log data
//*
// DD *
COLLECT SMF
COMMIT AFTER END OF FILE;
/*
//HBOLOG DD DISP=SHR,DSN=CDPZ01.SMFDUMP.D191016.T1
//HBOOUT DD SYSOUT=*
//HBODUMP DD SYSOUT=*
//HBODEBUG DD SYSOUT=*
//S1102010 DD SYSOUT=*,RECFM=V,LRECL=32756
//S1102011 DD SYSOUT=*,RECFM=V,LRECL=32756
※HBOIN DDで、カスタマイズした以下のメンバーを指定しています!
DD DISP=SHR,DSN=CDPZ02.CUSTOM.SHBODEFS(HBOR1102)
DD DISP=SHR,DSN=CDPZ02.CUSTOM.SHBODEFS(HBOU1102)
JOBLOGを確認します。
10,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,199,50,1,0,0,1,0,124,0,+0.0000000000000000,+0.0000000000000000,+1.2600000000000000E+02
10,18:00:46:84,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,199,50,1,0,0,1,0,124,0,+0.0000000000000000,+0.0000000000000000,+1.2600000000000000E+02
10,18:00:48:07,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,199,50,1,0,0,1,0,124,0,+0.0000000000000000,+0.0000000000000000,+1.2600000000000000E+02
10,18:00:49:25,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,200,50,1,0,0,1,0,125,0,+0.0000000000000000,+0.0000000000000000,+1.2600000000000000E+02
10,18:00:50:34,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,201,50,1,0,0,1,0,126,0,+0.0000000000000000,+0.0000000000000000,+1.2600000000000000E+02
11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CADP,DFHDPLU , , , ,1,N,0,0,0,0,0,0,0,Y,B
11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CATA,DFHZATA , , , ,255,N,2,0,0,0,0,0,0,Y,B
11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CATD,DFHZATD , , , ,255,N,1,0,0,0,0,0,0,Y,B
11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CATR,DFHZATR , , , ,255,N,0,0,0,0,0,0,0,Y,B
11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CBAM,DFHECBAM, , , ,255,N,0,0,0,0,0,0,0,Y,B
11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CCIN,DFHZCN1 ,DFHCOMCL, , ,254,N,0,0,0,0,0,0,0,Y,B
...
ポリシーのカスタマイズ
上で定義したData Streamの内容を、ConfigTool上でもCustom Data Streamとして定義します。
参考:Creating a System Data Engine data stream definition のProcedure 2~5
ConfigToolでMANAGE CUSTOM DATA STREAM DEFINITIONSボタンをクリック。
Create System Data Engine data stream definitionをクリック。
この定義は、追加したいSTID単位に作成します。
以下、STID:10 用のData Stream定義例です。各フィールドに値を設定してOKを押します。
<補足>
Name: 新しく追加するData Stream名
Description: 説明
Group/Subgroup: 新しく追加するData Streamを配置するグループ名/サブグループ名(任意の名前)。エディターで選択する際に、Custum Data Streams以下にこのグループにカテゴライズされて表示される。
SHBODEFS dataset members:このData Streamに関連するSHBODEFSメンバー名
実体として、USS上に以下のようなJSONファイルが作成されます。
/u/CDP201/cdpConfig/SMF_110_2_10.streams.json
/u/CDP201/cdpConfig/SMF_110_2_11.streams.json
{
"groupings": {
"Custom Data Streams": {
"CICS Group": {
"Statistics": [
"SMF_110_2_10"
]
}
}
},
"definitions": [
{
"category": "SMF",
"name": "SMF_110_2_10",
"description": "Customized Statstics STID 10",
"tags": [
"CSV",
"Split",
"Custom"
],
"concatenation": [
"USER",
"CDP"
],
"hboin": {
"all": [
"HBOCCORY",
"HBOLLSMF",
"HBOR1102",
"HBOR1103",
"HBOTDSPE",
"HBOTDWEK",
"HBOTPERI",
"HBOU1102"
]
},
"parms": [
{
"displayName": "Data Source Name",
"name": "dataSourceName",
"defaultValue": "SMF_110_2_10",
"edit": "Required",
"description": "Name of Data Source sent to subscribers",
"policyOnly": 1,
"unique": true
},
{
"displayName": "Data Source Type",
"name": "dataSourceType",
"defaultValue": "zOS-SMF_110_2_10",
"edit": "Protected",
"description": "Type of Data Source sent to subscribers",
"policyOnly": 1
},
{
"displayName": "File Path",
"name": "filePath",
"defaultValue": "SMF/SMF_110_2_10",
"edit": "Protected",
"description": "Path used for the SMF data",
"policyOnly": 1,
"unique": true
}
]
}
]
}
新しく追加したData Streamを使って、ポリシーを作成します。
新規にポリシー作成する際に、Data Streamを選択するメニューに上で追加したSMF_110_2_10, SMF_110_2_11が表示されるので、それを選択します。
ユーザー定義のCustom Data Streamを指定した場合、SYSTEM DATA ENGINEボタンを押すと、以下のようにUSER Concaenationという設定が新たに追加指定できるようになります。ここに、カスタマイズしたData Stream定義を配置したPDSデータセット名を指定することになります。
Data Streamer(HBODSPRO)の設定変更
Data Streamer起動プロシージャーで参照するポリシーファイルの指定を、上で生成されたポリシーファイルに置き換えて起動します。
Logstash構成ファイルのカスタマイズ
一旦、どのような形式でデータが送信されてくるか確認します。
例によって以下のLogstash構成ファイルにて確認します。
input{
tcp{
port => 8081
}
}
filter {
json { source => "message" }
}
output {
stdout{ }
}
結果
{
"sourceName" => "ZOS1-SMF_110_2_10",
"message" => [
[0] "10,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,199,50,1,0,0,1,0,124,0,+0.0000000000000000,+0.0000000000000000,+1.26000
00000000000E+02",
[1] "10,18:00:46:84,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,199,50,1,0,0,1,0,124,0,+0.0000000000000000,+0.0000000000000000,+1.26000
00000000000E+02",
[2] "10,18:00:48:07,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,199,50,1,0,0,1,0,124,0,+0.0000000000000000,+0.0000000000000000,+1.26000
00000000000E+02",
[3] "10,18:00:49:25,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,200,50,1,0,0,1,0,125,0,+0.0000000000000000,+0.0000000000000000,+1.26000
00000000000E+02",
[4] "10,18:00:50:34,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,201,50,1,0,0,1,0,126,0,+0.0000000000000000,+0.0000000000000000,+1.26000
00000000000E+02"
],
"sourceType" => "zOS-SMF_110_2_10",
"port" => 41576,
"@version" => "1",
"host" => "EPLEX1",
"path" => "SMF/SMF_110_2_10",
"timeZone" => "+0900",
"seq" => {
"w" => "2",
"c" => "0"
},
"sysplexName" => "EPLEX",
"inputsequence" => "20200123022216080:000000",
"@timestamp" => 2020-01-23T02:22:09.306Z,
"systemName" => "ZOS1"
}
{
"sourceName" => "ZOS1-SMF_110_2_11",
"message" => [
[ 0] "11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CADP,DFHDPLU , , , ,1,N,0,0,0,0,0,0,0,Y,B",
[ 1] "11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CATA,DFHZATA , , , ,255,N,2,0,0,0,0,0,0,Y,B",
[ 2] "11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CATD,DFHZATD , , , ,255,N,1,0,0,0,0,0,0,Y,B",
[ 3] "11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CATR,DFHZATR , , , ,255,N,0,0,0,0,0,0,0,Y,B",
[ 4] "11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CBAM,DFHECBAM, , , ,255,N,0,0,0,0,0,0,0,Y,B",
[ 5] "11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CCIN,DFHZCN1 ,DFHCOMCL, , ,254,N,0,0,0,0,0,0,0,Y,B",
...
[978] "11,18:00:50:34,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CXRT,DFHCRT , , , ,1,N,0,0,0,0,0,0,0,Y,B",
[979] "11,18:00:50:34,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,DSNC,DFHD2CM1, , , ,255,N,0,0,0,0,0,0,0,Y,B"
],
"sourceType" => "zOS-SMF_110_2_11",
"port" => 41576,
"@version" => "1",
"host" => "EPLEX1",
"path" => "SMF/SMF_110_2_11",
"timeZone" => "+0900",
"seq" => {
"w" => "0",
"c" => "1"
},
"sysplexName" => "EPLEX",
"inputsequence" => "20200123022216131:000000",
"@timestamp" => 2020-01-23T02:22:09.338Z,
"systemName" => "ZOS1"
}
STID:10, STID:11それぞれについて、Logstashの構成ファイルを作成します(製品提供のファイル群には含まれていないので、一から作成する必要があります)。
型の指定は、「(5)カスタマイズ-共通」の記事で示しているElasticsearchのindex templateにて型を明示指定することもできますし、numeric_detectionを有効化することである程度自動変換もしてくれます。Elasticsearch のIndex templateで型の対応をしている場合は、以下に記載のLogstashでの明示的な型設定は不要です。
STID:10用定義作成
filter {
if [sourceType] == "zOS-SMF_110_2_10" {
csv{
columns => [ "REC_STID", "SMFSTTME", "SMFSTDTE", "SMFSTSID", "SMFSTSSI", "SMFSTLRT", "SMFSTCST", "SMFSTJBN", "SMFSTRSD", "SMFSTRST", "XMGNUM", "XMGMXT", "XMGCAT", "XMGCQT", "XMGTAMXT", "XMGPAT", "XMGPQT", "XM
GTAT", "XMGTDT", "XMGTQTME", "XMGCQTME", "XMGTNUM" ]
separator => ","
convert => {
"XMGNUM" => "integer"
"XMGMXT" => "integer"
"XMGCAT" => "integer"
"XMGCQT" => "integer"
"XMGTAMXT" => "integer"
"XMGPAT" => "integer"
"XMGPQT" => "integer"
"XMGTAT" => "integer"
"XMGTDT" => "integer"
"XMGTQTME" => "float"
"XMGCQTME" => "float"
"XMGTNUM" => "float"
}
}
}
}
filter {
if [sourceType] == "zOS-SMF_110_2_10" {
mutate{ add_field => {
"[@metadata][timestamp]" => "%{SMFSTDTE} %{SMFSTTME}"
}}
date{ match => [
"[@metadata][timestamp]", "yyyy-MM-dd HH:mm:ss:SS"
]}
}
}
STID:10用定義作成
filter {
if [sourceType] == "zOS-SMF_110_2_11" {
csv{
columns => [ "REC_STID", "SMFSTTME", "SMFSTDTE", "SMFSTSID", "SMFSTSSI", "SMFSTLRT", "SMFSTCST", "SMFSTJBN", "SMFSTRSD", "SMFSTRST", "XMRTI", "XMRPN", "XMRTCL", "XMRRNAM", "XMRRSYS", "XMRPRTY", "XMRDYN", "XMRAC", "XMRRC", "XMRDLC", "XMRDRC", "XMRRSC", "XMRSVC", "XMRITV", "XMRIWO", "XMRIAC" ]
separator => ","
convert => {
"XMRAC" => "integer"
"XMRRC" => "integer"
"XMRDLC" => "integer"
"XMRDRC" => "integer"
"XMRRSC" => "integer"
"XMRSVC" => "integer"
"XMRITV" => "integer"
}
}
}
}
filter {
if [sourceType] == "zOS-SMF_110_2_11" {
mutate{ add_field => {
"[@metadata][timestamp]" => "%{SMFSTDTE} %{SMFSTTME}"
}}
date{ match => [
"[@metadata][timestamp]", "yyyy-MM-dd HH:mm:ss:SS"
]}
}
}
一旦、outputをElasticsearchではなくstdoutにして、Logstashのレベルでフォーマットできるか確認してみると...
{
"@version" => "1",
"seq" => {
"w" => "1",
"c" => "0"
},
"XMGPQT" => 0,
"XMGMXT" => 50,
"XMGCQTME" => 0.0,
"SMFSTSSI" => "CICS",
"timeZone" => "+0900",
"message" => "10,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,199,50,1,0,0,1,0,124,0,+0.0000000000000000,+0.00000000000000
00,+1.2600000000000000E+02",
"XMGCQT" => 0,
"port" => 41578,
"SMFSTCST" => "2019-10-15 17:45:43.317175",
"XMGTNUM" => 126.0,
"systemName" => "ZOS1",
"SMFSTSID" => "ZOS1",
"XMGPAT" => 1,
"REC_STID" => "10",
"XMGCAT" => 1,
"host" => "EPLEX1",
"inputsequence" => "20200123022757604:000000",
"SMFSTJBN" => "CT54D4A1",
"sourceType" => "zOS-SMF_110_2_10",
"SMFSTDTE" => "2019-10-16",
"SMFSTRSD" => "2019-10-15",
"SMFSTRST" => "17:45:41:86",
"XMGTDT" => 0,
"path" => "SMF/SMF_110_2_10",
"SMFSTLRT" => "00:00:00",
"@timestamp" => 2019-10-16T09:00:44.780Z,
"SMFSTTME" => "18:00:44:78",
"XMGTQTME" => 0.0,
"sourceName" => "ZOS1-SMF_110_2_10",
"XMGTAT" => 124,
"XMGNUM" => 199,
"sysplexName" => "EPLEX",
"XMGTAMXT" => 0
}
...
{
"@version" => "1",
"seq" => {
"w" => "2",
"c" => "1"
},
"XMRSVC" => 0,
"SMFSTSSI" => "CICS",
"timeZone" => "+0900",
"message" => "11,18:00:44:78,2019-10-16,ZOS1,CICS,00:00:00,2019-10-15 17:45:43.317175,CT54D4A1,2019-10-15,17:45:41:86,CATA,DFHZATA , , , ,255,N,2,0,0,0,0,0,0,Y,B
",
"XMRTCL" => " ",
"XMRPRTY" => "255",
"port" => 41578,
"SMFSTCST" => "2019-10-15 17:45:43.317175",
"XMRDYN" => "N",
"systemName" => "ZOS1",
"SMFSTSID" => "ZOS1",
"XMRAC" => 2,
"REC_STID" => "11",
"XMRRSC" => 0,
"host" => "EPLEX1",
"inputsequence" => "20200123022757655:000000",
"SMFSTJBN" => "CT54D4A1",
"XMRPN" => "DFHZATA ",
"sourceType" => "zOS-SMF_110_2_11",
"XMRDRC" => 0,
"SMFSTDTE" => "2019-10-16",
"SMFSTRSD" => "2019-10-15",
"SMFSTRST" => "17:45:41:86",
"XMRRSYS" => " ",
"path" => "SMF/SMF_110_2_11",
"SMFSTLRT" => "00:00:00",
"@timestamp" => 2019-10-16T09:00:44.780Z,
"SMFSTTME" => "18:00:44:78",
"XMRRNAM" => " ",
"XMRITV" => 0,
"sourceName" => "ZOS1-SMF_110_2_11",
"XMRIWO" => "Y",
"XMRRC" => 0,
"XMRDLC" => 0,
"sysplexName" => "EPLEX",
"XMRIAC" => "B",
"XMRTI" => "CATA"
}
うまく取れてそうなのでOKでしょう。ということで、Elasticsearchにぶちこんで、Kibanaで見てみます。
Kibana Discoverでの確認
Elasticsearchにデータを取り込むと、cdp-zos-smf_110_2_10-* および cdp-zos-smf_110_2_10-*という名前のindexに取り込まれるので、index patternを作ってDiscoverで確認してみます。
それぞれ取り込めてそうです。
Logger情報取得
CICS関連のパフォーマンス情報を確認する際は、上に挙げたモニター、統計情報以外に、Loggerに関する情報も合わせて参照することも多いです。LoggerはCICS自体の機能ではなくOS提供の機能(IXGLOGR)が利用されます。
Logger関連SMF補足
SMF Type 88
Logger関連の情報は、SMF Type 88として取得されます。
参考: Record Type 88 (58) — System Logger Data
参考: System Logger interim storage related I/O activity
参考: Monitoring the logger environment
SMF関連設定
LoggerはOS提供コンポーネントのため、データ書き込みのインターバルなどの設定はOSの設定に依存します。
参考: Statements and parameters for SMFPRMxx
参考: Displaying SMF data
参考: SETSMF command
D SMF,O
SETSMF INTVAL(01)
Logger関連SMFデータの確認
SMF Type 88のダンプ用JCLサンプル
//SMFDUMP JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//***************************************************************
//SMFDUMP EXEC PGM=IFASMFDP
//INDD1 DD DSN=SYS1.ZOS1.MAN3,DISP=SHR
//OUTDD1 DD DSN=CDPZ02.SMFDUMP.D200127.LOGR,DISP=(NEW,CATLG,DELETE),
// SPACE=(CYL,(10,5)),VOL=SER=ZSPK01
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
INDD(INDD1,OPTIONS(DUMP))
OUTDD(OUTDD1,TYPE(88))
/*
Logger関連SMFデータフォーマット用JCLサンプル
参考: Sample JCL procedures and functions in SYS1.SAMPLIB
参考: IXGRPT1 SAMPLIB program
//IXGRPT1J JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) 00010000
//* ******************************************************************* 00030000
//* TO REPLACE THE SET STATEMENTS, FOLLOW THE INSTRUCTIONS BELOW IN * 00040000
//* THE SUGGESTED MODIFICATION SECTION. * 00050000
//* ******************************************************************* 00060000
// SET SMFIN1=CDPZ02.SMFDUMP.D200127.LOGR 00070001
// SET LIBPRFX=CEE 00080000
// SET RPTOBJ=SYS1.SAMPLIB(IXGRPT1L) 00090000
//* 00100000
//* ******************************************************************* 01120500
//* SORT STEP: USE ROUTINE SPECIFIED BY YOUR SITE. ONE POSSIBILITY 01130000
//* WOULD BE DFSORT: 01140000
//* ******************************************************************* 01150000
//* 01160000
//* SORT EACH SMF INPUT DSN BY TIMESTAMP AND LOGSTREAM NAME 01170000
//SORT1 EXEC PGM=SORT 01180000
//SYSOUT DD SYSOUT=* 01190000
//SORTIN DD DSN=&SMFIN1,DISP=(OLD,KEEP) 01200000
//SORTOUT DD DSN=&&TEMP1,DISP=(NEW,PASS),UNIT=SYSDA, 01210000
// SPACE=(CYL,(1,1)) 01220000
//SYSIN DD * 01230000
OPTION VLSHRT 01240000
SORT FIELDS=(133,8,BI,A, 01250000
105,26,CH,A) 01260000
INCLUDE COND=(23,2,BI,EQ,X'0001',AND,241,10,CH,EQ,C'*DASDONLY*') 01270002
/* 01280000
//* @L1C 01281000
//* @L1C 01283001
//* USE THE SORT AND INCLUDE OPTIONS ABOVE AT THE HBB6603 AND HIGHER 01290000
//* RELEASE LEVELS. SEE DEPENDENCIES FOR OTHER RELEASE AND LOGSTREAM 01300000
//* REPORTING OPTIONS. 01310000
//* ******************************************************************* 01320000
//* ASSEMBLE SUBROUTINE IXGR1A. 01330000
//* ******************************************************************* 01340000
//ASMC EXEC PGM=ASMA90,REGION=0M,PARM='OBJECT,NODECK' * @01C 01350000
//SYSLIB DD DSN=SYS1.MACLIB,DISP=SHR * LIBRARY DSN 01360000
//SYSLIN DD DSN=&&OBJ(IXGR1A),SPACE=(TRK,(10,30,10),,,ROUND), 01370000
// UNIT=3390,DISP=(MOD,PASS), 01380000
// DCB=(BLKSIZE=3120,LRECL=80,RECFM=FB) * ASM OBJ 01390000
//SYSPRINT DD SYSOUT=* 01400000
//SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(5,5)) 01410000
//SYSIN DD DSN=SYS1.SAMPLIB(IXGR1A),DISP=SHR * ASM SOURCE 01420000
//* 01430000
//* ******************************************************************* 01440000
//* LINK/EDIT, AND EXECUTE OBJECT SAMPLIB MEMBER USING LE LIBRARIES. 01450000
//* ******************************************************************* 01460000
//LKED EXEC PGM=IEWL,REGION=1024K 01470000
//SYSLIB DD DSN=&LIBPRFX..SCEELKED,DISP=SHR * CATALOGUED PROC 01480000
//SYSPRINT DD SYSOUT=* 01490000
//SYSLIN DD DSN=&RPTOBJ.,DISP=SHR * @01C 01500000
// DD DDNAME=SYSIN 01510000
//SYSLMOD DD DSN=&&LOADMOD(GO),DISP=(MOD,PASS),UNIT=SYSDA, 01520000
// SPACE=(1024,(50,20,1)) * LOAD MODULE 01530000
//SYSUT1 DD DSN=&&SYSUT1,UNIT=SYSDA,SPACE=(1024,(200,20)), 01540000
// DCB=BLKSIZE=1024 01550000
//SYSIN DD DSN=*.ASMC.SYSLIN,DISP=(MOD,PASS) * ASM OBJ (IN) 01560000
//GO EXEC PGM=*.LKED.SYSLMOD,COND=(4,LT,LKED), 01570000
// REGION=2048K 01580000
//STEPLIB DD DSN=&LIBPRFX..SCEERUN,DISP=SHR * CATALOGUED PROC 01590000
//SYSPRINT DD SYSOUT=* 01600000
//CEEDUMP DD SYSOUT=* 01610000
//SYSUDUMP DD SYSOUT=* 01620000
//SMFDATA DD DSN=*.SORT1.SORTOUT,DISP=(MOD,PASS) 01630000
//RPORT88 DD SYSOUT=* * IXGRPT1 OUTPUT 01640000
//*//* *************************************************************** 01650000
上のJCLでフォーマットした結果例
SYSTEM LOGGER ACTIVITY REPORT (IXGRPT1)
PAGE 1
BYT WRITTN BYT WRITTN BYT WRITTN AVERAGE
BY USERS TO INTERIM TO DASD #WRITES ---# WRITES COMPLETED------ BUFFER
--LOGSTREAM NAME------------ STRUCTURE NAME-- IXGWRITES STORAGE INVOKED TYPE1 TYPE2 TYPE3 SIZE
BYT DELETD # DELETES BYT DELETD # DELETS ---------------EVENT---------------
INTERIM ST W/O DASD INTERIM ST W/ OFF- DASD STRC NTRY STG STG RE-
W/O DASD WRITE W/DASD WRITE LOAD SHFT FULL FULL THLD FULL BLD
___________________________________________________________________________________________________________________________________
...
01/27/20 6:41:00 AM (SMF INTERVAL TIMESTAMP 'D7629ACAD1700000'X)
CT54D0CM.DFHLOG *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D0CM.DFHSHUNT *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D4A1.DFHLOG *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D4A1.DFHSHUNT *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D6A1.DFHLOG *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D6A1.DFHSHUNT *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D6A2.DFHLOG *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D6A2.DFHSHUNT *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
01/27/20 6:42:00 AM (SMF INTERVAL TIMESTAMP 'D7629B0409E00000'X)
CT54D0CM.DFHLOG *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D0CM.DFHSHUNT *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D4A1.DFHLOG *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D4A1.DFHSHUNT *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D6A1.DFHLOG *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 ___________________________________________________________________________________________________________________________________
1
SYSTEM LOGGER ACTIVITY REPORT (IXGRPT1)
PAGE 2
BYT WRITTN BYT WRITTN BYT WRITTN AVERAGE
BY USERS TO INTERIM TO DASD #WRITES ---# WRITES COMPLETED------ BUFFER
--LOGSTREAM NAME------------ STRUCTURE NAME-- IXGWRITES STORAGE INVOKED TYPE1 TYPE2 TYPE3 SIZE
BYT DELETD # DELETES BYT DELETD # DELETS ---------------EVENT---------------
INTERIM ST W/O DASD INTERIM ST W/ OFF- DASD STRC NTRY STG STG RE-
W/O DASD WRITE W/DASD WRITE LOAD SHFT FULL FULL THLD FULL BLD
___________________________________________________________________________________________________________________________________
CT54D6A1.DFHSHUNT *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D6A2.DFHLOG *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D6A2.DFHSHUNT *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
...
01/27/20 7:42:00 AM (SMF INTERVAL TIMESTAMP 'D762A86D44200000'X)
CT54D0CM.DFHLOG *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D0CM.DFHSHUNT *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D4A1.DFHLOG *DASDONLY* 21027 135168 0 33 33 0 0 637
0 0 0 0 0 0 0 0 0 0 0
CT54D4A1.DFHSHUNT *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D6A1.DFHLOG *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D6A1.DFHSHUNT *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D6A2.DFHLOG *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D6A2.DFHSHUNT *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
01/27/20 7:43:00 AM (SMF INTERVAL TIMESTAMP 'D762A8A67C900000'X)
CT54D0CM.DFHLOG *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D0CM.DFHSHUNT *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D4A1.DFHLOG *DASDONLY* 13130 86016 0 21 21 0 0 625
0 0 0 0 0 0 0 0 0 0 0
CT54D4A1.DFHSHUNT *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D6A1.DFHLOG *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D6A1.DFHSHUNT *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D6A2.DFHLOG *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
CT54D6A2.DFHSHUNT *DASDONLY* 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0
0 ___________________________________________________________________________________________________________________________________
1
SYSTEM LOGGER ACTIVITY REPORT (IXGRPT1)
PAGE 6
BYT WRITTN BYT WRITTN BYT WRITTN AVERAGE
BY USERS TO INTERIM TO DASD #WRITES ---# WRITES COMPLETED------ BUFFER
--LOGSTREAM NAME------------ STRUCTURE NAME-- IXGWRITES STORAGE INVOKED TYPE1 TYPE2 TYPE3 SIZE
BYT DELETD # DELETES BYT DELETD # DELETS ---------------EVENT---------------
INTERIM ST W/O DASD INTERIM ST W/ OFF- DASD STRC NTRY STG STG RE-
W/O DASD WRITE W/DASD WRITE LOAD SHFT FULL FULL THLD FULL BLD
___________________________________________________________________________________________________________________________________
REPORT SUMMARY: ===================================================================================================================
MAX VAL SEEN (ANY INTERVL) 21027 135168 0 33 33 0 0 637
0 0 0 0 0 0 0 0 0 0 0
MIN VAL SEEN (ANY INTERVL) 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
AVG VAL SEEN (ANY INTERVL) 2627 17014 0 4 4 0 0 632
0 0 0 0 0 0 0 0 0 0 0
TOTALS CUM-BYT-WRT-USERS CUM-BYT-WRT-INTERIM CUM-BYT-WRT-DASD
34157 221184 0
CUM-IXGWRITE CUM-TYPE-1 CUM-TYPE-2 CUM-TYPE-3
54 54 0 0
CUM-BYT-DEL-NO-WRT CUM-DEL-NO-WRT CUM-BYT-DEL-AFTR-WRT CUM-DEL-AFTR-WRT
0 0 0 0
CUM-OFFLOAD CUM-DASD-SHFT CUM-STRC-FULL CUM-NTRY-FULL CUM-STG-THLD CUM-ST-FULL CUM-REBLD
0 0 0 0 0 0
NUMBER OF INTERVALS: 13
SMF FIRST/LAST INTERVAL TIMESTAMP: 01/27/20 6:39:52 AM / 01/27/20 7:43:00 AM
NUMBER OF SMF RECORDS: 104
カスタマイズ
事前準備:取得フィールドの選択
参考: Record Type 88 (58) — System Logger Data
今回は、以下のフィールドを抽出することにします。
- SMF88DTE: Date when the record was moved into the SMF buffer, in the form 0cyydddF. See Standard and Extended SMF record headers for a detailed description.
- SMF88TME: Time since midnight, in hundredths of a second, that the record was built into the SMF buffer.
- SMF88LSN: Log stream name
- SMF88LWB: Bytes requested by user application(s) on IXGWRITE macro invocations for this log stream during the expiring SMF interval (FORMAT=LONG FLOATING POINT).
- SMF88SAB: Current after bytes count. Count of bytes deleted from interim storage during this interval, after being offloaded (FORMAT=LONG FLOATING POINT). This field is incremented by system logger's internal management of interim storage.
- SMF88EO: Number of successful offloads (greater than one byte of data) performed for this log stream on this system during the expiring interval. (FORMAT=32 bits)
SDE定義のカスタマイズ
/usr/lpp/IBM/zcdp/v2r1m0/UI/LIB/sde.streams.jsonを確認します。
...
{
"category": "SMF",
"name": "SMF_088",
"description": "System logger",
"tags": [
"CSV",
"Split"
],
"concatenation": [
"CDP"
],
"hboin": {
"all": [
"HBOCCORY",
"HBOLLSMF",
"HBORS088",
"HBOUS088"
]
},
...
デフォルトの定義では、HBORS088, HBOUS088がSDE定義として使われることが確認できます。
CDPZ02.V2R1M0.SHBODEFS(HBOUS088) => CDPZ02.CUSTOM.SHBODEFS(HBOU088C) にコピーして編集します。
SET IBM_FILE = 'SMF088C';
DEFINE UPDATE SMF_088_CUST
VERSION 'CDP.110 '
FROM SMF_088
TO &IBM_UPDATE_TARGET
AS &IBM_FILE_FORMAT SET(ALL);
DEFINE TEMPLATE SMF_088_CUST FOR SMF_088_CUST
ORDER
(SMF88DTE,
SMF88TME,
SMF88LSN,
SMF88LWB,
SMF88SAB,
SMF88EO)
AS &IBM_FILE_FORMAT;
単発のバッチで、CSV化を試してみます。
//HBOSMFCB JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//*
//HBOSMFCB EXEC PGM=HBOPDE,REGION=0M,
// PARM='SHOWINPUT=NO,ZIIPOFFLOAD=NO'
//STEPLIB DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBOLOAD
//*
//* CONTROL STATEMENTS
//*
//HBOIN DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOCCSV)
// DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBOLLSMF)
// DD DISP=SHR,DSN=CDPZ02.V2R1M0.SHBODEFS(HBORS088)
// DD DISP=SHR,DSN=CDPZ02.CUSTOM.SHBODEFS(HBOU088C)
//*
//* Sample COLLECT statement for processing log data
//*
// DD *
COLLECT SMF
COMMIT AFTER END OF FILE;
/*
//HBOLOG DD DISP=SHR,DSN=CDPZ02.SMFDUMP.D200127.LOGR
//HBOOUT DD SYSOUT=*
//HBODUMP DD SYSOUT=*
//HBODEBUG DD SYSOUT=*
//SMF088C DD SYSOUT=*,RECFM=V,LRECL=32756
上のようなJCLを作って、SMF Type88のデータがダンプされたデータセットを入力に、CSV化してみます。
結果確認。
...
2020-01-27,16:42:00:08,ATR.EPLEX.MAIN.UR ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:42:00:08,ATR.EPLEX.DELAYED.UR ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:42:00:08,ATR.EPLEX.ARCHIVE ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:42:00:08,,,,
2020-01-27,16:42:00:08,ATR.EPLEX.RM.DATA ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:42:00:08,ATR.EPLEX.RESTART ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:42:00:08,,,,
2020-01-27,16:42:00:08,CT54D4A1.DFHLOG ,+2.1027000000000000E+04,+0.0000000000000000,0
2020-01-27,16:42:00:08,CT54D6A2.DFHSHUNT ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:42:00:08,CT54D4A1.DFHSHUNT ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:42:00:08,CT54D6A1.DFHLOG ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:42:00:08,CT54D6A1.DFHSHUNT ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:42:00:08,CT54D6A2.DFHLOG ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:42:00:08,CT54D0CM.DFHLOG ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:42:00:08,CT54D0CM.DFHSHUNT ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:43:00:07,ATR.EPLEX.MAIN.UR ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:43:00:07,ATR.EPLEX.DELAYED.UR ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:43:00:07,ATR.EPLEX.ARCHIVE ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:43:00:07,,,,
2020-01-27,16:43:00:07,ATR.EPLEX.RM.DATA ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:43:00:07,ATR.EPLEX.RESTART ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:43:00:07,,,,
2020-01-27,16:43:00:07,CT54D4A1.DFHLOG ,+1.3130000000000000E+04,+0.0000000000000000,0
2020-01-27,16:43:00:07,CT54D6A2.DFHSHUNT ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:43:00:07,CT54D4A1.DFHSHUNT ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:43:00:07,CT54D6A1.DFHLOG ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:43:00:07,CT54D6A1.DFHSHUNT ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:43:00:07,CT54D6A2.DFHLOG ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:43:00:07,CT54D0CM.DFHLOG ,+0.0000000000000000,+0.0000000000000000,0
2020-01-27,16:43:00:07,CT54D0CM.DFHSHUNT ,+0.0000000000000000,+0.0000000000000000,0
...
抽出したフィールドについて、CSV化できてるっぽいです。
ポリシーのカスタマイズ
上でカスタマイズした定義に沿ったDATA STREAMを定義します。
Data Streamer(HBODSPRO)の設定変更
Data Streamer起動プロシージャーで参照するポリシーファイルの指定を、上で生成されたポリシーファイルに置き換えて起動します。
Logstash構成ファイルのカスタマイズ
Linux側で稼働させるLogstashの構成ファイルも、追加したフィールドの分、カスタマイズします。
それぞれ以下のようにコピーして編集します。
H_SMF_088.lsh => H_SMF_088_CUST.lsh
N_SMF_088.lsh => N_SMF_088_CUST.lsh
filter {
if [sourceType] == "zOS-SMF_088_CUST" {
csv{ columns => [ "SMF88DTE", "SMF88TME", "log_stream_name", "byt_wrt_by_user", "byt_offload_to_dasd", "num_offload" ]
separator => "," }
}
}
filter {
if [sourceType] == "zOS-SMF_088_CUST" {
mutate{ add_field => {
"[@metadata][timestamp]" => "%{SMF88DTE} %{SMF88TME}"
}}
date{ match => [
"[@metadata][timestamp]", "yyyy-MM-dd HH:mm:ss:SS"
]}
}
}
一旦、outputをElasticsearchではなくstdoutにして、Logstashのレベルでフォーマットできるか確認してみると...
...
{
"timeZone" => "+0900",
"log_stream_name" => "CT54D4A1.DFHLOG ",
"sysplexName" => "EPLEX",
"inputsequence" => "20200129061846506:000000",
"SMF88TME" => "16:43:00:07",
"byt_wrt_by_user" => "+1.3130000000000000E+04",
"systemName" => "ZOS1",
"port" => 55614,
"byt_offload_to_dasd" => "+0.0000000000000000",
"@version" => "1",
"sourceType" => "zOS-SMF_088_CUST",
"host" => "EPLEX1",
"SMF88DTE" => "2020-01-27",
"path" => "SMF/SMF_088_CUST",
"@timestamp" => 2020-01-27T07:43:00.070Z,
"sourceName" => "ZOS1-SMF_088_CUST",
"num_offload" => "0",
"seq" => {
"c" => "0",
"w" => "1"
},
"message" => "2020-01-27,16:43:00:07,CT54D4A1.DFHLOG ,+1.3130000000000000E+04,+0.0000000000000000,0"
}
...
OKそうです。Elasticsearchに取り込む前に、Elasticsearch側にMapping情報を定義しておきます。
Elasticsearchのカスタマイズ
index templateを追加して、Mapping情報を定義します。
Elasticsearchにデータを取り込むと、cdp-zos-smf_088_cust-*という名前のindexに取り込まれるので、このindexに対するtemplateを作成して、Mapping情報を設定しておきます。
CDPz共通設定(既に定義してあれば不要)
PUT _template/cdp_common
{
"index_patterns": ["cdp-*"],
"order" : 0,
"settings": {
"number_of_shards": 1,
"number_of_replicas" : 0
},
"mappings": {
"numeric_detection": true
}
}
SMF Type88用の追加設定
PUT _template/cdp_smf088cust
{
"index_patterns": ["cdp-*smf_088_cust*"],
"order" : 1,
"mappings": {
"properties": {
"log_stream_name": {
"type": "keyword"
},
"byt_wrt_by_user": {
"type": "float"
},
"byt_offload_to_dasd": {
"type": "float"
},
"num_offload": {
"type": "integer"
}
}
}
}
上のindex templateを作成した後、Logstash経由でElasticsearchにデータを取り込みます。
Kibana Discoverでの確認
Elasticsearchにデータを取り込むと、cdp-zos-smf_088_cust-*という名前のindexが作成されるので、index patternを作成してDixcoverで確認してみます。
意図した通りに取り込めていることが確認できました。
JOBLOG取得
SYSLOG取得と同じような手順で、Logforwarder経由でJOBLOGを取得することもできます。
Policy
Policyの設定で、CICS User Messages YMD をData Streamとして指定します。
data streamの設定で、取得したいJOB名(ワイルドカード指定可)などを設定します。
その他はSYSLOGと同様です。
Logstashに送られるメッセージを見てみます。例えば以下のようなメッセージがCICSのJOBLOGのMSGUSに出力されたものとします。
DFHPG0101 01/22/2020 09:59:34 CT54D4A1 TCP00040 CICSUSER CEDA Resource definition for TGSTA01 has been added.
DFHRD0101 01/22/2020 09:59:34 CT54D4A1 TCP00040 CICSUSER CEDA INSTALL PROGRAM(TGSTA01)
0040 CEDA CICSUSER 01/22/20 09:59:34 INSTALL PROGRAM(TGSTA01) GROUP(TAGGRP)
CDPz経由でLogstashに送られたデータは以下のような構造になっています。
{
"@version" => "1",
"port" => 59914,
"host" => "EPLEX1",
"message" => [
[0] "DFHPG0101 01/22/2020 09:59:34 CT54D4A1 TCP00040 CICSUSER CEDA Resource definition for TGSTA01 has been added. \n",
[1] "DFHRD0101 01/22/2020 09:59:34 CT54D4A1 TCP00040 CICSUSER CEDA INSTALL PROGRAM(TGSTA01)\n",
[2] "0040 CEDA CICSUSER 01/22/20 09:59:34 INSTALL PROGRAM(TGSTA01) GROUP(TAGGRP)\n",
[3] "\u0000 "
],
"sysplexName" => "EPLEX",
"sourceType" => "zOS-CICS-MSGUSRYMD",
"systemName" => "ZOS1",
"@timestamp" => 2020-01-22T00:59:34.801Z,
"sourceName" => "ZOS1-JOB-CT54_CT54D4A1_MSGUSR",
"path" => "JOB001/MSGUSR/YMD/CT54D4A1/MSGUSR",
"inputsequence" => "20200122005941802:000000",
"seq" => {
"c" => "2",
"w" => "0"
},
"timeZone" => "+0900"
}
messageの各配列はCSV化されている訳では無く、単なるひと塊の文字列としてハンドリングされることになります。SYSLOGと同様、必要であればメッセージIDハンドリングのためのカスタマイズを行うことになります。