From 32e4a297195f8bed86b7dec82cdc59c09bd03bc6 Mon Sep 17 00:00:00 2001 From: cleverchuk Date: Tue, 10 Oct 2023 11:56:01 -0400 Subject: [PATCH 01/10] (#9297) add new instrumentation config `otel.instrumentation.mdc.resource-attributes` that will be used to configure `Resource` attributes to be added to logging map diagnostic context. --- .../mdc/v1_2/LoggingEventInstrumentation.java | 5 ++ .../mdc/v1_0/LoggingEventInstrumentation.java | 3 ++ .../ConfiguredResourceAttributesHolder.java | 51 ++++++++++++++++++ ...onfiguredResourceAttributesHolderTest.java | 53 +++++++++++++++++++ .../javaagent/tooling/AgentInstaller.java | 4 ++ .../autoconfigure/SdkAutoconfigureAccess.java | 16 ++++++ 6 files changed, 132 insertions(+) create mode 100644 javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolder.java create mode 100644 javaagent-bootstrap/src/test/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolderTest.java create mode 100644 javaagent-tooling/src/main/java/io/opentelemetry/sdk/autoconfigure/SdkAutoconfigureAccess.java diff --git a/instrumentation/log4j/log4j-mdc-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/mdc/v1_2/LoggingEventInstrumentation.java b/instrumentation/log4j/log4j-mdc-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/mdc/v1_2/LoggingEventInstrumentation.java index e8b0c425ed6f..bf5f4834c189 100644 --- a/instrumentation/log4j/log4j-mdc-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/mdc/v1_2/LoggingEventInstrumentation.java +++ b/instrumentation/log4j/log4j-mdc-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/mdc/v1_2/LoggingEventInstrumentation.java @@ -17,6 +17,7 @@ import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.util.VirtualField; +import io.opentelemetry.javaagent.bootstrap.ConfiguredResourceAttributesHolder; import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -79,6 +80,10 @@ public static void onExit( default: // do nothing } + } else if (ConfiguredResourceAttributesHolder.getAttributeValue(key) != null) { + if (value == null) { + value = ConfiguredResourceAttributesHolder.getAttributeValue(key); + } } } } diff --git a/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java b/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java index c45a77984310..e1e24858a96b 100644 --- a/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java +++ b/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java @@ -23,6 +23,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.instrumentation.logback.mdc.v1_0.internal.UnionMap; +import io.opentelemetry.javaagent.bootstrap.ConfiguredResourceAttributesHolder; import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -79,6 +80,8 @@ public static void onExit( spanContextData.put(TRACE_ID, spanContext.getTraceId()); spanContextData.put(SPAN_ID, spanContext.getSpanId()); spanContextData.put(TRACE_FLAGS, spanContext.getTraceFlags().asHex()); + + spanContextData.putAll(ConfiguredResourceAttributesHolder.getResourceAttribute()); } if (LogbackSingletons.addBaggage()) { diff --git a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolder.java b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolder.java new file mode 100644 index 000000000000..a8ae4948c494 --- /dev/null +++ b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolder.java @@ -0,0 +1,51 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.bootstrap; + +import static io.opentelemetry.api.common.AttributeKey.stringKey; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; +import java.util.HashMap; +import java.util.Map; +import javax.annotation.Nullable; + +public final class ConfiguredResourceAttributesHolder { + + private static final Map resourceAttribute = new HashMap<>(); + + public static Map getResourceAttribute() { + return resourceAttribute; + } + + public static void initialize(Attributes resourceAttribute) { + String[] mdcResourceAttributes = getConfiguredAttributes(); + + for (String key : mdcResourceAttributes) { + String value = resourceAttribute.get(stringKey(key)); + if (value != null) { + ConfiguredResourceAttributesHolder.resourceAttribute.put( + String.format("otel.resource.%s", key), value); + } + } + } + + private static String[] getConfiguredAttributes() { + String resourceAttributes = + ConfigPropertiesUtil.getString("otel.instrumentation.mdc.resource-attributes"); + if (resourceAttributes == null) { + return new String[] {}; + } + return resourceAttributes.split(","); + } + + @Nullable + public static String getAttributeValue(String key) { + return resourceAttribute.get(String.format("otel.resource.%s", key)); + } + + private ConfiguredResourceAttributesHolder() {} +} diff --git a/javaagent-bootstrap/src/test/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolderTest.java b/javaagent-bootstrap/src/test/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolderTest.java new file mode 100644 index 000000000000..3a2e40d5d65f --- /dev/null +++ b/javaagent-bootstrap/src/test/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolderTest.java @@ -0,0 +1,53 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.bootstrap; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import java.util.Collections; +import org.junit.jupiter.api.Test; +import org.junitpioneer.jupiter.ClearSystemProperty; +import org.junitpioneer.jupiter.SetSystemProperty; + +class ConfiguredResourceAttributesHolderTest { + + @Test + @SetSystemProperty( + key = "otel.instrumentation.mdc.resource-attributes", + value = "service.name,runtime") + void testGetAttributeValue() { + Attributes attributes = Attributes.builder().put("service.name", "test-service").build(); + + ConfiguredResourceAttributesHolder.initialize(attributes); + assertEquals( + "test-service", ConfiguredResourceAttributesHolder.getAttributeValue("service.name")); + } + + @Test + @SetSystemProperty(key = "otel.instrumentation.mdc.resource-attributes", value = "items") + void testGetAttributeValueWhenKeyIsNotString() { + Attributes attributes = + Attributes.builder() + .put(AttributeKey.stringArrayKey("items"), Collections.singletonList("test-item")) + .build(); + + ConfiguredResourceAttributesHolder.initialize(attributes); + assertNull(ConfiguredResourceAttributesHolder.getAttributeValue("items")); + } + + @Test + @ClearSystemProperty(key = "otel.instrumentation.mdc.resource-attributes") + void testGetAttributeValueWhenConfigIsNotSet() { + Attributes attributes = + Attributes.builder().put(AttributeKey.stringArrayKey("don't care"), "won't care").build(); + + ConfiguredResourceAttributesHolder.initialize(attributes); + assertNull(ConfiguredResourceAttributesHolder.getAttributeValue("dc-wc")); + } +} diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java index 27d20e39eb26..8cbe60221344 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java @@ -21,6 +21,7 @@ import io.opentelemetry.javaagent.bootstrap.AgentClassLoader; import io.opentelemetry.javaagent.bootstrap.BootstrapPackagePrefixesHolder; import io.opentelemetry.javaagent.bootstrap.ClassFileTransformerHolder; +import io.opentelemetry.javaagent.bootstrap.ConfiguredResourceAttributesHolder; import io.opentelemetry.javaagent.bootstrap.DefineClassHelper; import io.opentelemetry.javaagent.bootstrap.InstrumentedTaskClasses; import io.opentelemetry.javaagent.bootstrap.http.HttpServerResponseCustomizer; @@ -41,6 +42,7 @@ import io.opentelemetry.javaagent.tooling.muzzle.AgentTooling; import io.opentelemetry.javaagent.tooling.util.Trie; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; +import io.opentelemetry.sdk.autoconfigure.SdkAutoconfigureAccess; import io.opentelemetry.sdk.autoconfigure.internal.AutoConfigureUtil; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.lang.instrument.Instrumentation; @@ -125,6 +127,8 @@ private static void installBytebuddyAgent( copyNecessaryConfigToSystemProperties(sdkConfig); setBootstrapPackages(sdkConfig, extensionClassLoader); + ConfiguredResourceAttributesHolder.initialize( + SdkAutoconfigureAccess.getResourceAttributes(autoConfiguredSdk)); for (BeforeAgentListener agentListener : loadOrdered(BeforeAgentListener.class, extensionClassLoader)) { diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/sdk/autoconfigure/SdkAutoconfigureAccess.java b/javaagent-tooling/src/main/java/io/opentelemetry/sdk/autoconfigure/SdkAutoconfigureAccess.java new file mode 100644 index 000000000000..477f5bcbdee4 --- /dev/null +++ b/javaagent-tooling/src/main/java/io/opentelemetry/sdk/autoconfigure/SdkAutoconfigureAccess.java @@ -0,0 +1,16 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.autoconfigure; + +import io.opentelemetry.api.common.Attributes; + +public final class SdkAutoconfigureAccess { + public static Attributes getResourceAttributes(AutoConfiguredOpenTelemetrySdk sdk) { + return sdk.getResource().getAttributes(); + } + + private SdkAutoconfigureAccess() {} +} From a0bf77624e8401fb43bedf952be2b14bd8f2948b Mon Sep 17 00:00:00 2001 From: cleverchuk Date: Wed, 11 Oct 2023 15:25:03 -0400 Subject: [PATCH 02/10] (#9297) - use assertJ for unit test assertions - use plural for method and field names - add compile only dependency on `:javaagent-bootstrap` for `instrumentation:log4j:log4j-context-data:log4j-context-data-2.17:library-autoconfigure` --- .../library-autoconfigure/build.gradle.kts | 1 + .../v2_17/OpenTelemetryContextDataProvider.java | 2 ++ .../v2_7/SpanDecoratingContextDataInjector.java | 6 ++++++ .../mdc/v1_0/LoggingEventInstrumentation.java | 2 +- .../ConfiguredResourceAttributesHolder.java | 11 +++++------ .../ConfiguredResourceAttributesHolderTest.java | 16 +++++++++------- 6 files changed, 24 insertions(+), 14 deletions(-) diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/build.gradle.kts b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/build.gradle.kts index 7425e00ef5b7..26b587e868e3 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/build.gradle.kts +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/build.gradle.kts @@ -5,6 +5,7 @@ plugins { base.archivesName.set("${base.archivesName.get()}-autoconfigure") dependencies { + compileOnly(project(":javaagent-bootstrap")) library("org.apache.logging.log4j:log4j-core:2.17.0") testImplementation(project(":instrumentation:log4j:log4j-context-data:log4j-context-data-common:testing")) diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java index 459d7085fcd8..2ce6e3126ac5 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java @@ -15,6 +15,7 @@ import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; +import io.opentelemetry.javaagent.bootstrap.ConfiguredResourceAttributesHolder; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -47,6 +48,7 @@ public Map supplyContextData() { contextData.put(TRACE_ID, spanContext.getTraceId()); contextData.put(SPAN_ID, spanContext.getSpanId()); contextData.put(TRACE_FLAGS, spanContext.getTraceFlags().asHex()); + contextData.putAll(ConfiguredResourceAttributesHolder.getResourceAttributes()); if (BAGGAGE_ENABLED) { Baggage baggage = Baggage.fromContext(context); diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/contextdata/v2_7/SpanDecoratingContextDataInjector.java b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/contextdata/v2_7/SpanDecoratingContextDataInjector.java index 544d1cdd16be..87c810271435 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/contextdata/v2_7/SpanDecoratingContextDataInjector.java +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/contextdata/v2_7/SpanDecoratingContextDataInjector.java @@ -14,6 +14,7 @@ import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.context.Context; +import io.opentelemetry.javaagent.bootstrap.ConfiguredResourceAttributesHolder; import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig; import java.util.List; import java.util.Map; @@ -55,6 +56,11 @@ public StringMap injectContextData(List list, StringMap stringMap) { newContextData.putValue(SPAN_ID, currentContext.getSpanId()); newContextData.putValue(TRACE_FLAGS, currentContext.getTraceFlags().asHex()); + for (Map.Entry entry : + ConfiguredResourceAttributesHolder.getResourceAttributes().entrySet()) { + newContextData.putValue(entry.getKey(), entry.getValue()); + } + if (BAGGAGE_ENABLED) { Baggage baggage = Baggage.fromContext(context); for (Map.Entry entry : baggage.asMap().entrySet()) { diff --git a/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java b/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java index e1e24858a96b..616b016ec1f8 100644 --- a/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java +++ b/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java @@ -81,7 +81,7 @@ public static void onExit( spanContextData.put(SPAN_ID, spanContext.getSpanId()); spanContextData.put(TRACE_FLAGS, spanContext.getTraceFlags().asHex()); - spanContextData.putAll(ConfiguredResourceAttributesHolder.getResourceAttribute()); + spanContextData.putAll(ConfiguredResourceAttributesHolder.getResourceAttributes()); } if (LogbackSingletons.addBaggage()) { diff --git a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolder.java b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolder.java index a8ae4948c494..b36ef9c2d3c6 100644 --- a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolder.java +++ b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolder.java @@ -15,10 +15,10 @@ public final class ConfiguredResourceAttributesHolder { - private static final Map resourceAttribute = new HashMap<>(); + private static final Map resourceAttributes = new HashMap<>(); - public static Map getResourceAttribute() { - return resourceAttribute; + public static Map getResourceAttributes() { + return resourceAttributes; } public static void initialize(Attributes resourceAttribute) { @@ -27,8 +27,7 @@ public static void initialize(Attributes resourceAttribute) { for (String key : mdcResourceAttributes) { String value = resourceAttribute.get(stringKey(key)); if (value != null) { - ConfiguredResourceAttributesHolder.resourceAttribute.put( - String.format("otel.resource.%s", key), value); + ConfiguredResourceAttributesHolder.resourceAttributes.put(key, value); } } } @@ -44,7 +43,7 @@ private static String[] getConfiguredAttributes() { @Nullable public static String getAttributeValue(String key) { - return resourceAttribute.get(String.format("otel.resource.%s", key)); + return resourceAttributes.get(key); } private ConfiguredResourceAttributesHolder() {} diff --git a/javaagent-bootstrap/src/test/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolderTest.java b/javaagent-bootstrap/src/test/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolderTest.java index 3a2e40d5d65f..0d2fb9cb1d90 100644 --- a/javaagent-bootstrap/src/test/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolderTest.java +++ b/javaagent-bootstrap/src/test/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolderTest.java @@ -5,8 +5,7 @@ package io.opentelemetry.javaagent.bootstrap; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; +import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; @@ -22,11 +21,14 @@ class ConfiguredResourceAttributesHolderTest { key = "otel.instrumentation.mdc.resource-attributes", value = "service.name,runtime") void testGetAttributeValue() { - Attributes attributes = Attributes.builder().put("service.name", "test-service").build(); + Attributes attributes = + Attributes.builder().put("service.name", "test-service").put("runtime", "JVM").build(); ConfiguredResourceAttributesHolder.initialize(attributes); - assertEquals( - "test-service", ConfiguredResourceAttributesHolder.getAttributeValue("service.name")); + + assertThat(ConfiguredResourceAttributesHolder.getAttributeValue("service.name")) + .isEqualTo("test-service"); + assertThat(ConfiguredResourceAttributesHolder.getAttributeValue("runtime")).isEqualTo("JVM"); } @Test @@ -38,7 +40,7 @@ void testGetAttributeValueWhenKeyIsNotString() { .build(); ConfiguredResourceAttributesHolder.initialize(attributes); - assertNull(ConfiguredResourceAttributesHolder.getAttributeValue("items")); + assertThat(ConfiguredResourceAttributesHolder.getAttributeValue("items")).isNull(); } @Test @@ -48,6 +50,6 @@ void testGetAttributeValueWhenConfigIsNotSet() { Attributes.builder().put(AttributeKey.stringArrayKey("don't care"), "won't care").build(); ConfiguredResourceAttributesHolder.initialize(attributes); - assertNull(ConfiguredResourceAttributesHolder.getAttributeValue("dc-wc")); + assertThat(ConfiguredResourceAttributesHolder.getAttributeValue("dc-wc")).isNull(); } } From f4fb87830745544b0e1643ededc4c30bb6debd7d Mon Sep 17 00:00:00 2001 From: cleverchuk Date: Thu, 12 Oct 2023 10:04:42 -0400 Subject: [PATCH 03/10] (#9297) - use implementation dependency on `:javaagent-bootstrap` --- .../library-autoconfigure/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/build.gradle.kts b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/build.gradle.kts index 26b587e868e3..9b8ceb49f4c7 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/build.gradle.kts +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/build.gradle.kts @@ -5,7 +5,7 @@ plugins { base.archivesName.set("${base.archivesName.get()}-autoconfigure") dependencies { - compileOnly(project(":javaagent-bootstrap")) + implementation(project(":javaagent-bootstrap")) library("org.apache.logging.log4j:log4j-core:2.17.0") testImplementation(project(":instrumentation:log4j:log4j-context-data:log4j-context-data-common:testing")) From 153b74bed4441dad4895471d1aba0738aef14e54 Mon Sep 17 00:00:00 2001 From: cleverchuk Date: Mon, 16 Oct 2023 13:57:11 -0400 Subject: [PATCH 04/10] (#9297) - use compile dependency on `:javaagent-bootstrap` and do runtime check before use. --- .../library-autoconfigure/build.gradle.kts | 2 +- .../OpenTelemetryContextDataProvider.java | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/build.gradle.kts b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/build.gradle.kts index 9b8ceb49f4c7..26b587e868e3 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/build.gradle.kts +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/build.gradle.kts @@ -5,7 +5,7 @@ plugins { base.archivesName.set("${base.archivesName.get()}-autoconfigure") dependencies { - implementation(project(":javaagent-bootstrap")) + compileOnly(project(":javaagent-bootstrap")) library("org.apache.logging.log4j:log4j-core:2.17.0") testImplementation(project(":instrumentation:log4j:log4j-context-data:log4j-context-data-common:testing")) diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java index 2ce6e3126ac5..0ffe9258d749 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java @@ -26,6 +26,19 @@ * #supplyContextData()} is called when a log entry is created. */ public class OpenTelemetryContextDataProvider implements ContextDataProvider { + + private boolean configuredResourceAttributeAccessible; + + public OpenTelemetryContextDataProvider() { + try { + Class.forName("io.opentelemetry.javaagent.bootstrap.ConfiguredResourceAttributesHolder"); + this.configuredResourceAttributeAccessible = true; + + } catch (ClassNotFoundException ok) { + this.configuredResourceAttributeAccessible = false; + } + } + private static final boolean BAGGAGE_ENABLED = ConfigPropertiesUtil.getBoolean("otel.instrumentation.log4j-context-data.add-baggage", false); @@ -48,7 +61,10 @@ public Map supplyContextData() { contextData.put(TRACE_ID, spanContext.getTraceId()); contextData.put(SPAN_ID, spanContext.getSpanId()); contextData.put(TRACE_FLAGS, spanContext.getTraceFlags().asHex()); - contextData.putAll(ConfiguredResourceAttributesHolder.getResourceAttributes()); + + if (configuredResourceAttributeAccessible) { + contextData.putAll(ConfiguredResourceAttributesHolder.getResourceAttributes()); + } if (BAGGAGE_ENABLED) { Baggage baggage = Baggage.fromContext(context); From d5620f8e5accff17653e4ea17f2e31512cb94900 Mon Sep 17 00:00:00 2001 From: cleverchuk Date: Wed, 25 Oct 2023 10:32:55 -0400 Subject: [PATCH 05/10] (#9297) - refactor constructor to static method --- .../OpenTelemetryContextDataProvider.java | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java index 0ffe9258d749..eb069d5f9f7c 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java @@ -27,21 +27,28 @@ */ public class OpenTelemetryContextDataProvider implements ContextDataProvider { - private boolean configuredResourceAttributeAccessible; + private static final boolean BAGGAGE_ENABLED = + ConfigPropertiesUtil.getBoolean("otel.instrumentation.log4j-context-data.add-baggage", false); + + private static final boolean configuredResourceAttributeAccessible = + isConfiguredResourceAttributeAccessible(); - public OpenTelemetryContextDataProvider() { + /** + * Checks whether {@link ConfiguredResourceAttributesHolder} is available in classpath. The result + * is true if {@link ConfiguredResourceAttributesHolder} can be loaded, false otherwise. + * + * @return A boolean + */ + private static boolean isConfiguredResourceAttributeAccessible() { try { Class.forName("io.opentelemetry.javaagent.bootstrap.ConfiguredResourceAttributesHolder"); - this.configuredResourceAttributeAccessible = true; + return true; } catch (ClassNotFoundException ok) { - this.configuredResourceAttributeAccessible = false; + return false; } } - private static final boolean BAGGAGE_ENABLED = - ConfigPropertiesUtil.getBoolean("otel.instrumentation.log4j-context-data.add-baggage", false); - /** * Returns context from the current span when available. * From 9cf2689a4e43e927468b8485b0f95099e0484053 Mon Sep 17 00:00:00 2001 From: cleverchuk Date: Thu, 26 Oct 2023 08:58:25 -0400 Subject: [PATCH 06/10] (#9297) - move ConfiguredResourceAttributesHolder to javaagent-extension-api --- .../library-autoconfigure/build.gradle.kts | 2 +- .../OpenTelemetryContextDataProvider.java | 5 +- .../SpanDecoratingContextDataInjector.java | 2 +- .../mdc/v1_2/LoggingEventInstrumentation.java | 2 +- .../mdc/v1_0/LoggingEventInstrumentation.java | 2 +- ...onfiguredResourceAttributesHolderTest.java | 55 ------------------- .../ConfiguredResourceAttributesHolder.java | 23 ++++---- .../javaagent/tooling/AgentInstaller.java | 2 +- 8 files changed, 18 insertions(+), 75 deletions(-) delete mode 100644 javaagent-bootstrap/src/test/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolderTest.java rename {javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap => javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal}/ConfiguredResourceAttributesHolder.java (67%) diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/build.gradle.kts b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/build.gradle.kts index 26b587e868e3..e33133932c6f 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/build.gradle.kts +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/build.gradle.kts @@ -5,7 +5,7 @@ plugins { base.archivesName.set("${base.archivesName.get()}-autoconfigure") dependencies { - compileOnly(project(":javaagent-bootstrap")) + compileOnly(project(":javaagent-extension-api")) library("org.apache.logging.log4j:log4j-core:2.17.0") testImplementation(project(":instrumentation:log4j:log4j-context-data:log4j-context-data-common:testing")) diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java index eb069d5f9f7c..e28eab7fe608 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java @@ -15,7 +15,7 @@ import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; -import io.opentelemetry.javaagent.bootstrap.ConfiguredResourceAttributesHolder; +import io.opentelemetry.javaagent.bootstrap.internal.ConfiguredResourceAttributesHolder; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -41,7 +41,8 @@ public class OpenTelemetryContextDataProvider implements ContextDataProvider { */ private static boolean isConfiguredResourceAttributeAccessible() { try { - Class.forName("io.opentelemetry.javaagent.bootstrap.ConfiguredResourceAttributesHolder"); + Class.forName( + "io.opentelemetry.javaagent.bootstrap.internal.ConfiguredResourceAttributesHolder"); return true; } catch (ClassNotFoundException ok) { diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/contextdata/v2_7/SpanDecoratingContextDataInjector.java b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/contextdata/v2_7/SpanDecoratingContextDataInjector.java index 87c810271435..1cd131257e69 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/contextdata/v2_7/SpanDecoratingContextDataInjector.java +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/contextdata/v2_7/SpanDecoratingContextDataInjector.java @@ -14,7 +14,7 @@ import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.context.Context; -import io.opentelemetry.javaagent.bootstrap.ConfiguredResourceAttributesHolder; +import io.opentelemetry.javaagent.bootstrap.internal.ConfiguredResourceAttributesHolder; import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig; import java.util.List; import java.util.Map; diff --git a/instrumentation/log4j/log4j-mdc-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/mdc/v1_2/LoggingEventInstrumentation.java b/instrumentation/log4j/log4j-mdc-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/mdc/v1_2/LoggingEventInstrumentation.java index bf5f4834c189..31efdac1ec20 100644 --- a/instrumentation/log4j/log4j-mdc-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/mdc/v1_2/LoggingEventInstrumentation.java +++ b/instrumentation/log4j/log4j-mdc-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/mdc/v1_2/LoggingEventInstrumentation.java @@ -17,8 +17,8 @@ import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.util.VirtualField; -import io.opentelemetry.javaagent.bootstrap.ConfiguredResourceAttributesHolder; import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; +import io.opentelemetry.javaagent.bootstrap.internal.ConfiguredResourceAttributesHolder; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import net.bytebuddy.asm.Advice; diff --git a/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java b/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java index 616b016ec1f8..5cb3bd5b1771 100644 --- a/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java +++ b/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java @@ -23,8 +23,8 @@ import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.instrumentation.logback.mdc.v1_0.internal.UnionMap; -import io.opentelemetry.javaagent.bootstrap.ConfiguredResourceAttributesHolder; import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; +import io.opentelemetry.javaagent.bootstrap.internal.ConfiguredResourceAttributesHolder; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import java.util.HashMap; diff --git a/javaagent-bootstrap/src/test/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolderTest.java b/javaagent-bootstrap/src/test/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolderTest.java deleted file mode 100644 index 0d2fb9cb1d90..000000000000 --- a/javaagent-bootstrap/src/test/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolderTest.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.bootstrap; - -import static org.assertj.core.api.Assertions.assertThat; - -import io.opentelemetry.api.common.AttributeKey; -import io.opentelemetry.api.common.Attributes; -import java.util.Collections; -import org.junit.jupiter.api.Test; -import org.junitpioneer.jupiter.ClearSystemProperty; -import org.junitpioneer.jupiter.SetSystemProperty; - -class ConfiguredResourceAttributesHolderTest { - - @Test - @SetSystemProperty( - key = "otel.instrumentation.mdc.resource-attributes", - value = "service.name,runtime") - void testGetAttributeValue() { - Attributes attributes = - Attributes.builder().put("service.name", "test-service").put("runtime", "JVM").build(); - - ConfiguredResourceAttributesHolder.initialize(attributes); - - assertThat(ConfiguredResourceAttributesHolder.getAttributeValue("service.name")) - .isEqualTo("test-service"); - assertThat(ConfiguredResourceAttributesHolder.getAttributeValue("runtime")).isEqualTo("JVM"); - } - - @Test - @SetSystemProperty(key = "otel.instrumentation.mdc.resource-attributes", value = "items") - void testGetAttributeValueWhenKeyIsNotString() { - Attributes attributes = - Attributes.builder() - .put(AttributeKey.stringArrayKey("items"), Collections.singletonList("test-item")) - .build(); - - ConfiguredResourceAttributesHolder.initialize(attributes); - assertThat(ConfiguredResourceAttributesHolder.getAttributeValue("items")).isNull(); - } - - @Test - @ClearSystemProperty(key = "otel.instrumentation.mdc.resource-attributes") - void testGetAttributeValueWhenConfigIsNotSet() { - Attributes attributes = - Attributes.builder().put(AttributeKey.stringArrayKey("don't care"), "won't care").build(); - - ConfiguredResourceAttributesHolder.initialize(attributes); - assertThat(ConfiguredResourceAttributesHolder.getAttributeValue("dc-wc")).isNull(); - } -} diff --git a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolder.java b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/ConfiguredResourceAttributesHolder.java similarity index 67% rename from javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolder.java rename to javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/ConfiguredResourceAttributesHolder.java index b36ef9c2d3c6..123126c71cfb 100644 --- a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/ConfiguredResourceAttributesHolder.java +++ b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/ConfiguredResourceAttributesHolder.java @@ -3,16 +3,21 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.bootstrap; +package io.opentelemetry.javaagent.bootstrap.internal; import static io.opentelemetry.api.common.AttributeKey.stringKey; import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; +import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import javax.annotation.Nullable; +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ public final class ConfiguredResourceAttributesHolder { private static final Map resourceAttributes = new HashMap<>(); @@ -22,8 +27,9 @@ public static Map getResourceAttributes() { } public static void initialize(Attributes resourceAttribute) { - String[] mdcResourceAttributes = getConfiguredAttributes(); - + List mdcResourceAttributes = + InstrumentationConfig.get() + .getList("otel.instrumentation.mdc.resource-attributes", Collections.emptyList()); for (String key : mdcResourceAttributes) { String value = resourceAttribute.get(stringKey(key)); if (value != null) { @@ -32,15 +38,6 @@ public static void initialize(Attributes resourceAttribute) { } } - private static String[] getConfiguredAttributes() { - String resourceAttributes = - ConfigPropertiesUtil.getString("otel.instrumentation.mdc.resource-attributes"); - if (resourceAttributes == null) { - return new String[] {}; - } - return resourceAttributes.split(","); - } - @Nullable public static String getAttributeValue(String key) { return resourceAttributes.get(key); diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java index 8cbe60221344..860823914dc6 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java @@ -21,12 +21,12 @@ import io.opentelemetry.javaagent.bootstrap.AgentClassLoader; import io.opentelemetry.javaagent.bootstrap.BootstrapPackagePrefixesHolder; import io.opentelemetry.javaagent.bootstrap.ClassFileTransformerHolder; -import io.opentelemetry.javaagent.bootstrap.ConfiguredResourceAttributesHolder; import io.opentelemetry.javaagent.bootstrap.DefineClassHelper; import io.opentelemetry.javaagent.bootstrap.InstrumentedTaskClasses; import io.opentelemetry.javaagent.bootstrap.http.HttpServerResponseCustomizer; import io.opentelemetry.javaagent.bootstrap.http.HttpServerResponseCustomizerHolder; import io.opentelemetry.javaagent.bootstrap.http.HttpServerResponseMutator; +import io.opentelemetry.javaagent.bootstrap.internal.ConfiguredResourceAttributesHolder; import io.opentelemetry.javaagent.bootstrap.internal.InstrumentationConfig; import io.opentelemetry.javaagent.extension.AgentListener; import io.opentelemetry.javaagent.extension.ignore.IgnoredTypesConfigurer; From 740ef8ae5c962de2febcd37c2febdd8d36b28c72 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Tue, 31 Oct 2023 13:46:11 +0200 Subject: [PATCH 07/10] Add tests for resource attributes in mdc --- .../javaagent/build.gradle.kts | 1 + .../src/test/groovy/AutoLog4j2Test.groovy | 20 +++++++++++++ .../OpenTelemetryContextDataProvider.java | 17 +++++++---- .../javaagent/build.gradle.kts | 1 + .../SpanDecoratingContextDataInjector.java | 28 +++++++++++++------ .../src/test/groovy/Log4j27Test.groovy | 20 +++++++++++++ .../log4j-mdc-1.2/javaagent/build.gradle.kts | 6 ++++ .../mdc/v1_2/LoggingEventInstrumentation.java | 6 ++-- .../log4j/mdc/v1_2/Log4j1MdcTest.java | 15 ++++++++++ .../javaagent/build.gradle.kts | 4 +++ .../mdc/v1_0/LoggingEventInstrumentation.java | 3 +- .../logback/v1_0/LogbackTest.java | 21 ++++++++++++++ 12 files changed, 123 insertions(+), 19 deletions(-) diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/build.gradle.kts b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/build.gradle.kts index 754b33b63db2..28aa63c81196 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/build.gradle.kts +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/build.gradle.kts @@ -74,6 +74,7 @@ tasks { test { jvmArgs("-Dlog4j2.is.webapp=false") jvmArgs("-Dlog4j2.enable.threadlocals=true") + jvmArgs("-Dotel.instrumentation.mdc.resource-attributes=service.name,telemetry.sdk.language") } named("check") { diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/src/test/groovy/AutoLog4j2Test.groovy b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/src/test/groovy/AutoLog4j2Test.groovy index 260ff5915f07..b75ff250e91e 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/src/test/groovy/AutoLog4j2Test.groovy +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/src/test/groovy/AutoLog4j2Test.groovy @@ -3,7 +3,27 @@ * SPDX-License-Identifier: Apache-2.0 */ +import io.opentelemetry.instrumentation.log4j.contextdata.ListAppender import io.opentelemetry.instrumentation.test.AgentTestTrait +import org.apache.logging.log4j.LogManager class AutoLog4j2Test extends Log4j2Test implements AgentTestTrait { + + def "resource attributes"() { + given: + def logger = LogManager.getLogger("TestLogger") + + when: + logger.info("log message 1") + + def events = ListAppender.get().getEvents() + + then: + events.size() == 1 + events[0].message == "log message 1" + events[0].contextData["trace_id"] == null + events[0].contextData["span_id"] == null + events[0].contextData["service.name"] == "unknown_service:java" + events[0].contextData["telemetry.sdk.language"] == "java" + } } diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java index e28eab7fe608..8941bfbe84b0 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/main/java/io/opentelemetry/instrumentation/log4j/contextdata/v2_17/OpenTelemetryContextDataProvider.java @@ -33,6 +33,15 @@ public class OpenTelemetryContextDataProvider implements ContextDataProvider { private static final boolean configuredResourceAttributeAccessible = isConfiguredResourceAttributeAccessible(); + private static final Map staticContextData = getStaticContextData(); + + private static Map getStaticContextData() { + if (configuredResourceAttributeAccessible) { + return ConfiguredResourceAttributesHolder.getResourceAttributes(); + } + return Collections.emptyMap(); + } + /** * Checks whether {@link ConfiguredResourceAttributesHolder} is available in classpath. The result * is true if {@link ConfiguredResourceAttributesHolder} can be loaded, false otherwise. @@ -61,19 +70,17 @@ public Map supplyContextData() { Context context = Context.current(); Span currentSpan = Span.fromContext(context); if (!currentSpan.getSpanContext().isValid()) { - return Collections.emptyMap(); + return staticContextData; } Map contextData = new HashMap<>(); + contextData.putAll(staticContextData); + SpanContext spanContext = currentSpan.getSpanContext(); contextData.put(TRACE_ID, spanContext.getTraceId()); contextData.put(SPAN_ID, spanContext.getSpanId()); contextData.put(TRACE_FLAGS, spanContext.getTraceFlags().asHex()); - if (configuredResourceAttributeAccessible) { - contextData.putAll(ConfiguredResourceAttributesHolder.getResourceAttributes()); - } - if (BAGGAGE_ENABLED) { Baggage baggage = Baggage.fromContext(context); for (Map.Entry entry : baggage.asMap().entrySet()) { diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/build.gradle.kts b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/build.gradle.kts index 05587ee92418..d29a28a596dd 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/build.gradle.kts +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/build.gradle.kts @@ -26,6 +26,7 @@ tasks { filter { excludeTestsMatching("Log4j27BaggageTest") } + jvmArgs("-Dotel.instrumentation.mdc.resource-attributes=service.name,telemetry.sdk.language") } val testAddBaggage by registering(Test::class) { diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/contextdata/v2_7/SpanDecoratingContextDataInjector.java b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/contextdata/v2_7/SpanDecoratingContextDataInjector.java index 1cd131257e69..7e660c557241 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/contextdata/v2_7/SpanDecoratingContextDataInjector.java +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/contextdata/v2_7/SpanDecoratingContextDataInjector.java @@ -29,6 +29,8 @@ public final class SpanDecoratingContextDataInjector implements ContextDataInjec InstrumentationConfig.get() .getBoolean("otel.instrumentation.log4j-context-data.add-baggage", false); + private static final StringMap staticContextData = getStaticContextData(); + private final ContextDataInjector delegate; public SpanDecoratingContextDataInjector(ContextDataInjector delegate) { @@ -41,26 +43,21 @@ public StringMap injectContextData(List list, StringMap stringMap) { if (contextData.containsKey(TRACE_ID)) { // Assume already instrumented event if traceId is present. - return contextData; + return staticContextData.isEmpty() ? contextData : newContextData(contextData); } Context context = Context.current(); Span span = Span.fromContext(context); SpanContext currentContext = span.getSpanContext(); if (!currentContext.isValid()) { - return contextData; + return staticContextData.isEmpty() ? contextData : newContextData(contextData); } - StringMap newContextData = new SortedArrayStringMap(contextData); + StringMap newContextData = newContextData(contextData); newContextData.putValue(TRACE_ID, currentContext.getTraceId()); newContextData.putValue(SPAN_ID, currentContext.getSpanId()); newContextData.putValue(TRACE_FLAGS, currentContext.getTraceFlags().asHex()); - for (Map.Entry entry : - ConfiguredResourceAttributesHolder.getResourceAttributes().entrySet()) { - newContextData.putValue(entry.getKey(), entry.getValue()); - } - if (BAGGAGE_ENABLED) { Baggage baggage = Baggage.fromContext(context); for (Map.Entry entry : baggage.asMap().entrySet()) { @@ -75,4 +72,19 @@ public StringMap injectContextData(List list, StringMap stringMap) { public ReadOnlyStringMap rawContextData() { return delegate.rawContextData(); } + + private static StringMap newContextData(StringMap contextData) { + StringMap newContextData = new SortedArrayStringMap(contextData); + newContextData.putAll(staticContextData); + return newContextData; + } + + private static StringMap getStaticContextData() { + StringMap map = new SortedArrayStringMap(); + for (Map.Entry entry : + ConfiguredResourceAttributesHolder.getResourceAttributes().entrySet()) { + map.putValue(entry.getKey(), entry.getValue()); + } + return map; + } } diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/test/groovy/Log4j27Test.groovy b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/test/groovy/Log4j27Test.groovy index 24e5b98f4cfe..b58519657017 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/test/groovy/Log4j27Test.groovy +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/test/groovy/Log4j27Test.groovy @@ -3,7 +3,27 @@ * SPDX-License-Identifier: Apache-2.0 */ +import io.opentelemetry.instrumentation.log4j.contextdata.ListAppender import io.opentelemetry.instrumentation.test.AgentTestTrait +import org.apache.logging.log4j.LogManager class Log4j27Test extends Log4j2Test implements AgentTestTrait { + + def "resource attributes"() { + given: + def logger = LogManager.getLogger("TestLogger") + + when: + logger.info("log message 1") + + def events = ListAppender.get().getEvents() + + then: + events.size() == 1 + events[0].message == "log message 1" + events[0].contextData["trace_id"] == null + events[0].contextData["span_id"] == null + events[0].contextData["service.name"] == "unknown_service:java" + events[0].contextData["telemetry.sdk.language"] == "java" + } } diff --git a/instrumentation/log4j/log4j-mdc-1.2/javaagent/build.gradle.kts b/instrumentation/log4j/log4j-mdc-1.2/javaagent/build.gradle.kts index 9ede7f4fc5b1..856bd835dfd9 100644 --- a/instrumentation/log4j/log4j-mdc-1.2/javaagent/build.gradle.kts +++ b/instrumentation/log4j/log4j-mdc-1.2/javaagent/build.gradle.kts @@ -30,3 +30,9 @@ configurations { exclude("javax.jms", "jms") } } + +tasks { + test { + jvmArgs("-Dotel.instrumentation.mdc.resource-attributes=service.name,telemetry.sdk.language") + } +} diff --git a/instrumentation/log4j/log4j-mdc-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/mdc/v1_2/LoggingEventInstrumentation.java b/instrumentation/log4j/log4j-mdc-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/mdc/v1_2/LoggingEventInstrumentation.java index 31efdac1ec20..f3d87dec222b 100644 --- a/instrumentation/log4j/log4j-mdc-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/mdc/v1_2/LoggingEventInstrumentation.java +++ b/instrumentation/log4j/log4j-mdc-1.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/mdc/v1_2/LoggingEventInstrumentation.java @@ -80,10 +80,8 @@ public static void onExit( default: // do nothing } - } else if (ConfiguredResourceAttributesHolder.getAttributeValue(key) != null) { - if (value == null) { - value = ConfiguredResourceAttributesHolder.getAttributeValue(key); - } + } else if (value == null) { + value = ConfiguredResourceAttributesHolder.getAttributeValue(key); } } } diff --git a/instrumentation/log4j/log4j-mdc-1.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/log4j/mdc/v1_2/Log4j1MdcTest.java b/instrumentation/log4j/log4j-mdc-1.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/log4j/mdc/v1_2/Log4j1MdcTest.java index 5a3bcc190628..3661ac8ecbab 100644 --- a/instrumentation/log4j/log4j-mdc-1.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/log4j/mdc/v1_2/Log4j1MdcTest.java +++ b/instrumentation/log4j/log4j-mdc-1.2/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/log4j/mdc/v1_2/Log4j1MdcTest.java @@ -90,4 +90,19 @@ void idsWhenSpan() { assertEquals(events.get(2).getMDC("span_id"), span2.getSpanContext().getSpanId()); assertEquals(events.get(2).getMDC("trace_flags"), "01"); } + + @Test + void resourceAttributes() { + logger.info("log message 1"); + + List events = ListAppender.getEvents(); + + assertEquals(1, events.size()); + assertEquals("log message 1", events.get(0).getMessage()); + assertNull(events.get(0).getMDC("trace_id")); + assertNull(events.get(0).getMDC("span_id")); + assertNull(events.get(0).getMDC("trace_flags")); + assertEquals("unknown_service:java", events.get(0).getMDC("service.name")); + assertEquals("java", events.get(0).getMDC("telemetry.sdk.language")); + } } diff --git a/instrumentation/logback/logback-mdc-1.0/javaagent/build.gradle.kts b/instrumentation/logback/logback-mdc-1.0/javaagent/build.gradle.kts index 9d616d079f9a..8ebb5d8d9c8a 100644 --- a/instrumentation/logback/logback-mdc-1.0/javaagent/build.gradle.kts +++ b/instrumentation/logback/logback-mdc-1.0/javaagent/build.gradle.kts @@ -63,6 +63,10 @@ dependencies { } tasks { + test { + jvmArgs("-Dotel.instrumentation.mdc.resource-attributes=service.name,telemetry.sdk.language") + } + named("check") { dependsOn(testing.suites) } diff --git a/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java b/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java index 5cb3bd5b1771..4f706cc062b0 100644 --- a/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java +++ b/instrumentation/logback/logback-mdc-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/mdc/v1_0/LoggingEventInstrumentation.java @@ -80,9 +80,8 @@ public static void onExit( spanContextData.put(TRACE_ID, spanContext.getTraceId()); spanContextData.put(SPAN_ID, spanContext.getSpanId()); spanContextData.put(TRACE_FLAGS, spanContext.getTraceFlags().asHex()); - - spanContextData.putAll(ConfiguredResourceAttributesHolder.getResourceAttributes()); } + spanContextData.putAll(ConfiguredResourceAttributesHolder.getResourceAttributes()); if (LogbackSingletons.addBaggage()) { Baggage baggage = Java8BytecodeBridge.baggageFromContext(context); diff --git a/instrumentation/logback/logback-mdc-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/logback/v1_0/LogbackTest.java b/instrumentation/logback/logback-mdc-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/logback/v1_0/LogbackTest.java index f59a2bcf9ad0..a3a062bf50ca 100644 --- a/instrumentation/logback/logback-mdc-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/logback/v1_0/LogbackTest.java +++ b/instrumentation/logback/logback-mdc-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/logback/v1_0/LogbackTest.java @@ -5,9 +5,14 @@ package io.opentelemetry.javaagent.instrumentation.logback.v1_0; +import static org.assertj.core.api.Assertions.assertThat; + +import ch.qos.logback.classic.spi.ILoggingEvent; import io.opentelemetry.instrumentation.logback.mdc.v1_0.AbstractLogbackTest; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import java.util.List; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; class LogbackTest extends AbstractLogbackTest { @@ -19,4 +24,20 @@ class LogbackTest extends AbstractLogbackTest { public InstrumentationExtension getInstrumentationExtension() { return agentTesting; } + + @Test + void resourceAttributes() { + logger.info("log message 1"); + + List events = listAppender.list; + + assertThat(events.size()).isEqualTo(1); + assertThat(events.get(0).getMessage()).isEqualTo("log message 1"); + assertThat(events.get(0).getMDCPropertyMap().get("trace_id")).isNull(); + assertThat(events.get(0).getMDCPropertyMap().get("span_id")).isNull(); + assertThat(events.get(0).getMDCPropertyMap().get("trace_flags")).isNull(); + assertThat(events.get(0).getMDCPropertyMap().get("service.name")) + .isEqualTo("unknown_service:java"); + assertThat(events.get(0).getMDCPropertyMap().get("telemetry.sdk.language")).isEqualTo("java"); + } } From 4e8033078cd59c4b6c350a7c693437202812c9ac Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Thu, 2 Nov 2023 21:27:25 +0200 Subject: [PATCH 08/10] fix test --- .../log4j-context-data-2.17/javaagent/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/build.gradle.kts b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/build.gradle.kts index 28aa63c81196..e36b98e6cf70 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/build.gradle.kts +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/build.gradle.kts @@ -40,6 +40,7 @@ testing { testTask.configure { jvmArgs("-Dlog4j2.is.webapp=false") jvmArgs("-Dlog4j2.enable.threadlocals=false") + jvmArgs("-Dotel.instrumentation.mdc.resource-attributes=service.name,telemetry.sdk.language") } } } From 22fde67dc0ff0d6eb054adb05d391b6c61fc48d1 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Mon, 13 Nov 2023 12:10:05 +0200 Subject: [PATCH 09/10] add doc --- .../log4j-context-data-2.17/javaagent/README.md | 5 +++++ instrumentation/log4j/log4j-mdc-1.2/javaagent/README.md | 5 +++++ .../logback/logback-mdc-1.0/javaagent/README.md | 7 ++++--- 3 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/README.md create mode 100644 instrumentation/log4j/log4j-mdc-1.2/javaagent/README.md diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/README.md b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/README.md new file mode 100644 index 000000000000..d290cc95ec7b --- /dev/null +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/README.md @@ -0,0 +1,5 @@ +# Settings for the Log4j MDC instrumentation + +| System property | Type | Default | Description | +|------------------------------------------------|---------|---------|--------------------------------------------------------------------| +| `otel.instrumentation.mdc.resource-attributes` | String | | Comma separated list of resource attributes to expose through MDC. | diff --git a/instrumentation/log4j/log4j-mdc-1.2/javaagent/README.md b/instrumentation/log4j/log4j-mdc-1.2/javaagent/README.md new file mode 100644 index 000000000000..d290cc95ec7b --- /dev/null +++ b/instrumentation/log4j/log4j-mdc-1.2/javaagent/README.md @@ -0,0 +1,5 @@ +# Settings for the Log4j MDC instrumentation + +| System property | Type | Default | Description | +|------------------------------------------------|---------|---------|--------------------------------------------------------------------| +| `otel.instrumentation.mdc.resource-attributes` | String | | Comma separated list of resource attributes to expose through MDC. | diff --git a/instrumentation/logback/logback-mdc-1.0/javaagent/README.md b/instrumentation/logback/logback-mdc-1.0/javaagent/README.md index cc0970e50954..bba26f1851cb 100644 --- a/instrumentation/logback/logback-mdc-1.0/javaagent/README.md +++ b/instrumentation/logback/logback-mdc-1.0/javaagent/README.md @@ -1,5 +1,6 @@ # Settings for the Logback MDC instrumentation -| System property | Type | Default | Description | -| ---------------------------------------------- | ------- | ------- | ----------------------------------------------- | -| `otel.instrumentation.logback-mdc.add-baggage` | Boolean | `false` | Enable exposing baggage attributes through MDC. | +| System property | Type | Default | Description | +|-------------------------------------------------|---------|---------|--------------------------------------------------------------------| +| `otel.instrumentation.logback-mdc.add-baggage` | Boolean | `false` | Enable exposing baggage attributes through MDC. | +| `otel.instrumentation.mdc.resource-attributes` | String | | Comma separated list of resource attributes to expose through MDC. | From 822f0b1b97dab1f8b281051dc846697a2a881acd Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Mon, 13 Nov 2023 18:09:45 +0200 Subject: [PATCH 10/10] rename otel.instrumentation.mdc.resource-attributes to otel.instrumentation.common.mdc.resource-attributes --- .../log4j-context-data-2.17/javaagent/README.md | 6 +++--- .../log4j-context-data-2.17/javaagent/build.gradle.kts | 4 ++-- .../log4j-context-data-2.7/javaagent/build.gradle.kts | 2 +- instrumentation/log4j/log4j-mdc-1.2/javaagent/README.md | 6 +++--- .../log4j/log4j-mdc-1.2/javaagent/build.gradle.kts | 2 +- .../logback/logback-mdc-1.0/javaagent/README.md | 8 ++++---- .../logback/logback-mdc-1.0/javaagent/build.gradle.kts | 2 +- .../internal/ConfiguredResourceAttributesHolder.java | 3 ++- 8 files changed, 17 insertions(+), 16 deletions(-) diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/README.md b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/README.md index d290cc95ec7b..8395e5f3da17 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/README.md +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/README.md @@ -1,5 +1,5 @@ # Settings for the Log4j MDC instrumentation -| System property | Type | Default | Description | -|------------------------------------------------|---------|---------|--------------------------------------------------------------------| -| `otel.instrumentation.mdc.resource-attributes` | String | | Comma separated list of resource attributes to expose through MDC. | +| System property | Type | Default | Description | +|-------------------------------------------------------|---------|---------|--------------------------------------------------------------------| +| `otel.instrumentation.common.mdc.resource-attributes` | String | | Comma separated list of resource attributes to expose through MDC. | diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/build.gradle.kts b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/build.gradle.kts index e36b98e6cf70..d82585961ddb 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/build.gradle.kts +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/build.gradle.kts @@ -40,7 +40,7 @@ testing { testTask.configure { jvmArgs("-Dlog4j2.is.webapp=false") jvmArgs("-Dlog4j2.enable.threadlocals=false") - jvmArgs("-Dotel.instrumentation.mdc.resource-attributes=service.name,telemetry.sdk.language") + jvmArgs("-Dotel.instrumentation.common.mdc.resource-attributes=service.name,telemetry.sdk.language") } } } @@ -75,7 +75,7 @@ tasks { test { jvmArgs("-Dlog4j2.is.webapp=false") jvmArgs("-Dlog4j2.enable.threadlocals=true") - jvmArgs("-Dotel.instrumentation.mdc.resource-attributes=service.name,telemetry.sdk.language") + jvmArgs("-Dotel.instrumentation.common.mdc.resource-attributes=service.name,telemetry.sdk.language") } named("check") { diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/build.gradle.kts b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/build.gradle.kts index d29a28a596dd..40bbbdb1979f 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/build.gradle.kts +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/build.gradle.kts @@ -26,7 +26,7 @@ tasks { filter { excludeTestsMatching("Log4j27BaggageTest") } - jvmArgs("-Dotel.instrumentation.mdc.resource-attributes=service.name,telemetry.sdk.language") + jvmArgs("-Dotel.instrumentation.common.mdc.resource-attributes=service.name,telemetry.sdk.language") } val testAddBaggage by registering(Test::class) { diff --git a/instrumentation/log4j/log4j-mdc-1.2/javaagent/README.md b/instrumentation/log4j/log4j-mdc-1.2/javaagent/README.md index d290cc95ec7b..8395e5f3da17 100644 --- a/instrumentation/log4j/log4j-mdc-1.2/javaagent/README.md +++ b/instrumentation/log4j/log4j-mdc-1.2/javaagent/README.md @@ -1,5 +1,5 @@ # Settings for the Log4j MDC instrumentation -| System property | Type | Default | Description | -|------------------------------------------------|---------|---------|--------------------------------------------------------------------| -| `otel.instrumentation.mdc.resource-attributes` | String | | Comma separated list of resource attributes to expose through MDC. | +| System property | Type | Default | Description | +|-------------------------------------------------------|---------|---------|--------------------------------------------------------------------| +| `otel.instrumentation.common.mdc.resource-attributes` | String | | Comma separated list of resource attributes to expose through MDC. | diff --git a/instrumentation/log4j/log4j-mdc-1.2/javaagent/build.gradle.kts b/instrumentation/log4j/log4j-mdc-1.2/javaagent/build.gradle.kts index 856bd835dfd9..5054629f77fc 100644 --- a/instrumentation/log4j/log4j-mdc-1.2/javaagent/build.gradle.kts +++ b/instrumentation/log4j/log4j-mdc-1.2/javaagent/build.gradle.kts @@ -33,6 +33,6 @@ configurations { tasks { test { - jvmArgs("-Dotel.instrumentation.mdc.resource-attributes=service.name,telemetry.sdk.language") + jvmArgs("-Dotel.instrumentation.common.mdc.resource-attributes=service.name,telemetry.sdk.language") } } diff --git a/instrumentation/logback/logback-mdc-1.0/javaagent/README.md b/instrumentation/logback/logback-mdc-1.0/javaagent/README.md index bba26f1851cb..2f7d1b8c15c6 100644 --- a/instrumentation/logback/logback-mdc-1.0/javaagent/README.md +++ b/instrumentation/logback/logback-mdc-1.0/javaagent/README.md @@ -1,6 +1,6 @@ # Settings for the Logback MDC instrumentation -| System property | Type | Default | Description | -|-------------------------------------------------|---------|---------|--------------------------------------------------------------------| -| `otel.instrumentation.logback-mdc.add-baggage` | Boolean | `false` | Enable exposing baggage attributes through MDC. | -| `otel.instrumentation.mdc.resource-attributes` | String | | Comma separated list of resource attributes to expose through MDC. | +| System property | Type | Default | Description | +|-------------------------------------------------------|---------|---------|--------------------------------------------------------------------| +| `otel.instrumentation.logback-mdc.add-baggage` | Boolean | `false` | Enable exposing baggage attributes through MDC. | +| `otel.instrumentation.common.mdc.resource-attributes` | String | | Comma separated list of resource attributes to expose through MDC. | diff --git a/instrumentation/logback/logback-mdc-1.0/javaagent/build.gradle.kts b/instrumentation/logback/logback-mdc-1.0/javaagent/build.gradle.kts index 8ebb5d8d9c8a..dbd226ac9089 100644 --- a/instrumentation/logback/logback-mdc-1.0/javaagent/build.gradle.kts +++ b/instrumentation/logback/logback-mdc-1.0/javaagent/build.gradle.kts @@ -64,7 +64,7 @@ dependencies { tasks { test { - jvmArgs("-Dotel.instrumentation.mdc.resource-attributes=service.name,telemetry.sdk.language") + jvmArgs("-Dotel.instrumentation.common.mdc.resource-attributes=service.name,telemetry.sdk.language") } named("check") { diff --git a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/ConfiguredResourceAttributesHolder.java b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/ConfiguredResourceAttributesHolder.java index 123126c71cfb..77f2e7ac16fb 100644 --- a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/ConfiguredResourceAttributesHolder.java +++ b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/bootstrap/internal/ConfiguredResourceAttributesHolder.java @@ -29,7 +29,8 @@ public static Map getResourceAttributes() { public static void initialize(Attributes resourceAttribute) { List mdcResourceAttributes = InstrumentationConfig.get() - .getList("otel.instrumentation.mdc.resource-attributes", Collections.emptyList()); + .getList( + "otel.instrumentation.common.mdc.resource-attributes", Collections.emptyList()); for (String key : mdcResourceAttributes) { String value = resourceAttribute.get(stringKey(key)); if (value != null) {