Skip to content

Commit b47aca9

Browse files
AlchemyDinglaurit
andauthored
Allow configuring MDC key names for trace_id, span_id, trace_flags (#11329)
Co-authored-by: Lauri Tulmin <[email protected]>
1 parent a52561f commit b47aca9

File tree

29 files changed

+468
-122
lines changed

29 files changed

+468
-122
lines changed

instrumentation-api/src/main/java/io/opentelemetry/instrumentation/api/internal/ConfigPropertiesUtil.java

+5
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ public static String getString(String propertyName) {
4343
return System.getenv(toEnvVarName(propertyName));
4444
}
4545

46+
public static String getString(String propertyName, String defaultValue) {
47+
String strValue = getString(propertyName);
48+
return strValue == null ? defaultValue : strValue;
49+
}
50+
4651
public static List<String> getList(String propertyName, List<String> defaultValue) {
4752
String value = getString(propertyName);
4853
if (value == null) {

instrumentation/jboss-logmanager/jboss-logmanager-mdc-1.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jbosslogmanager/mdc/v1_1/JbossExtLogRecordInstrumentation.java

+21-25
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@
55

66
package io.opentelemetry.javaagent.instrumentation.jbosslogmanager.mdc.v1_1;
77

8-
import static io.opentelemetry.instrumentation.api.incubator.log.LoggingContextConstants.SPAN_ID;
9-
import static io.opentelemetry.instrumentation.api.incubator.log.LoggingContextConstants.TRACE_FLAGS;
10-
import static io.opentelemetry.instrumentation.api.incubator.log.LoggingContextConstants.TRACE_ID;
118
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
129
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
1310
import static net.bytebuddy.matcher.ElementMatchers.named;
@@ -18,6 +15,7 @@
1815
import io.opentelemetry.context.Context;
1916
import io.opentelemetry.instrumentation.api.util.VirtualField;
2017
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
18+
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
2119
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
2220
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
2321
import java.util.Map;
@@ -57,7 +55,9 @@ public static void onExit(
5755
@Advice.This ExtLogRecord record,
5856
@Advice.Argument(0) String key,
5957
@Advice.Return(readOnly = false) String value) {
60-
if (TRACE_ID.equals(key) || SPAN_ID.equals(key) || TRACE_FLAGS.equals(key)) {
58+
if (CommonConfig.get().getTraceIdKey().equals(key)
59+
|| CommonConfig.get().getSpanIdKey().equals(key)
60+
|| CommonConfig.get().getTraceFlagsKey().equals(key)) {
6161
if (value != null) {
6262
// Assume already instrumented event if traceId/spanId/sampled is present.
6363
return;
@@ -72,18 +72,14 @@ public static void onExit(
7272
return;
7373
}
7474

75-
switch (key) {
76-
case TRACE_ID:
77-
value = spanContext.getTraceId();
78-
break;
79-
case SPAN_ID:
80-
value = spanContext.getSpanId();
81-
break;
82-
case TRACE_FLAGS:
83-
value = spanContext.getTraceFlags().asHex();
84-
break;
85-
default:
86-
// do nothing
75+
if (CommonConfig.get().getTraceIdKey().equals(key)) {
76+
value = spanContext.getTraceId();
77+
}
78+
if (CommonConfig.get().getSpanIdKey().equals(key)) {
79+
value = spanContext.getSpanId();
80+
}
81+
if (CommonConfig.get().getTraceFlagsKey().equals(key)) {
82+
value = spanContext.getTraceFlags().asHex();
8783
}
8884
}
8985
}
@@ -97,9 +93,9 @@ public static void onExit(
9793
@Advice.This ExtLogRecord record,
9894
@Advice.Return(readOnly = false) Map<String, String> value) {
9995

100-
if (value.containsKey(TRACE_ID)
101-
&& value.containsKey(SPAN_ID)
102-
&& value.containsKey(TRACE_FLAGS)) {
96+
if (value.containsKey(CommonConfig.get().getTraceIdKey())
97+
&& value.containsKey(CommonConfig.get().getSpanIdKey())
98+
&& value.containsKey(CommonConfig.get().getTraceFlagsKey())) {
10399
return;
104100
}
105101

@@ -113,16 +109,16 @@ public static void onExit(
113109
return;
114110
}
115111

116-
if (!value.containsKey(TRACE_ID)) {
117-
value.put(TRACE_ID, spanContext.getTraceId());
112+
if (!value.containsKey(CommonConfig.get().getTraceIdKey())) {
113+
value.put(CommonConfig.get().getTraceIdKey(), spanContext.getTraceId());
118114
}
119115

120-
if (!value.containsKey(SPAN_ID)) {
121-
value.put(SPAN_ID, spanContext.getSpanId());
116+
if (!value.containsKey(CommonConfig.get().getSpanIdKey())) {
117+
value.put(CommonConfig.get().getSpanIdKey(), spanContext.getSpanId());
122118
}
123119

124-
if (!value.containsKey(TRACE_FLAGS)) {
125-
value.put(TRACE_FLAGS, spanContext.getTraceFlags().asHex());
120+
if (!value.containsKey(CommonConfig.get().getTraceFlagsKey())) {
121+
value.put(CommonConfig.get().getTraceFlagsKey(), spanContext.getTraceFlags().asHex());
126122
}
127123
}
128124
}
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Settings for the Log4j MDC instrumentation
22

3-
| System property | Type | Default | Description |
4-
|-------------------------------------------------------|---------|---------|--------------------------------------------------------------------|
5-
| `otel.instrumentation.common.mdc.resource-attributes` | String | | Comma separated list of resource attributes to expose through MDC. |
3+
| System property | Type | Default | Description |
4+
|-------------------------------------------------------|---------|---------------|--------------------------------------------------------------------|
5+
| `otel.instrumentation.log4j-context-data.add-baggage` | Boolean | `false` | Enable exposing baggage attributes through MDC. |
6+
| `otel.instrumentation.common.mdc.resource-attributes` | String | | Comma separated list of resource attributes to expose through MDC. |
7+
| `otel.instrumentation.common.logging.trace-id` | String | `trace_id` | Customize MDC key name for the trace id. |
8+
| `otel.instrumentation.common.logging.span-id` | String | `span_id` | Customize MDC key name for the span id. |
9+
| `otel.instrumentation.common.logging.trace-flags` | String | `trace_flags` | Customize MDC key name for the trace flags. |

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

+17-4
Original file line numberDiff line numberDiff line change
@@ -47,19 +47,32 @@ testing {
4747
}
4848

4949
val testAddBaggage by registering(JvmTestSuite::class) {
50-
sources {
51-
java {
52-
setSrcDirs(listOf("src/testAddBaggage/java"))
50+
dependencies {
51+
implementation(project(":instrumentation:log4j:log4j-context-data:log4j-context-data-common:testing"))
52+
}
53+
54+
targets {
55+
all {
56+
testTask.configure {
57+
jvmArgs("-Dotel.instrumentation.log4j-context-data.add-baggage=true")
58+
jvmArgs("-Dlog4j2.is.webapp=false")
59+
jvmArgs("-Dlog4j2.enable.threadlocals=true")
60+
}
5361
}
5462
}
63+
}
64+
65+
val testLoggingKeys by registering(JvmTestSuite::class) {
5566
dependencies {
5667
implementation(project(":instrumentation:log4j:log4j-context-data:log4j-context-data-common:testing"))
5768
}
5869

5970
targets {
6071
all {
6172
testTask.configure {
62-
jvmArgs("-Dotel.instrumentation.log4j-context-data.add-baggage=true")
73+
jvmArgs("-Dotel.instrumentation.common.logging.trace-id=trace_id_test")
74+
jvmArgs("-Dotel.instrumentation.common.logging.span-id=span_id_test")
75+
jvmArgs("-Dotel.instrumentation.common.logging.trace-flags=trace_flags_test")
6376
jvmArgs("-Dlog4j2.is.webapp=false")
6477
jvmArgs("-Dlog4j2.enable.threadlocals=true")
6578
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.log4j.contextdata.v2_17;
7+
8+
import io.opentelemetry.instrumentation.log4j.contextdata.Log4j2LoggingKeysTest;
9+
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
10+
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
11+
import org.junit.jupiter.api.extension.RegisterExtension;
12+
13+
class AutoLog4jLoggingKeysTest extends Log4j2LoggingKeysTest {
14+
@RegisterExtension
15+
static final InstrumentationExtension testing = AgentInstrumentationExtension.create();
16+
17+
@Override
18+
public InstrumentationExtension getInstrumentationExtension() {
19+
return testing;
20+
}
21+
}

instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/README.md

+9-1
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,17 @@ will be added to the context when a log statement is made when a span is active:
4242
- `span_id`
4343
- `trace_flags`
4444

45+
These keys can be customized using the following system properties or environment variables:
46+
47+
| System property | Environment variable |
48+
|-------------------------------------------------------|---------------------------------------------------|
49+
| `otel.instrumentation.common.logging.trace-id` | `OTEL_INSTRUMENTATION_COMMON_LOGGING_TRACE_ID` |
50+
| `otel.instrumentation.common.logging.span-id` | `OTEL_INSTRUMENTATION_COMMON_LOGGING_SPAN_ID` |
51+
| `otel.instrumentation.common.logging.trace-flags` | `OTEL_INSTRUMENTATION_COMMON_LOGGING_TRACE_FLAGS` |
52+
4553
If the `otel.instrumentation.log4j-context-data.add-baggage` system property (or the
4654
`OTEL_INSTRUMENTATION_LOG4J_CONTEXT_DATA_ADD_BAGGAGE` environment variable) is set to `true`,
47-
key/value pairs in [baggage](https://opentelemetry.io/docs/concepts/signals/baggage/) will be added to the context too.
55+
key/value pairs in [baggage](https://opentelemetry.io/docs/concepts/signals/baggage/) will also be added to the context data.
4856

4957
- `baggage.<entry_name>`
5058

instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/build.gradle.kts

+11
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ tasks {
1515
test {
1616
filter {
1717
excludeTestsMatching("LibraryLog4j2BaggageTest")
18+
excludeTestsMatching("LibraryLog4j2LoggingKeysTest")
1819
}
1920
}
2021

@@ -25,7 +26,17 @@ tasks {
2526
jvmArgs("-Dotel.instrumentation.log4j-context-data.add-baggage=true")
2627
}
2728

29+
val testLoggingKeys by registering(Test::class) {
30+
filter {
31+
includeTestsMatching("LibraryLog4j2LoggingKeysTest")
32+
}
33+
jvmArgs("-Dotel.instrumentation.common.logging.trace-id=trace_id_test")
34+
jvmArgs("-Dotel.instrumentation.common.logging.span-id=span_id_test")
35+
jvmArgs("-Dotel.instrumentation.common.logging.trace-flags=trace_flags_test")
36+
}
37+
2838
named("check") {
2939
dependsOn(testAddBaggage)
40+
dependsOn(testLoggingKeys)
3041
}
3142
}

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

+13-10
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,12 @@
55

66
package io.opentelemetry.instrumentation.log4j.contextdata.v2_17;
77

8-
import static io.opentelemetry.instrumentation.api.incubator.log.LoggingContextConstants.SPAN_ID;
9-
import static io.opentelemetry.instrumentation.api.incubator.log.LoggingContextConstants.TRACE_FLAGS;
10-
import static io.opentelemetry.instrumentation.api.incubator.log.LoggingContextConstants.TRACE_ID;
11-
128
import io.opentelemetry.api.baggage.Baggage;
139
import io.opentelemetry.api.baggage.BaggageEntry;
1410
import io.opentelemetry.api.trace.Span;
1511
import io.opentelemetry.api.trace.SpanContext;
1612
import io.opentelemetry.context.Context;
13+
import io.opentelemetry.instrumentation.api.incubator.log.LoggingContextConstants;
1714
import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil;
1815
import io.opentelemetry.javaagent.bootstrap.internal.ConfiguredResourceAttributesHolder;
1916
import java.util.Collections;
@@ -26,13 +23,19 @@
2623
* #supplyContextData()} is called when a log entry is created.
2724
*/
2825
public class OpenTelemetryContextDataProvider implements ContextDataProvider {
29-
3026
private static final boolean BAGGAGE_ENABLED =
3127
ConfigPropertiesUtil.getBoolean("otel.instrumentation.log4j-context-data.add-baggage", false);
32-
28+
private static final String TRACE_ID_KEY =
29+
ConfigPropertiesUtil.getString(
30+
"otel.instrumentation.common.logging.trace-id", LoggingContextConstants.TRACE_ID);
31+
private static final String SPAN_ID_KEY =
32+
ConfigPropertiesUtil.getString(
33+
"otel.instrumentation.common.logging.span-id", LoggingContextConstants.SPAN_ID);
34+
private static final String TRACE_FLAGS_KEY =
35+
ConfigPropertiesUtil.getString(
36+
"otel.instrumentation.common.logging.trace-flags", LoggingContextConstants.TRACE_FLAGS);
3337
private static final boolean configuredResourceAttributeAccessible =
3438
isConfiguredResourceAttributeAccessible();
35-
3639
private static final Map<String, String> staticContextData = getStaticContextData();
3740

3841
private static Map<String, String> getStaticContextData() {
@@ -77,9 +80,9 @@ public Map<String, String> supplyContextData() {
7780
contextData.putAll(staticContextData);
7881

7982
SpanContext spanContext = currentSpan.getSpanContext();
80-
contextData.put(TRACE_ID, spanContext.getTraceId());
81-
contextData.put(SPAN_ID, spanContext.getSpanId());
82-
contextData.put(TRACE_FLAGS, spanContext.getTraceFlags().asHex());
83+
contextData.put(TRACE_ID_KEY, spanContext.getTraceId());
84+
contextData.put(SPAN_ID_KEY, spanContext.getSpanId());
85+
contextData.put(TRACE_FLAGS_KEY, spanContext.getTraceFlags().asHex());
8386

8487
if (BAGGAGE_ENABLED) {
8588
Baggage baggage = Baggage.fromContext(context);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.log4j.contextdata.v2_17;
7+
8+
import io.opentelemetry.instrumentation.log4j.contextdata.Log4j2LoggingKeysTest;
9+
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
10+
import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension;
11+
import org.junit.jupiter.api.extension.RegisterExtension;
12+
13+
class LibraryLog4j2LoggingKeysTest extends Log4j2LoggingKeysTest {
14+
@RegisterExtension
15+
static final InstrumentationExtension testing = LibraryInstrumentationExtension.create();
16+
17+
@Override
18+
public InstrumentationExtension getInstrumentationExtension() {
19+
return testing;
20+
}
21+
}

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

+11
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ tasks {
2525
test {
2626
filter {
2727
excludeTestsMatching("Log4j27BaggageTest")
28+
excludeTestsMatching("Log4j27LoggingKeysTest")
2829
}
2930
jvmArgs("-Dotel.instrumentation.common.mdc.resource-attributes=service.name,telemetry.sdk.language")
3031
}
@@ -36,7 +37,17 @@ tasks {
3637
jvmArgs("-Dotel.instrumentation.log4j-context-data.add-baggage=true")
3738
}
3839

40+
val testLoggingKeys by registering(Test::class) {
41+
filter {
42+
includeTestsMatching("Log4j27LoggingKeysTest")
43+
}
44+
jvmArgs("-Dotel.instrumentation.common.logging.trace-id=trace_id_test")
45+
jvmArgs("-Dotel.instrumentation.common.logging.span-id=span_id_test")
46+
jvmArgs("-Dotel.instrumentation.common.logging.trace-flags=trace_flags_test")
47+
}
48+
3949
named("check") {
4050
dependsOn(testAddBaggage)
51+
dependsOn(testLoggingKeys)
4152
}
4253
}

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

+8-8
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,12 @@
55

66
package io.opentelemetry.javaagent.instrumentation.log4j.contextdata.v2_7;
77

8-
import static io.opentelemetry.instrumentation.api.incubator.log.LoggingContextConstants.SPAN_ID;
9-
import static io.opentelemetry.instrumentation.api.incubator.log.LoggingContextConstants.TRACE_FLAGS;
10-
import static io.opentelemetry.instrumentation.api.incubator.log.LoggingContextConstants.TRACE_ID;
11-
128
import io.opentelemetry.api.baggage.Baggage;
139
import io.opentelemetry.api.baggage.BaggageEntry;
1410
import io.opentelemetry.api.trace.Span;
1511
import io.opentelemetry.api.trace.SpanContext;
1612
import io.opentelemetry.context.Context;
13+
import io.opentelemetry.javaagent.bootstrap.internal.CommonConfig;
1714
import io.opentelemetry.javaagent.bootstrap.internal.ConfiguredResourceAttributesHolder;
1815
import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig;
1916
import java.util.List;
@@ -28,6 +25,9 @@ public final class SpanDecoratingContextDataInjector implements ContextDataInjec
2825
private static final boolean BAGGAGE_ENABLED =
2926
InstrumentationConfig.get()
3027
.getBoolean("otel.instrumentation.log4j-context-data.add-baggage", false);
28+
private static final String TRACE_ID_KEY = CommonConfig.get().getTraceIdKey();
29+
private static final String SPAN_ID_KEY = CommonConfig.get().getSpanIdKey();
30+
private static final String TRACE_FLAGS_KEY = CommonConfig.get().getTraceFlagsKey();
3131

3232
private static final StringMap staticContextData = getStaticContextData();
3333

@@ -41,7 +41,7 @@ public SpanDecoratingContextDataInjector(ContextDataInjector delegate) {
4141
public StringMap injectContextData(List<Property> list, StringMap stringMap) {
4242
StringMap contextData = delegate.injectContextData(list, stringMap);
4343

44-
if (contextData.containsKey(TRACE_ID)) {
44+
if (contextData.containsKey(TRACE_ID_KEY)) {
4545
// Assume already instrumented event if traceId is present.
4646
return staticContextData.isEmpty() ? contextData : newContextData(contextData);
4747
}
@@ -54,9 +54,9 @@ public StringMap injectContextData(List<Property> list, StringMap stringMap) {
5454
}
5555

5656
StringMap newContextData = newContextData(contextData);
57-
newContextData.putValue(TRACE_ID, currentContext.getTraceId());
58-
newContextData.putValue(SPAN_ID, currentContext.getSpanId());
59-
newContextData.putValue(TRACE_FLAGS, currentContext.getTraceFlags().asHex());
57+
newContextData.putValue(TRACE_ID_KEY, currentContext.getTraceId());
58+
newContextData.putValue(SPAN_ID_KEY, currentContext.getSpanId());
59+
newContextData.putValue(TRACE_FLAGS_KEY, currentContext.getTraceFlags().asHex());
6060

6161
if (BAGGAGE_ENABLED) {
6262
Baggage baggage = Baggage.fromContext(context);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.log4j.contextdata.v2_7;
7+
8+
import io.opentelemetry.instrumentation.log4j.contextdata.Log4j2LoggingKeysTest;
9+
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
10+
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
11+
import org.junit.jupiter.api.extension.RegisterExtension;
12+
13+
class Log4j27LoggingKeysTest extends Log4j2LoggingKeysTest {
14+
@RegisterExtension
15+
static final InstrumentationExtension testing = AgentInstrumentationExtension.create();
16+
17+
@Override
18+
public InstrumentationExtension getInstrumentationExtension() {
19+
return testing;
20+
}
21+
}

0 commit comments

Comments
 (0)