Skip to content

Commit c607938

Browse files
traskotelbot[bot]
andauthored
Support custom exception handling (#14493)
Co-authored-by: otelbot <197425009+otelbot@users.noreply.github.com>
1 parent 38765f5 commit c607938

File tree

5 files changed

+42
-45
lines changed
  • instrumentation
    • java-util-logging/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jul
    • jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/appender/v1_1
    • log4j
      • log4j-appender-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v1_2
      • log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/internal
    • logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/internal

5 files changed

+42
-45
lines changed

instrumentation/java-util-logging/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jul/JavaUtilLoggingHelper.java

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,12 @@
99
import io.opentelemetry.api.GlobalOpenTelemetry;
1010
import io.opentelemetry.api.common.Attributes;
1111
import io.opentelemetry.api.common.AttributesBuilder;
12+
import io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder;
1213
import io.opentelemetry.api.logs.LogRecordBuilder;
1314
import io.opentelemetry.api.logs.Severity;
1415
import io.opentelemetry.context.Context;
1516
import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig;
16-
import io.opentelemetry.semconv.ExceptionAttributes;
1717
import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes;
18-
import java.io.PrintWriter;
19-
import java.io.StringWriter;
2018
import java.util.concurrent.TimeUnit;
2119
import java.util.logging.Formatter;
2220
import java.util.logging.Level;
@@ -85,13 +83,8 @@ private static void mapLogRecord(LogRecordBuilder builder, LogRecord logRecord)
8583
// throwable
8684
Throwable throwable = logRecord.getThrown();
8785
if (throwable != null) {
88-
// TODO (trask) extract method for recording exception into
89-
// io.opentelemetry:opentelemetry-api
90-
attributes.put(ExceptionAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
91-
attributes.put(ExceptionAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
92-
StringWriter writer = new StringWriter();
93-
throwable.printStackTrace(new PrintWriter(writer));
94-
attributes.put(ExceptionAttributes.EXCEPTION_STACKTRACE, writer.toString());
86+
// this cast is safe within java agent instrumentation
87+
((ExtendedLogRecordBuilder) builder).setException(throwable);
9588
}
9689

9790
if (captureExperimentalAttributes) {

instrumentation/jboss-logmanager/jboss-logmanager-appender-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/appender/v1_1/LoggingEventMapper.java

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,13 @@
1212
import io.opentelemetry.api.common.AttributeKey;
1313
import io.opentelemetry.api.common.Attributes;
1414
import io.opentelemetry.api.common.AttributesBuilder;
15+
import io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder;
1516
import io.opentelemetry.api.logs.LogRecordBuilder;
1617
import io.opentelemetry.api.logs.Severity;
1718
import io.opentelemetry.context.Context;
1819
import io.opentelemetry.instrumentation.api.internal.cache.Cache;
1920
import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig;
20-
import io.opentelemetry.semconv.ExceptionAttributes;
2121
import io.opentelemetry.semconv.incubating.ThreadIncubatingAttributes;
22-
import java.io.PrintWriter;
23-
import java.io.StringWriter;
2422
import java.util.List;
2523
import java.util.Map;
2624
import org.jboss.logmanager.ExtLogRecord;
@@ -81,13 +79,8 @@ public void capture(Logger logger, ExtLogRecord record) {
8179

8280
Throwable throwable = record.getThrown();
8381
if (throwable != null) {
84-
// TODO (trask) extract method for recording exception into
85-
// io.opentelemetry:opentelemetry-api
86-
attributes.put(ExceptionAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
87-
attributes.put(ExceptionAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
88-
StringWriter writer = new StringWriter();
89-
throwable.printStackTrace(new PrintWriter(writer));
90-
attributes.put(ExceptionAttributes.EXCEPTION_STACKTRACE, writer.toString());
82+
// this cast is safe within java agent instrumentation
83+
((ExtendedLogRecordBuilder) builder).setException(throwable);
9184
}
9285
captureMdcAttributes(attributes);
9386

instrumentation/log4j/log4j-appender-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/appender/v1_2/LogEventMapper.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import io.opentelemetry.api.common.AttributeKey;
1212
import io.opentelemetry.api.common.Attributes;
1313
import io.opentelemetry.api.common.AttributesBuilder;
14+
import io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder;
1415
import io.opentelemetry.api.logs.LogRecordBuilder;
1516
import io.opentelemetry.api.logs.Severity;
1617
import io.opentelemetry.context.Context;
@@ -101,13 +102,15 @@ public void capture(
101102

102103
// throwable
103104
if (throwable != null) {
104-
// TODO (trask) extract method for recording exception into
105-
// io.opentelemetry:opentelemetry-api
106-
attributes.put(ExceptionAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
107-
attributes.put(ExceptionAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
108-
StringWriter writer = new StringWriter();
109-
throwable.printStackTrace(new PrintWriter(writer));
110-
attributes.put(ExceptionAttributes.EXCEPTION_STACKTRACE, writer.toString());
105+
if (builder instanceof ExtendedLogRecordBuilder) {
106+
((ExtendedLogRecordBuilder) builder).setException(throwable);
107+
} else {
108+
attributes.put(ExceptionAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
109+
attributes.put(ExceptionAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
110+
StringWriter writer = new StringWriter();
111+
throwable.printStackTrace(new PrintWriter(writer));
112+
attributes.put(ExceptionAttributes.EXCEPTION_STACKTRACE, writer.toString());
113+
}
111114
}
112115

113116
captureMdcAttributes(attributes);

instrumentation/log4j/log4j-appender-2.17/library/src/main/java/io/opentelemetry/instrumentation/log4j/appender/v2_17/internal/LogEventMapper.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import io.opentelemetry.api.common.AttributeKey;
99
import io.opentelemetry.api.common.Attributes;
1010
import io.opentelemetry.api.common.AttributesBuilder;
11+
import io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder;
1112
import io.opentelemetry.api.logs.LogRecordBuilder;
1213
import io.opentelemetry.api.logs.Severity;
1314
import io.opentelemetry.context.Context;
@@ -117,7 +118,7 @@ public void mapLogEvent(
117118
}
118119

119120
if (throwable != null) {
120-
setThrowable(attributes, throwable);
121+
setThrowable(builder, attributes, throwable);
121122
}
122123

123124
captureContextDataAttributes(attributes, contextData);
@@ -233,14 +234,17 @@ public static AttributeKey<String> getMapMessageAttributeKey(String key) {
233234
key, k -> AttributeKey.stringKey("log4j.map_message." + k));
234235
}
235236

236-
private static void setThrowable(AttributesBuilder attributes, Throwable throwable) {
237-
// TODO (trask) extract method for recording exception into
238-
// io.opentelemetry:opentelemetry-api
239-
attributes.put(ExceptionAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
240-
attributes.put(ExceptionAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
241-
StringWriter writer = new StringWriter();
242-
throwable.printStackTrace(new PrintWriter(writer));
243-
attributes.put(ExceptionAttributes.EXCEPTION_STACKTRACE, writer.toString());
237+
private static void setThrowable(
238+
LogRecordBuilder builder, AttributesBuilder attributes, Throwable throwable) {
239+
if (builder instanceof ExtendedLogRecordBuilder) {
240+
((ExtendedLogRecordBuilder) builder).setException(throwable);
241+
} else {
242+
attributes.put(ExceptionAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
243+
attributes.put(ExceptionAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
244+
StringWriter writer = new StringWriter();
245+
throwable.printStackTrace(new PrintWriter(writer));
246+
attributes.put(ExceptionAttributes.EXCEPTION_STACKTRACE, writer.toString());
247+
}
244248
}
245249

246250
private static Severity levelToSeverity(Level level) {

instrumentation/logback/logback-appender-1.0/library/src/main/java/io/opentelemetry/instrumentation/logback/appender/v1_0/internal/LoggingEventMapper.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import io.opentelemetry.api.common.AttributeKey;
1818
import io.opentelemetry.api.common.Attributes;
1919
import io.opentelemetry.api.common.AttributesBuilder;
20+
import io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder;
2021
import io.opentelemetry.api.logs.LogRecordBuilder;
2122
import io.opentelemetry.api.logs.LoggerProvider;
2223
import io.opentelemetry.api.logs.Severity;
@@ -147,7 +148,7 @@ private void mapLoggingEvent(
147148
throwable = ((ThrowableProxy) throwableProxy).getThrowable();
148149
}
149150
if (throwable != null) {
150-
setThrowable(attributes, throwable);
151+
setThrowable(builder, attributes, throwable);
151152
}
152153

153154
captureMdcAttributes(attributes, loggingEvent.getMDCPropertyMap());
@@ -269,14 +270,17 @@ public static AttributeKey<String> getMdcAttributeKey(String key) {
269270
return mdcAttributeKeys.computeIfAbsent(key, AttributeKey::stringKey);
270271
}
271272

272-
private static void setThrowable(AttributesBuilder attributes, Throwable throwable) {
273-
// TODO (trask) extract method for recording exception into
274-
// io.opentelemetry:opentelemetry-api
275-
attributes.put(ExceptionAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
276-
attributes.put(ExceptionAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
277-
StringWriter writer = new StringWriter();
278-
throwable.printStackTrace(new PrintWriter(writer));
279-
attributes.put(ExceptionAttributes.EXCEPTION_STACKTRACE, writer.toString());
273+
private static void setThrowable(
274+
LogRecordBuilder builder, AttributesBuilder attributes, Throwable throwable) {
275+
if (builder instanceof ExtendedLogRecordBuilder) {
276+
((ExtendedLogRecordBuilder) builder).setException(throwable);
277+
} else {
278+
attributes.put(ExceptionAttributes.EXCEPTION_TYPE, throwable.getClass().getName());
279+
attributes.put(ExceptionAttributes.EXCEPTION_MESSAGE, throwable.getMessage());
280+
StringWriter writer = new StringWriter();
281+
throwable.printStackTrace(new PrintWriter(writer));
282+
attributes.put(ExceptionAttributes.EXCEPTION_STACKTRACE, writer.toString());
283+
}
280284
}
281285

282286
private static Severity levelToSeverity(Level level) {

0 commit comments

Comments
 (0)