/javabrake

Airbrake notifier for Java

Primary LanguageJavaMIT LicenseMIT

Javabrake

.github/workflows/test.yml

Introduction

Javabrake is a Java notifier for Airbrake.

Installation

Gradle:

implementation 'io.airbrake:javabrake:0.2.4'

Maven:

<dependency>
  <groupId>io.airbrake</groupId>
  <artifactId>javabrake</artifactId>
  <version>0.2.4</version>
</dependency>

Ivy:

<dependency org='io.airbrake' name='javabrake' rev='0.2.4'>
  <artifact name='javabrake' ext='pom'></artifact>
</dependency>

Quickstart

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;
    });

Using notifier directly:

try {
  do();
} catch (IOException e) {
  notifier.report(e);
}

Using Airbrake proxy class:

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;
    });

Or ignore 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));
      }
    });

log4j2 integration

See https://github.com/airbrake/log4javabrake2

logback integration

See https://github.com/airbrake/logback

HTTP proxy

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);

Notifier release instrucitons

A note on Java version

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

Build

./gradlew build

Upload to JCentral:

./gradlew bintrayUpload

Upload to Maven Central:

./gradlew uploadArchives
./gradlew closeAndReleaseRepository

Usefull links: