読者です 読者をやめる 読者になる 読者になる

Zabbix3でJavaアプリログのExceptionを補足してメールぶっ飛ばす

Linux

世の中には看過してよい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.アイテム

f:id:new_pill:20170326011539p:plain

名前 :適当
タイプ:Zabbixエージェント(アクティブ)
キー:log[/var/log/test.log,"([^ ]*Exception)",,,skip,\1]
データ型:ログ
更新間隔(秒):1(適当)
ヒストリ保存期間(日):7(適当)

2.トリガー

f:id:new_pill:20170326011841p:plain

名前: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.アクション

f:id:new_pill:20170326012409p:plain
f:id:new_pill:20170326012512p:plain
適当につけた名前をつなげる。
3で作ったメディアタイプをつなげる。

メッセージの件名:{TRIGGER.STATUS}: <{ITEM.VALUE1}> :{TRIGGER.NAME}

とすることでNullPointerExceptionとかRuntimeExceptionとかが件名にはいるので気にしなくて良いExceptioonは本文見なくても良くなるのでおすすめ。

5.ユーザーに3で作ったメディアタイプで送信先メールアドレスを追加

これがプロダクションだと社内向けメーリングリストとかになるのだとおもう。

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のことはよくわかっていない。

Unityで遊んだ。

c#

nn-hokuson.hatenablog.com
なんか1時間で遊べるシューティングが作れるってよ。本当に1時間で出来たわ。本買ってもうたわ。
10年ぐらい前に「ゲームプログラマになる前に覚えておきたい技術」を読んだときは死にそうになったものだけれど。
めっちゃ楽やね。衝突判定書かなくて良いとか。。UnityでC#のプログラム覚えましたって人は信用出来ないね。これは楽すぎる。
これでクロスプラットフォームとかすごいねぇ。久々にC#書いたけど良いね。書いたとも言えない行数だけど。キャストするのではなくComponent取る感じがSeasarのDIっぽい。

自分で爆発音をつけてみるカスタマイズをしてみた。LINEアプリで録音して共有でメールに飛ばして適当にカットして、と。最速でアセット用意するメソッドかもしれん。

Github pagesで公開してみました。
Unity WebGL Player | SampleShooting
Chromeでも動くね。Firefoxは知らん。

ソース

github.com

Rails Tutotial 14章 完了

ruby

何回も通ったfollow/unfollowのところ。
今回は一番理解が進んだかも知れない。やっぱり日本語だったのが大きいねぇ。自分の英語力のなさに失望感も少しありつつ。最先端は追いかけられないけどもうそんな若くないし一周遅れてキャッチアップすれば良いのかなと思ってみたり。

今回はcloud9とかも使ってみたりして最新の開発環境も体感したけどEmacs+iTermで結局一番しっくりくるから、老害になったなと。

まぁ、ともかく終わりました。

やったね!、と。

Home | Ruby on Rails Tutorial Sample App

Rails Tutoial 13章 カスタマイズ HerokuアプリのCarrierWaveのアップロード先をdropboxにした。

ruby

貧乏なのでS3辛くてね。Dropboxあるだろと思ったらやっぱりあった。
hyperneetprogrammer.hatenablog.com
基本このリンク先に従えばOK

設定

herokuに環境変数与えないといけないので

heroku config:set D_APP_KEY="5glfo"
heroku config:set D_APP_SECRET="4lz09muo"
heroku config:set D_ACCESS_TOKEN="x4za9"
heroku config:set D_ACCESS_TOKEN_SECRET="f7w2f"
heroku config:set D_USER_ID="299999"

を実行する。
herokuにS3につながっているテストmicropostがあるのでリセットする

$ heroku pg:reset DATABASE
$ heroku run rails db:migrate
$ heroku run rails db:seed
picture_uploader.rb
  if Rails.env.production?
    storage :dropbox
  else
    storage :file
  end
carrier_wave.rb
CarrierWave.configure do |config|
  config.dropbox_app_key = ENV["D_APP_KEY"]
  config.dropbox_app_secret = ENV["D_APP_SECRET"]
  config.dropbox_access_token = ENV["D_ACCESS_TOKEN"]
  config.dropbox_access_token_secret = ENV["D_ACCESS_TOKEN_SECRET"]
  config.dropbox_user_id = ENV["D_USER_ID"]
  config.dropbox_access_type = "app_folder"
end

結果

何の事はない。上手く行った。気持ちS3のときよりレスポンスが悪くなった気がするけど無料なので。無料なので
所要時間も10分かからず。

Rails Tutorial 13章

ruby

テストの課題一件眠くて飛ばしたー
AWSでつまったーーーー

AWSはサービス開始1年目でガラケーゲームで使って以来。
インターフェースとか変わりすぎー
全くわからん。
ググってなんとかしたー
ねむいー
ねるー
CarrierWaveとかわかってないですよ。

コマンドライン実行(初心者)

java

Eclipseに頼りきりだったのでこの辺りとても手薄。
NoClassDefFoundErrorに悩まされた。

package jp;

import jp.lib.LibA;

public class DMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		if(args.length != 2){
			System.out.println("USAGE:\n java -cp /path/to/classpath jp/DMain arg1 arg2");
			return;
		}
		LibA libA = new LibA();
		System.out.println(libA.sb(args[0], args[1]));
	}

}
D:\workspaces\workspace1\JavaTest\bin>java -classpath D:\workspaces\workspace1\JavaTest\bin jp/DMain arg1 arg2

コレで戦える!!

Rails Tutorial 12章

ruby

特に問題も発生せず、herokuデプロイまで行けました。
factorygirlとかあったとおもうんだけどどこいったんだろ?
まだチュートリアルでみてない。
qiita.com