この記事は、弊社リンク情報システムが主催する「アドベントカレンダー」のリレー記事です。
アドベントカレンダーは engineer.hanzomon なる怪しいグループのメンバによってリレーされます。
本記事は15日目、12/15(土)分です。ちなみに本日から年賀状受付開始ですよ!
きっかけ
アドベントカレンダーで記事書きます!とは言ったもののネタがない。
なんか適当にOSSのお話(Ansible とかZabbix とかAirflow とか)で一本書こうかなと思ったら当アドベントの5日目に
なんて記事が出て、
購入履歴を元に新刊の発売日を通知してもらえたら、「もう発売してる?!」みたいなことが減って良さそうですね…
なんて書いてあるじゃないですか。
じゃあちょうどいいからZabbix 4.0(ついこのあいだ出ました)で実装されたHTTP agentでそれ実現しましょということで。
なお「購入履歴を元に…」の部分は残念ながら手が回ってないです。APIで取れないし…
Zabbix とは?
Zabbix は、OSSのネットワーク監視ソフトウェアです。
Zabbix Agentを導入した監視対象ホストの状態を、Zabbix Serverを導入したサーバで一元管理したりします。
が、今回Agent君は出てきませんのでまっとうなZabbixの使い方を知りたい場合はググったりしましょう。
準備
筆者はZabbixは2.2までしか使ったことがないので、簡単にZabbix 4.0の環境を作ります。
インストールするの面倒なので公式が出してるDockerイメージ使ってサクッと。
以下のコマンドでコンテナが起動して、HTTPでZabbixのWebコンソールにアクセスできるようになります。
docker run --name zabbix-appliance -t -p 10051:10051 -p 80:80 -d zabbix/zabbix-appliance:latest
HTTP://ホスト名/ でアクセス
初期ユーザは「Admin」、パスワードは「zabbix」となっているはず。
ログインできました。2.2と比べるとなんかすげーリッチになってますね(浦島感)
1. HTTP agent のItem を作る
監視用のItem を作っていきます。
本来ならちゃんとTemplateから作りたいところですが、面倒時間の都合でHost のItem に直接定義します。
メニューのConfiguration -> Hosts からZabbix server (今回の手順だとこいつしかいないハズ)のItems をクリック
からの右上のCreate Item をクリック
Item の新規作成画面が出ます。
今回はHTTP agent を使って楽天Kobo電子書籍検索APIのリクエストを発行していきます。(詳しくは5日目の記事をチェック!)
ちなみにアプリID発行要のため、事前に取っときましょう。すぐ取れます。
Name は適当でよいです。
Type にはHTTP agent を選択しましょう。
key は任意文字列です。これも好きに。
URL とQuery fields も5日目の記事を丸パクリします。アプリケーションIDだけは自分の使ってください。
細かいとこだとUpdate interval は1日くらいでいいでしょう。毎秒監視するような項目でもないし。
あ、Type of information はText を選択しておく必要があります。レスポンスがJSONなので。
まとめるとこんな感じ。
設定出来たら一回Check Now 押してから保存しておきましょう。
このCheck Now もZabbix 4.0 の新機能で、Item の取得をInterval によらず即時でやってくれるというやつです。
この機能だけでも4.0 にする価値ありますわ。(今まではInterval を極小にして無理やり取得→また戻す、みたいなことやってました)
で、Check Now 押したので値が取れてるハズです。Monitoring -> Latest data から対象のItem が取得できてること確認します。
レスポンス取れてますね。次はこのレスポンスから発売日の情報を抜き出します。
2. Dependent Item を作る
上記で取得できたのはJSON のレスポンスなわけですが、このままだとまぁ扱いにくいわけです。
というわけでレスポンスから発売日の情報だけ抜き出します。
再度Create Item から今度はType にDependent Item を設定してItem を作成します。
ここのキモはMaster item に1.で作成したItem を指定することですね。あとは適当でよいです。
で、Preprocessing タブでJSON のパースをします。
今回取得するのは発売日なので、$.Items[0].Item.salesDate ですね。
これで保存すればこのItem でゴールデンカムイの最新刊の発売日が取得できるというわけです。確認しましょ。
最新刊の発売日であるところの「2018年12月19日」がちゃんと取れてます。
3. Trigger を設定して新刊情報が出たら通知する
あとはこの発売日が変わったら(=新刊の情報が出たら)変更後の発売日を通知してしまえばよいわけです。
Configuration -> Hosts からZabbix server のTroggers をクリック
からのCreate Trigger をクリック
Trigger の定義を行います。
2.で作成したItem の値が前回と異なる(Change)場合にTrigger が起動するよう設定します。
これで発売日が更新されればTrigger されるはずです。確認します。
といっても新刊が今このタイミングで出るわけないので、リクエスト弄って1巻の発売日取ります。
パラメータのsort を +releaseDate に変更。
Check Now で値を即時取得します。Dashboard で確認しましょ。
当該Trigger が通知されてます。実験成功ですね。
あとはこのTrigger 起因のAction を定義してメール通知なりなんなりすればいいということです。
Configuration -> Action からCreate action
3.で作成したTrigger 起因で起動するようにCondition を設定
Operation タブでSend to Users にAdmin ユーザを追加
で保存です。あとは再度Trigger をキックしてからDashboard 見てみます。
メール飛ばそうとしてますね。(メール回りなんも設定してないので失敗してますが)
以上で新刊発売日通知の仕組みが完成しました!
まとめ
Zabbix はいいぞ。
今回記事にしてない部分とかでも、4.0 になって色々進化してるのが見て取れて楽しかったです。ほんと浦島太郎状態。
いい加減2.2 を使うのもどーかなーと思うので、まじめに移行検討しないとですね…
あと、記事の引用を快く受け入れてくださった@p3ngu1n さんに感謝を。是非Zabbix 使ってみてください。
お読みいただきありがとうございました。
明日は@t_slash_k さんです。