From 1e0635ba5ae035453e38fc06f110ca2d4cf4c51e Mon Sep 17 00:00:00 2001 From: Steven Swartz Date: Wed, 19 Jul 2023 15:23:53 -0400 Subject: [PATCH] Adds tests for log4j2 ThreadContext baggage attributes (#8955) --- .../otel.spotless-conventions.gradle.kts | 2 +- .../javaagent/build.gradle.kts | 21 ++++++++ .../groovy/AutoLog4jBaggageTest.groovy | 9 ++++ .../library-autoconfigure/build.gradle.kts | 19 +++++++ .../groovy/LibraryLog4j2BaggageTest.groovy | 9 ++++ .../javaagent/build.gradle.kts | 19 +++++++ .../src/test/groovy/Log4j27BaggageTest.groovy | 9 ++++ .../src/main/groovy/Log4J2BaggageTest.groovy | 11 ++++ .../testing/src/main/groovy/Log4j2Test.groovy | 54 +++++++++++++------ .../src/main/resources/log4j2-test.xml | 2 +- 10 files changed, 138 insertions(+), 17 deletions(-) create mode 100644 instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/src/testAddBaggage/groovy/AutoLog4jBaggageTest.groovy create mode 100644 instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/test/groovy/LibraryLog4j2BaggageTest.groovy create mode 100644 instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/test/groovy/Log4j27BaggageTest.groovy create mode 100644 instrumentation/log4j/log4j-context-data/log4j-context-data-common/testing/src/main/groovy/Log4J2BaggageTest.groovy diff --git a/conventions/src/main/kotlin/otel.spotless-conventions.gradle.kts b/conventions/src/main/kotlin/otel.spotless-conventions.gradle.kts index e08e669fc6..9c9ae5b0b8 100644 --- a/conventions/src/main/kotlin/otel.spotless-conventions.gradle.kts +++ b/conventions/src/main/kotlin/otel.spotless-conventions.gradle.kts @@ -18,7 +18,7 @@ spotless { groovy { licenseHeaderFile( rootProject.file("buildscripts/spotless.license.java"), - "(package|import|class)" + "(package|import|(?:abstract )?class)" ) endWithNewline() } 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 b8f7e18d84..754b33b63d 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 @@ -44,6 +44,27 @@ testing { } } } + + val testAddBaggage by registering(JvmTestSuite::class) { + sources { + groovy { + setSrcDirs(listOf("src/testAddBaggage/groovy")) + } + } + dependencies { + implementation(project(":instrumentation:log4j:log4j-context-data:log4j-context-data-common:testing")) + } + + targets { + all { + testTask.configure { + jvmArgs("-Dotel.instrumentation.log4j-context-data.add-baggage=true") + jvmArgs("-Dlog4j2.is.webapp=false") + jvmArgs("-Dlog4j2.enable.threadlocals=true") + } + } + } + } } } diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/src/testAddBaggage/groovy/AutoLog4jBaggageTest.groovy b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/src/testAddBaggage/groovy/AutoLog4jBaggageTest.groovy new file mode 100644 index 0000000000..ccb9edaed2 --- /dev/null +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/javaagent/src/testAddBaggage/groovy/AutoLog4jBaggageTest.groovy @@ -0,0 +1,9 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +import io.opentelemetry.instrumentation.test.AgentTestTrait + +class AutoLog4jBaggageTest extends Log4J2BaggageTest implements AgentTestTrait { +} 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 04f5be0210..7425e00ef5 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 @@ -9,3 +9,22 @@ dependencies { testImplementation(project(":instrumentation:log4j:log4j-context-data:log4j-context-data-common:testing")) } + +tasks { + test { + filter { + excludeTestsMatching("LibraryLog4j2BaggageTest") + } + } + + val testAddBaggage by registering(Test::class) { + filter { + includeTestsMatching("LibraryLog4j2BaggageTest") + } + jvmArgs("-Dotel.instrumentation.log4j-context-data.add-baggage=true") + } + + named("check") { + dependsOn(testAddBaggage) + } +} diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/test/groovy/LibraryLog4j2BaggageTest.groovy b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/test/groovy/LibraryLog4j2BaggageTest.groovy new file mode 100644 index 0000000000..943784d723 --- /dev/null +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.17/library-autoconfigure/src/test/groovy/LibraryLog4j2BaggageTest.groovy @@ -0,0 +1,9 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +import io.opentelemetry.instrumentation.test.LibraryTestTrait + +class LibraryLog4j2BaggageTest extends Log4J2BaggageTest implements LibraryTestTrait { +} 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 1bf995beec..05587ee924 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 @@ -20,3 +20,22 @@ dependencies { latestDepTestLibrary("org.apache.logging.log4j:log4j-core:2.16.+") // see log4j-context-data-2.17 module } + +tasks { + test { + filter { + excludeTestsMatching("Log4j27BaggageTest") + } + } + + val testAddBaggage by registering(Test::class) { + filter { + includeTestsMatching("Log4j27BaggageTest") + } + jvmArgs("-Dotel.instrumentation.log4j-context-data.add-baggage=true") + } + + named("check") { + dependsOn(testAddBaggage) + } +} diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/test/groovy/Log4j27BaggageTest.groovy b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/test/groovy/Log4j27BaggageTest.groovy new file mode 100644 index 0000000000..b25a646a1b --- /dev/null +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-2.7/javaagent/src/test/groovy/Log4j27BaggageTest.groovy @@ -0,0 +1,9 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +import io.opentelemetry.instrumentation.test.AgentTestTrait + +class Log4j27BaggageTest extends Log4J2BaggageTest implements AgentTestTrait { +} diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-common/testing/src/main/groovy/Log4J2BaggageTest.groovy b/instrumentation/log4j/log4j-context-data/log4j-context-data-common/testing/src/main/groovy/Log4J2BaggageTest.groovy new file mode 100644 index 0000000000..d369a227cb --- /dev/null +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-common/testing/src/main/groovy/Log4J2BaggageTest.groovy @@ -0,0 +1,11 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +abstract class Log4J2BaggageTest extends Log4j2Test { + @Override + boolean expectBaggage() { + return true + } +} diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-common/testing/src/main/groovy/Log4j2Test.groovy b/instrumentation/log4j/log4j-context-data/log4j-context-data-common/testing/src/main/groovy/Log4j2Test.groovy index 091e389146..db460bdb1e 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-common/testing/src/main/groovy/Log4j2Test.groovy +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-common/testing/src/main/groovy/Log4j2Test.groovy @@ -3,6 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ +import io.opentelemetry.api.baggage.Baggage import io.opentelemetry.api.trace.Span import io.opentelemetry.instrumentation.log4j.contextdata.ListAppender import io.opentelemetry.instrumentation.test.InstrumentationSpecification @@ -41,9 +42,19 @@ abstract class Log4j2Test extends InstrumentationSpecification { def logger = LogManager.getLogger("TestLogger") when: - Span span1 = runWithSpan("test") { - logger.info("log message 1") - Span.current() + Baggage baggage = Baggage.empty().toBuilder().put("baggage_key", "baggage_value").build() + Span spanParent + Span spanChild + try (var unusedScope = baggage.makeCurrent()) { + runWithSpan("test") { + spanParent = Span.current() + logger.info("log span parent") + + runWithSpan("test-child") { + logger.info("log span child") + spanChild = Span.current() + } + } } logger.info("log message 2") @@ -56,20 +67,33 @@ abstract class Log4j2Test extends InstrumentationSpecification { def events = ListAppender.get().getEvents() then: - events.size() == 3 - events[0].message == "log message 1" - events[0].contextData["trace_id"] == span1.spanContext.traceId - events[0].contextData["span_id"] == span1.spanContext.spanId + events.size() == 4 + events[0].message == "log span parent" + events[0].contextData["trace_id"] == spanParent.spanContext.traceId + events[0].contextData["span_id"] == spanParent.spanContext.spanId events[0].contextData["trace_flags"] == "01" + events[0].contextData["baggage.baggage_key"] == (expectBaggage() ? "baggage_value" : null) - events[1].message == "log message 2" - events[1].contextData["trace_id"] == null - events[1].contextData["span_id"] == null - events[1].contextData["trace_flags"] == null + events[1].message == "log span child" + events[1].contextData["trace_id"] == spanChild.spanContext.traceId + events[1].contextData["span_id"] == spanChild.spanContext.spanId + events[1].contextData["trace_flags"] == "01" + events[1].contextData["baggage.baggage_key"] == (expectBaggage() ? "baggage_value" : null) - events[2].message == "log message 3" - events[2].contextData["trace_id"] == span2.spanContext.traceId - events[2].contextData["span_id"] == span2.spanContext.spanId - events[2].contextData["trace_flags"] == "01" + events[2].message == "log message 2" + events[2].contextData["trace_id"] == null + events[2].contextData["span_id"] == null + events[2].contextData["trace_flags"] == null + events[2].contextData["baggage.baggage_key"] == null + + events[3].message == "log message 3" + events[3].contextData["trace_id"] == span2.spanContext.traceId + events[3].contextData["span_id"] == span2.spanContext.spanId + events[3].contextData["trace_flags"] == "01" + events[3].contextData["baggage.baggage_key"] == null + } + + boolean expectBaggage() { + return false } } diff --git a/instrumentation/log4j/log4j-context-data/log4j-context-data-common/testing/src/main/resources/log4j2-test.xml b/instrumentation/log4j/log4j-context-data/log4j-context-data-common/testing/src/main/resources/log4j2-test.xml index 17138ea6e0..9394620bef 100644 --- a/instrumentation/log4j/log4j-context-data/log4j-context-data-common/testing/src/main/resources/log4j2-test.xml +++ b/instrumentation/log4j/log4j-context-data/log4j-context-data-common/testing/src/main/resources/log4j2-test.xml @@ -2,7 +2,7 @@ - +