Skip to content

Commit 8f594bd

Browse files
zeitlingerlaurit
authored andcommitted
fix map structured args in logstash (open-telemetry#15341)
1 parent 06efe62 commit 8f594bd

File tree

2 files changed

+18
-10
lines changed

2 files changed

+18
-10
lines changed

instrumentation/logback/logback-appender-1.0/library/src/logstashStructuredArgsTest/java/io/opentelemetry/instrumentation/logback/appender/v1_0/LogstashStructuredArgsTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
import io.opentelemetry.api.common.AttributeKey;
1111
import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension;
12+
import java.util.HashMap;
13+
import java.util.Map;
1214
import net.logstash.logback.argument.StructuredArguments;
1315
import org.junit.jupiter.api.BeforeAll;
1416
import org.junit.jupiter.api.Test;
@@ -90,4 +92,17 @@ void structuredArgumentsWithTypedValues() {
9092
equalTo(AttributeKey.longKey("timestamp"), timestamp),
9193
equalTo(AttributeKey.booleanKey("session_active"), true)));
9294
}
95+
96+
@Test
97+
void logWithStructuredArgument() {
98+
Map<String, Object> eventData = new HashMap<>();
99+
eventData.put("foo", "bar");
100+
logger.info("message: {}", StructuredArguments.entries(eventData));
101+
102+
testing.waitAndAssertLogRecords(
103+
logRecord ->
104+
logRecord
105+
.hasBody("message: {foo=bar}")
106+
.hasAttributesSatisfying(equalTo(AttributeKey.stringKey("foo"), "bar")));
107+
}
93108
}

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

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -640,7 +640,7 @@ private static boolean supportsLogstashStructuredArguments() {
640640
private void captureLogstashStructuredArguments(LogRecordBuilder builder, Object[] arguments) {
641641
for (Object argument : arguments) {
642642
if (isLogstashStructuredArgument(argument)) {
643-
captureLogstashStructuredArgument(builder, argument);
643+
captureLogstashMarker(builder, argument);
644644
}
645645
}
646646
}
@@ -649,15 +649,8 @@ private void captureLogstashStructuredArguments(LogRecordBuilder builder, Object
649649
private static boolean isLogstashStructuredArgument(Object argument) {
650650
// StructuredArguments implement the marker interface, so we can check for it
651651
// without importing the class directly (which may not be available at runtime)
652-
return argument instanceof SingleFieldAppendingMarker;
653-
}
654-
655-
@NoMuzzle
656-
private void captureLogstashStructuredArgument(LogRecordBuilder builder, Object argument) {
657-
// StructuredArguments created by v() or keyValue() extend SingleFieldAppendingMarker
658-
// which has getFieldName() and provides field value via reflection
659-
SingleFieldAppendingMarker marker = (SingleFieldAppendingMarker) argument;
660-
captureLogstashMarker(builder, marker);
652+
return argument instanceof SingleFieldAppendingMarker
653+
|| argument instanceof MapEntriesAppendingMarker;
661654
}
662655

663656
private interface FieldReader {

0 commit comments

Comments
 (0)