Zabbix3でJavaアプリログのExceptionを補足してメールぶっ飛ばす
世の中には看過してよいExceptionと看過してはいけないExceptionがあります。
我らがZabbixでJavaアプリケーションログのExceptionを検知してメールをぶっ飛ばす方法を考えます。
背景
NullPointerExceptionがおきてエラーページに飛んでいた状態に気づかずに1ヶ月ぐらい放置してしまってお客様に指摘されて直すとかありました。
もっと先に気づいて闇に直すことをできるようにしたいと同僚に言われ検証してみる。Javaアプリに手をいれることを考えたが、Javaアプリは糞重いのでこれ以上処理を増やしたくない。
そこでzabbixに登場していただくことにしました。
もちろん無視して良いExceptionもあるので発生したExceptionをメールに載せる、というのを今回はやりたいと思います。
メールがきたらログを見に行くワークフローを想定。
productionでは便利に使えるsmtpサーバーがあるとおもいますが、今回は検証ということでsmtp.gmail.comを使います。
また、本来はアプリごとに一発で決めれるテンプレートを作るべきですが、検証なので直接ホストにアイテム等突っ込みます。
3年ぶりぐらいにzabbix触りました。
環境
- アップグレードしっぱいしてこわれたUbuntu14か16かわからないサーバー
- Zabbix3.x(パッケージシステムで入ったやつ)
zabbixのインストール
適当にググってください。いっぱい出てくる
DBの日本語化はZabbixの日本語文字化けを解消する方法 - geek.conf.2を参考にしました。
1.アイテム
名前 :適当 タイプ:Zabbixエージェント(アクティブ) キー:log[/var/log/test.log,"([^ ]*Exception)",,,skip,\1] データ型:ログ 更新間隔(秒):1(適当) ヒストリ保存期間(日):7(適当)
2.トリガー
名前:InfoExceptionTrigger(適当) 深刻度:情報 条件式: {zabbix-server:log[/var/log/test.log,"([^ ]*Exception)",,,skip,\1].strlen()}>0 and {zabbix-server:log[/var/log/test.log,"([^ ]*Exception)",,,skip,\1].nodata(5s)}=0 正常イベントの生成 障害イベント生成モード:複数
- 条件式は正規表現でExceptionの値を取り出していること
- 5秒たったら正常復帰
今回は検証なので/var/log/test.logを監視している。
ちょっと残念なところはトリガーが2回ずつ呼ばれてメールが発信されてしまうこと。nodataが原因らしいけどうまい解決方法が思いつかない。
3.メディアタイプ
メールタイプで作成
zabbix gmail smtpとかでググると設定がでてきますね。
gmailを使う場合は「セキュリティの弱いプログラムを許可」しないとだめっぽい。
何回かメールぶん投げているとprevent sign in attempt みたいなメールが来て、そこに許可のためのURLが乗ってる。
捨てgmailアドレスを使うことをおすすめ。何れにせよgmailは一日500通の送信制限があったとおもうので実運用には向かないですね。
4.アクション
適当につけた名前をつなげる。
3で作ったメディアタイプをつなげる。
メッセージの件名:{TRIGGER.STATUS}: <{ITEM.VALUE1}> :{TRIGGER.NAME}
とすることでNullPointerExceptionとかRuntimeExceptionとかが件名にはいるので気にしなくて良いExceptioonは本文見なくても良くなるのでおすすめ。
6. 確認
echo "aaa " `date "+%Y%m%d%H%M%S"`Exception bbbb >> /var/log/test.log
とかしてメールが届けはOK。検証完了です。
一回のExceptionでトリガーが2回、回復が1回の3通メールが飛びます。
7.感想
やっぱりZabbixはややこしい。変にスクリプト書くよりも標準機能でなんとかするのが後の人のことを考えた方法だと思う。あと、本番投入の際にはきちんとワークフローの設計もふくめて検討して設定しないと早晩ぐちゃぐちゃになるのがZabbix。あとおれはインフラ系ではないのでZabbixのことはよくわかっていない。