JobSchedulerでのジョブ監視機能－３　Zabbixへの遅延通知設定編

# Zabbixへの遅延通知設定

本記事では前回に引き続き、JobSchedulerでのジョブ監視機能について記載します。
今回は実際にジョブに遅延が発生した場合に監視システムのZabbixへの通知設定を行います。

ジョブ監視機能の概要については以下の記事をご確認ください。
https://qiita.com/Yoshitami/items/400afb3467078c06223e

また、JobScheduler、Zabbix（zabbix_sender）のインストールはすでに行っているものとします。

# ジョブ監視設定について
本記事では、以下の場合にZabbixに対して通知を行うものとします。
・ジョブの監視はすべてのジョブ、ジョブチェーンに遅延が発生した際に行う
・遅延は10秒以上経過したジョブを通知する
・通知先はZabbixのアイテム「JobScheduler Job delay occurrence」に対して行う
・Zabbixへの通知はzabbix_senderを使用する
・ジョブに遅延が発生した場合のみ通知を行い、ジョブエラー通知設定は行わない

# 環境
●Jobschedulerサーバ（Zabbixと同居）
・CentOS 7.6
・PostgreSQL 9.6.11
・java version "1.8.0_212"
・JobSchedulerMaster 1.12.9
・JOC Cockpit 1.12.9
・Zabbix 4.2.6
本記事でのJobSchedulerのインストールユーザは「scheduler」となります。
※前回と同じ環境で設定を行います。

●ジョブ監視設定
・通知先Zabbixホスト名：jos12
・通知先Zabbixアイテム名：JobScheduler Job delay occurrence
・通知先Zabbixアイテムのキー：JobDelay
・通知ジョブ：すべてのジョブ、ジョブチェーンを監視を行う

# JobSchedulerのジョブ監視機能（Monitoring Interface）の有効化
Monitoring Interface機能の有効化設定は前回の「JobSchedulerでのジョブ監視機能－２　Zabbixへのジョブエラー通知設定編」の記事をご確認ください。
https://qiita.com/Yoshitami/items/cdb90de052fb141c7a28


# Zabbixへ通知するジョブ、パラメータ設定
「SystemMonitorNotification_zabbix.xml」に通知するジョブの設定、Zabbixへ送信するメッセージの設定を行います。
修正する設定ファイルは以下になります。
※今回はエラー通知は行わないため、前回の記事「Zabbixへのエラー通知設定編」で設定した内容は削除して設定しなおします。
パス：/home/scheduler/sos-berlin.com/jobscheduler/scheduler/config/notification
設定ファイル：SystemMonitorNotification_zabbix.xml

```shell-session
# su - scheduler 
$ cd sos-berlin.com/jobscheduler/scheduler/config/notification
$ vim SystemMonitorNotification_zabbix.xml
<?xml version="1.0" encoding="utf-8"?>
<SystemMonitorNotification system_id="zabbix">
                       <!--「system_id」をzabbixに設定-->
        <Notification>
                <NotificationMonitor service_name_on_error="JobDelay">
                <!--「service_name_on_error」にzabbixのアイテムキーを設定-->
                        <NotificationCommand><![CDATA[
                                #!/bin/bash
                                zabbix_sender -z localhost -s jos12 -k ${SERVICE_NAME} -o 'JobChain = "${MON_N_JOB_CHAIN_NAME}", Job = "${MON_N_JOB_NAME}", HistoryID = ${MON_N_ORDER_HISTORY_ID}, OrderId = ${MON_N_ORDER_ID}, "${MON_C_CHECK_TEXT}"'
                                <!--zabbix_senderを使用して通知する内容を設定-->
                        ]]></NotificationCommand>
                </NotificationMonitor> 
                <NotificationObjects>
                        <TimerRef ref="TIMER_TEST" />
                        <!--「Timer name」で設定したタイマー名を指定-->
                </NotificationObjects>
        </Notification>
        <Timer name="TIMER_TEST">
        <!--タイマー名を設定-->
                <TimerJob />
                <!--通知するジョブ名を設定、何も指定しないことにより、すべてのジョブ、ジョブチェーンの監視を行う-->
                <Maximum><Script language="javascript"><![CDATA[10]]></Script></Maximum>
                <!--実行時間が10秒以上経過する場合通知を行う-->
        </Timer>
</SystemMonitorNotification>
```

# 通知ジョブパラメータの説明

上記の「SystemMonitorNotification_zabbix.xml」では、すべてのジョブ、ジョブチェーンに遅延が発生した場合にZabbixのアイテムJobDelayに通知を行う設定となります。
各パラメータの設定値は以下になります。
zabbix_senderにて通知するメッセージ内容の各パラメータにつきましては、前回の記事「JobSchedulerでのジョブ監視機能－１　概要説明編」の「監視システムへの送信メッセージ内容」もしくは以下のナレッジをご確認ください。
https://kb.sos-berlin.com/pages/viewpage.action?pageId=2523518

・通知ジョブパラメータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66557/182f9a90-8eaa-4158-9acc-b0e91174fabe.png)

# Zabbixの設定
JobSchedulerの監視ジョブよりエラー通知を受信するため、Zabbixにてアイテム（キー）、トリガーの設定を行います。

・アイテム（キー）の作成
　ZabbixのWebUIにログインし、
　設定 ＞ ホスト ＞ 対象のホスト(jos12)のアイテム ＞ アイテムの作成 を選択し、以下を作成する
　・作成するアイテム
　　・名前：JobScheduler Job delay occurrence
　　・タイプ：Zabbixトラッパー
　　・キー：JobDelay
　　・データ型：文字列
![b-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66557/2d49faa6-5196-01be-9062-bf9a57f79254.jpeg)

・トリガーの作成
　ZabbixのWebUIにログインし、
　設定 ＞ ホスト ＞ 対象のホスト(jos12)のトリガー ＞ トリガー の作成 を選択し、以下を作成する
　・作成するトリガー
　　・名前：JobMonitoring job delay occurrence
　　・深刻度：致命的な障害
　　・条件式：{jos12:JobDelay.regexp(^0)}=0 
　　・障害イベント生成モード：複数
![b-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66557/85d4d992-a65a-1650-eb94-35e04705606d.jpeg)

#　動作確認
通知ジョブの設定、Zabbixの通知アイテム登録の設定が完了しましたので、実際にジョブに遅延を発生させて遅延通知が行われることの動作確認を行います。

・テストジョブの作成
　テストとして15秒スリープし、遅延させるスタンドアロンジョブを作成します。

```shell-session
# su - scheduler
$ cd sos-berlin.com/jobscheduler/scheduler/config/live/
$ vim delay_test.job.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<job >
    <script  language="shell">
        <![CDATA[
#!/bin/bash
LANG=C
echo "Start Test JOB"
echo "`hostname`"
sleep 15  ## sleep処理を追加し、遅延を発生させるように設定
exit 0
#
        ]]>
    </script>
<run_time />
</job>
```

・ジョブの実行
　JOCのWebUIよりジョブを選択し、作成したジョブ「delay_test」を実行し、ジョブに遅延を発生させます。
　（ジョブ「delay_test」は正常に終了し、ジョブの実行時間が15秒かかっているため、遅延となります。）
![delay.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66557/317141ee-4b9d-023d-7774-6dd7a8b9d6ab.jpeg)

・監視ジョブ実行確認
　監視ジョブは、「SystemNotifier,zabbix.order.xml」で定義した実行時間（毎分実行）になると実行されます。
![system.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66557/a15c2ff2-325f-b8d2-fe84-f21bf4240eab.jpeg)

　通知ジョブのオーダ履歴を確認すると、以下のようにZabbixへの通知が行われていることを確認できます。
　
　通知ジョブ実行ログ（一部のみ抜粋）:

```shell-session
2019-10-24 10:37:03.879+0900 [info]   [stdout] 24 10:37:03.655 [INFO ] (SystemNotifierModel.java:139) - [initConfig][NotificationMonitors=1(valide=1)][JobChains=0][Jobs=1][TimerRefs onError=1, onSuccess=0][MasterMessage=0][TaskIfLongerThan=0][TaskIfShorterThan=0][TaskWarning=0]
2019-10-24 10:37:04.650+0900 [info]   [stdout] 24 10:37:04.194 [INFO ] (SystemNotifierModel.java:1533) - [notifyAgain]found=3
2019-10-24 10:37:04.650+0900 [info]   [stdout] 24 10:37:04.266 [INFO ] (SystemNotifierModel.java:1772) - [notifyAgain]sended=0, error=0, skipped=1 (total checked=3)
2019-10-24 10:37:04.650+0900 [info]   [stdout] 24 10:37:04.287 [INFO ] (SystemNotifierModel.java:1782) - [notifyNew]found=2
2019-10-24 10:37:04.650+0900 [info]   [stdout] 24 10:37:04.316 [INFO ] (SystemNotifierModel.java:1872) - [notifyNew]sended=0, error=0, skipped=2 (total checked=2)
2019-10-24 10:37:04.650+0900 [info]   [stdout] 24 10:37:04.444 [INFO ] (SystemNotifierModel.java:1473) - [notifyTimer][service_name_on_success=0][service_name_on_error=1]found 286 checks for timers in the db
2019-10-24 10:37:04.650+0900 [info]   [stdout] 24 10:37:04.584 [INFO ] (SystemNotifierModel.java:349) - ----------------------------------------------------------------
2019-10-24 10:37:04.650+0900 [info]   [stdout] 24 10:37:04.584 [INFO ] (SystemNotifierModel.java:350) - [    [286][executeNotifyTimer]][notifyOnTimer][JobDelay][Job delay_test]notification 1 of 1. call plugin SystemNotifierProcessBuilderPlugin
2019-10-24 10:37:04.650+0900 [info]   [stdout] 24 10:37:04.619 [INFO ] (SystemNotifierProcessBuilderPlugin.java:80) - [CRITICAL-TIMER][command][preview]#!/bin/bash
2019-10-24 10:37:04.650+0900 [info]   [stdout] 				zabbix_sender -z localhost -s jos12 -k JobDelay -o 'JobChain = "*", Job = "delay_test", HistoryID = 0, OrderId = *, "execution time 15.00s is greater than the defined maximum time 10.00s. task started at 2019-10-24 01:36:19(UTC) and finished at 2019-10-24 01:36:34(UTC)"'
2019-10-24 10:37:04.650+0900 [info]   [stdout] 24 10:37:04.620 [INFO ] (SystemNotifierProcessBuilderPlugin.java:81) - [CRITICAL-TIMER][command][execute][/bin/bash, -c, #!/bin/bash
2019-10-24 10:37:04.650+0900 [info]   [stdout] 				zabbix_sender -z localhost -s jos12 -k JobDelay -o 'JobChain = "*", Job = "delay_test", HistoryID = 0, OrderId = *, "execution time 15.00s is greater than the defined maximum time 10.00s. task started at 2019-10-24 01:36:19(UTC) and finished at 2019-10-24 01:36:34(UTC)"']
2019-10-24 10:37:04.650+0900 [info]   [stdout] 24 10:37:04.638 [INFO ] (SystemNotifierProcessBuilderPlugin.java:138) - [CRITICAL-TIMER][command][executed]exitCode=0
2019-10-24 10:37:04.650+0900 [info]   [stdout] 24 10:37:04.646 [INFO ] (SystemNotifierModel.java:361) - ----------------------------------------------------------------
2019-10-24 10:37:04.650+0900 [info]   [stdout] 24 10:37:04.647 [INFO ] (SystemNotifierModel.java:1524) - [notifyTimer]sended=1, error=0, skipped=285 (total checked=286)
2019-10-24 10:37:04.651+0900 [info]   SCHEDULER-843  Task has ended processing of Order sos/notification/SystemNotifier:zabbix, state=notifier, on JobScheduler 'http://jos12:40444'
2019-10-24 10:37:04.651+0900 [info]   set_state success
```

・Zabbixでの確認
　ZabbixのWebUIにログインし、
　監視データ ＞ 障害 に移動し、ステータスを確認すると、遅延通知を受け取っていることが確認できます。
　監視ジョブよりzabbix_senderで送信したメッセージは、「JobMonitoring job delay occurrence」を選択し、ヒストリ（JobScheduler Job delay occurrence）の順で移動し確認できます。

　遅延通知:
![zabbix1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66557/a5d73043-20cd-5c68-153c-daaf5777e765.jpeg)

　zabbix_senderで受信したメッセージ:
![zabbix2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66557/6360d691-36e8-bda2-6dd4-3b7405630b3f.jpeg)

#備考
上記のテストではスタンドアロンジョブを使用しているため、前回と同じで、zabbix_senderで通知したメッセージの「JobChain」、「OrderId」は存在しないため「*」として表示されます。
スタンドアロンジョブではなく、ジョブチェーンでのエラーが発生した際には、「JobChain」、「OrderId」も含めメッセージが送信されます。

※ジョブ、ジョブチェーンを指定して監視する場合は、以下のようにSystemMonitorNotification_zabbix.xmlを設定します。
また、タイマーを複数使用することにより、ジョブ、ジョブチェーンの監視時間を分けて監視することができます。
以下の設定例では、
●ジョブの実行時間が10秒以上かかったら通知
　・ジョブチェーン「test/my_jobchain1」
　・ジョブ「test3/my_job」
●ジョブの実行時間が30秒以上かかったら通知
　・ジョブチェーン「test2/my_jobchain2」
の監視を行います。

```shell-session
<NotificationObjects>
      <TimerRef ref="TIMER_TEST" />
</NotificationObjects>

<Timer name="TIMER_TEST">
      <TimerJob />
      <Maximum><Script language="javascript"><![CDATA[10]]></Script></Maximum>
</Timer>

↓

<NotificationObjects>
      <TimerRef ref="TIMER_TEST" />
      <TimerRef ref="TIMER_TEST2" />
      <!--「Timer name」で設定したタイマー名を指定-->
</NotificationObjects>

<Timer name="TIMER_TEST">
      <TimerJobChain name="test/my_jobchain1"/>
      <!--TimerJobChain nameでジョブチェーン名を指定する-->
      <TimerJob name="test3/my_job"/>
      <!--TimerJob nameでジョブ名を指定する-->
      <Maximum><Script language="javascript"><![CDATA[10]]></Script></Maximum>
</Timer>
<!--ジョブの実行時間が10秒以上かかったら通知-->

<Timer name="TIMER_TEST2">
      <TimerJobChain name="test2/my_jobchain2"/>

      <Maximum><Script language="javascript"><![CDATA[30]]></Script></Maximum>
</Timer>
<!--ジョブの実行時間が30秒以上かかったら通知-->
```

また、エラー通知、遅延通知の設定を合わせて設定することも可能です。