From 2810e776686c471722b5b5294114b0d176f1d937 Mon Sep 17 00:00:00 2001 From: jeanbisutti Date: Wed, 14 Sep 2022 12:48:29 +0200 Subject: [PATCH 1/7] Export code metrics --- .../implementation/LogDataMapper.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/agent/azure-monitor-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/LogDataMapper.java b/agent/azure-monitor-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/LogDataMapper.java index c6e23c5373f..ae86712261f 100644 --- a/agent/azure-monitor-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/LogDataMapper.java +++ b/agent/azure-monitor-exporter/src/main/java/com/azure/monitor/opentelemetry/exporter/implementation/LogDataMapper.java @@ -136,7 +136,8 @@ private static void setItemCount( private static final String LOGBACK_MDC_PREFIX = "logback.mdc."; private static final String JBOSS_LOGGING_MDC_PREFIX = "jboss-logmanager.mdc."; - static void setExtraAttributes(AbstractTelemetryBuilder telemetryBuilder, Attributes attributes) { + private static void setExtraAttributes( + AbstractTelemetryBuilder telemetryBuilder, Attributes attributes) { attributes.forEach( (attributeKey, value) -> { String key = attributeKey.getKey(); @@ -153,6 +154,22 @@ static void setExtraAttributes(AbstractTelemetryBuilder telemetryBuilder, Attrib key.substring(LOGBACK_MDC_PREFIX.length()), String.valueOf(value)); return; } + if (SemanticAttributes.CODE_FILEPATH.getKey().equals(key)) { + telemetryBuilder.addProperty("FileName", String.valueOf(value)); + return; + } + if (SemanticAttributes.CODE_NAMESPACE.getKey().equals(key)) { + telemetryBuilder.addProperty("ClassName", String.valueOf(value)); + return; + } + if (SemanticAttributes.CODE_FUNCTION.getKey().equals(key)) { + telemetryBuilder.addProperty("MethodName", String.valueOf(value)); + return; + } + if (SemanticAttributes.CODE_LINENO.getKey().equals(key)) { + telemetryBuilder.addProperty("LineNumber", String.valueOf(value)); + return; + } if (key.startsWith(JBOSS_LOGGING_MDC_PREFIX)) { telemetryBuilder.addProperty( key.substring(JBOSS_LOGGING_MDC_PREFIX.length()), String.valueOf(value)); From ed95e882b16ee2f77b107fb55b2ff40f4a8c9ab0 Mon Sep 17 00:00:00 2001 From: jeanbisutti Date: Wed, 14 Sep 2022 14:30:18 +0200 Subject: [PATCH 2/7] New test code in comment while waiting for the use of the next OTel instrumentation release --- .../smoketest/TraceLogBackTest.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/smoke-tests/apps/TraceLogBackUsingAgent/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/TraceLogBackTest.java b/smoke-tests/apps/TraceLogBackUsingAgent/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/TraceLogBackTest.java index 1dde1670038..57adf7f9440 100644 --- a/smoke-tests/apps/TraceLogBackUsingAgent/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/TraceLogBackTest.java +++ b/smoke-tests/apps/TraceLogBackUsingAgent/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/TraceLogBackTest.java @@ -60,13 +60,26 @@ void testTraceLogBack() throws Exception { assertThat(md1.getProperties()).containsEntry("LoggerName", "smoketestapp"); assertThat(md1.getProperties()).containsKey("ThreadName"); assertThat(md1.getProperties()).containsEntry("MDC key", "MDC value"); + /* + assertThat(md1.getProperties()).containsEntry("FileName", "SimpleTestTraceLogBackServlet.java"); + assertThat(md1.getProperties()).containsEntry("ClassName", "com.microsoft.applicationinsights.smoketestapp.SimpleTestTraceLogBackServlet"); + assertThat(md1.getProperties()).containsEntry("MethodName", "doGet"); + assertThat(md1.getProperties()).containsEntry("LineNumber", "24"); + assertThat(md1.getProperties()).hasSize(8); + */ assertThat(md1.getProperties()).hasSize(4); - assertThat(md2.getMessage()).isEqualTo("This is logback error."); assertThat(md2.getSeverityLevel()).isEqualTo(SeverityLevel.ERROR); assertThat(md2.getProperties()).containsEntry("SourceType", "Logger"); assertThat(md2.getProperties()).containsEntry("LoggerName", "smoketestapp"); assertThat(md2.getProperties()).containsKey("ThreadName"); + /* + assertThat(md1.getProperties()).containsEntry("FileName", "SimpleTestTraceLogBackServlet.java"); + assertThat(md1.getProperties()).containsEntry("ClassName", "com.microsoft.applicationinsights.smoketestapp.SimpleTestTraceLogBackServlet"); + assertThat(md1.getProperties()).containsEntry("MethodName", "doGet"); + assertThat(md1.getProperties()).containsEntry("LineNumber", "26"); + assertThat(md2.getProperties()).hasSize(7); + */ assertThat(md2.getProperties()).hasSize(3); SmokeTestExtension.assertParentChild( @@ -77,7 +90,7 @@ void testTraceLogBack() throws Exception { @Test @TargetUri("/traceLogBackWithException") - void testTraceLogBackWithExeption() throws Exception { + void testTraceLogBackWithException() throws Exception { List rdList = testing.mockedIngestion.waitForItems("RequestData", 1); Envelope rdEnvelope = rdList.get(0); @@ -101,6 +114,13 @@ void testTraceLogBackWithExeption() throws Exception { assertThat(ed.getProperties()).containsEntry("LoggerName", "smoketestapp"); assertThat(ed.getProperties()).containsKey("ThreadName"); assertThat(ed.getProperties()).containsEntry("MDC key", "MDC value"); + /* + assertThat(ed.getProperties()).containsEntry("FileName", "SimpleTestTraceLogBackWithExceptionServlet.java"); + assertThat(ed.getProperties()).containsEntry("ClassName", "com.microsoft.applicationinsights.smoketestapp.SimpleTestTraceLogBackWithExceptionServlet"); + assertThat(ed.getProperties()).containsEntry("MethodName", "doGet"); + assertThat(ed.getProperties()).containsEntry("LineNumber", "21"); + assertThat(ed.getProperties()).hasSize(9); + */ assertThat(ed.getProperties()).hasSize(5); SmokeTestExtension.assertParentChild( From 3655fdc1d8c3ea200d1ef0f7451af4f5f3250b8e Mon Sep 17 00:00:00 2001 From: jeanbisutti Date: Wed, 14 Sep 2022 15:58:41 +0200 Subject: [PATCH 3/7] Enable the capture of OTel code attributes with a json property --- .../agent/internal/configuration/Configuration.java | 1 + .../agent/internal/init/AiConfigCustomizer.java | 4 ++++ .../src/smokeTest/resources/applicationinsights.json | 3 ++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/Configuration.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/Configuration.java index 4f1af282503..7924488e083 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/Configuration.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/Configuration.java @@ -216,6 +216,7 @@ public static class DatabaseMaskingConfiguration { public static class LoggingInstrumentation { public String level = "INFO"; + public boolean captureCodeAttributes; public Severity getSeverity() { return getSeverity(level); diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/AiConfigCustomizer.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/AiConfigCustomizer.java index 6f8efa9c162..d61b8d3e92b 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/AiConfigCustomizer.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/AiConfigCustomizer.java @@ -252,6 +252,10 @@ private static void enableInstrumentations(Configuration config, Map Date: Thu, 15 Sep 2022 12:45:45 +0200 Subject: [PATCH 4/7] Uncomment assertions --- .../resources/applicationinsights.json | 3 +- .../smoketest/TraceLogBackTest.java | 39 +++++++++++-------- .../resources/applicationinsights.json | 3 +- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/smoke-tests/apps/TraceLogBack/src/smokeTest/resources/applicationinsights.json b/smoke-tests/apps/TraceLogBack/src/smokeTest/resources/applicationinsights.json index ee3d0ce7021..96680a4fd60 100644 --- a/smoke-tests/apps/TraceLogBack/src/smokeTest/resources/applicationinsights.json +++ b/smoke-tests/apps/TraceLogBack/src/smokeTest/resources/applicationinsights.json @@ -8,8 +8,7 @@ }, "instrumentation": { "logging": { - "level": "warn", - "captureCodeAttributes": true + "level": "warn" } } } diff --git a/smoke-tests/apps/TraceLogBackUsingAgent/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/TraceLogBackTest.java b/smoke-tests/apps/TraceLogBackUsingAgent/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/TraceLogBackTest.java index 57adf7f9440..186c698f4e5 100644 --- a/smoke-tests/apps/TraceLogBackUsingAgent/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/TraceLogBackTest.java +++ b/smoke-tests/apps/TraceLogBackUsingAgent/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/TraceLogBackTest.java @@ -60,27 +60,32 @@ void testTraceLogBack() throws Exception { assertThat(md1.getProperties()).containsEntry("LoggerName", "smoketestapp"); assertThat(md1.getProperties()).containsKey("ThreadName"); assertThat(md1.getProperties()).containsEntry("MDC key", "MDC value"); - /* + assertThat(md1.getProperties()).containsEntry("FileName", "SimpleTestTraceLogBackServlet.java"); - assertThat(md1.getProperties()).containsEntry("ClassName", "com.microsoft.applicationinsights.smoketestapp.SimpleTestTraceLogBackServlet"); + assertThat(md1.getProperties()) + .containsEntry( + "ClassName", + "com.microsoft.applicationinsights.smoketestapp.SimpleTestTraceLogBackServlet"); assertThat(md1.getProperties()).containsEntry("MethodName", "doGet"); assertThat(md1.getProperties()).containsEntry("LineNumber", "24"); + assertThat(md1.getProperties()).hasSize(8); - */ - assertThat(md1.getProperties()).hasSize(4); + assertThat(md2.getMessage()).isEqualTo("This is logback error."); assertThat(md2.getSeverityLevel()).isEqualTo(SeverityLevel.ERROR); assertThat(md2.getProperties()).containsEntry("SourceType", "Logger"); assertThat(md2.getProperties()).containsEntry("LoggerName", "smoketestapp"); assertThat(md2.getProperties()).containsKey("ThreadName"); - /* - assertThat(md1.getProperties()).containsEntry("FileName", "SimpleTestTraceLogBackServlet.java"); - assertThat(md1.getProperties()).containsEntry("ClassName", "com.microsoft.applicationinsights.smoketestapp.SimpleTestTraceLogBackServlet"); - assertThat(md1.getProperties()).containsEntry("MethodName", "doGet"); - assertThat(md1.getProperties()).containsEntry("LineNumber", "26"); + + assertThat(md2.getProperties()).containsEntry("FileName", "SimpleTestTraceLogBackServlet.java"); + assertThat(md2.getProperties()) + .containsEntry( + "ClassName", + "com.microsoft.applicationinsights.smoketestapp.SimpleTestTraceLogBackServlet"); + assertThat(md2.getProperties()).containsEntry("MethodName", "doGet"); + assertThat(md2.getProperties()).containsEntry("LineNumber", "26"); + assertThat(md2.getProperties()).hasSize(7); - */ - assertThat(md2.getProperties()).hasSize(3); SmokeTestExtension.assertParentChild( rd, rdEnvelope, mdEnvelope1, "GET /TraceLogBackUsingAgent/traceLogBack"); @@ -114,14 +119,16 @@ void testTraceLogBackWithException() throws Exception { assertThat(ed.getProperties()).containsEntry("LoggerName", "smoketestapp"); assertThat(ed.getProperties()).containsKey("ThreadName"); assertThat(ed.getProperties()).containsEntry("MDC key", "MDC value"); - /* - assertThat(ed.getProperties()).containsEntry("FileName", "SimpleTestTraceLogBackWithExceptionServlet.java"); - assertThat(ed.getProperties()).containsEntry("ClassName", "com.microsoft.applicationinsights.smoketestapp.SimpleTestTraceLogBackWithExceptionServlet"); + + assertThat(ed.getProperties()) + .containsEntry("FileName", "SimpleTestTraceLogBackWithExceptionServlet.java"); + assertThat(ed.getProperties()) + .containsEntry( + "ClassName", + "com.microsoft.applicationinsights.smoketestapp.SimpleTestTraceLogBackWithExceptionServlet"); assertThat(ed.getProperties()).containsEntry("MethodName", "doGet"); assertThat(ed.getProperties()).containsEntry("LineNumber", "21"); assertThat(ed.getProperties()).hasSize(9); - */ - assertThat(ed.getProperties()).hasSize(5); SmokeTestExtension.assertParentChild( rd, rdEnvelope, edEnvelope, "GET /TraceLogBackUsingAgent/traceLogBackWithException"); diff --git a/smoke-tests/apps/TraceLogBackUsingAgent/src/smokeTest/resources/applicationinsights.json b/smoke-tests/apps/TraceLogBackUsingAgent/src/smokeTest/resources/applicationinsights.json index 96680a4fd60..ee3d0ce7021 100644 --- a/smoke-tests/apps/TraceLogBackUsingAgent/src/smokeTest/resources/applicationinsights.json +++ b/smoke-tests/apps/TraceLogBackUsingAgent/src/smokeTest/resources/applicationinsights.json @@ -8,7 +8,8 @@ }, "instrumentation": { "logging": { - "level": "warn" + "level": "warn", + "captureCodeAttributes": true } } } From 4e2a53ca94d2ee4e9588fbf946ab6daf8a1d6433 Mon Sep 17 00:00:00 2001 From: jeanbisutti Date: Thu, 15 Sep 2022 13:12:28 +0200 Subject: [PATCH 5/7] Change json configuration --- .../agent/internal/configuration/Configuration.java | 3 ++- .../agent/internal/init/AiConfigCustomizer.java | 2 +- .../src/smokeTest/resources/applicationinsights.json | 6 ++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/Configuration.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/Configuration.java index 7924488e083..650e74ce6fb 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/Configuration.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/Configuration.java @@ -216,7 +216,6 @@ public static class DatabaseMaskingConfiguration { public static class LoggingInstrumentation { public String level = "INFO"; - public boolean captureCodeAttributes; public Severity getSeverity() { return getSeverity(level); @@ -313,6 +312,8 @@ public static class PreviewConfiguration { // Note: this configuration option will be removed in 4.0.0 public boolean captureLoggingLevelAsCustomDimension; + public boolean captureLogbackCodeAttributes; + // this is to support interoperability with other systems // intentionally not allowing the removal of w3c propagator since that is key to many Azure // integrated experiences diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/AiConfigCustomizer.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/AiConfigCustomizer.java index d61b8d3e92b..e6ff1e0de35 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/AiConfigCustomizer.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/AiConfigCustomizer.java @@ -252,7 +252,7 @@ private static void enableInstrumentations(Configuration config, Map Date: Thu, 15 Sep 2022 13:37:34 +0200 Subject: [PATCH 6/7] Disable verification of logback code attributes for Wildfly --- .../smoketest/TraceLogBackTest.java | 63 +++++++++++++------ 1 file changed, 43 insertions(+), 20 deletions(-) diff --git a/smoke-tests/apps/TraceLogBackUsingAgent/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/TraceLogBackTest.java b/smoke-tests/apps/TraceLogBackUsingAgent/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/TraceLogBackTest.java index 186c698f4e5..cd5dc0cbd15 100644 --- a/smoke-tests/apps/TraceLogBackUsingAgent/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/TraceLogBackTest.java +++ b/smoke-tests/apps/TraceLogBackUsingAgent/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/TraceLogBackTest.java @@ -30,6 +30,10 @@ abstract class TraceLogBackTest { @RegisterExtension static final SmokeTestExtension testing = SmokeTestExtension.create(); + boolean checkLogBackCodeAttributes() { + return true; + } + @Test @TargetUri("/traceLogBack") void testTraceLogBack() throws Exception { @@ -61,15 +65,20 @@ void testTraceLogBack() throws Exception { assertThat(md1.getProperties()).containsKey("ThreadName"); assertThat(md1.getProperties()).containsEntry("MDC key", "MDC value"); - assertThat(md1.getProperties()).containsEntry("FileName", "SimpleTestTraceLogBackServlet.java"); - assertThat(md1.getProperties()) - .containsEntry( - "ClassName", - "com.microsoft.applicationinsights.smoketestapp.SimpleTestTraceLogBackServlet"); - assertThat(md1.getProperties()).containsEntry("MethodName", "doGet"); - assertThat(md1.getProperties()).containsEntry("LineNumber", "24"); - - assertThat(md1.getProperties()).hasSize(8); + if (checkLogBackCodeAttributes()) { + assertThat(md1.getProperties()) + .containsEntry("FileName", "SimpleTestTraceLogBackServlet.java"); + assertThat(md1.getProperties()) + .containsEntry( + "ClassName", + "com.microsoft.applicationinsights.smoketestapp.SimpleTestTraceLogBackServlet"); + assertThat(md1.getProperties()).containsEntry("MethodName", "doGet"); + assertThat(md1.getProperties()).containsEntry("LineNumber", "24"); + + assertThat(md1.getProperties()).hasSize(8); + } else { + assertThat(md1.getProperties()).hasSize(4); + } assertThat(md2.getMessage()).isEqualTo("This is logback error."); assertThat(md2.getSeverityLevel()).isEqualTo(SeverityLevel.ERROR); @@ -120,15 +129,19 @@ void testTraceLogBackWithException() throws Exception { assertThat(ed.getProperties()).containsKey("ThreadName"); assertThat(ed.getProperties()).containsEntry("MDC key", "MDC value"); - assertThat(ed.getProperties()) - .containsEntry("FileName", "SimpleTestTraceLogBackWithExceptionServlet.java"); - assertThat(ed.getProperties()) - .containsEntry( - "ClassName", - "com.microsoft.applicationinsights.smoketestapp.SimpleTestTraceLogBackWithExceptionServlet"); - assertThat(ed.getProperties()).containsEntry("MethodName", "doGet"); - assertThat(ed.getProperties()).containsEntry("LineNumber", "21"); - assertThat(ed.getProperties()).hasSize(9); + if (checkLogBackCodeAttributes()) { + assertThat(ed.getProperties()) + .containsEntry("FileName", "SimpleTestTraceLogBackWithExceptionServlet.java"); + assertThat(ed.getProperties()) + .containsEntry( + "ClassName", + "com.microsoft.applicationinsights.smoketestapp.SimpleTestTraceLogBackWithExceptionServlet"); + assertThat(ed.getProperties()).containsEntry("MethodName", "doGet"); + assertThat(ed.getProperties()).containsEntry("LineNumber", "21"); + assertThat(ed.getProperties()).hasSize(9); + } else { + assertThat(ed.getProperties()).hasSize(5); + } SmokeTestExtension.assertParentChild( rd, rdEnvelope, edEnvelope, "GET /TraceLogBackUsingAgent/traceLogBackWithException"); @@ -156,8 +169,18 @@ static class Tomcat8Java18Test extends TraceLogBackTest {} static class Tomcat8Java19Test extends TraceLogBackTest {} @Environment(WILDFLY_13_JAVA_8) - static class Wildfly13Java8Test extends TraceLogBackTest {} + static class Wildfly13Java8Test extends TraceLogBackTest { + @Override + boolean checkLogBackCodeAttributes() { + return false; + } + } @Environment(WILDFLY_13_JAVA_8_OPENJ9) - static class Wildfly13Java8OpenJ9Test extends TraceLogBackTest {} + static class Wildfly13Java8OpenJ9Test extends TraceLogBackTest { + @Override + boolean checkLogBackCodeAttributes() { + return false; + } + } } From 35165ee89f58c73f943f3c88d0cee3eba204540c Mon Sep 17 00:00:00 2001 From: jeanbisutti Date: Thu, 15 Sep 2022 13:49:48 +0200 Subject: [PATCH 7/7] Disable verification of logback code attributes for Wildfly --- .../smoketest/TraceLogBackTest.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/smoke-tests/apps/TraceLogBackUsingAgent/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/TraceLogBackTest.java b/smoke-tests/apps/TraceLogBackUsingAgent/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/TraceLogBackTest.java index cd5dc0cbd15..9f0002e6476 100644 --- a/smoke-tests/apps/TraceLogBackUsingAgent/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/TraceLogBackTest.java +++ b/smoke-tests/apps/TraceLogBackUsingAgent/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/TraceLogBackTest.java @@ -86,15 +86,20 @@ void testTraceLogBack() throws Exception { assertThat(md2.getProperties()).containsEntry("LoggerName", "smoketestapp"); assertThat(md2.getProperties()).containsKey("ThreadName"); - assertThat(md2.getProperties()).containsEntry("FileName", "SimpleTestTraceLogBackServlet.java"); - assertThat(md2.getProperties()) - .containsEntry( - "ClassName", - "com.microsoft.applicationinsights.smoketestapp.SimpleTestTraceLogBackServlet"); - assertThat(md2.getProperties()).containsEntry("MethodName", "doGet"); - assertThat(md2.getProperties()).containsEntry("LineNumber", "26"); - - assertThat(md2.getProperties()).hasSize(7); + if (checkLogBackCodeAttributes()) { + assertThat(md2.getProperties()) + .containsEntry("FileName", "SimpleTestTraceLogBackServlet.java"); + assertThat(md2.getProperties()) + .containsEntry( + "ClassName", + "com.microsoft.applicationinsights.smoketestapp.SimpleTestTraceLogBackServlet"); + assertThat(md2.getProperties()).containsEntry("MethodName", "doGet"); + assertThat(md2.getProperties()).containsEntry("LineNumber", "26"); + + assertThat(md2.getProperties()).hasSize(7); + } else { + assertThat(md2.getProperties()).hasSize(3); + } SmokeTestExtension.assertParentChild( rd, rdEnvelope, mdEnvelope1, "GET /TraceLogBackUsingAgent/traceLogBack");