Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

27,851 views

Published on

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

Published in: Technology
  • Be the first to comment

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. おわり

×