Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT

17,768 views

Published on

Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT

Published in: Technology
0 Comments
9 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
17,768
On SlideShare
0
From Embeds
0
Number of Embeds
12,351
Actions
Shares
0
Downloads
6
Comments
0
Likes
9
Embeds 0
No embeds

No notes for slide

Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT

  1. 1. Norikraで作る PHPの例外検知システム YAPC::Asia Tokyo 2015 LT Masahiro Nagano @kazeburo
  2. 2. PHPはじめました 長年Perlをやってきましたが
  3. 3. PHPの例外を検出し 通知するシステム Catch PHP Exception and send it to Slack
  4. 4. STEP 1 例外をログに記録する Log the PHP Exception
  5. 5. Try-Catch try { throw new MyAppException('Boofy'); } catch (Exception $e ) { $msg = json_encode(array( 'message' => $e->getMessage(), '_exception' => array( 'class' => get_class($e), 'message' => $e->getMessage(), 'trace' => .. ), )). "n"; error_log($msg, 3, '/path/to/app_error_log'); }
  6. 6. set_exception_handler set_exception_handler(function($e) { $msg = decorate_exception($e); error_log($msg, 3, '/path/to/app_error_log'); }); throw new MyAppException('Boofy'); try-catch外で発生した例外を補足 Catch the PHP Exception outside Try-Catch
  7. 7. set_error_handler set_error_handler( function($severity, $msg, $file, $line){ throw new ErrorException( $msg, 0, $$severity, $file, $line ); } ); PHPではエラーと例外は別物 エラーを例外に変換 Convert Error to Exeption
  8. 8. これらの機能を使っても 補足できない例外がある (例) syntax error、存在しないメソッドの呼び出し Can’t all Exception with these functions
  9. 9. error_reporting & error_log error_reporting(E_ALL | E_STRICT); ini_set('error_log', '/path/to/php_log'); 致命的エラーをログに記録 php.ini でも書ける Log Fatal Errors to the log file
  10. 10. Apache vhost ErrorLog <VirtualHost *:80> ServerName api.example.com ErrorLog /path/to/error_log </VirtualHost> php.ini にerror_logの設定がなく ini_set 前にエラーが発生した場合
  11. 11. Apache ErrorLog ErrorLog /var/log/httpd/error_log Segmentation fault など Apacheのworkerプロセスの不正終了
  12. 12. ここまでまとめ PHP(mod_php)のエラーログは全部で 4つのファイルに記録される ここまでが長かった 弊社の環境では
  13. 13. STEP 2 例外の集約から通知
  14. 14. 構成 App App App SQLを投入 エラーログをfluentdでNorikraに送り リアルタイムに集計してSlackに通知
  15. 15. fluentd <source> type tail format json path /path/to/app_error_log tag nohostname.error_app_log </source> <source> type tail format /^[(?<time>[^]]*)] (?<message>.*)$/ time_format %d-%b-%Y %H:%M:%S path /path/to/php_log tag nohostname.apache_error </source> <source> type tail format /^[[^ ]* (?<time>[^]]*)] [(?<level>[^]]*)](?: [pid (?<pid>[^]]*)])? [client (?<client>[^]]*)] (?<message>.*?)(?:, referer: (? <referer>.*))?$/ path /path/to/error_log tag nohostname.apache_error </source> <source> type tail format /^[[^ ]* (?<time>[^]]*)] [(?<level>[^]]*)](?: [pid (?<pid>[^]]*)])? [client (?<client>[^]]*)] (?<message>.*?)(?:, referer: (? <referer>.*))?$/ path /var/log/httpd/error_log tag nohostname.apache_error </source> <match nohostname.**> type record_reformer tag ${tag_suffix[1]} hostname ${hostname} </match> <match {error_app_log,apache_error}> type forward <server> name cep host cep </server> </match> in_tail x 4 hostname追加 集約サーバへの送信
  16. 16. Norikra •Norikra とはリアルタイムイベントスト リームに対して SQL ライクな言語で処 理できる super cool なプロダクト
  17. 17. Norikra Query SELECT "alert-channel" as channel, "[..][" || hostname || "] Detect *" || CAST(COUNT(*), string) || "* PDOException in this 1min: ```" || message || "``` action: `" || COALESCE(NULLABLE(action),"-") || "`" AS msg FROM error_app_log.win:time_batch(1 min) WHERE exception.class = "PDOException" OR ( _exception.class = "ErrorException" AND _exception.message LIKE "PDOStatement%" ) GROUP BY hostname, message, action HAVING COUNT(*) > 0
  18. 18. 表示例
  19. 19. まとめ • Norikra便利 • PHPのエラーログはつらい • 扱いづらいPHPのエラー処理を適当にいなす - uzullaがブログ • http://uzulla.hateblo.jp/entry/ 2013/12/20/041619
  20. 20. He is an awesome PHP guy!!!
  21. 21. おわり

×