norikraでアプリログを集計してリアルタイムエラー通知 # norikra meetup

16
Norikra meetup session #2 kawamuray

Upload: kawamuray

Post on 07-Jul-2015

3.123 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup

Norikra meetup session #2kawamuray

Page 2: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup

● 名前: kawamuray● 本業: 大学院修士課程2年● 副業1: アルバイトサーバサイドエンジニア@LINE Corp● 副業2: Student@Google Summer of Code● Norikraとの関わり: jrubyでudf書ける方法発明したりした

About me

Page 3: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup

Norikraでアプリログを集計してリアルタイムエラー通知あるいは,Norikraの身近な活用法

テーマ

Page 4: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup

● screen or tmux + tail -F ?● 全部のアプリ見れる?● 流れ早いと見逃さない?

私の場合:● アクティブに開発してるとき or デプロイ時 しか見てない● バッチ等重要局面の失敗はikachanでIRCへgo● でも,errorとかcriticalレベルで吐かれるログは全部見たい

アプリのログ,監視してる?

Page 5: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup

sub logger { my ($level, $message) = @_; my(undef, $file, $line) = caller(0); my $content = "[$level] $message at $file line $line"; print STDERR $content, "\n"; if ($level eq 'error' || $level eq ‘critical’) { $c->ikachan($content); }}

エラーログは全部通知する?

Page 6: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup

エラー通知という名のSPAM

Page 7: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup

● メッセージは変数によって微妙に違うかもしれない● ログのレベル,ファイル,行が同じなら同じような内容とみなして良いよね● エラー通知はきっかけ.ざっくり内容が分かれば良い.● 詳細はどうせファイル見に行くでしょ?

サマライズしよう

Page 8: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup

my $fluent_logger = Fluent::Logger->new(...);my $hostname = `hostname`; chomp $hostname;sub logger { my ($level, $message) = @_; my(undef, $file, $line) = caller(0); my $content = "[$level] $message at $file line $line"; # ... ファイルに書く処理 ... # fluentdに全部投げちゃうど

$fluent_logger->post('foo.applog', { level => $level, file => $file, line => $line, host => $hostname, message => $message, });}

やること1

Page 9: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup

SELECT level, file, line, LAST(host) AS host, LAST(message) AS message, COUNT(*) AS countFROM foo_applog.win:time_batch(5 min)WHERE level IN ('error', 'critical')GROUP BY level, file, line

やること2

Page 10: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup

$ crontab -l*/1 * * * * setlock -nx /tmp/norikra-error-notify.pl.lock /path/to/norikra-error-notify.pl

やること3

Page 11: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup

#!/usr/bin/env perluse strict;use warnings;use Foo; # project classuse Norikra::Client;my $IntervalMinutes = 5;my $c = Foo->bootstrap;my $norikra = Norikra::Client->new('norikra.server.address', 26571);my $query_name = "foo_errors_in_${IntervalMinutes}min";my $events = $norikra->event($query_name);for my $event (@$events) { my ($time, $log) = @$event; next if $log->{count} == 0; my $msg = "[$log->{host}][$level] $log->{message} at $log->{file} line $log->{line}"; if ($log->{count} > 1) { my $count = $log->{count} - 1; $msg .= " ... and $count more similar logs in this $IntervalMinutes minutes"; } $c->ikachan($msg); # post to IRC via ikachan}

norikra-error-notify.pl

Page 12: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup

Architecture

App

IRC norikra-error-notify.pl @ cron

Page 13: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup

すっきり

Page 14: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup

● 複数ノード,複数インスタンスのアプリログをまとめられる● Fluentdに投げとけばアプリの外側で使える● ロガーと別に通知処理を入れなくて済む

良い点

Page 15: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup

不満:● プロジェクト毎にクエリ登録したりcron仕掛けるのめんどい● 1度来た通知が修正作業中に何回もくるのがうっとおしい

展望:● そのへん面倒みてくれるいい感じのアプリでも作るけ?● と思っているところです.

展望

Page 16: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup

アプリログに関して:● アプリのログは書くだけじゃなくてちゃんと監視しようNorikraに関して:● Norikraは身近なとこでも使える● SQL書ければだいたい使える● ログ+ストリーム(リアルタイム)処理の組み合わせは色々でき

そう● ありがとう タゴ=モリス

まとめ