Javabrake is a Java notifier for Airbrake.
Gradle:
implementation 'io.airbrake:javabrake:0.3.0'
Maven:
<dependency>
<groupId>io.airbrake</groupId>
<artifactId>javabrake</artifactId>
<version>0.3.0</version>
</dependency>
Ivy:
<dependency org='io.airbrake' name='javabrake' rev='0.3.0'>
<artifact name='javabrake' ext='pom'></artifact>
</dependency>
Configuration:
import io.airbrake.javabrake.Notifier;
import io.airbrake.javabrake.Config;
Config config = new Config();
config.projectId = 12345;
config.projectKey = "FIXME";
Notifier notifier = new Notifier(config);
notifier.addFilter(
(Notice notice) -> {
notice.setContext("environment", "production");
return notice;
});
try {
do();
} catch (IOException e) {
notifier.report(e);
}
import io.airbrake.javabrake.Airbrake;
try {
do();
} catch (IOException e) {
Airbrake.report(e);
}
By default report
sends errors asynchronously returning a Future
, but synchronous API is also available:
import io.airbrake.javabrake.Notice;
Notice notice = Airbrake.reportSync(e);
if (notice.exception != null) {
logger.info(notice.exception);
} else {
logger.info(notice.id);
}
To set custom params you can build and send notice in separate steps:
import io.airbrake.javabrake.Notice;
Notice notice = Airbrake.buildNotice(e);
notice.setContext("component", "mycomponent");
notice.setParam("param1", "value1");
Airbrake.send(notice);
You can also set custom params on all reported notices:
notifier.addFilter(
(Notice notice) -> {
notice.setParam("myparam", "myvalue");
return notice;
});
You can link error notices with the routes by setting the route e.g. /hello and httpMethod e.g. GET, POST in the custom parameters for error notices. For example:
Notice notice = notifier.buildNotice(e);
notice.setContext("route", "route-name");
notice.setContext("httpMethod", "http-method-name");
gnore specific notice:
notifier.addFilter(
(Notice notice) -> {
if (notice.context.get("environment") == "development") {
// Ignore notice.
return null;
}
return notice;
});
To debug why notices are not sent you can use onReportedNotice
hook:
notifier.onReportedNotice(
(notice) -> {
if (notice.exception != null) {
logger.info(notice.exception);
} else {
logger.info(String.format("notice id=%s url=%s", notice.id, notice.url));
}
});
You can read more about our Performance Monitoring offering in our docs.
notifier.routes.notify
allows sending route stats to Airbrake. You can also use this API manually:
import io.airbrake.javabrake.RouteMetric;
RouteMetric metric = new RouteMetric(request.getMethod(), request.getRequestURI());
metric.statusCode = response.getStatus();
metric.contentType = response.getContentType();
metric.endTime = new Date();
notifier.routes.notify(metric);
notifier.routes.notify
allows sending performance breakdown stats
to Airbrake. You can use this API manually:
import io.airbrake.javabrake.RouteMetric;
RouteMetric metric = new RouteMetric(request.getMethod(), request.getRequestURI());
metric.startSpan("span1 name", new Date());
try {
do();
} catch (Exception e) {
e.printStackTrace();
}
metric.endSpan("span1 name", new Date());
metric.startSpan("span2 name", new Date());
try {
do();
} catch (Exception e) {
e.printStackTrace();
}
metric.endSpan("span2 name", new Date());
metric.end();
metric.statusCode = response.getStatus();
metric.contentType = response.getContentType();
notifier.routes.notify(metric);
notifier.queries.notify
allows sending SQL query stats to Airbrake. You can also use this API manually:
Date startTime = new Date();
try
{
do();
}catch(
Exception e)
{
e.printStackTrace();
}
Date endTime = new Date();
notifier.queries.notify(request.getMethod(),request.getRequestURI()
,"SELECT * FROM foos",startTime,endTime);
notifier.queues.notify
allows sending queue (job) stats to Airbrake. You can also use this API manually:
import io.airbrake.javabrake.QueueMetric;
QueueMetric metric = new QueueMetric("foo_queue");
metric.startSpan("span1 name", new Date());
try {
do();
} catch (Exception e) {
e.printStackTrace();
}
metric.endSpan("span1 name", new Date());
metric.startSpan("span2 name", new Date());
try {
do();
} catch (Exception e) {
e.printStackTrace();
}
metric.endSpan("span2 name", new Date());
metric.end();
notifier.queues.notify(metric);
For more information visit docs
See https://github.com/airbrake/log4javabrake2
See https://github.com/airbrake/logback
javabrake uses OkHttp as an HTTP client. So in order to use proxy all you have to do is to configure OkHttpClient:
import java.net.InetSocketAddress;
import okhttp3.OkHttpClient;
import okhttp3.Proxy;
import io.airbrake.javabrake.OkSender;
Proxy proxy = new Proxy(Proxy.Type.HTTP, InetSocketAddress.createUnresolved("192.168.1.105", 8081);
OkHttpClient httpClient =
new OkHttpClient.Builder()
.connectTimeout(3000, TimeUnit.MILLISECONDS)
.readTimeout(3000, TimeUnit.MILLISECONDS)
.writeTimeout(3000, TimeUnit.MILLISECONDS)
.proxy(proxy)
.build();
OkSender.setOkHttpClient(httpClient);
Make sure you build and release this notifier with open-jdk-8, one way to manage your local java version is using asdf. You can install this tool via homebrew:
brew install asdf
Then install open-jdk-8 and set it as JAVA home before running any of the ./gradlew
commands:
asdf plugin add java
asdf install java adoptopenjdk-8.0.312+7
export JAVA_HOME=$HOME/.asdf/installs/java/adoptopenjdk-8.0.312+7
./gradlew build
Upload to JCentral:
./gradlew bintrayUpload
Upload to Maven Central:
./gradlew uploadArchives
./gradlew closeAndReleaseRepository
Usefull links: