結論から言うと、Dropwizard 0.8の問題だった。
- ERROR以上をErrbitに送るとする(threshold
-
net.anthavio:airbrake-logback:1.0.1
を利用 -
net.anthavio.airbrake.AirbrakeLogbackAppender.Notify#ALL
とする -
logger.error
で明示的にERRORを吐く
上記のような時、airbrake-logbackの以下でNPEが発生する。
} else if (notify == Notify.ALL) {
StackTraceElement[] stackTrace = event.getCallerData(); // NPE
AirbrakeNotice notice = new AirbrakeNoticeBuilderUsingFilteredSystemProperties(apiKey, event.getFormattedMessage(), stackTrace[0], env).newNotice();
airbrakeNotifier.notify(notice);
}
なので、以下のようにnullチェックをすれば回避は出来る。
} else if (notify == Notify.ALL) {
StackTraceElement[] stackTrace = event.getCallerData();
StackTraceElement stackTraceElement = null;
if (stackTrace.length > 0) {
stackTraceElement = stackTrace[0];
}
AirbrakeNotice notice = new AirbrakeNoticeBuilderUsingFilteredSystemProperties(
apiKey, event.getFormattedMessage(), stackTraceElement, env)
.newNotice();
airbrakeNotifier.notify(notice);
}
色々調べてみると、Dropwizard 0.9からincludeCallerData
というプロパティが設定出来るようになり、これを設定ファイルのyamlでtrue
にしておけばNPEが発生しないことが分かった。
callerData
というのはLogbackの何かの設定っぽい?