![Page 1: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup](https://reader030.vdocuments.site/reader030/viewer/2022020123/559abbab1a28abcf4a8b4629/html5/thumbnails/1.jpg)
Norikra meetup session #2kawamuray
![Page 2: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup](https://reader030.vdocuments.site/reader030/viewer/2022020123/559abbab1a28abcf4a8b4629/html5/thumbnails/2.jpg)
● 名前: kawamuray● 本業: 大学院修士課程2年● 副業1: アルバイトサーバサイドエンジニア@LINE Corp● 副業2: Student@Google Summer of Code● Norikraとの関わり: jrubyでudf書ける方法発明したりした
About me
![Page 3: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup](https://reader030.vdocuments.site/reader030/viewer/2022020123/559abbab1a28abcf4a8b4629/html5/thumbnails/3.jpg)
Norikraでアプリログを集計してリアルタイムエラー通知あるいは,Norikraの身近な活用法
テーマ
![Page 4: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup](https://reader030.vdocuments.site/reader030/viewer/2022020123/559abbab1a28abcf4a8b4629/html5/thumbnails/4.jpg)
● screen or tmux + tail -F ?● 全部のアプリ見れる?● 流れ早いと見逃さない?
私の場合:● アクティブに開発してるとき or デプロイ時 しか見てない● バッチ等重要局面の失敗はikachanでIRCへgo● でも,errorとかcriticalレベルで吐かれるログは全部見たい
アプリのログ,監視してる?
![Page 5: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup](https://reader030.vdocuments.site/reader030/viewer/2022020123/559abbab1a28abcf4a8b4629/html5/thumbnails/5.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022020123/559abbab1a28abcf4a8b4629/html5/thumbnails/6.jpg)
エラー通知という名のSPAM
![Page 7: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup](https://reader030.vdocuments.site/reader030/viewer/2022020123/559abbab1a28abcf4a8b4629/html5/thumbnails/7.jpg)
● メッセージは変数によって微妙に違うかもしれない● ログのレベル,ファイル,行が同じなら同じような内容とみなして良いよね● エラー通知はきっかけ.ざっくり内容が分かれば良い.● 詳細はどうせファイル見に行くでしょ?
サマライズしよう
![Page 8: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup](https://reader030.vdocuments.site/reader030/viewer/2022020123/559abbab1a28abcf4a8b4629/html5/thumbnails/8.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022020123/559abbab1a28abcf4a8b4629/html5/thumbnails/9.jpg)
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](https://reader030.vdocuments.site/reader030/viewer/2022020123/559abbab1a28abcf4a8b4629/html5/thumbnails/10.jpg)
$ crontab -l*/1 * * * * setlock -nx /tmp/norikra-error-notify.pl.lock /path/to/norikra-error-notify.pl
やること3
![Page 11: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup](https://reader030.vdocuments.site/reader030/viewer/2022020123/559abbab1a28abcf4a8b4629/html5/thumbnails/11.jpg)
#!/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](https://reader030.vdocuments.site/reader030/viewer/2022020123/559abbab1a28abcf4a8b4629/html5/thumbnails/12.jpg)
Architecture
App
IRC norikra-error-notify.pl @ cron
![Page 13: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup](https://reader030.vdocuments.site/reader030/viewer/2022020123/559abbab1a28abcf4a8b4629/html5/thumbnails/13.jpg)
すっきり
![Page 14: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup](https://reader030.vdocuments.site/reader030/viewer/2022020123/559abbab1a28abcf4a8b4629/html5/thumbnails/14.jpg)
● 複数ノード,複数インスタンスのアプリログをまとめられる● Fluentdに投げとけばアプリの外側で使える● ロガーと別に通知処理を入れなくて済む
良い点
![Page 15: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup](https://reader030.vdocuments.site/reader030/viewer/2022020123/559abbab1a28abcf4a8b4629/html5/thumbnails/15.jpg)
不満:● プロジェクト毎にクエリ登録したりcron仕掛けるのめんどい● 1度来た通知が修正作業中に何回もくるのがうっとおしい
展望:● そのへん面倒みてくれるいい感じのアプリでも作るけ?● と思っているところです.
展望
![Page 16: Norikraでアプリログを集計してリアルタイムエラー通知 # Norikra meetup](https://reader030.vdocuments.site/reader030/viewer/2022020123/559abbab1a28abcf4a8b4629/html5/thumbnails/16.jpg)
アプリログに関して:● アプリのログは書くだけじゃなくてちゃんと監視しようNorikraに関して:● Norikraは身近なとこでも使える● SQL書ければだいたい使える● ログ+ストリーム(リアルタイム)処理の組み合わせは色々でき
そう● ありがとう タゴ=モリス
まとめ