package org.rakam.util; import com.getsentry.raven.Raven; import com.getsentry.raven.RavenFactory; import com.getsentry.raven.event.Event; import com.getsentry.raven.event.EventBuilder; import com.getsentry.raven.event.interfaces.ExceptionInterface; import com.getsentry.raven.event.interfaces.HttpInterface; import com.getsentry.raven.jul.SentryHandler; import com.google.common.collect.ImmutableMap; import io.netty.handler.codec.http.HttpResponseStatus; import org.rakam.report.QueryError; import org.rakam.report.QueryExecutor; import org.rakam.server.http.RakamHttpRequest; import org.rakam.server.http.RakamServletWrapper; import java.util.Arrays; import java.util.Map; import java.util.Optional; import java.util.logging.LogManager; import java.util.stream.Collectors; public class LogUtil { private static final Raven RAVEN; private static final Map<String, String> TAGS; private static final String RELEASE; static { LogManager manager = LogManager.getLogManager(); String canonicalName = SentryHandler.class.getCanonicalName(); String dsnInternal = manager.getProperty(canonicalName + ".dsn"); String tagsString = manager.getProperty(canonicalName + ".tags"); TAGS = Optional.ofNullable(tagsString).map(str -> Arrays.stream(str.split(",")).map(val -> val.split(":")).collect(Collectors.toMap(a -> a[0], a -> a[1]))) .orElse(ImmutableMap.of()); RELEASE = manager.getProperty(canonicalName + ".release"); RAVEN = dsnInternal != null ? RavenFactory.ravenInstance(dsnInternal) : null; } public static void logException(RakamHttpRequest request, RakamException e) { if (RAVEN == null) { return; } EventBuilder builder = new EventBuilder() .withMessage(e.getMessage()) .withSentryInterface(new HttpInterface(new RakamServletWrapper(request))) .withLevel(Event.Level.WARNING) .withLogger(RakamException.class.getName()) .withTag("status", e.getStatusCode().reasonPhrase()); if (TAGS != null) { for (Map.Entry<String, String> entry : TAGS.entrySet()) { builder.withTag(entry.getKey(), entry.getValue()); } } if (RELEASE != null) { builder.withRelease(RELEASE); } RAVEN.sendEvent(builder.build()); } public static void logException(RakamHttpRequest request, Throwable e) { if (RAVEN == null) { return; } EventBuilder builder = new EventBuilder() .withSentryInterface(new ExceptionInterface(e)) .withSentryInterface(new HttpInterface(new RakamServletWrapper(request))) .withLevel(Event.Level.WARNING) .withLogger(RakamException.class.getName()); if (TAGS != null) { for (Map.Entry<String, String> entry : TAGS.entrySet()) { builder.withTag(entry.getKey(), entry.getValue()); } } if (RELEASE != null) { builder.withRelease(RELEASE); } RAVEN.sendEvent(builder.build()); } public static void logException(RakamHttpRequest request, IllegalArgumentException e) { logException(request, new RakamException(e.getMessage(), HttpResponseStatus.BAD_REQUEST)); } public static void logQueryError(String query, QueryError e, Class<? extends QueryExecutor> queryExecutorClass) { EventBuilder builder = new EventBuilder() .withMessage(e.message) .withExtra("query", query) .withLevel(Event.Level.WARNING) .withLogger(QueryError.class.getName()) .withTag("executor", queryExecutorClass.getName()); if (TAGS != null) { for (Map.Entry<String, String> entry : TAGS.entrySet()) { builder.withTag(entry.getKey(), entry.getValue()); } } if (RELEASE != null) { builder.withRelease(RELEASE); } // TODO log errors to Rakam } }