JobSchedulerでのジョブ監視機能－２　Zabbixへのジョブエラー通知設定編

# Zabbixへのエラー通知設定

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

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

また、JobScheduler、Zabbix（zabbix_sender）のインストールはすでに行っているものとします。
JobSchedulerのインストールは以下に詳しく記載されております。
https://qiita.com/satoruf/items/fd78523c68a7c2a0593e

# ジョブ監視設定について
本記事では、以下の場合にZabbixに対して通知を行うものとします。
・ジョブの監視はすべてのジョブ、ジョブチェーンにエラーが発生した際に行う
・通知先はZabbixのアイテム「JobScheduler Job status monitoring」に対して行う
・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 status monitoring
・通知先Zabbixアイテムのキー：JobError
・通知ジョブ：すべてのジョブ、ジョブチェーンを監視を行う

# JobSchedulerのジョブ監視機能（Monitoring Interface）の有効化

ジョブ監視機能（Monitoring Interface）はデフォルトでは機能が無効になっているため、有効にします。
パラメータ「sos.use_notification」の値をfalseからtrueに変更するとMonitoring Interfaceが有効になります。
修正する設定ファイルは以下になります。
パス：/home/scheduler/sos-berlin.com/jobscheduler/scheduler/config
設定ファイル：scheduler.xml

```shell-session
# su - scheduler 
$ cd sos-berlin.com/jobscheduler/scheduler/config
$ vim scheduler.xml
<spooler>
    <config ...>
        <params>
            ...
            <param name="sos.use_notification" value="true"/>
                                                 <!--"false"から"true"に変更-->
            ...
</spooler>
```

設定を反映させるためJobSchedulerのサービスを再起動します。

```shell-session
$ sudo systemctl restart jobscheduler.service
```

次に監視ジョブのオーダ定義ファイルを作成します。
修正する設定ファイルは以下となります。
パス：/home/scheduler/sos-berlin.com/jobscheduler/scheduler/config/live/sos/notification
設定ファイル：SystemNotifier,zabbix.order.xml

```shell-session
# su - scheduler 
$ cd sos-berlin.com/jobscheduler/scheduler/config/live/sos/notification
$ mv SystemNotifier,MonitorSystem.order.xml SystemNotifier,zabbix.order.xml
※既存の「SystemNotifier,MonitorSystem.order.xml」を使用してzabbix用に修正します。
$ vim SystemNotifier,zabbix.order.xml
<?xml version="1.0" encoding="ISO-8859-1"?>

<order>
    <params>
        <param name="schema_configuration_file"     value="config/notification/SystemMonitorNotification_v1.0.xsd"/>
        <!-- param name="system_configuration_file"     value="config/notification/SystemMonitorNotification_MonitorSystem.xml"/-->
        <param name="system_configuration_file"     value="config/notification/SystemMonitorNotification_zabbix.xml"/>
        <!-- 「SystemMonitorNotification_MonitorSystem.xml」を「SystemMonitorNotification_zabbix.xml」に修正-->
    </params>
    <run_time>
        <!-- period  absolute_repeat="00:05" begin="00:00" end="24:00"/-->
        <period  absolute_repeat="00:01" begin="00:00" end="24:00"/>
        <!-- run_timeのコメントアウトを解除し、テストとして毎分オーダが実行するように修正-->
    </run_time>
</order>
```

# Monitoring Interface定義ファイルの作成し、Zabbixへ通知するジョブ、パラメータ設定

「SystemMonitorNotification_zabbix.xml」を作成し、通知するジョブの設定、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="JobError">
                <!--「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}", ErrorMessage = "${MON_N_ERROR_TEXT}", StartTime = "${MON_N_TASK_START_TIME}", EndTime = "${MON_N_TASK_END_TIME}", HistoryID = ${MON_N_ORDER_HISTORY_ID}, OrderId = ${MON_N_ORDER_ID}, TaskId = ${MON_N_TASK_ID}'
                                <!--zabbix_senderを使用して通知する内容を設定-->
                        ]]></NotificationCommand>
                </NotificationMonitor> 
                <NotificationObjects>
                        <Job />
                        <!--通知するジョブ名を設定、何も指定しないことにより、すべてのジョブ、ジョブチェーンの監視を行う-->
                </NotificationObjects>
        </Notification>
</SystemMonitorNotification>
```

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

上記の「SystemMonitorNotification_zabbix.xml」では、すべてのジョブ、ジョブチェーンにエラーが発生した場合にZabbixのアイテムJobErrorに通知を行う設定となります。
各パラメータの設定値は以下になります。
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/67e1d95f-e54e-1dde-96f3-4c61c6811409.png)

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

・アイテム（キー）の作成
　ZabbixのWebUIにログインし、
　設定 ＞ ホスト ＞ 対象のホスト(jos12)のアイテム ＞ アイテムの作成 を選択し、以下を作成する
　・作成するアイテム
　　・名前：Jobscheduler job status monitoring
　　・タイプ：Zabbixトラッパー
　　・キー：JobError
　　・データ型：文字列
![b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66557/c78a34c6-cd9f-b1d1-3c09-8949f2ee2088.jpeg)

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

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

・テストジョブの作成
　テストとしてエラー終了させるスタンドアロンジョブを作成します。

```shell-session
# su - scheduler
$ cd sos-berlin.com/jobscheduler/scheduler/config/live/
$ vim error_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`"
exit 1  ## exit 1 でエラー終了するように設定
#
        ]]>
    </script>
<run_time />
</job>
```

・ジョブの実行
　JOCのWebUIよりジョブを選択し、作成したジョブ「error_test」を実行し、エラーを発生させます。
![b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66557/c3b7a1f7-cc0d-1e5d-b1f2-0b297efd8e9b.jpeg)

・監視ジョブ実行確認
　監視ジョブは、「SystemNotifier,zabbix.order.xml」で定義した実行時間（毎分実行）になると実行されます。
![b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66557/ee861b95-9fe1-b423-422c-15614ddfdc41.jpeg)

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

```shell-session
2019-09-05 15:00:03.600+0900 [info]   [stdout] 05 15:00:03.236 [INFO ] (SystemNotifierModel.java:139) - [initConfig][NotificationMonitors=1(valide=1)][JobChains=0][Jobs=1][TimerRefs onError=0, onSuccess=0][MasterMessage=0][TaskIfLongerThan=0][TaskIfShorterThan=0][TaskWarning=0]
2019-09-05 15:00:03.899+0900 [info]   [stdout] 05 15:00:03.724 [INFO ] (SystemNotifierModel.java:1533) - [notifyAgain]found=1
2019-09-05 15:00:03.899+0900 [info]   [stdout] 05 15:00:03.776 [INFO ] (SystemNotifierModel.java:1772) - [notifyAgain]sended=0, error=0, skipped=1 (total checked=1)
2019-09-05 15:00:03.899+0900 [info]   [stdout] 05 15:00:03.792 [INFO ] (SystemNotifierModel.java:1782) - [notifyNew]found=2
2019-09-05 15:00:03.899+0900 [info]   [stdout] 05 15:00:03.812 [INFO ] (SystemNotifierModel.java:977) - ----------------------------------------------------------------
2019-09-05 15:00:03.899+0900 [info]   [stdout] 05 15:00:03.812 [INFO ] (SystemNotifierModel.java:978) - [    [1][executeNotifyJob]][notifyOnError][JobError][error_test]notification 1 of 1. call plugin SystemNotifierProcessBuilderPlugin
2019-09-05 15:00:03.899+0900 [info]   [stdout] 05 15:00:03.844 [INFO ] (SystemNotifierProcessBuilderPlugin.java:80) - [CRITICAL-ERROR][command][preview]#!/bin/bash
2019-09-05 15:00:03.899+0900 [info]   [stdout]                                 zabbix_sender -z localhost -s jos12 -k JobError -o 'JobChain = "*", Job = "error_test", ErrorMessage = "SCHEDULER-280  Process terminated with exit code 1 (0x1)", StartTime = "2019-09-05 05:59:59", EndTime = "2019-09-05 05:59:59", HistoryID = 0, OrderId = *, TaskId = 173'
2019-09-05 15:00:03.899+0900 [info]   [stdout] 05 15:00:03.844 [INFO ] (SystemNotifierProcessBuilderPlugin.java:81) - [CRITICAL-ERROR][command][execute][/bin/bash, -c, #!/bin/bash
2019-09-05 15:00:03.899+0900 [info]   [stdout]                                 zabbix_sender -z localhost -s jos12 -k JobError -o 'JobChain = "*", Job = "error_test", ErrorMessage = "SCHEDULER-280  Process terminated with exit code 1 (0x1)", StartTime = "2019-09-05 05:59:59", EndTime = "2019-09-05 05:59:59", HistoryID = 0, OrderId = *, TaskId = 173']
2019-09-05 15:00:03.899+0900 [info]   [stdout] 05 15:00:03.868 [INFO ] (SystemNotifierProcessBuilderPlugin.java:138) - [CRITICAL-ERROR][command][executed]exitCode=0
2019-09-05 15:00:03.899+0900 [info]   [stdout] 05 15:00:03.872 [INFO ] (SystemNotifierModel.java:990) - ----------------------------------------------------------------
2019-09-05 15:00:03.899+0900 [info]   [stdout] 05 15:00:03.880 [INFO ] (SystemNotifierModel.java:1872) - [notifyNew]sended=1, error=0, skipped=1 (total checked=2)
2019-09-05 15:00:03.899+0900 [info]   [stdout] 05 15:00:03.896 [INFO ] (SystemNotifierModel.java:1462) - [notifyTimer][skip]found 0 Timer definitions
2019-09-05 15:00:03.900+0900 [info]   SCHEDULER-843  Task has ended processing of Order sos/notification/SystemNotifier:zabbix, state=notifier, on JobScheduler 'http://jos12:40444'
2019-09-05 15:00:03.901+0900 [info]   set_state success
```

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

　エラー通知:
![b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66557/4ee4c6ab-1599-8e9a-1320-f85c7bc71f35.jpeg)

　zabbix_senderで受信したメッセージ:
![b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66557/eabf35b9-5a52-d407-e10f-5bd24add5018.jpeg)


# 備考
上記のテストではスタンドアロンジョブを使用していますが、今回の設定はすべてのジョブ、ジョブチェーンを監視しているため、ジョブチェーンにエラーが発生した際もZabbixにエラー通知されます。

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

※ジョブ、ジョブチェーンを指定して監視する場合は、以下のようにSystemMonitorNotification_zabbix.xmlを設定します。以下の設定例では、
　・ジョブチェーン「test/my_jobchain1」
　・「test2/my_jobchain2」
　・ジョブ「test3/my_job」
の3つのみを監視します。
詳しい設定方法は別記事で詳しくご紹介します。

```shell-session
<NotificationObjects>
      <Job />
      <!--すべてのジョブ、ジョブチェーンの監視を行う-->
</NotificationObjects>

↓

<NotificationObjects>
      <JobChain name="test/my_jobchain1"/>
      <JobChain name="test2/my_jobchain2"/>
      <!--JobChain nameでジョブチェーン名を指定する-->
      <Job name="test3/my_job"/>
      <!--Job nameでジョブ名を指定する-->
</NotificationObjects>
```

# 監視システムへの遅延通知設定
次回の記事「JobSchedulerでのジョブ監視機能－３　Zabbixへのジョブ遅延通知設定編」では、ジョブに遅延が発生した場合に監視システムへの通知設定方法についてを記載します。
監視システムは今回と同じでZabbixを使用し、通知はジョブに遅延が発生した際にZabbixにzabbix_senderを使用して遅延通知するものとします。
JobScheduler Monitoring Interfaceの設定、Zabbixの設定や、通知する内容は次回の記事で詳しく記載します。