Tech Sketch Bucket of Technical Chips by TIS Inc.

JobSchedulerで実行したJobをZabbixで監視する②

Pocket

前回の記事 でJobSchedulerの使い方をご紹介しました。今回は前の記事で簡単に触れたJobSchedulerのAPIを使ってZabbixでJob実行時間(elapse time)を監視する方法の紹介をしたいと思います。

Jobの実行時間を監視したいケースとしてはDBバックアップJobなど、Job稼働時間が日々変動するケースが考えられます。例えば、最初は数分で完了していたDBバックアップ処理が容量増加に伴い、いつの間にか数十分/数時間になっていた、という場合に何かしら監視の仕組みがなければ気付けないでしょう。場合によってはデータ末梢を検討する必要があるかもしれません。
では、実際にJobSchedulerで稼働したJobの実行時間を監視する方法について記載します。

JobSchedulerとZabbix連携の全体像

JobSchedulerとZabbixを下記の構成で連携させます。

big_pic.png

まず、JobSchedulerにて定期的にJobを実行させます。次にJobSchedulerのWebAPIを使用して実行したJobの履歴情報を取得するスクリプトを作成し、Zabbixの外部スクリプトで定期的に実行させます。最後に取得したJob実行履歴情報をzabbix_senderを用いてZabbixのアイテムへデータを登録します。

監視対象のJob

今回Zabbixで監視する対象のJobは下記のようなJobとします。詳細な作成方法については前回の記事をご参照下さい。

job_define2.png

Order jobの内容

perlScriptで下記のような5~60秒waitするOrder Jobを定義します。(order1 / order2 / order3 全て同じJob定義)
scriptの内容はrandを使用して5~60の乱数を取得し、ランダムに生成された時間sleepするJobとしています。

add_orderのスケジュール設定

add_orderは毎日00:00から5分間隔で稼働し続ける設定にしたいと思います。
Jobのスケジュール設定はJOEから実施します。

js2_joe.PNG

  1. add_order → Run Time → Every Dayを選択し、毎日のスケジュールを定義する画面を開く
  2. スケジュール情報を定義する
    1. Begin Timeを00:00:00 , End Timeを24:00:00に設定(Begin Timeはスケジュール適用開始時間・End Timeはスケジュール適用終了時間を指定する項目)
    2. Start TimeをInterval start/startで00:05:00を設定(Job稼働間隔の指定)
    3. When Holidayをignore holidayに設定(休日を無視して毎日稼働させる設定)
  3. スケジュール定義後にApply Periodボタンをクリックする
  4. 定義したスケジュールが画面下部のリストに反映されるので、登録した内容が間違っていないか確認する

JOCでの設定内容確認

Job定義を作成し、内容を保存すれば、その瞬間からadd_orderが5分毎に稼働し続けています。設定が正しく反映されているかJOCを使って確認してみます。

js2_joc_aft.PNG

スケジュールが正しく追加されていればJobの右側に緑の文字で次回稼働予定時間までのカウントダウンが表示されます。また、稼働後のorder1/2/3のJobログを確認すると、ランダム秒だけwaitして終了していることが確認出来ると思います。
ここで作成したJobについてZabbixで監視してみます。

Zabbixでの監視設定

Zabbixへのアイテム追加

まず、Zabbixに下記アイテムの登録をします。内容はいずれもZabbixトラッパー・数値で名前とキーの名称を下記とします。

  • .test.order1.id
  • .test.order2.id
  • .test.order3.id
  • .test.order1.elapse
  • .test.order2.elapse
  • .test.order3.elapse

Zabbixへの外部スクリプト追加

次に、JobSchedulerのAPIを使ってelapseの履歴を取得する外部スクリプトを登録します。外部スクリプトはZabbixディレクトリのexternalscripts配下に格納して下さい。また、 JobSchedulerのPHPライブラリー をダウンロードし、同ディレクトリにlibディレクトリを作成し、その中にダウンロードしたPHPライブラリー(lib/schedulerとlib/classes)を配置して下さい。また、PHPでZabbix APIを操作する為に confirm IT solutions GmbH で作成している外部ライブラリーを使用しています。このPHPライブラリーはexternalscripts配下のphplibに配置して下さい。
なお、スクリプトの先頭で読み込んでいるJobHistoryClass.phpは「id」「start_time」「end_time」の3つのプライベート変数とそのgetter/setterを持った独自に作成したクラスです。

こちらのスクリプトをZabbixの外部チェックとして定期実行すれば、JobSchedulerにて実行されたorder1/order2/order3の実行時間を取得することが出来ます。スクリプトの内容についてはスクリプト内のコメントをご参照下さい。

スクリプトが実行された後にグラフを確認すると下記のような5~60秒処理時間がかかっていることがわかるグラフが作成されます。(ある程度Jobが稼働してから確認してみて下さい)

chart2.png

※各Jobの実行時間は5~60秒で作成しましたが、Zabbix側で検知した際の実行時間は10~65秒と全体的に5秒分の時間が加算されています。これはJobSchedulerでjavascriptを用いたOrder Jobを稼働させると、実際の処理終了時刻(本記事の例だと5~60秒のwhileループ処理の終了時刻)から5秒後にJobScheduler上でJob終了のステータスとなる為です。JobScheduler上で何らかの終了処理をするのに5秒の時間を要していると推測していますが、本記事では深く追求はしません。

最後に

今回はJobSchedulerで実行した特定Jobのelapseを取得してZabbixでグラフ表示するサンプルをご紹介しました。
このサンプルスクリプトだけでは実運用では使えないですが、このスクリプトを応用すればJobSchedulerに登録されたJobをZabbix側へ自動でアイテム登録し、処理時間の推移を取得するような仕組みも実現出来るかと思います。また、Zabbix側の設定でelapseが○○秒を超過したらアラートをあげる、といったことも可能です。

このようにOSS間をAPIで連携させれば、現在人手で行っている運用を自動化させたり、複数のOSSで取得出来るデータを組み合わせて意味のあるデータに加工して分析に使ったりと、色々な用途が考えられます。

今の運用に何かしら不満がある場合はこのようにプロダクト間でデータ連携などを実現し、より素敵な運用ライフを送れる仕組みを検討してみては如何でしょうか。

エンジニア採用中!私たちと一緒に働いてみませんか?