Skip to content

Commit 1eadd1e

Browse files
authored
Have user supplied attributes take precedence over exception-derived attributes (#7993)
1 parent 3b72741 commit 1eadd1e

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkLogRecordBuilder.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public ExtendedSdkLogRecordBuilder setException(Throwable throwable) {
4646
loggerSharedState
4747
.getExceptionAttributeResolver()
4848
.setExceptionAttributes(
49-
this::setAttribute,
49+
this::setExceptionAttribute,
5050
throwable,
5151
loggerSharedState.getLogLimits().getMaxAttributeValueLength());
5252

@@ -144,4 +144,17 @@ protected ReadWriteLogRecord createLogRecord(Context context, long observedTimes
144144
body,
145145
extendedAttributes);
146146
}
147+
148+
/**
149+
* Sets an exception-derived attribute only if it hasn't already been set by the user. This
150+
* ensures user-set attributes take precedence over exception-derived attributes.
151+
*/
152+
private <T> void setExceptionAttribute(AttributeKey<T> key, @Nullable T value) {
153+
if (key == null || key.getKey().isEmpty() || value == null) {
154+
return;
155+
}
156+
if (extendedAttributes == null || extendedAttributes.get(key) == null) {
157+
setAttribute(key, value);
158+
}
159+
}
147160
}

sdk/logs/src/testIncubating/java/io/opentelemetry/sdk/logs/ExtendedLoggerBuilderTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,27 @@ public void setExceptionAttributes(
7676
equalTo(EXCEPTION_TYPE, "type"),
7777
equalTo(EXCEPTION_STACKTRACE, "stacktrace")));
7878
}
79+
80+
@Test
81+
void setException_UserAttributesTakePrecedence() {
82+
Logger logger = loggerProviderBuilder.build().get("logger");
83+
84+
((ExtendedLogRecordBuilder) logger.logRecordBuilder())
85+
.setAttribute(EXCEPTION_MESSAGE, "custom message")
86+
.setException(new Exception("error"))
87+
.emit();
88+
89+
assertThat(exporter.getFinishedLogRecordItems())
90+
.satisfiesExactly(
91+
logRecord ->
92+
assertThat(logRecord)
93+
.hasAttributesSatisfyingExactly(
94+
equalTo(EXCEPTION_TYPE, "java.lang.Exception"),
95+
equalTo(EXCEPTION_MESSAGE, "custom message"),
96+
satisfies(
97+
EXCEPTION_STACKTRACE,
98+
stacktrace ->
99+
stacktrace.startsWith(
100+
"java.lang.Exception: error" + System.lineSeparator()))));
101+
}
79102
}

0 commit comments

Comments
 (0)