diff --git a/instrumentation/java-util-logging/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingHelper.java b/instrumentation/java-util-logging/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingHelper.java index 780e7307c8..dfc29d6ad6 100644 --- a/instrumentation/java-util-logging/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingHelper.java +++ b/instrumentation/java-util-logging/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingHelper.java @@ -9,14 +9,12 @@ import application.java.util.logging.Logger; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder; import io.opentelemetry.api.logs.LogRecordBuilder; import io.opentelemetry.api.logs.Severity; import io.opentelemetry.context.Context; import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; -import io.opentelemetry.semconv.ExceptionAttributes; import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes; -import java.io.PrintWriter; -import java.io.StringWriter; import java.util.concurrent.TimeUnit; import java.util.logging.Formatter; import java.util.logging.Level; @@ -85,13 +83,8 @@ public final class JavaUtilLoggingHelper { // throwable Throwable throwable = logRecord.getThrown(); if (throwable != null) { - // TODO (trask) extract method for recording exception into - // io.opentelemetry:opentelemetry-api - attributes.put(ExceptionAttributes.EXCEPTION_TYPE, throwable.getClass().getName()); - attributes.put(ExceptionAttributes.EXCEPTION_MESSAGE, throwable.getMessage()); - StringWriter writer = new StringWriter(); - throwable.printStackTrace(new PrintWriter(writer)); - attributes.put(ExceptionAttributes.EXCEPTION_STACKTRACE, writer.toString()); + // this cast is safe within java agent instrumentation + ((ExtendedLogRecordBuilder) builder).setException(throwable); } if (captureExperimentalAttributes) { diff --git a/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/appender/v1_1/LoggingEventMapper.java b/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/appender/v1_1/LoggingEventMapper.java index b8e13d2f3e..344c831605 100644 --- a/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/appender/v1_1/LoggingEventMapper.java +++ b/instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/appender/v1_1/LoggingEventMapper.java @@ -12,15 +12,13 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder; import io.opentelemetry.api.logs.LogRecordBuilder; import io.opentelemetry.api.logs.Severity; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.internal.cache.Cache; import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; -import io.opentelemetry.semconv.ExceptionAttributes; import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes; -import java.io.PrintWriter; -import java.io.StringWriter; import java.util.List; import java.util.Map; import org.jboss.logmanager.ExtLogRecord; @@ -81,13 +79,8 @@ public final class LoggingEventMapper { Throwable throwable = record.getThrown(); if (throwable != null) { - // TODO (trask) extract method for recording exception into - // io.opentelemetry:opentelemetry-api - attributes.put(ExceptionAttributes.EXCEPTION_TYPE, throwable.getClass().getName()); - attributes.put(ExceptionAttributes.EXCEPTION_MESSAGE, throwable.getMessage()); - StringWriter writer = new StringWriter(); - throwable.printStackTrace(new PrintWriter(writer)); - attributes.put(ExceptionAttributes.EXCEPTION_STACKTRACE, writer.toString()); + // this cast is safe within java agent instrumentation + ((ExtendedLogRecordBuilder) builder).setException(throwable); } captureMdcAttributes(attributes); diff --git a/instrumentation/log4j/log4j-appender-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v1_2/LogEventMapper.java b/instrumentation/log4j/log4j-appender-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v1_2/LogEventMapper.java index b2c3b6dea3..1f6966503f 100644 --- a/instrumentation/log4j/log4j-appender-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v1_2/LogEventMapper.java +++ b/instrumentation/log4j/log4j-appender-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v1_2/LogEventMapper.java @@ -11,6 +11,7 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder; import io.opentelemetry.api.logs.LogRecordBuilder; import io.opentelemetry.api.logs.Severity; import io.opentelemetry.context.Context; @@ -101,13 +102,15 @@ public final class LogEventMapper { // throwable if (throwable != null) { - // TODO (trask) extract method for recording exception into - // io.opentelemetry:opentelemetry-api - attributes.put(ExceptionAttributes.EXCEPTION_TYPE, throwable.getClass().getName()); - attributes.put(ExceptionAttributes.EXCEPTION_MESSAGE, throwable.getMessage()); - StringWriter writer = new StringWriter(); - throwable.printStackTrace(new PrintWriter(writer)); - attributes.put(ExceptionAttributes.EXCEPTION_STACKTRACE, writer.toString()); + if (builder instanceof ExtendedLogRecordBuilder) { + ((ExtendedLogRecordBuilder) builder).setException(throwable); + } else { + attributes.put(ExceptionAttributes.EXCEPTION_TYPE, throwable.getClass().getName()); + attributes.put(ExceptionAttributes.EXCEPTION_MESSAGE, throwable.getMessage()); + StringWriter writer = new StringWriter(); + throwable.printStackTrace(new PrintWriter(writer)); + attributes.put(ExceptionAttributes.EXCEPTION_STACKTRACE, writer.toString()); + } } captureMdcAttributes(attributes); diff --git a/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/internal/LogEventMapper.java b/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/internal/LogEventMapper.java index a167f5ebbb..36ec63fcd1 100644 --- a/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/internal/LogEventMapper.java +++ b/instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/internal/LogEventMapper.java @@ -8,6 +8,7 @@ package io.opentelemetry.instrumentation.log4j.appender.v2_17.internal; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder; import io.opentelemetry.api.logs.LogRecordBuilder; import io.opentelemetry.api.logs.Severity; import io.opentelemetry.context.Context; @@ -117,7 +118,7 @@ public final class LogEventMapper { } if (throwable != null) { - setThrowable(attributes, throwable); + setThrowable(builder, attributes, throwable); } captureContextDataAttributes(attributes, contextData); @@ -233,14 +234,17 @@ public final class LogEventMapper { key, k -> AttributeKey.stringKey("log4j.map_message." + k)); } - private static void setThrowable(AttributesBuilder attributes, Throwable throwable) { - // TODO (trask) extract method for recording exception into - // io.opentelemetry:opentelemetry-api - attributes.put(ExceptionAttributes.EXCEPTION_TYPE, throwable.getClass().getName()); - attributes.put(ExceptionAttributes.EXCEPTION_MESSAGE, throwable.getMessage()); - StringWriter writer = new StringWriter(); - throwable.printStackTrace(new PrintWriter(writer)); - attributes.put(ExceptionAttributes.EXCEPTION_STACKTRACE, writer.toString()); + private static void setThrowable( + LogRecordBuilder builder, AttributesBuilder attributes, Throwable throwable) { + if (builder instanceof ExtendedLogRecordBuilder) { + ((ExtendedLogRecordBuilder) builder).setException(throwable); + } else { + attributes.put(ExceptionAttributes.EXCEPTION_TYPE, throwable.getClass().getName()); + attributes.put(ExceptionAttributes.EXCEPTION_MESSAGE, throwable.getMessage()); + StringWriter writer = new StringWriter(); + throwable.printStackTrace(new PrintWriter(writer)); + attributes.put(ExceptionAttributes.EXCEPTION_STACKTRACE, writer.toString()); + } } private static Severity levelToSeverity(Level level) { diff --git a/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/internal/LoggingEventMapper.java b/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/internal/LoggingEventMapper.java index 20f92ec2cc..0819c73a93 100644 --- a/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/internal/LoggingEventMapper.java +++ b/instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/internal/LoggingEventMapper.java @@ -17,6 +17,7 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder; import io.opentelemetry.api.logs.LogRecordBuilder; import io.opentelemetry.api.logs.LoggerProvider; import io.opentelemetry.api.logs.Severity; @@ -147,7 +148,7 @@ public final class LoggingEventMapper { throwable = ((ThrowableProxy) throwableProxy).getThrowable(); } if (throwable != null) { - setThrowable(attributes, throwable); + setThrowable(builder, attributes, throwable); } captureMdcAttributes(attributes, loggingEvent.getMDCPropertyMap()); @@ -269,14 +270,17 @@ public final class LoggingEventMapper { return mdcAttributeKeys.computeIfAbsent(key, AttributeKey::stringKey); } - private static void setThrowable(AttributesBuilder attributes, Throwable throwable) { - // TODO (trask) extract method for recording exception into - // io.opentelemetry:opentelemetry-api - attributes.put(ExceptionAttributes.EXCEPTION_TYPE, throwable.getClass().getName()); - attributes.put(ExceptionAttributes.EXCEPTION_MESSAGE, throwable.getMessage()); - StringWriter writer = new StringWriter(); - throwable.printStackTrace(new PrintWriter(writer)); - attributes.put(ExceptionAttributes.EXCEPTION_STACKTRACE, writer.toString()); + private static void setThrowable( + LogRecordBuilder builder, AttributesBuilder attributes, Throwable throwable) { + if (builder instanceof ExtendedLogRecordBuilder) { + ((ExtendedLogRecordBuilder) builder).setException(throwable); + } else { + attributes.put(ExceptionAttributes.EXCEPTION_TYPE, throwable.getClass().getName()); + attributes.put(ExceptionAttributes.EXCEPTION_MESSAGE, throwable.getMessage()); + StringWriter writer = new StringWriter(); + throwable.printStackTrace(new PrintWriter(writer)); + attributes.put(ExceptionAttributes.EXCEPTION_STACKTRACE, writer.toString()); + } } private static Severity levelToSeverity(Level level) {