Skip to content

Commit 5fe7b75

Browse files
authored
Merge pull request #1 from laurit/resource-attribute-mdc-test
Add tests for resource attributes in mdc
2 parents 857db6e + 4a868f2 commit 5fe7b75

File tree

12 files changed

+124
-19
lines changed

12 files changed

+124
-19
lines changed

instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ testing {
4040
testTask.configure {
4141
jvmArgs("-Dlog4j2.is.webapp=false")
4242
jvmArgs("-Dlog4j2.enable.threadlocals=false")
43+
jvmArgs("-Dotel.instrumentation.mdc.resource-attributes=service.name,telemetry.sdk.language")
4344
}
4445
}
4546
}
@@ -74,6 +75,7 @@ tasks {
7475
test {
7576
jvmArgs("-Dlog4j2.is.webapp=false")
7677
jvmArgs("-Dlog4j2.enable.threadlocals=true")
78+
jvmArgs("-Dotel.instrumentation.mdc.resource-attributes=service.name,telemetry.sdk.language")
7779
}
7880

7981
named("check") {

instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/src/test/groovy/AutoLog4j2Test.groovy

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,27 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6+
import io.opentelemetry.instrumentation.log4j.contextdata.ListAppender
67
import io.opentelemetry.instrumentation.test.AgentTestTrait
8+
import org.apache.logging.log4j.LogManager
79

810
class AutoLog4j2Test extends Log4j2Test implements AgentTestTrait {
11+
12+
def "resource attributes"() {
13+
given:
14+
def logger = LogManager.getLogger("TestLogger")
15+
16+
when:
17+
logger.info("log message 1")
18+
19+
def events = ListAppender.get().getEvents()
20+
21+
then:
22+
events.size() == 1
23+
events[0].message == "log message 1"
24+
events[0].contextData["trace_id"] == null
25+
events[0].contextData["span_id"] == null
26+
events[0].contextData["service.name"] == "unknown_service:java"
27+
events[0].contextData["telemetry.sdk.language"] == "java"
28+
}
929
}

instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,15 @@ public class OpenTelemetryContextDataProvider implements ContextDataProvider {
3333
private static final boolean configuredResourceAttributeAccessible =
3434
isConfiguredResourceAttributeAccessible();
3535

36+
private static final Map<String, String> staticContextData = getStaticContextData();
37+
38+
private static Map<String, String> getStaticContextData() {
39+
if (configuredResourceAttributeAccessible) {
40+
return ConfiguredResourceAttributesHolder.getResourceAttributes();
41+
}
42+
return Collections.emptyMap();
43+
}
44+
3645
/**
3746
* Checks whether {@link ConfiguredResourceAttributesHolder} is available in classpath. The result
3847
* is true if {@link ConfiguredResourceAttributesHolder} can be loaded, false otherwise.
@@ -61,19 +70,17 @@ public Map<String, String> supplyContextData() {
6170
Context context = Context.current();
6271
Span currentSpan = Span.fromContext(context);
6372
if (!currentSpan.getSpanContext().isValid()) {
64-
return Collections.emptyMap();
73+
return staticContextData;
6574
}
6675

6776
Map<String, String> contextData = new HashMap<>();
77+
contextData.putAll(staticContextData);
78+
6879
SpanContext spanContext = currentSpan.getSpanContext();
6980
contextData.put(TRACE_ID, spanContext.getTraceId());
7081
contextData.put(SPAN_ID, spanContext.getSpanId());
7182
contextData.put(TRACE_FLAGS, spanContext.getTraceFlags().asHex());
7283

73-
if (configuredResourceAttributeAccessible) {
74-
contextData.putAll(ConfiguredResourceAttributesHolder.getResourceAttributes());
75-
}
76-
7784
if (BAGGAGE_ENABLED) {
7885
Baggage baggage = Baggage.fromContext(context);
7986
for (Map.Entry<String, BaggageEntry> entry : baggage.asMap().entrySet()) {

instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ tasks {
2626
filter {
2727
excludeTestsMatching("Log4j27BaggageTest")
2828
}
29+
jvmArgs("-Dotel.instrumentation.mdc.resource-attributes=service.name,telemetry.sdk.language")
2930
}
3031

3132
val testAddBaggage by registering(Test::class) {

instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/contextdata/v2_7/SpanDecoratingContextDataInjector.java

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ public final class SpanDecoratingContextDataInjector implements ContextDataInjec
2929
InstrumentationConfig.get()
3030
.getBoolean("otel.instrumentation.log4j-context-data.add-baggage", false);
3131

32+
private static final StringMap staticContextData = getStaticContextData();
33+
3234
private final ContextDataInjector delegate;
3335

3436
public SpanDecoratingContextDataInjector(ContextDataInjector delegate) {
@@ -41,26 +43,21 @@ public StringMap injectContextData(List<Property> list, StringMap stringMap) {
4143

4244
if (contextData.containsKey(TRACE_ID)) {
4345
// Assume already instrumented event if traceId is present.
44-
return contextData;
46+
return staticContextData.isEmpty() ? contextData : newContextData(contextData);
4547
}
4648

4749
Context context = Context.current();
4850
Span span = Span.fromContext(context);
4951
SpanContext currentContext = span.getSpanContext();
5052
if (!currentContext.isValid()) {
51-
return contextData;
53+
return staticContextData.isEmpty() ? contextData : newContextData(contextData);
5254
}
5355

54-
StringMap newContextData = new SortedArrayStringMap(contextData);
56+
StringMap newContextData = newContextData(contextData);
5557
newContextData.putValue(TRACE_ID, currentContext.getTraceId());
5658
newContextData.putValue(SPAN_ID, currentContext.getSpanId());
5759
newContextData.putValue(TRACE_FLAGS, currentContext.getTraceFlags().asHex());
5860

59-
for (Map.Entry<String, String> entry :
60-
ConfiguredResourceAttributesHolder.getResourceAttributes().entrySet()) {
61-
newContextData.putValue(entry.getKey(), entry.getValue());
62-
}
63-
6461
if (BAGGAGE_ENABLED) {
6562
Baggage baggage = Baggage.fromContext(context);
6663
for (Map.Entry<String, BaggageEntry> entry : baggage.asMap().entrySet()) {
@@ -75,4 +72,19 @@ public StringMap injectContextData(List<Property> list, StringMap stringMap) {
7572
public ReadOnlyStringMap rawContextData() {
7673
return delegate.rawContextData();
7774
}
75+
76+
private static StringMap newContextData(StringMap contextData) {
77+
StringMap newContextData = new SortedArrayStringMap(contextData);
78+
newContextData.putAll(staticContextData);
79+
return newContextData;
80+
}
81+
82+
private static StringMap getStaticContextData() {
83+
StringMap map = new SortedArrayStringMap();
84+
for (Map.Entry<String, String> entry :
85+
ConfiguredResourceAttributesHolder.getResourceAttributes().entrySet()) {
86+
map.putValue(entry.getKey(), entry.getValue());
87+
}
88+
return map;
89+
}
7890
}

instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/test/groovy/Log4j27Test.groovy

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,27 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6+
import io.opentelemetry.instrumentation.log4j.contextdata.ListAppender
67
import io.opentelemetry.instrumentation.test.AgentTestTrait
8+
import org.apache.logging.log4j.LogManager
79

810
class Log4j27Test extends Log4j2Test implements AgentTestTrait {
11+
12+
def "resource attributes"() {
13+
given:
14+
def logger = LogManager.getLogger("TestLogger")
15+
16+
when:
17+
logger.info("log message 1")
18+
19+
def events = ListAppender.get().getEvents()
20+
21+
then:
22+
events.size() == 1
23+
events[0].message == "log message 1"
24+
events[0].contextData["trace_id"] == null
25+
events[0].contextData["span_id"] == null
26+
events[0].contextData["service.name"] == "unknown_service:java"
27+
events[0].contextData["telemetry.sdk.language"] == "java"
28+
}
929
}

instrumentation/log4j/log4j-mdc-1.2/javaagent/build.gradle.kts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,9 @@ configurations {
3030
exclude("javax.jms", "jms")
3131
}
3232
}
33+
34+
tasks {
35+
test {
36+
jvmArgs("-Dotel.instrumentation.mdc.resource-attributes=service.name,telemetry.sdk.language")
37+
}
38+
}

instrumentation/log4j/log4j-mdc-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/mdc/v1_2/LoggingEventInstrumentation.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,8 @@ public static void onExit(
8080
default:
8181
// do nothing
8282
}
83-
} else if (ConfiguredResourceAttributesHolder.getAttributeValue(key) != null) {
84-
if (value == null) {
85-
value = ConfiguredResourceAttributesHolder.getAttributeValue(key);
86-
}
83+
} else if (value == null) {
84+
value = ConfiguredResourceAttributesHolder.getAttributeValue(key);
8785
}
8886
}
8987
}

instrumentation/log4j/log4j-mdc-1.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/log4j/mdc/v1_2/Log4j1MdcTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,19 @@ void idsWhenSpan() {
9090
assertEquals(events.get(2).getMDC("span_id"), span2.getSpanContext().getSpanId());
9191
assertEquals(events.get(2).getMDC("trace_flags"), "01");
9292
}
93+
94+
@Test
95+
void resourceAttributes() {
96+
logger.info("log message 1");
97+
98+
List<LoggingEvent> events = ListAppender.getEvents();
99+
100+
assertEquals(1, events.size());
101+
assertEquals("log message 1", events.get(0).getMessage());
102+
assertNull(events.get(0).getMDC("trace_id"));
103+
assertNull(events.get(0).getMDC("span_id"));
104+
assertNull(events.get(0).getMDC("trace_flags"));
105+
assertEquals("unknown_service:java", events.get(0).getMDC("service.name"));
106+
assertEquals("java", events.get(0).getMDC("telemetry.sdk.language"));
107+
}
93108
}

instrumentation/logback/logback-mdc-1.0/javaagent/build.gradle.kts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ dependencies {
6363
}
6464

6565
tasks {
66+
test {
67+
jvmArgs("-Dotel.instrumentation.mdc.resource-attributes=service.name,telemetry.sdk.language")
68+
}
69+
6670
named("check") {
6771
dependsOn(testing.suites)
6872
}

instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,8 @@ public static void onExit(
8080
spanContextData.put(TRACE_ID, spanContext.getTraceId());
8181
spanContextData.put(SPAN_ID, spanContext.getSpanId());
8282
spanContextData.put(TRACE_FLAGS, spanContext.getTraceFlags().asHex());
83-
84-
spanContextData.putAll(ConfiguredResourceAttributesHolder.getResourceAttributes());
8583
}
84+
spanContextData.putAll(ConfiguredResourceAttributesHolder.getResourceAttributes());
8685

8786
if (LogbackSingletons.addBaggage()) {
8887
Baggage baggage = Java8BytecodeBridge.baggageFromContext(context);

instrumentation/logback/logback-mdc-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/logback/v1_0/LogbackTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,14 @@
55

66
package io.opentelemetry.javaagent.instrumentation.logback.v1_0;
77

8+
import static org.assertj.core.api.Assertions.assertThat;
9+
10+
import ch.qos.logback.classic.spi.ILoggingEvent;
811
import io.opentelemetry.instrumentation.logback.mdc.v1_0.AbstractLogbackTest;
912
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
1013
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
14+
import java.util.List;
15+
import org.junit.jupiter.api.Test;
1116
import org.junit.jupiter.api.extension.RegisterExtension;
1217

1318
class LogbackTest extends AbstractLogbackTest {
@@ -19,4 +24,20 @@ class LogbackTest extends AbstractLogbackTest {
1924
public InstrumentationExtension getInstrumentationExtension() {
2025
return agentTesting;
2126
}
27+
28+
@Test
29+
void resourceAttributes() {
30+
logger.info("log message 1");
31+
32+
List<ILoggingEvent> events = listAppender.list;
33+
34+
assertThat(events.size()).isEqualTo(1);
35+
assertThat(events.get(0).getMessage()).isEqualTo("log message 1");
36+
assertThat(events.get(0).getMDCPropertyMap().get("trace_id")).isNull();
37+
assertThat(events.get(0).getMDCPropertyMap().get("span_id")).isNull();
38+
assertThat(events.get(0).getMDCPropertyMap().get("trace_flags")).isNull();
39+
assertThat(events.get(0).getMDCPropertyMap().get("service.name"))
40+
.isEqualTo("unknown_service:java");
41+
assertThat(events.get(0).getMDCPropertyMap().get("telemetry.sdk.language")).isEqualTo("java");
42+
}
2243
}

0 commit comments

Comments
 (0)