Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Erwarte die Ausnahmen – Elegante Fehlerbehandlung

Erwarte die Ausnahmen – Elegante Fehlerbehandlung

Auch die beste Testabdeckung einer Web Applikation verhindert nicht, dass Fehler und Bugs in der Produktionsumgebung auftreten können, insbesondere bei Datenbank Problemen oder Lastspitzen. Deshalb ist es wichtig, Fehler und Probleme frühzeitig zu erkennen, um diese schnell beheben zu können. In diesem Talk werde ich effiziente Wege wie z.B. Deployment Strategien, Canary Environments oder Circuit Breaker vorstellen um Fehler messen, loggen und dann elegant behandeln zu können. Ziel ist, den Einfluss auf Gesamtstabilität und User-Experience der Applikation so gering wie möglich zu halten.

Bastian Hofmann

April 07, 2017
Tweet

More Decks by Bastian Hofmann

Other Decks in Programming

Transcript

  1. bool error_log ( string $message [, int $message_type = 0

    [, string $destination [, string $extra_headers ]]] )
  2. set_error_handler( function($errno, $msg, $file, $line) { $e = new \Exception();

    $error = [ 'type' => $errno, 'message' => $msg, 'file' => $file, 'line' => $line, 'trace' => $e->getTrace(), ]; error_log(json_encode($error)); return true; });
  3. set_error_handler( function($errno, $msg, $file, $line) { switch ($errno) { case

    E_RECOVERABLE_ERROR: case E_USER_ERROR: throw new \ErrorException($msg, null, $errno, $file, $line); case E_WARNING: case E_USER_WARNING: case E_CORE_WARNING: case E_COMPILE_WARNING: throw new WarningException($msg, null, $errno, $file, $line); case E_NOTICE: case E_USER_NOTICE: throw new NoticeException($msg, null, $errno, $file, $line); case E_STRICT: throw new StrictException($msg, null, $errno, $file, $line); } return true; }); $a = []; try { $b = $a['doesNotExist']; } catch (NoticeException $e) { }
  4. web server http service http service http service http service

    create unique trace_id for request user request trace_id trace_id trace_id trace_id log log log log log
  5. input { file { type => "error" path => [

    "/var/logs/php/*.log" ] add_field => [ "severity", "error" ] } file { type => "access" path => [ "/var/logs/apache/*_access.log" ] add_field => [ "severity", "info" ] }
  6. filter{ grok { match => ["@source", "\/%{USERNAME:facility}\.log$"] } grok {

    type => "access" pattern => "^%{IP:OriginalIp} \s[a-zA-Z0-9_-]+\s[a-zA-Z0-9_-]+\s\[.*? \]\s\"%{DATA:Request}..." } }
  7. input {
 rabbitmq {
 queue => "logs"
 host => "amqp.host"


    exchange => "ls_exchange"
 exclusive => false
 }
 }
  8. filter { grok {
 match => [
 'Type','EntityNotFoundException| TimeoutException'
 ]


    break_on_match => true
 add_tag => ['not_serious']
 tag_on_failure => ['serious']
 } }
  9. output {
 elasticsearch {
 embedded => false
 bind_host => "localhost"


    bind_port => "9305"
 host => "localhost"
 cluster => "logs"
 }
 }
  10. Service A Service B Error Circuit Breaker Status: -> open

    Error rate: > threshold Test if still failing
  11. Service A Service B 200 OK Circuit Breaker Status: ->

    close Error rate: 0 Test if still failing