From 8d5ea3c43da7f7094437b5d540909f25f44ffe01 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 29 Aug 2025 11:07:00 -0700 Subject: [PATCH 01/31] enduser.id and enduser.pseudo.id --- .../applicationinsightsweb/UserContextInstrumentation.java | 2 +- .../src/test/java/ApplicationInsightsWebTest.java | 2 +- .../applicationinsights/smoketestapp/TestController.java | 1 + .../OpenTelemetryApiSupportControllerSpansEnabledTest.java | 3 ++- .../smoketest/OpenTelemetryApiSupportTest.java | 3 ++- 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/agent/instrumentation/applicationinsights-web-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/applicationinsightsweb/UserContextInstrumentation.java b/agent/instrumentation/applicationinsights-web-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/applicationinsightsweb/UserContextInstrumentation.java index adeec540796..6363d883040 100644 --- a/agent/instrumentation/applicationinsights-web-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/applicationinsightsweb/UserContextInstrumentation.java +++ b/agent/instrumentation/applicationinsights-web-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/applicationinsightsweb/UserContextInstrumentation.java @@ -43,7 +43,7 @@ public static void methodEnter( @Advice.This UserContext userContext, @Advice.Argument(0) String name) { Span span = VirtualField.find(UserContext.class, Span.class).get(userContext); if (span != null) { - span.setAttribute("enduser.id", name); + span.setAttribute("enduser.pseudo.id", name); } } } diff --git a/agent/instrumentation/applicationinsights-web-2.3/src/test/java/ApplicationInsightsWebTest.java b/agent/instrumentation/applicationinsights-web-2.3/src/test/java/ApplicationInsightsWebTest.java index b7d0e1a2c0c..a8064d8ae83 100644 --- a/agent/instrumentation/applicationinsights-web-2.3/src/test/java/ApplicationInsightsWebTest.java +++ b/agent/instrumentation/applicationinsights-web-2.3/src/test/java/ApplicationInsightsWebTest.java @@ -69,7 +69,7 @@ void setRequestUser() { .hasAttributesSatisfyingExactly( equalTo(CodeIncubatingAttributes.CODE_NAMESPACE, "Code"), equalTo(CodeIncubatingAttributes.CODE_FUNCTION, "setUser"), - equalTo(EnduserIncubatingAttributes.ENDUSER_ID, "myuser")), + equalTo(EnduserIncubatingAttributes.ENDUSER_PSEUDO_ID, "myuser")), span -> span.hasName("Code.internalSetUser") .hasKind(INTERNAL) diff --git a/smoke-tests/apps/OpenTelemetryApiSupport/src/main/java/com/microsoft/applicationinsights/smoketestapp/TestController.java b/smoke-tests/apps/OpenTelemetryApiSupport/src/main/java/com/microsoft/applicationinsights/smoketestapp/TestController.java index f4e1ff7b1b0..3b98166641c 100644 --- a/smoke-tests/apps/OpenTelemetryApiSupport/src/main/java/com/microsoft/applicationinsights/smoketestapp/TestController.java +++ b/smoke-tests/apps/OpenTelemetryApiSupport/src/main/java/com/microsoft/applicationinsights/smoketestapp/TestController.java @@ -20,6 +20,7 @@ public String testApi() { Span.current().setAttribute("myattr1", "myvalue1"); Span.current().setAttribute("myattr2", "myvalue2"); Span.current().setAttribute("enduser.id", "myuser"); + Span.current().setAttribute("enduser.pseudo.id", "mypseudo"); Span.current().updateName("myspanname"); return "OK!"; } diff --git a/smoke-tests/apps/OpenTelemetryApiSupport/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryApiSupportControllerSpansEnabledTest.java b/smoke-tests/apps/OpenTelemetryApiSupport/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryApiSupportControllerSpansEnabledTest.java index 1bc05995639..5b61d008f7a 100644 --- a/smoke-tests/apps/OpenTelemetryApiSupport/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryApiSupportControllerSpansEnabledTest.java +++ b/smoke-tests/apps/OpenTelemetryApiSupport/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryApiSupportControllerSpansEnabledTest.java @@ -54,7 +54,8 @@ void testApi() throws Exception { .isEqualTo("testroleinstance"); assertThat(telemetry.rddEnvelope1.getTags()) .hasEntrySatisfying("ai.internal.sdkVersion", v -> assertThat(v).startsWith("java:3.")); - assertThat(telemetry.rddEnvelope1.getTags()).containsEntry("ai.user.id", "myuser"); + assertThat(telemetry.rddEnvelope1.getTags()).containsEntry("ai.user.authUserId", "myuser"); + assertThat(telemetry.rddEnvelope1.getTags()).containsEntry("ai.user.id", "mypseudo"); SmokeTestExtension.assertParentChild( telemetry.rd, diff --git a/smoke-tests/apps/OpenTelemetryApiSupport/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryApiSupportTest.java b/smoke-tests/apps/OpenTelemetryApiSupport/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryApiSupportTest.java index 0953e282707..04d78068b95 100644 --- a/smoke-tests/apps/OpenTelemetryApiSupport/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryApiSupportTest.java +++ b/smoke-tests/apps/OpenTelemetryApiSupport/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryApiSupportTest.java @@ -50,7 +50,8 @@ void testApi() throws Exception { assertThat(telemetry.rdEnvelope.getTags()) .hasEntrySatisfying("ai.internal.sdkVersion", v -> assertThat(v).startsWith("java:3.")); - assertThat(telemetry.rdEnvelope.getTags()).containsEntry("ai.user.id", "myuser"); + assertThat(telemetry.rdEnvelope.getTags()).containsEntry("ai.user.authUserId", "myuser"); + assertThat(telemetry.rdEnvelope.getTags()).containsEntry("ai.user.id", "mypseudo"); } @Test From 8e06ec70d76cca5ecbfafb68cc28abef3d9fea1b Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Thu, 28 Aug 2025 12:28:50 -0700 Subject: [PATCH 02/31] session.id --- .../applicationinsights/smoketestapp/TestController.java | 1 + .../OpenTelemetryApiSupportControllerSpansEnabledTest.java | 1 + .../smoketest/OpenTelemetryApiSupportTest.java | 1 + 3 files changed, 3 insertions(+) diff --git a/smoke-tests/apps/OpenTelemetryApiSupport/src/main/java/com/microsoft/applicationinsights/smoketestapp/TestController.java b/smoke-tests/apps/OpenTelemetryApiSupport/src/main/java/com/microsoft/applicationinsights/smoketestapp/TestController.java index 3b98166641c..bf59ec2117e 100644 --- a/smoke-tests/apps/OpenTelemetryApiSupport/src/main/java/com/microsoft/applicationinsights/smoketestapp/TestController.java +++ b/smoke-tests/apps/OpenTelemetryApiSupport/src/main/java/com/microsoft/applicationinsights/smoketestapp/TestController.java @@ -21,6 +21,7 @@ public String testApi() { Span.current().setAttribute("myattr2", "myvalue2"); Span.current().setAttribute("enduser.id", "myuser"); Span.current().setAttribute("enduser.pseudo.id", "mypseudo"); + Span.current().setAttribute("session.id", "mysession"); Span.current().updateName("myspanname"); return "OK!"; } diff --git a/smoke-tests/apps/OpenTelemetryApiSupport/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryApiSupportControllerSpansEnabledTest.java b/smoke-tests/apps/OpenTelemetryApiSupport/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryApiSupportControllerSpansEnabledTest.java index 5b61d008f7a..5d5578e3218 100644 --- a/smoke-tests/apps/OpenTelemetryApiSupport/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryApiSupportControllerSpansEnabledTest.java +++ b/smoke-tests/apps/OpenTelemetryApiSupport/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryApiSupportControllerSpansEnabledTest.java @@ -56,6 +56,7 @@ void testApi() throws Exception { .hasEntrySatisfying("ai.internal.sdkVersion", v -> assertThat(v).startsWith("java:3.")); assertThat(telemetry.rddEnvelope1.getTags()).containsEntry("ai.user.authUserId", "myuser"); assertThat(telemetry.rddEnvelope1.getTags()).containsEntry("ai.user.id", "mypseudo"); + assertThat(telemetry.rddEnvelope1.getTags()).containsEntry("ai.session.id", "mysession"); SmokeTestExtension.assertParentChild( telemetry.rd, diff --git a/smoke-tests/apps/OpenTelemetryApiSupport/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryApiSupportTest.java b/smoke-tests/apps/OpenTelemetryApiSupport/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryApiSupportTest.java index 04d78068b95..bb90b290cec 100644 --- a/smoke-tests/apps/OpenTelemetryApiSupport/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryApiSupportTest.java +++ b/smoke-tests/apps/OpenTelemetryApiSupport/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryApiSupportTest.java @@ -52,6 +52,7 @@ void testApi() throws Exception { .hasEntrySatisfying("ai.internal.sdkVersion", v -> assertThat(v).startsWith("java:3.")); assertThat(telemetry.rdEnvelope.getTags()).containsEntry("ai.user.authUserId", "myuser"); assertThat(telemetry.rdEnvelope.getTags()).containsEntry("ai.user.id", "mypseudo"); + assertThat(telemetry.rdEnvelope.getTags()).containsEntry("ai.session.id", "mysession"); } @Test From 54db0e91fc50c9cef9546045a890b8a7723dd7e5 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 29 Aug 2025 10:42:35 -0700 Subject: [PATCH 03/31] Remove dependency on autoconfigure SemanticAttributes copy --- .../configuration/ConfigurationBuilder.java | 60 ++++++++++--------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilder.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilder.java index a420aebe94b..ed66c6aa00f 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilder.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/configuration/ConfigurationBuilder.java @@ -3,7 +3,6 @@ package com.microsoft.applicationinsights.agent.internal.configuration; -import com.azure.monitor.opentelemetry.autoconfigure.implementation.SemanticAttributes; import com.azure.monitor.opentelemetry.autoconfigure.implementation.statsbeat.RpAttachType; import com.azure.monitor.opentelemetry.autoconfigure.implementation.utils.HostName; import com.azure.monitor.opentelemetry.autoconfigure.implementation.utils.Strings; @@ -22,6 +21,13 @@ import com.microsoft.applicationinsights.agent.internal.configuration.Configuration.SamplingOverride; import com.microsoft.applicationinsights.agent.internal.diagnostics.DiagnosticsHelper; import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.semconv.ClientAttributes; +import io.opentelemetry.semconv.HttpAttributes; +import io.opentelemetry.semconv.NetworkAttributes; +import io.opentelemetry.semconv.ServerAttributes; +import io.opentelemetry.semconv.UrlAttributes; +import io.opentelemetry.semconv.incubating.HttpIncubatingAttributes; +import io.opentelemetry.semconv.incubating.NetIncubatingAttributes; import java.io.IOException; import java.net.URL; import java.net.URLDecoder; @@ -359,44 +365,44 @@ private static void supportTelemetryProcessorsOldSemConv(Configuration config) { private static String mapAttributeKey(String oldAttributeKey) { String result = null; // Common attributes across HTTP client and server spans - if (oldAttributeKey.equals(SemanticAttributes.HTTP_METHOD.getKey())) { - result = SemanticAttributes.HTTP_REQUEST_METHOD.getKey(); - } else if (oldAttributeKey.equals(SemanticAttributes.HTTP_STATUS_CODE.getKey())) { - result = SemanticAttributes.HTTP_RESPONSE_STATUS_CODE.getKey(); + if (oldAttributeKey.equals(HttpIncubatingAttributes.HTTP_METHOD.getKey())) { + result = HttpAttributes.HTTP_REQUEST_METHOD.getKey(); + } else if (oldAttributeKey.equals(HttpIncubatingAttributes.HTTP_STATUS_CODE.getKey())) { + result = HttpAttributes.HTTP_RESPONSE_STATUS_CODE.getKey(); } else if (oldAttributeKey.startsWith("http.request.header.") || oldAttributeKey.startsWith("http.response.header.")) { result = oldAttributeKey.replace('_', '-'); - } else if (oldAttributeKey.equals(SemanticAttributes.NET_PROTOCOL_NAME.getKey())) { - result = SemanticAttributes.NETWORK_PROTOCOL_NAME.getKey(); - } else if (oldAttributeKey.equals(SemanticAttributes.NET_PROTOCOL_VERSION.getKey())) { - result = SemanticAttributes.NETWORK_PROTOCOL_VERSION.getKey(); - } else if (oldAttributeKey.equals(SemanticAttributes.NET_SOCK_PEER_ADDR.getKey())) { - result = SemanticAttributes.NETWORK_PEER_ADDRESS.getKey(); - } else if (oldAttributeKey.equals(SemanticAttributes.NET_SOCK_PEER_PORT.getKey())) { - result = SemanticAttributes.NETWORK_PEER_PORT.getKey(); + } else if (oldAttributeKey.equals(NetIncubatingAttributes.NET_PROTOCOL_NAME.getKey())) { + result = NetworkAttributes.NETWORK_PROTOCOL_NAME.getKey(); + } else if (oldAttributeKey.equals(NetIncubatingAttributes.NET_PROTOCOL_VERSION.getKey())) { + result = NetworkAttributes.NETWORK_PROTOCOL_VERSION.getKey(); + } else if (oldAttributeKey.equals(NetIncubatingAttributes.NET_SOCK_PEER_ADDR.getKey())) { + result = NetworkAttributes.NETWORK_PEER_ADDRESS.getKey(); + } else if (oldAttributeKey.equals(NetIncubatingAttributes.NET_SOCK_PEER_PORT.getKey())) { + result = NetworkAttributes.NETWORK_PEER_PORT.getKey(); } // HTTP client span attributes // http.url is handled via LazyHttpUrl - if (oldAttributeKey.equals(SemanticAttributes.HTTP_RESEND_COUNT.getKey())) { - result = SemanticAttributes.HTTP_REQUEST_RESEND_COUNT.getKey(); + if (oldAttributeKey.equals("http.resend_count")) { + result = HttpAttributes.HTTP_REQUEST_RESEND_COUNT.getKey(); // becomes available. - } else if (oldAttributeKey.equals(SemanticAttributes.NET_PEER_NAME.getKey())) { - result = SemanticAttributes.SERVER_ADDRESS.getKey(); - } else if (oldAttributeKey.equals(SemanticAttributes.NET_PEER_PORT.getKey())) { - result = SemanticAttributes.SERVER_PORT.getKey(); + } else if (oldAttributeKey.equals(NetIncubatingAttributes.NET_PEER_NAME.getKey())) { + result = ServerAttributes.SERVER_ADDRESS.getKey(); + } else if (oldAttributeKey.equals(NetIncubatingAttributes.NET_PEER_PORT.getKey())) { + result = ServerAttributes.SERVER_PORT.getKey(); } // HTTP server span attributes // http.target is handled via LazyHttpTarget - if (oldAttributeKey.equals(SemanticAttributes.HTTP_SCHEME.getKey())) { - result = SemanticAttributes.URL_SCHEME.getKey(); - } else if (oldAttributeKey.equals(SemanticAttributes.HTTP_CLIENT_IP.getKey())) { - result = SemanticAttributes.CLIENT_ADDRESS.getKey(); - } else if (oldAttributeKey.equals(SemanticAttributes.NET_HOST_NAME.getKey())) { - result = SemanticAttributes.SERVER_ADDRESS.getKey(); - } else if (oldAttributeKey.equals(SemanticAttributes.NET_HOST_PORT.getKey())) { - result = SemanticAttributes.SERVER_PORT.getKey(); + if (oldAttributeKey.equals(HttpIncubatingAttributes.HTTP_SCHEME.getKey())) { + result = UrlAttributes.URL_SCHEME.getKey(); + } else if (oldAttributeKey.equals(HttpIncubatingAttributes.HTTP_CLIENT_IP.getKey())) { + result = ClientAttributes.CLIENT_ADDRESS.getKey(); + } else if (oldAttributeKey.equals(NetIncubatingAttributes.NET_HOST_NAME.getKey())) { + result = ServerAttributes.SERVER_ADDRESS.getKey(); + } else if (oldAttributeKey.equals(NetIncubatingAttributes.NET_HOST_PORT.getKey())) { + result = ServerAttributes.SERVER_PORT.getKey(); } if (result == null) { From b86ed3e58ae35a369a3511db8faf17e5b9f754bd Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 29 Aug 2025 11:05:29 -0700 Subject: [PATCH 04/31] Update to Azure SDK latest snapshot --- .github/workflows/build-common.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-common.yml b/.github/workflows/build-common.yml index 3a744dcb52c..c01397f634a 100644 --- a/.github/workflows/build-common.yml +++ b/.github/workflows/build-common.yml @@ -10,7 +10,7 @@ on: env: # set this to : to build and test with an unreleased # version of the azure-monitor-opentelemetry-autoconfigure dependency - AZURE_MONITOR_OPENTELEMETRY_AUTOCONFIGURE_SNAPSHOT: + AZURE_MONITOR_OPENTELEMETRY_AUTOCONFIGURE_SNAPSHOT: trask/azure-sdk-for-java:semconv2 jobs: spotless: From 18c760b2067895168405c7bb1864b63f835db228 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 19 Sep 2025 17:44:34 -0700 Subject: [PATCH 05/31] test --- .github/workflows/build-common.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-common.yml b/.github/workflows/build-common.yml index c01397f634a..15bf7e63633 100644 --- a/.github/workflows/build-common.yml +++ b/.github/workflows/build-common.yml @@ -10,7 +10,7 @@ on: env: # set this to : to build and test with an unreleased # version of the azure-monitor-opentelemetry-autoconfigure dependency - AZURE_MONITOR_OPENTELEMETRY_AUTOCONFIGURE_SNAPSHOT: trask/azure-sdk-for-java:semconv2 + AZURE_MONITOR_OPENTELEMETRY_AUTOCONFIGURE_SNAPSHOT: Azure/azure-sdk-for-java:main jobs: spotless: From b4110a52658983efd1256123227e00e028f6718e Mon Sep 17 00:00:00 2001 From: Harsimar Kaur Date: Thu, 11 Sep 2025 16:52:50 -0700 Subject: [PATCH 06/31] check for exporter env vars and pass to metricdatamapper --- .../agent/internal/init/SecondEntryPoint.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java index bce668a9aa2..89d54c11760 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java @@ -69,6 +69,7 @@ import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder; import io.opentelemetry.sdk.trace.export.SpanExporter; import io.opentelemetry.sdk.trace.samplers.SamplingDecision; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.io.File; import java.util.ArrayList; import java.util.Collections; @@ -274,7 +275,7 @@ public void customize(AutoConfigurationCustomizer autoConfiguration) { (metricExporter, configProperties) -> { if (metricExporter instanceof AzureMonitorMetricExporterProvider.MarkerMetricExporter) { - return buildMetricExporter(configuration, telemetryClient, metricFilters); + return buildMetricExporter(configuration, telemetryClient, metricFilters, configProperties); } else { return metricExporter; } @@ -365,10 +366,16 @@ private static SpanExporter buildTraceExporter( private static MetricExporter buildMetricExporter( Configuration configuration, TelemetryClient telemetryClient, - List metricFilters) { + List metricFilters, ConfigProperties configProperties) { + + String otelMetricsEndpoint = configProperties.getString("otel.metrics.exporter.otlp.endpoint"); + String otelMetricsExporter = configProperties.getString("otel.metrics.exporter"); + boolean otlpEnabled = (otelMetricsExporter != null && !otelMetricsExporter.isEmpty()) && + (otelMetricsEndpoint != null && !otelMetricsEndpoint.isEmpty()); + MetricDataMapper mapper = new MetricDataMapper( - telemetryClient::populateDefaults, configuration.preview.captureHttpServer4xxAsError); + telemetryClient::populateDefaults, configuration.preview.captureHttpServer4xxAsError, otlpEnabled); return new AgentMetricExporter( metricFilters, mapper, telemetryClient.getMetricsBatchItemProcessor()); } From 69ddfdaf78a2478a868a3af2b50f93eed9ab3148 Mon Sep 17 00:00:00 2001 From: Harsimar Kaur Date: Fri, 12 Sep 2025 15:41:01 -0700 Subject: [PATCH 07/31] still need to test these changes & build upon update sdk pr --- agent/agent-tooling/build.gradle.kts | 2 +- agent/agent-tooling/gradle.lockfile | 2 +- .../agent/internal/init/SecondEntryPoint.java | 8 +++++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/agent/agent-tooling/build.gradle.kts b/agent/agent-tooling/build.gradle.kts index 994836679dc..7d5a4760970 100644 --- a/agent/agent-tooling/build.gradle.kts +++ b/agent/agent-tooling/build.gradle.kts @@ -21,7 +21,7 @@ dependencies { implementation(project(":agent:agent-profiler:agent-diagnostics")) implementation(project(":etw:java")) - implementation("com.azure:azure-monitor-opentelemetry-autoconfigure:1.3.0") + implementation("com.azure:azure-monitor-opentelemetry-autoconfigure:1.4.0-beta.1") compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-bootstrap") compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling") compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling-java9") diff --git a/agent/agent-tooling/gradle.lockfile b/agent/agent-tooling/gradle.lockfile index 873ebbce122..47438e08e76 100644 --- a/agent/agent-tooling/gradle.lockfile +++ b/agent/agent-tooling/gradle.lockfile @@ -9,7 +9,7 @@ com.azure:azure-core-http-netty:1.16.0=runtimeClasspath com.azure:azure-core:1.56.0=runtimeClasspath com.azure:azure-identity:1.17.0=runtimeClasspath com.azure:azure-json:1.5.0=runtimeClasspath -com.azure:azure-monitor-opentelemetry-autoconfigure:1.3.0=runtimeClasspath +com.azure:azure-monitor-opentelemetry-autoconfigure:1.4.0-beta.1=runtimeClasspath com.azure:azure-sdk-bom:1.2.38=runtimeClasspath com.azure:azure-storage-blob:12.31.2=runtimeClasspath com.azure:azure-storage-common:12.30.2=runtimeClasspath diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java index 89d54c11760..16d800a4690 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java @@ -91,6 +91,9 @@ public class SecondEntryPoint new ClientLogger("com.microsoft.applicationinsights.agent"); private static File tempDir; + private static final String METRICS_TO_LOG_ANALYTICS_ENABLED = + "APPLICATIONINSIGHTS_METRICS_TO_LOGANALYTICS_ENABLED"; + @Nullable private static AzureMonitorLogFilteringProcessor logFilteringProcessor; static File getTempDir() { @@ -372,10 +375,13 @@ private static MetricExporter buildMetricExporter( String otelMetricsExporter = configProperties.getString("otel.metrics.exporter"); boolean otlpEnabled = (otelMetricsExporter != null && !otelMetricsExporter.isEmpty()) && (otelMetricsEndpoint != null && !otelMetricsEndpoint.isEmpty()); + + String metricsToLAEnvVar = System.getenv(METRICS_TO_LOG_ANALYTICS_ENABLED); + boolean metricsToLAEnabled = metricsToLAEnvVar == null || "true".equalsIgnoreCase(metricsToLAEnvVar); MetricDataMapper mapper = new MetricDataMapper( - telemetryClient::populateDefaults, configuration.preview.captureHttpServer4xxAsError, otlpEnabled); + telemetryClient::populateDefaults, configuration.preview.captureHttpServer4xxAsError, otlpEnabled, metricsToLAEnabled); return new AgentMetricExporter( metricFilters, mapper, telemetryClient.getMetricsBatchItemProcessor()); } From a262c54ecb2d011273edaf8b287dfd4077c3e7cf Mon Sep 17 00:00:00 2001 From: Harsimar Kaur Date: Mon, 15 Sep 2025 17:24:09 -0700 Subject: [PATCH 08/31] fixing some existing tests (not done yet), merge in sdk update change for testing --- .../agent/internal/init/SecondEntryPoint.java | 12 +++++------- ...re-monitor-opentelemetry-autoconfigure.properties | 2 ++ .../smoketest/HttpPreaggregatedMetricsTest.java | 5 +++-- .../smoketest/OpenTelemetryMetricTest.java | 3 +++ 4 files changed, 13 insertions(+), 9 deletions(-) create mode 100644 inst/azure-monitor-opentelemetry-autoconfigure.properties diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java index 16d800a4690..2c1b6260580 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java @@ -90,9 +90,7 @@ public class SecondEntryPoint private static final ClientLogger startupLogger = new ClientLogger("com.microsoft.applicationinsights.agent"); private static File tempDir; - - private static final String METRICS_TO_LOG_ANALYTICS_ENABLED = - "APPLICATIONINSIGHTS_METRICS_TO_LOGANALYTICS_ENABLED"; + private static final String SENT_TO_AMW = "SENT_TO_AMW"; @Nullable private static AzureMonitorLogFilteringProcessor logFilteringProcessor; @@ -376,12 +374,12 @@ private static MetricExporter buildMetricExporter( boolean otlpEnabled = (otelMetricsExporter != null && !otelMetricsExporter.isEmpty()) && (otelMetricsEndpoint != null && !otelMetricsEndpoint.isEmpty()); - String metricsToLAEnvVar = System.getenv(METRICS_TO_LOG_ANALYTICS_ENABLED); - boolean metricsToLAEnabled = metricsToLAEnvVar == null || "true".equalsIgnoreCase(metricsToLAEnvVar); - + // Set system property that MetricDataMapper can read + System.setProperty(SENT_TO_AMW, Boolean.toString(otlpEnabled)); + MetricDataMapper mapper = new MetricDataMapper( - telemetryClient::populateDefaults, configuration.preview.captureHttpServer4xxAsError, otlpEnabled, metricsToLAEnabled); + telemetryClient::populateDefaults, configuration.preview.captureHttpServer4xxAsError); return new AgentMetricExporter( metricFilters, mapper, telemetryClient.getMetricsBatchItemProcessor()); } diff --git a/inst/azure-monitor-opentelemetry-autoconfigure.properties b/inst/azure-monitor-opentelemetry-autoconfigure.properties new file mode 100644 index 00000000000..d3c7ef8fa1b --- /dev/null +++ b/inst/azure-monitor-opentelemetry-autoconfigure.properties @@ -0,0 +1,2 @@ +name=azure-monitor-opentelemetry-autoconfigure +version=1.4.0-beta.1 diff --git a/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTest.java b/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTest.java index 80423e435e8..cb565880b1b 100644 --- a/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTest.java +++ b/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTest.java @@ -175,7 +175,7 @@ private static void validateMetricData( String expectedSuccess = Integer.parseInt(resultCode) < 400 ? "True" : "False"; Map properties = metricData.getProperties(); if ("client".equals(type)) { - assertThat(properties).hasSize(9); + assertThat(properties).hasSize(10); assertThat(properties.get("_MS.MetricId")).isEqualTo("dependencies/duration"); assertThat(properties.get("dependency/resultCode")).isEqualTo(resultCode); assertThat(properties.get("Dependency.Success")).isEqualTo(expectedSuccess); @@ -184,7 +184,7 @@ private static void validateMetricData( assertThat(properties.get("Dependency.Type")).isEqualTo("Http"); assertThat(properties.get("operation/synthetic")).isEqualTo("False"); } else { - assertThat(properties).hasSize(7); + assertThat(properties).hasSize(8); assertThat(properties.get("_MS.MetricId")).isEqualTo("requests/duration"); assertThat(properties.get("request/resultCode")).isEqualTo(resultCode); assertThat(properties.get("Request.Success")).isEqualTo(expectedSuccess); @@ -193,6 +193,7 @@ private static void validateMetricData( assertThat(properties.get("cloud/roleInstance")).isEqualTo("testroleinstance"); assertThat(properties.get("cloud/roleName")).isEqualTo("testrolename"); assertThat(properties.get("_MS.IsAutocollected")).isEqualTo("True"); + assertThat(properties.get("_MS.SentToAMW")).isEqualTo("false"); } @Environment(TOMCAT_8_JAVA_8) diff --git a/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTest.java b/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTest.java index a6e935361fe..f8039a34cf5 100644 --- a/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTest.java +++ b/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTest.java @@ -189,6 +189,7 @@ private void validateCounterMetric(String name) throws Exception { assertThat(properties1).containsEntry("tag2", "def"); assertThat(properties1).containsEntry("name", "apple"); assertThat(properties1).containsEntry("color", "green"); + assertThat(properties1).containsEntry("_MS.SentToAMW", "false"); // validate tags Map tags2 = envelope2.getTags(); @@ -211,6 +212,7 @@ private void validateCounterMetric(String name) throws Exception { assertThat(properties2).containsEntry("tag2", "def"); assertThat(properties2).containsEntry("name", "apple"); assertThat(properties2).containsEntry("color", "red"); + assertThat(properties2).containsEntry("_MS.SentToAMW", "false"); // validate tags Map tags3 = envelope3.getTags(); @@ -233,6 +235,7 @@ private void validateCounterMetric(String name) throws Exception { assertThat(properties3).containsEntry("tag2", "def"); assertThat(properties3).containsEntry("name", "lemon"); assertThat(properties3).containsEntry("color", "yellow"); + assertThat(properties3).containsEntry("_MS.SentToAMW", "false"); } @Environment(TOMCAT_8_JAVA_8) From 18253f6ff4447bbda94448be45414e5e47713837 Mon Sep 17 00:00:00 2001 From: Harsimar Kaur Date: Tue, 16 Sep 2025 09:42:11 -0700 Subject: [PATCH 09/31] add one test, it is currently failing --- .../agent/internal/init/SecondEntryPoint.java | 2 +- .../apps/OpenTelemetryMetric/build.gradle.kts | 4 + .../OpenTelemetryMetricTestToAmw.java | 202 ++++++++++++++++++ ...sWithRoleNameOverridesAndSamplingTest.java | 5 +- .../smoketest/SmokeTestExtension.java | 15 +- .../smoketest/SmokeTestExtensionBuilder.java | 9 +- 6 files changed, 230 insertions(+), 7 deletions(-) create mode 100644 smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java index 2c1b6260580..3725ab47dba 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java @@ -90,7 +90,7 @@ public class SecondEntryPoint private static final ClientLogger startupLogger = new ClientLogger("com.microsoft.applicationinsights.agent"); private static File tempDir; - private static final String SENT_TO_AMW = "SENT_TO_AMW"; + private static final String SENT_TO_AMW = "sent.to.amw"; @Nullable private static AzureMonitorLogFilteringProcessor logFilteringProcessor; diff --git a/smoke-tests/apps/OpenTelemetryMetric/build.gradle.kts b/smoke-tests/apps/OpenTelemetryMetric/build.gradle.kts index 49822a2d9f6..ad3eb90c4df 100644 --- a/smoke-tests/apps/OpenTelemetryMetric/build.gradle.kts +++ b/smoke-tests/apps/OpenTelemetryMetric/build.gradle.kts @@ -7,6 +7,10 @@ dependencies { exclude("org.springframework.boot", "spring-boot-starter-tomcat") } implementation("io.opentelemetry:opentelemetry-api:1.12.0") + + smokeTestImplementation("org.mock-server:mockserver-netty:5.15.0:shaded") + smokeTestImplementation("org.awaitility:awaitility:4.2.0") + smokeTestImplementation("io.opentelemetry.proto:opentelemetry-proto:0.14.0-alpha") } configurations.all { diff --git a/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java b/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java new file mode 100644 index 00000000000..d9503268923 --- /dev/null +++ b/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java @@ -0,0 +1,202 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.microsoft.applicationinsights.smoketest; + +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_11; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_11_OPENJ9; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_17; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_17_OPENJ9; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_21; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_21_OPENJ9; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_23; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_23_OPENJ9; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_8; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_8_OPENJ9; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.WILDFLY_13_JAVA_8; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.WILDFLY_13_JAVA_8_OPENJ9; +import static java.util.concurrent.TimeUnit.SECONDS; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockserver.model.HttpRequest.request; +import static org.testcontainers.shaded.org.awaitility.Awaitility.await; + +import com.microsoft.applicationinsights.smoketest.schemav2.Data; +import com.microsoft.applicationinsights.smoketest.schemav2.DataPoint; +import com.microsoft.applicationinsights.smoketest.schemav2.Envelope; +import com.microsoft.applicationinsights.smoketest.schemav2.MetricData; +import com.microsoft.applicationinsights.smoketest.schemav2.RequestData; +import io.opentelemetry.proto.metrics.v1.Metric; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.mockserver.model.HttpRequest; + +@UseAgent +abstract class OpenTelemetryMetricTestToAmw { + + @RegisterExtension + static final SmokeTestExtension testing = SmokeTestExtension.builder() + .useOtlpViaEnvVars() + .build(); + + @Test + @TargetUri("/trackDoubleCounterMetric") + void trackDoubleCounterMetric() throws Exception { + validateCounterMetric("trackDoubleCounterMetric"); + validateOtlpMetricsReceived("trackDoubleCounterMetric"); + } + + private void validateCounterMetric(String name) throws Exception { + List rdList = testing.mockedIngestion.waitForItems("RequestData", 1); + List metrics = testing.mockedIngestion.waitForMetricItems(name, 3); + + metrics.sort( + Comparator.comparing( + obj -> { + MetricData metricData = (MetricData) ((Data) obj.getData()).getBaseData(); + List dataPointList = metricData.getMetrics(); + DataPoint dataPoint = dataPointList.get(0); + return dataPoint.getValue(); + })); + + Envelope rdEnvelope = rdList.get(0); + RequestData rd = (RequestData) ((Data) rdEnvelope.getData()).getBaseData(); + assertThat(rd.getName()).isEqualTo("GET /OpenTelemetryMetric/" + name); + + // validate 1st metric + Envelope envelope1 = metrics.get(0); + Envelope envelope2 = metrics.get(1); + Envelope envelope3 = metrics.get(2); + + assertThat(rdEnvelope.getSampleRate()).isNull(); + assertThat(envelope1.getSampleRate()).isNull(); // metrics are never sent with sample rate + assertThat(envelope2.getSampleRate()).isNull(); // metrics are never sent with sample rate + assertThat(envelope3.getSampleRate()).isNull(); // metrics are never sent with sample rate + + // validate tags + Map tags1 = envelope1.getTags(); + assertThat(tags1.get("ai.internal.sdkVersion")).isNotNull(); + assertThat(tags1).containsEntry("ai.cloud.roleInstance", "testroleinstance"); + assertThat(tags1).containsEntry("ai.cloud.role", "testrolename"); + assertThat(tags1).containsEntry("ai.application.ver", "123"); + + // validate base data + MetricData md1 = (MetricData) ((Data) envelope1.getData()).getBaseData(); + List dataPointList1 = md1.getMetrics(); + assertThat(dataPointList1).hasSize(1); + DataPoint dp1 = dataPointList1.get(0); + assertThat(dp1.getValue()).isEqualTo(2.0); + assertThat(dp1.getName()).isEqualTo(name); + + // validate custom dimension + Map properties1 = md1.getProperties(); + assertThat(properties1).containsEntry("tag1", "abc"); + assertThat(properties1).containsEntry("tag2", "def"); + assertThat(properties1).containsEntry("name", "apple"); + assertThat(properties1).containsEntry("color", "green"); + assertThat(properties1).containsEntry("_MS.SentToAMW", "true"); + + // validate tags + Map tags2 = envelope2.getTags(); + assertThat(tags2.get("ai.internal.sdkVersion")).isNotNull(); + assertThat(tags2).containsEntry("ai.cloud.roleInstance", "testroleinstance"); + assertThat(tags2).containsEntry("ai.cloud.role", "testrolename"); + assertThat(tags2).containsEntry("ai.application.ver", "123"); + + // validate base data + MetricData md2 = (MetricData) ((Data) envelope2.getData()).getBaseData(); + List dataPointList2 = md2.getMetrics(); + assertThat(dataPointList2).hasSize(1); + DataPoint dp2 = dataPointList2.get(0); + assertThat(dp2.getValue()).isEqualTo(6.0); + assertThat(dp2.getName()).isEqualTo(name); + + // validate custom dimension + Map properties2 = md2.getProperties(); + assertThat(properties2).containsEntry("tag1", "abc"); + assertThat(properties2).containsEntry("tag2", "def"); + assertThat(properties2).containsEntry("name", "apple"); + assertThat(properties2).containsEntry("color", "red"); + assertThat(properties2).containsEntry("_MS.SentToAMW", "true"); + + // validate tags + Map tags3 = envelope3.getTags(); + assertThat(tags3.get("ai.internal.sdkVersion")).isNotNull(); + assertThat(tags3).containsEntry("ai.cloud.roleInstance", "testroleinstance"); + assertThat(tags3).containsEntry("ai.cloud.role", "testrolename"); + assertThat(tags3).containsEntry("ai.application.ver", "123"); + + // validate base data + MetricData md3 = (MetricData) ((Data) envelope3.getData()).getBaseData(); + List dataPointList3 = md3.getMetrics(); + assertThat(dataPointList3).hasSize(1); + DataPoint dp3 = dataPointList3.get(0); + assertThat(dp3.getValue()).isEqualTo(7.0); + assertThat(dp3.getName()).isEqualTo(name); + + // validate custom dimension + Map properties3 = md3.getProperties(); + assertThat(properties3).containsEntry("tag1", "abc"); + assertThat(properties3).containsEntry("tag2", "def"); + assertThat(properties3).containsEntry("name", "lemon"); + assertThat(properties3).containsEntry("color", "yellow"); + assertThat(properties3).containsEntry("_MS.SentToAMW", "true"); + + } + + private void validateOtlpMetricsReceived(String name) throws Exception { + await() + .atMost(10, SECONDS) + .untilAsserted( + () -> { + HttpRequest[] otlpRequests = testing.mockedOtlpIngestion.getCollectorServer() + .retrieveRecordedRequests(request()); + + assertThat(otlpRequests).isNotEmpty(); + + List otlpMetrics = + testing.mockedOtlpIngestion.extractMetricsFromRequests(otlpRequests); + + assertThat(otlpMetrics).hasSize(3); + }); + } + + @Environment(TOMCAT_8_JAVA_8) + static class Tomcat8Java8Test extends OpenTelemetryMetricTestToAmw {} + + @Environment(TOMCAT_8_JAVA_8_OPENJ9) + static class Tomcat8Java8OpenJ9Test extends OpenTelemetryMetricTestToAmw {} + + @Environment(TOMCAT_8_JAVA_11) + static class Tomcat8Java11Test extends OpenTelemetryMetricTestToAmw {} + + @Environment(TOMCAT_8_JAVA_11_OPENJ9) + static class Tomcat8Java11OpenJ9Test extends OpenTelemetryMetricTestToAmw {} + + @Environment(TOMCAT_8_JAVA_17) + static class Tomcat8Java17Test extends OpenTelemetryMetricTestToAmw {} + + @Environment(TOMCAT_8_JAVA_17_OPENJ9) + static class Tomcat8Java17OpenJ9Test extends OpenTelemetryMetricTestToAmw {} + + @Environment(TOMCAT_8_JAVA_21) + static class Tomcat8Java21Test extends OpenTelemetryMetricTestToAmw {} + + @Environment(TOMCAT_8_JAVA_21_OPENJ9) + static class Tomcat8Java21OpenJ9Test extends OpenTelemetryMetricTestToAmw {} + + @Environment(TOMCAT_8_JAVA_23) + static class Tomcat8Java23Test extends OpenTelemetryMetricTestToAmw {} + + @Environment(TOMCAT_8_JAVA_23_OPENJ9) + static class Tomcat8Java23OpenJ9Test extends OpenTelemetryMetricTestToAmw {} + + @Environment(WILDFLY_13_JAVA_8) + static class Wildfly13Java8Test extends OpenTelemetryMetricTestToAmw {} + + @Environment(WILDFLY_13_JAVA_8_OPENJ9) + static class Wildfly13Java8OpenJ9Test extends OpenTelemetryMetricTestToAmw {} +} diff --git a/smoke-tests/apps/PreAggMetricsWithRoleNameOverridesAndSampling/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/PreAggMetricsWithRoleNameOverridesAndSamplingTest.java b/smoke-tests/apps/PreAggMetricsWithRoleNameOverridesAndSampling/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/PreAggMetricsWithRoleNameOverridesAndSamplingTest.java index f3047cae0b6..61a7bcd1495 100644 --- a/smoke-tests/apps/PreAggMetricsWithRoleNameOverridesAndSampling/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/PreAggMetricsWithRoleNameOverridesAndSamplingTest.java +++ b/smoke-tests/apps/PreAggMetricsWithRoleNameOverridesAndSampling/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/PreAggMetricsWithRoleNameOverridesAndSamplingTest.java @@ -171,7 +171,7 @@ private static void validateMetricData( Map properties = metricData.getProperties(); String expectedSuccess = "200".equals(resultCode) ? "True" : "False"; if ("client".equals(type)) { - assertThat(properties).hasSize(9); + assertThat(properties).hasSize(10); assertThat(properties.get("_MS.MetricId")).isEqualTo("dependencies/duration"); assertThat(properties.get("dependency/resultCode")).isEqualTo(resultCode); assertThat(properties.get("Dependency.Success")).isEqualTo(expectedSuccess); @@ -179,7 +179,7 @@ private static void validateMetricData( .isEqualTo("host.testcontainers.internal:6060"); assertThat(properties.get("Dependency.Type")).isEqualTo("Http"); } else { - assertThat(properties).hasSize(7); + assertThat(properties).hasSize(8); assertThat(properties.get("_MS.MetricId")).isEqualTo("requests/duration"); assertThat(properties.get("request/resultCode")).isEqualTo(resultCode); assertThat(properties.get("Request.Success")).isEqualTo(expectedSuccess); @@ -188,6 +188,7 @@ private static void validateMetricData( assertThat(properties.get("cloud/roleInstance")).isEqualTo("testroleinstance"); assertThat(properties.get("cloud/roleName")).isEqualTo(roleName); assertThat(properties.get("_MS.IsAutocollected")).isEqualTo("True"); + assertThat(properties.get("_MS.SentToAMW")).isEqualTo("false"); } @Environment(TOMCAT_8_JAVA_8) diff --git a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtension.java b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtension.java index 2364dac9be3..28844094cde 100644 --- a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtension.java +++ b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtension.java @@ -112,6 +112,7 @@ public class SmokeTestExtension private final List jvmArgs; private final boolean useDefaultHttpPort; private final boolean useOtlpEndpoint; + private final boolean useOtlpViaEnvVars; public static SmokeTestExtension create() { return builder().build(); @@ -137,7 +138,8 @@ public static SmokeTestExtensionBuilder builder() { Map envVars, List jvmArgs, boolean useDefaultHttpPort, - boolean useOtlpEndpoint) { + boolean useOtlpEndpoint, + boolean useOtlpViaEnvVars) { this.skipHealthCheck = skipHealthCheck; this.readOnly = readOnly; this.dependencyContainer = dependencyContainer; @@ -167,6 +169,7 @@ public static SmokeTestExtensionBuilder builder() { this.jvmArgs = jvmArgs; this.useDefaultHttpPort = useDefaultHttpPort; this.useOtlpEndpoint = useOtlpEndpoint; + this.useOtlpViaEnvVars = useOtlpViaEnvVars; mockedIngestion = new MockedAppInsightsIngestionServer(useOld3xAgent); } @@ -218,7 +221,7 @@ private void prepareEnvironment(Environment environment) throws Exception { mockedIngestion.startServer(); mockedIngestion.setRequestLoggingEnabled(true); mockedIngestion.setQuickPulseRequestLoggingEnabled(true); - if (useOtlpEndpoint) { + if (useOtlpEndpoint || useOtlpViaEnvVars) { mockedOtlpIngestion.startServer(); } network = Network.newNetwork(); @@ -422,6 +425,12 @@ private void startTestApplicationContainer() throws Exception { Testcontainers.exposeHostPorts(6060); Testcontainers.exposeHostPorts(4318); + if (useOtlpViaEnvVars) { + envVars.put("OTEL_METRICS_EXPORTER", "otlp,azure_monitor"); + envVars.put("OTEL_EXPORTER_OTLP_METRICS_ENDPOINT", FAKE_OTLP_INGESTION_ENDPOINT); + envVars.put("OTEL_EXPORTER_OTLP_PROTOCOL", "http/protobuf"); + } + GenericContainer container; if (REMOTE_DEBUG || useDefaultHttpPort) { FixedHostPortGenericContainer fixedPortContainer = @@ -571,7 +580,7 @@ public void afterAll(ExtensionContext context) throws Exception { mockedIngestion.stopServer(); mockedIngestion.setRequestLoggingEnabled(false); mockedIngestion.setQuickPulseRequestLoggingEnabled(false); - if (useOtlpEndpoint) { + if (useOtlpEndpoint || useOtlpViaEnvVars) { mockedOtlpIngestion.stopServer(); } } diff --git a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtensionBuilder.java b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtensionBuilder.java index 610141bb781..2a232fe83c8 100644 --- a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtensionBuilder.java +++ b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtensionBuilder.java @@ -29,6 +29,7 @@ public class SmokeTestExtensionBuilder { private final List jvmArgs = new ArrayList<>(); private boolean useDefaultHttpPort; private boolean useOtlpEndpoint; + private boolean useOtlpViaEnvVars; public SmokeTestExtensionBuilder setDependencyContainer( String envVarName, GenericContainer container) { @@ -108,6 +109,11 @@ public SmokeTestExtensionBuilder useOtlpEndpoint() { return this; } + public SmokeTestExtensionBuilder useOtlpViaEnvVars() { + this.useOtlpViaEnvVars = true; + return this; + } + public SmokeTestExtension build() { return new SmokeTestExtension( dependencyContainer, @@ -125,6 +131,7 @@ public SmokeTestExtension build() { envVars, jvmArgs, useDefaultHttpPort, - useOtlpEndpoint); + useOtlpEndpoint, + useOtlpViaEnvVars); } } From b5a3e27d5c233eff76d161c71d28df51ca7cd855 Mon Sep 17 00:00:00 2001 From: Harsimar Kaur Date: Tue, 16 Sep 2025 10:37:05 -0700 Subject: [PATCH 10/31] add one more test, will debug later --- ...tpPreaggregatedMetricsTestOtlpEnabled.java | 133 ++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java diff --git a/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java b/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java new file mode 100644 index 00000000000..f1ba5eddc75 --- /dev/null +++ b/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java @@ -0,0 +1,133 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.microsoft.applicationinsights.smoketest; + +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_11; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_11_OPENJ9; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_17; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_17_OPENJ9; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_21; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_21_OPENJ9; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_23; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_23_OPENJ9; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_8; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.TOMCAT_8_JAVA_8_OPENJ9; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.WILDFLY_13_JAVA_8; +import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.WILDFLY_13_JAVA_8_OPENJ9; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.data.MapEntry.entry; + +import com.microsoft.applicationinsights.smoketest.schemav2.Data; +import com.microsoft.applicationinsights.smoketest.schemav2.DataPoint; +import com.microsoft.applicationinsights.smoketest.schemav2.Envelope; +import com.microsoft.applicationinsights.smoketest.schemav2.MetricData; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +@UseAgent +abstract class HttpPreaggregatedMetricsTestOtlpEnabled { + + @RegisterExtension + static final SmokeTestExtension testing = SmokeTestExtension.builder() + .useOtlpViaEnvVars() + .build(); + + @Test + @TargetUri("/httpUrlConnection") + void testMsSentToAmw() throws Exception { + verifyMetrics(); + } + + private void verifyMetrics() throws Exception { + List clientMetrics = + testing.mockedIngestion.waitForStandardMetricItems("dependencies/duration", 3); + List serverMetrics = + testing.mockedIngestion.waitForStandardMetricItems("requests/duration", 1); + + verifyHttpClientPreAggregatedMetrics(clientMetrics); + verifyHttpServerPreAggregatedMetrics(serverMetrics); + } + + private static void verifyHttpClientPreAggregatedMetrics(List metrics) { + assertThat(metrics.size()).isEqualTo(3); + // sort metrics based on result code + metrics.sort( + Comparator.comparing( + obj -> { + MetricData metricData = (MetricData) ((Data) obj.getData()).getBaseData(); + return metricData.getProperties().get("dependency/resultCode"); + })); + + // 1st pre-aggregated metric + Envelope envelope1 = metrics.get(0); + MetricData md1 = (MetricData) ((Data) envelope1.getData()).getBaseData(); + validateMetricData(md1); + + // 2nd pre-aggregated metric + Envelope envelope2 = metrics.get(1); + MetricData md2 = (MetricData) ((Data) envelope2.getData()).getBaseData(); + validateMetricData(md2); + + // 3rd pre-aggregated metric + Envelope envelope3 = metrics.get(2); + MetricData md3 = (MetricData) ((Data) envelope3.getData()).getBaseData(); + validateMetricData(md3); + } + + private static void verifyHttpServerPreAggregatedMetrics(List metrics) { + assertThat(metrics.size()).isEqualTo(1); + // 1st pre-aggregated metric + Envelope envelope1 = metrics.get(0); + MetricData md1 = (MetricData) ((Data) envelope1.getData()).getBaseData(); + validateMetricData(md1); + } + + private static void validateMetricData(MetricData metricData) { + List dataPoints = metricData.getMetrics(); + assertThat(dataPoints).hasSize(1); + + // Verify properties - specifically that _MS.SentToAMW is true + Map properties = metricData.getProperties(); + assertThat(properties.get("_MS.SentToAMW")).isEqualTo("true"); + } + + @Environment(TOMCAT_8_JAVA_8) + static class Tomcat8Java8Test extends HttpPreaggregatedMetricsTestOtlpEnabled {} + + @Environment(TOMCAT_8_JAVA_8_OPENJ9) + static class Tomcat8Java8OpenJ9Test extends HttpPreaggregatedMetricsTestOtlpEnabled {} + + @Environment(TOMCAT_8_JAVA_11) + static class Tomcat8Java11Test extends HttpPreaggregatedMetricsTestOtlpEnabled {} + + @Environment(TOMCAT_8_JAVA_11_OPENJ9) + static class Tomcat8Java11OpenJ9Test extends HttpPreaggregatedMetricsTestOtlpEnabled {} + + @Environment(TOMCAT_8_JAVA_17) + static class Tomcat8Java17Test extends HttpPreaggregatedMetricsTestOtlpEnabled {} + + @Environment(TOMCAT_8_JAVA_17_OPENJ9) + static class Tomcat8Java17OpenJ9Test extends HttpPreaggregatedMetricsTestOtlpEnabled {} + + @Environment(TOMCAT_8_JAVA_21) + static class Tomcat8Java21Test extends HttpPreaggregatedMetricsTestOtlpEnabled {} + + @Environment(TOMCAT_8_JAVA_21_OPENJ9) + static class Tomcat8Java21OpenJ9Test extends HttpPreaggregatedMetricsTestOtlpEnabled {} + + @Environment(TOMCAT_8_JAVA_23) + static class Tomcat8Java23Test extends HttpPreaggregatedMetricsTestOtlpEnabled {} + + @Environment(TOMCAT_8_JAVA_23_OPENJ9) + static class Tomcat8Java23OpenJ9Test extends HttpPreaggregatedMetricsTestOtlpEnabled {} + + @Environment(WILDFLY_13_JAVA_8) + static class Wildfly13Java8Test extends HttpPreaggregatedMetricsTestOtlpEnabled {} + + @Environment(WILDFLY_13_JAVA_8_OPENJ9) + static class Wildfly13Java8OpenJ9Test extends HttpPreaggregatedMetricsTestOtlpEnabled {} +} From f1e6088b2650f51878b1e9060d8f6de79935509d Mon Sep 17 00:00:00 2001 From: Sean Li Date: Fri, 19 Sep 2025 11:21:14 -0700 Subject: [PATCH 11/31] remove setting env var and pass parameter instead --- .../agent/internal/init/SecondEntryPoint.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java index 3725ab47dba..cf4a7892bd6 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java @@ -374,12 +374,9 @@ private static MetricExporter buildMetricExporter( boolean otlpEnabled = (otelMetricsExporter != null && !otelMetricsExporter.isEmpty()) && (otelMetricsEndpoint != null && !otelMetricsEndpoint.isEmpty()); - // Set system property that MetricDataMapper can read - System.setProperty(SENT_TO_AMW, Boolean.toString(otlpEnabled)); - MetricDataMapper mapper = new MetricDataMapper( - telemetryClient::populateDefaults, configuration.preview.captureHttpServer4xxAsError); + telemetryClient::populateDefaults, configuration.preview.captureHttpServer4xxAsError, otlpEnabled); return new AgentMetricExporter( metricFilters, mapper, telemetryClient.getMetricsBatchItemProcessor()); } From 82c52a996a992e1a5f42e3ebd8467af8abc8aad1 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Fri, 19 Sep 2025 11:29:23 -0700 Subject: [PATCH 12/31] fix code style errors --- .../agent/internal/init/SecondEntryPoint.java | 1 - .../HttpPreaggregatedMetricsTestOtlpEnabled.java | 10 ++++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java index cf4a7892bd6..c31a3ce2e80 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java @@ -90,7 +90,6 @@ public class SecondEntryPoint private static final ClientLogger startupLogger = new ClientLogger("com.microsoft.applicationinsights.agent"); private static File tempDir; - private static final String SENT_TO_AMW = "sent.to.amw"; @Nullable private static AzureMonitorLogFilteringProcessor logFilteringProcessor; diff --git a/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java b/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java index f1ba5eddc75..a13f3d825dd 100644 --- a/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java +++ b/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java @@ -16,7 +16,6 @@ import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.WILDFLY_13_JAVA_8; import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.WILDFLY_13_JAVA_8_OPENJ9; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.data.MapEntry.entry; import com.microsoft.applicationinsights.smoketest.schemav2.Data; import com.microsoft.applicationinsights.smoketest.schemav2.DataPoint; @@ -31,10 +30,9 @@ @UseAgent abstract class HttpPreaggregatedMetricsTestOtlpEnabled { - @RegisterExtension - static final SmokeTestExtension testing = SmokeTestExtension.builder() - .useOtlpViaEnvVars() - .build(); + @RegisterExtension + static final SmokeTestExtension testing = + SmokeTestExtension.builder().useOtlpViaEnvVars().build(); @Test @TargetUri("/httpUrlConnection") @@ -89,7 +87,7 @@ private static void verifyHttpServerPreAggregatedMetrics(List metrics) private static void validateMetricData(MetricData metricData) { List dataPoints = metricData.getMetrics(); assertThat(dataPoints).hasSize(1); - + // Verify properties - specifically that _MS.SentToAMW is true Map properties = metricData.getProperties(); assertThat(properties.get("_MS.SentToAMW")).isEqualTo("true"); From 4bf35edcc0aaf6c2583f9b98b3412a8fd69173d9 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Fri, 19 Sep 2025 11:59:53 -0700 Subject: [PATCH 13/31] Fix compile errors --- .../agent/internal/init/SecondEntryPoint.java | 4 ++-- .../internal/PreAggregatedMetricsTest.java | 6 +++--- .../apps/OpenTelemetryMetric/build.gradle.kts | 2 +- .../OpenTelemetryMetricTestToAmw.java | 18 +++++++++--------- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java index c31a3ce2e80..8cbb0e51f18 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java @@ -370,8 +370,8 @@ private static MetricExporter buildMetricExporter( String otelMetricsEndpoint = configProperties.getString("otel.metrics.exporter.otlp.endpoint"); String otelMetricsExporter = configProperties.getString("otel.metrics.exporter"); - boolean otlpEnabled = (otelMetricsExporter != null && !otelMetricsExporter.isEmpty()) && - (otelMetricsEndpoint != null && !otelMetricsEndpoint.isEmpty()); + Boolean otlpEnabled = (otelMetricsExporter != null && !otelMetricsExporter.isEmpty()) && + (otelMetricsEndpoint != null && !otelMetricsEndpoint.isEmpty()); MetricDataMapper mapper = new MetricDataMapper( diff --git a/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/PreAggregatedMetricsTest.java b/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/PreAggregatedMetricsTest.java index 7615964e25d..c74d5b2ef9d 100644 --- a/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/PreAggregatedMetricsTest.java +++ b/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/PreAggregatedMetricsTest.java @@ -136,7 +136,7 @@ void generateHttpClientMetrics() { MetricTelemetryBuilder builder = MetricTelemetryBuilder.create(); MetricData metricData = metricDataCollection.iterator().next(); MetricDataMapper.updateMetricPointBuilder( - builder, metricData, metricData.getData().getPoints().iterator().next(), true, true); + builder, metricData, metricData.getData().getPoints().iterator().next(), true, true, null); TelemetryItem telemetryItem = builder.build(); MetricsData metricsData = (MetricsData) telemetryItem.getData().getBaseData(); @@ -211,7 +211,7 @@ void generateRpcClientMetrics() { MetricTelemetryBuilder builder = MetricTelemetryBuilder.create(); MetricData metricData = metricDataCollection.iterator().next(); MetricDataMapper.updateMetricPointBuilder( - builder, metricData, metricData.getData().getPoints().iterator().next(), true, true); + builder, metricData, metricData.getData().getPoints().iterator().next(), true, true, null); TelemetryItem telemetryItem = builder.build(); MetricsData metricsData = (MetricsData) telemetryItem.getData().getBaseData(); @@ -291,7 +291,7 @@ void generateHttpServerMetrics() { MetricTelemetryBuilder builder = MetricTelemetryBuilder.create(); MetricData metricData = target; MetricDataMapper.updateMetricPointBuilder( - builder, metricData, metricData.getData().getPoints().iterator().next(), true, true); + builder, metricData, metricData.getData().getPoints().iterator().next(), true, true, null); TelemetryItem telemetryItem = builder.build(); MetricsData metricsData = (MetricsData) telemetryItem.getData().getBaseData(); diff --git a/smoke-tests/apps/OpenTelemetryMetric/build.gradle.kts b/smoke-tests/apps/OpenTelemetryMetric/build.gradle.kts index ad3eb90c4df..032875462e8 100644 --- a/smoke-tests/apps/OpenTelemetryMetric/build.gradle.kts +++ b/smoke-tests/apps/OpenTelemetryMetric/build.gradle.kts @@ -7,7 +7,7 @@ dependencies { exclude("org.springframework.boot", "spring-boot-starter-tomcat") } implementation("io.opentelemetry:opentelemetry-api:1.12.0") - + smokeTestImplementation("org.mock-server:mockserver-netty:5.15.0:shaded") smokeTestImplementation("org.awaitility:awaitility:4.2.0") smokeTestImplementation("io.opentelemetry.proto:opentelemetry-proto:0.14.0-alpha") diff --git a/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java b/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java index d9503268923..7a4273cd81f 100644 --- a/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java +++ b/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java @@ -29,7 +29,6 @@ import java.util.Comparator; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.mockserver.model.HttpRequest; @@ -37,10 +36,9 @@ @UseAgent abstract class OpenTelemetryMetricTestToAmw { - @RegisterExtension - static final SmokeTestExtension testing = SmokeTestExtension.builder() - .useOtlpViaEnvVars() - .build(); + @RegisterExtension + static final SmokeTestExtension testing = + SmokeTestExtension.builder().useOtlpViaEnvVars().build(); @Test @TargetUri("/trackDoubleCounterMetric") @@ -144,7 +142,6 @@ private void validateCounterMetric(String name) throws Exception { assertThat(properties3).containsEntry("name", "lemon"); assertThat(properties3).containsEntry("color", "yellow"); assertThat(properties3).containsEntry("_MS.SentToAMW", "true"); - } private void validateOtlpMetricsReceived(String name) throws Exception { @@ -152,9 +149,12 @@ private void validateOtlpMetricsReceived(String name) throws Exception { .atMost(10, SECONDS) .untilAsserted( () -> { - HttpRequest[] otlpRequests = testing.mockedOtlpIngestion.getCollectorServer() - .retrieveRecordedRequests(request()); - + HttpRequest[] otlpRequests = + testing + .mockedOtlpIngestion + .getCollectorServer() + .retrieveRecordedRequests(request()); + assertThat(otlpRequests).isNotEmpty(); List otlpMetrics = From 27083d7a6c8344ed777d7f74ff86cd50d2f68cc2 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Fri, 19 Sep 2025 12:20:14 -0700 Subject: [PATCH 14/31] Fix style error --- .../agent/internal/init/SecondEntryPoint.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java index 8cbb0e51f18..9ee2b480c8b 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java @@ -55,6 +55,7 @@ import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder; import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer; import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider; +import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.autoconfigure.spi.internal.AutoConfigureListener; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.logs.LogRecordProcessor; @@ -69,7 +70,6 @@ import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder; import io.opentelemetry.sdk.trace.export.SpanExporter; import io.opentelemetry.sdk.trace.samplers.SamplingDecision; -import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.io.File; import java.util.ArrayList; import java.util.Collections; @@ -275,7 +275,8 @@ public void customize(AutoConfigurationCustomizer autoConfiguration) { (metricExporter, configProperties) -> { if (metricExporter instanceof AzureMonitorMetricExporterProvider.MarkerMetricExporter) { - return buildMetricExporter(configuration, telemetryClient, metricFilters, configProperties); + return buildMetricExporter( + configuration, telemetryClient, metricFilters, configProperties); } else { return metricExporter; } @@ -366,16 +367,20 @@ private static SpanExporter buildTraceExporter( private static MetricExporter buildMetricExporter( Configuration configuration, TelemetryClient telemetryClient, - List metricFilters, ConfigProperties configProperties) { - + List metricFilters, + ConfigProperties configProperties) { + String otelMetricsEndpoint = configProperties.getString("otel.metrics.exporter.otlp.endpoint"); String otelMetricsExporter = configProperties.getString("otel.metrics.exporter"); - Boolean otlpEnabled = (otelMetricsExporter != null && !otelMetricsExporter.isEmpty()) && - (otelMetricsEndpoint != null && !otelMetricsEndpoint.isEmpty()); + Boolean otlpEnabled = + (otelMetricsExporter != null && !otelMetricsExporter.isEmpty()) + && (otelMetricsEndpoint != null && !otelMetricsEndpoint.isEmpty()); MetricDataMapper mapper = new MetricDataMapper( - telemetryClient::populateDefaults, configuration.preview.captureHttpServer4xxAsError, otlpEnabled); + telemetryClient::populateDefaults, + configuration.preview.captureHttpServer4xxAsError, + otlpEnabled); return new AgentMetricExporter( metricFilters, mapper, telemetryClient.getMetricsBatchItemProcessor()); } From e793ce5db5f699d2594f349a838e69369f96f07e Mon Sep 17 00:00:00 2001 From: Sean Li Date: Fri, 19 Sep 2025 12:20:45 -0700 Subject: [PATCH 15/31] Fix test assert to False because env vars are not set --- .../smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java b/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java index a13f3d825dd..21e1a540416 100644 --- a/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java +++ b/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java @@ -90,7 +90,7 @@ private static void validateMetricData(MetricData metricData) { // Verify properties - specifically that _MS.SentToAMW is true Map properties = metricData.getProperties(); - assertThat(properties.get("_MS.SentToAMW")).isEqualTo("true"); + assertThat(properties.get("_MS.SentToAMW")).isEqualTo("False"); } @Environment(TOMCAT_8_JAVA_8) From 3e3b0f7e841b4ecee9479c0bd7a3a89a6307a482 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 19 Sep 2025 15:02:53 -0700 Subject: [PATCH 16/31] Fix --- .../agent/internal/init/SecondEntryPoint.java | 2 +- .../smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java index 9ee2b480c8b..ac2fe85bf7f 100644 --- a/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java +++ b/agent/agent-tooling/src/main/java/com/microsoft/applicationinsights/agent/internal/init/SecondEntryPoint.java @@ -370,7 +370,7 @@ private static MetricExporter buildMetricExporter( List metricFilters, ConfigProperties configProperties) { - String otelMetricsEndpoint = configProperties.getString("otel.metrics.exporter.otlp.endpoint"); + String otelMetricsEndpoint = configProperties.getString("otel.exporter.otlp.metrics.endpoint"); String otelMetricsExporter = configProperties.getString("otel.metrics.exporter"); Boolean otlpEnabled = (otelMetricsExporter != null && !otelMetricsExporter.isEmpty()) diff --git a/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java b/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java index 21e1a540416..35f3efb20b3 100644 --- a/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java +++ b/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java @@ -90,7 +90,7 @@ private static void validateMetricData(MetricData metricData) { // Verify properties - specifically that _MS.SentToAMW is true Map properties = metricData.getProperties(); - assertThat(properties.get("_MS.SentToAMW")).isEqualTo("False"); + assertThat(properties.get("_MS.SentToAMW")).isEqualTo("True"); } @Environment(TOMCAT_8_JAVA_8) From b55551eeada1068d551a911b42dac448e02e1e6f Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 19 Sep 2025 15:05:19 -0700 Subject: [PATCH 17/31] Fix --- agent/agent-tooling/build.gradle.kts | 2 +- agent/agent-tooling/gradle.lockfile | 2 +- inst/azure-monitor-opentelemetry-autoconfigure.properties | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/agent/agent-tooling/build.gradle.kts b/agent/agent-tooling/build.gradle.kts index 7d5a4760970..994836679dc 100644 --- a/agent/agent-tooling/build.gradle.kts +++ b/agent/agent-tooling/build.gradle.kts @@ -21,7 +21,7 @@ dependencies { implementation(project(":agent:agent-profiler:agent-diagnostics")) implementation(project(":etw:java")) - implementation("com.azure:azure-monitor-opentelemetry-autoconfigure:1.4.0-beta.1") + implementation("com.azure:azure-monitor-opentelemetry-autoconfigure:1.3.0") compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-bootstrap") compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling") compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling-java9") diff --git a/agent/agent-tooling/gradle.lockfile b/agent/agent-tooling/gradle.lockfile index 47438e08e76..873ebbce122 100644 --- a/agent/agent-tooling/gradle.lockfile +++ b/agent/agent-tooling/gradle.lockfile @@ -9,7 +9,7 @@ com.azure:azure-core-http-netty:1.16.0=runtimeClasspath com.azure:azure-core:1.56.0=runtimeClasspath com.azure:azure-identity:1.17.0=runtimeClasspath com.azure:azure-json:1.5.0=runtimeClasspath -com.azure:azure-monitor-opentelemetry-autoconfigure:1.4.0-beta.1=runtimeClasspath +com.azure:azure-monitor-opentelemetry-autoconfigure:1.3.0=runtimeClasspath com.azure:azure-sdk-bom:1.2.38=runtimeClasspath com.azure:azure-storage-blob:12.31.2=runtimeClasspath com.azure:azure-storage-common:12.30.2=runtimeClasspath diff --git a/inst/azure-monitor-opentelemetry-autoconfigure.properties b/inst/azure-monitor-opentelemetry-autoconfigure.properties index d3c7ef8fa1b..8c5a1732da2 100644 --- a/inst/azure-monitor-opentelemetry-autoconfigure.properties +++ b/inst/azure-monitor-opentelemetry-autoconfigure.properties @@ -1,2 +1,2 @@ name=azure-monitor-opentelemetry-autoconfigure -version=1.4.0-beta.1 +version=1.3.0 From f14de7eb7a46195163873b6bef6a4b8fba945aeb Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 19 Sep 2025 15:15:49 -0700 Subject: [PATCH 18/31] Make script run locally better --- .github/scripts/build-azure-monitor-dependency.sh | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/scripts/build-azure-monitor-dependency.sh b/.github/scripts/build-azure-monitor-dependency.sh index c0d6370fdec..d3cc1dac8b5 100755 --- a/.github/scripts/build-azure-monitor-dependency.sh +++ b/.github/scripts/build-azure-monitor-dependency.sh @@ -32,7 +32,9 @@ echo "Installed version: $INSTALLED_VERSION" # Clean up echo "Cleaning up..." cd .. -rm -rf azure-sdk-temp +if [ -n "$CI" ]; then + rm -rf azure-sdk-temp +fi # Update dependency versions in the current project echo "Updating dependency versions in project files..." @@ -52,10 +54,11 @@ fi ./gradlew resolveAndLockAll --write-locks ./gradlew generateLicenseReport --no-build-cache - # this is needed to make license report pass -git config user.email "41898282+github-actions[bot]@users.noreply.github.com" -git config user.name "github-actions[bot]" -git commit -a -m "update azure-monitor-opentelemetry-autoconfigure dependency to $INSTALLED_VERSION" +if [ -n "$CI" ]; then + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git config user.name "github-actions[bot]" + git commit -a -m "update azure-monitor-opentelemetry-autoconfigure dependency to $INSTALLED_VERSION" +fi echo "azure-monitor-opentelemetry-autoconfigure dependency build completed successfully" echo "All project files updated to use version: $INSTALLED_VERSION" From 154539be94305391bb61f63a6dad7adb131c8582 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 19 Sep 2025 15:31:36 -0700 Subject: [PATCH 19/31] Fix --- .../smoketest/ConnectionStringOverridesTest.java | 6 ++++-- .../smoketest/HttpPreaggregatedMetricsTest.java | 2 +- .../smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java | 2 +- .../smoketest/HttpServer4xxDefaultTest.java | 3 ++- .../applicationinsights/smoketest/HttpServer4xxTest.java | 3 ++- .../smoketest/InstrumentationKeyOverridesTest.java | 5 +++-- .../smoketest/OpenTelemetryMetricTest.java | 6 +++--- .../smoketest/OpenTelemetryMetricTestToAmw.java | 6 +++--- .../PreAggMetricsWithRoleNameOverridesAndSamplingTest.java | 2 +- .../smoketest/RoleNameOverridesTest.java | 5 +++-- .../microsoft/applicationinsights/smoketest/GrpcTest.java | 6 ++++-- 11 files changed, 27 insertions(+), 19 deletions(-) diff --git a/smoke-tests/apps/ConnectionStringOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/ConnectionStringOverridesTest.java b/smoke-tests/apps/ConnectionStringOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/ConnectionStringOverridesTest.java index 8a14507a1e7..30f6438d320 100644 --- a/smoke-tests/apps/ConnectionStringOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/ConnectionStringOverridesTest.java +++ b/smoke-tests/apps/ConnectionStringOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/ConnectionStringOverridesTest.java @@ -141,18 +141,20 @@ private static void validateMetricData(String type, MetricData metricData, Strin Map properties = metricData.getProperties(); String expectedSuccess = "200".equals(resultCode) ? "True" : "False"; if ("client".equals(type)) { - assertThat(properties).hasSize(9); + assertThat(properties).hasSize(10); assertThat(properties.get("_MS.MetricId")).isEqualTo("dependencies/duration"); assertThat(properties.get("dependency/resultCode")).isEqualTo(resultCode); assertThat(properties.get("Dependency.Success")).isEqualTo(expectedSuccess); assertThat(properties.get("dependency/target")) .isEqualTo("host.testcontainers.internal:6060"); assertThat(properties.get("Dependency.Type")).isEqualTo("Http"); + assertThat(properties.get("_MS.SentToAMW")).isEqualTo("False"); } else { - assertThat(properties).hasSize(7); + assertThat(properties).hasSize(8); assertThat(properties.get("_MS.MetricId")).isEqualTo("requests/duration"); assertThat(properties.get("request/resultCode")).isEqualTo(resultCode); assertThat(properties.get("Request.Success")).isEqualTo(expectedSuccess); + assertThat(properties.get("_MS.SentToAMW")).isEqualTo("False"); } assertThat(properties.get("operation/synthetic")).isEqualTo("False"); assertThat(properties.get("cloud/roleInstance")).isEqualTo("testroleinstance"); diff --git a/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTest.java b/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTest.java index cb565880b1b..ebc7c0eac34 100644 --- a/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTest.java +++ b/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTest.java @@ -193,7 +193,7 @@ private static void validateMetricData( assertThat(properties.get("cloud/roleInstance")).isEqualTo("testroleinstance"); assertThat(properties.get("cloud/roleName")).isEqualTo("testrolename"); assertThat(properties.get("_MS.IsAutocollected")).isEqualTo("True"); - assertThat(properties.get("_MS.SentToAMW")).isEqualTo("false"); + assertThat(properties.get("_MS.SentToAMW")).isEqualTo("False"); } @Environment(TOMCAT_8_JAVA_8) diff --git a/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java b/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java index 35f3efb20b3..4acf65e4130 100644 --- a/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java +++ b/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java @@ -88,7 +88,7 @@ private static void validateMetricData(MetricData metricData) { List dataPoints = metricData.getMetrics(); assertThat(dataPoints).hasSize(1); - // Verify properties - specifically that _MS.SentToAMW is true + // Verify properties - specifically that _MS.SentToAMW is True Map properties = metricData.getProperties(); assertThat(properties.get("_MS.SentToAMW")).isEqualTo("True"); } diff --git a/smoke-tests/apps/HttpServer4xx/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpServer4xxDefaultTest.java b/smoke-tests/apps/HttpServer4xx/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpServer4xxDefaultTest.java index 7ee7eb23c24..da845d4fe52 100644 --- a/smoke-tests/apps/HttpServer4xx/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpServer4xxDefaultTest.java +++ b/smoke-tests/apps/HttpServer4xx/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpServer4xxDefaultTest.java @@ -55,13 +55,14 @@ void doMostBasicTest() throws Exception { assertThat(dataPoint.getCount()).isEqualTo(1); Map properties = metricData.getProperties(); - assertThat(properties).hasSize(7); + assertThat(properties).hasSize(8); assertThat(properties.get("_MS.MetricId")).isEqualTo("requests/duration"); assertThat(properties.get("request/resultCode")).isEqualTo("400"); assertThat(properties.get("Request.Success")).isEqualTo("False"); assertThat(properties.get("cloud/roleInstance")).isEqualTo("testroleinstance"); assertThat(properties.get("cloud/roleName")).isEqualTo("testrolename"); assertThat(properties.get("_MS.IsAutocollected")).isEqualTo("True"); + assertThat(properties.get("_MS.SentToAMW")).isEqualTo("False"); } @Environment(TOMCAT_8_JAVA_8) diff --git a/smoke-tests/apps/HttpServer4xx/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpServer4xxTest.java b/smoke-tests/apps/HttpServer4xx/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpServer4xxTest.java index d64d2c53ece..faf140b927e 100644 --- a/smoke-tests/apps/HttpServer4xx/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpServer4xxTest.java +++ b/smoke-tests/apps/HttpServer4xx/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpServer4xxTest.java @@ -55,13 +55,14 @@ void doMostBasicTest() throws Exception { assertThat(dataPoint.getCount()).isEqualTo(1); Map properties = metricData.getProperties(); - assertThat(properties).hasSize(7); + assertThat(properties).hasSize(8); assertThat(properties.get("_MS.MetricId")).isEqualTo("requests/duration"); assertThat(properties.get("request/resultCode")).isEqualTo("400"); assertThat(properties.get("Request.Success")).isEqualTo("True"); assertThat(properties.get("cloud/roleInstance")).isEqualTo("testroleinstance"); assertThat(properties.get("cloud/roleName")).isEqualTo("testrolename"); assertThat(properties.get("_MS.IsAutocollected")).isEqualTo("True"); + assertThat(properties.get("_MS.SentToAMW")).isEqualTo("False"); } @Environment(TOMCAT_8_JAVA_8) diff --git a/smoke-tests/apps/InstrumentationKeyOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/InstrumentationKeyOverridesTest.java b/smoke-tests/apps/InstrumentationKeyOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/InstrumentationKeyOverridesTest.java index aa87d3f9004..57ec7732f44 100644 --- a/smoke-tests/apps/InstrumentationKeyOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/InstrumentationKeyOverridesTest.java +++ b/smoke-tests/apps/InstrumentationKeyOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/InstrumentationKeyOverridesTest.java @@ -134,7 +134,7 @@ private static void validateMetricData(String type, MetricData metricData, Strin Map properties = metricData.getProperties(); String expectedSuccess = "200".equals(resultCode) ? "True" : "False"; if ("client".equals(type)) { - assertThat(properties).hasSize(9); + assertThat(properties).hasSize(10); assertThat(properties.get("_MS.MetricId")).isEqualTo("dependencies/duration"); assertThat(properties.get("dependency/resultCode")).isEqualTo(resultCode); assertThat(properties.get("Dependency.Success")).isEqualTo(expectedSuccess); @@ -142,7 +142,7 @@ private static void validateMetricData(String type, MetricData metricData, Strin .isEqualTo("host.testcontainers.internal:6060"); assertThat(properties.get("Dependency.Type")).isEqualTo("Http"); } else { - assertThat(properties).hasSize(7); + assertThat(properties).hasSize(8); assertThat(properties.get("_MS.MetricId")).isEqualTo("requests/duration"); assertThat(properties.get("request/resultCode")).isEqualTo(resultCode); assertThat(properties.get("Request.Success")).isEqualTo(expectedSuccess); @@ -151,5 +151,6 @@ private static void validateMetricData(String type, MetricData metricData, Strin assertThat(properties.get("cloud/roleInstance")).isEqualTo("testroleinstance"); assertThat(properties.get("cloud/roleName")).isEqualTo("testrolename"); assertThat(properties.get("_MS.IsAutocollected")).isEqualTo("True"); + assertThat(properties.get("_MS.SentToAMW")).isEqualTo("False"); } } diff --git a/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTest.java b/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTest.java index f8039a34cf5..3ff3d3a8cfe 100644 --- a/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTest.java +++ b/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTest.java @@ -189,7 +189,7 @@ private void validateCounterMetric(String name) throws Exception { assertThat(properties1).containsEntry("tag2", "def"); assertThat(properties1).containsEntry("name", "apple"); assertThat(properties1).containsEntry("color", "green"); - assertThat(properties1).containsEntry("_MS.SentToAMW", "false"); + assertThat(properties1).containsEntry("_MS.SentToAMW", "False"); // validate tags Map tags2 = envelope2.getTags(); @@ -212,7 +212,7 @@ private void validateCounterMetric(String name) throws Exception { assertThat(properties2).containsEntry("tag2", "def"); assertThat(properties2).containsEntry("name", "apple"); assertThat(properties2).containsEntry("color", "red"); - assertThat(properties2).containsEntry("_MS.SentToAMW", "false"); + assertThat(properties2).containsEntry("_MS.SentToAMW", "False"); // validate tags Map tags3 = envelope3.getTags(); @@ -235,7 +235,7 @@ private void validateCounterMetric(String name) throws Exception { assertThat(properties3).containsEntry("tag2", "def"); assertThat(properties3).containsEntry("name", "lemon"); assertThat(properties3).containsEntry("color", "yellow"); - assertThat(properties3).containsEntry("_MS.SentToAMW", "false"); + assertThat(properties3).containsEntry("_MS.SentToAMW", "False"); } @Environment(TOMCAT_8_JAVA_8) diff --git a/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java b/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java index 7a4273cd81f..9310b1e290b 100644 --- a/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java +++ b/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java @@ -95,7 +95,7 @@ private void validateCounterMetric(String name) throws Exception { assertThat(properties1).containsEntry("tag2", "def"); assertThat(properties1).containsEntry("name", "apple"); assertThat(properties1).containsEntry("color", "green"); - assertThat(properties1).containsEntry("_MS.SentToAMW", "true"); + assertThat(properties1).containsEntry("_MS.SentToAMW", "True"); // validate tags Map tags2 = envelope2.getTags(); @@ -118,7 +118,7 @@ private void validateCounterMetric(String name) throws Exception { assertThat(properties2).containsEntry("tag2", "def"); assertThat(properties2).containsEntry("name", "apple"); assertThat(properties2).containsEntry("color", "red"); - assertThat(properties2).containsEntry("_MS.SentToAMW", "true"); + assertThat(properties2).containsEntry("_MS.SentToAMW", "True"); // validate tags Map tags3 = envelope3.getTags(); @@ -141,7 +141,7 @@ private void validateCounterMetric(String name) throws Exception { assertThat(properties3).containsEntry("tag2", "def"); assertThat(properties3).containsEntry("name", "lemon"); assertThat(properties3).containsEntry("color", "yellow"); - assertThat(properties3).containsEntry("_MS.SentToAMW", "true"); + assertThat(properties3).containsEntry("_MS.SentToAMW", "True"); } private void validateOtlpMetricsReceived(String name) throws Exception { diff --git a/smoke-tests/apps/PreAggMetricsWithRoleNameOverridesAndSampling/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/PreAggMetricsWithRoleNameOverridesAndSamplingTest.java b/smoke-tests/apps/PreAggMetricsWithRoleNameOverridesAndSampling/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/PreAggMetricsWithRoleNameOverridesAndSamplingTest.java index 61a7bcd1495..8734c8425cd 100644 --- a/smoke-tests/apps/PreAggMetricsWithRoleNameOverridesAndSampling/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/PreAggMetricsWithRoleNameOverridesAndSamplingTest.java +++ b/smoke-tests/apps/PreAggMetricsWithRoleNameOverridesAndSampling/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/PreAggMetricsWithRoleNameOverridesAndSamplingTest.java @@ -188,7 +188,7 @@ private static void validateMetricData( assertThat(properties.get("cloud/roleInstance")).isEqualTo("testroleinstance"); assertThat(properties.get("cloud/roleName")).isEqualTo(roleName); assertThat(properties.get("_MS.IsAutocollected")).isEqualTo("True"); - assertThat(properties.get("_MS.SentToAMW")).isEqualTo("false"); + assertThat(properties.get("_MS.SentToAMW")).isEqualTo("False"); } @Environment(TOMCAT_8_JAVA_8) diff --git a/smoke-tests/apps/RoleNameOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/RoleNameOverridesTest.java b/smoke-tests/apps/RoleNameOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/RoleNameOverridesTest.java index c770238288b..88e15aad965 100644 --- a/smoke-tests/apps/RoleNameOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/RoleNameOverridesTest.java +++ b/smoke-tests/apps/RoleNameOverrides/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/RoleNameOverridesTest.java @@ -139,7 +139,7 @@ private static void validateMetricData( Map properties = metricData.getProperties(); String expectedSuccess = "200".equals(resultCode) ? "True" : "False"; if ("client".equals(type)) { - assertThat(properties).hasSize(9); + assertThat(properties).hasSize(10); assertThat(properties.get("_MS.MetricId")).isEqualTo("dependencies/duration"); assertThat(properties.get("dependency/resultCode")).isEqualTo(resultCode); assertThat(properties.get("Dependency.Success")).isEqualTo(expectedSuccess); @@ -147,7 +147,7 @@ private static void validateMetricData( .isEqualTo("host.testcontainers.internal:6060"); assertThat(properties.get("Dependency.Type")).isEqualTo("Http"); } else { - assertThat(properties).hasSize(7); + assertThat(properties).hasSize(8); assertThat(properties.get("_MS.MetricId")).isEqualTo("requests/duration"); assertThat(properties.get("request/resultCode")).isEqualTo(resultCode); assertThat(properties.get("Request.Success")).isEqualTo(expectedSuccess); @@ -156,6 +156,7 @@ private static void validateMetricData( assertThat(properties.get("cloud/roleInstance")).isEqualTo("testroleinstance"); assertThat(properties.get("cloud/roleName")).isEqualTo(roleName); assertThat(properties.get("_MS.IsAutocollected")).isEqualTo("True"); + assertThat(properties.get("_MS.SentToAMW")).isEqualTo("False"); } @Environment(TOMCAT_8_JAVA_8) diff --git a/smoke-tests/apps/gRPC/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/GrpcTest.java b/smoke-tests/apps/gRPC/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/GrpcTest.java index 035ec637704..39107334830 100644 --- a/smoke-tests/apps/gRPC/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/GrpcTest.java +++ b/smoke-tests/apps/gRPC/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/GrpcTest.java @@ -75,7 +75,8 @@ void doSimpleTest() { entry("operation/synthetic", "False"), entry("cloud/roleInstance", "testroleinstance"), entry("cloud/roleName", "testrolename"), - entry("_MS.IsAutocollected", "True"))); + entry("_MS.IsAutocollected", "True"), + entry("_MS.SentToAMW", "False"))); testing.waitAndAssertMetric( "rpc.server.duration", @@ -152,7 +153,8 @@ void doConversationTest() { entry("operation/synthetic", "False"), entry("cloud/roleInstance", "testroleinstance"), entry("cloud/roleName", "testrolename"), - entry("_MS.IsAutocollected", "True"))); + entry("_MS.IsAutocollected", "True"), + entry("_MS.SentToAMW", "False"))); testing.waitAndAssertMetric( "rpc.server.duration", From 7a053fbbbc97e36781117c9bab1422d745fba73d Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 19 Sep 2025 15:20:52 -0700 Subject: [PATCH 20/31] SNAPSHOT --- agent/agent-tooling/build.gradle.kts | 2 +- agent/agent-tooling/gradle.lockfile | 17 +++--- licenses/more-licenses.md | 82 ++++++++++++-------------- smoke-tests/framework/build.gradle.kts | 2 +- 4 files changed, 49 insertions(+), 54 deletions(-) diff --git a/agent/agent-tooling/build.gradle.kts b/agent/agent-tooling/build.gradle.kts index 994836679dc..7d5a4760970 100644 --- a/agent/agent-tooling/build.gradle.kts +++ b/agent/agent-tooling/build.gradle.kts @@ -21,7 +21,7 @@ dependencies { implementation(project(":agent:agent-profiler:agent-diagnostics")) implementation(project(":etw:java")) - implementation("com.azure:azure-monitor-opentelemetry-autoconfigure:1.3.0") + implementation("com.azure:azure-monitor-opentelemetry-autoconfigure:1.4.0-beta.1") compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-bootstrap") compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling") compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling-java9") diff --git a/agent/agent-tooling/gradle.lockfile b/agent/agent-tooling/gradle.lockfile index 873ebbce122..a7cbccd3600 100644 --- a/agent/agent-tooling/gradle.lockfile +++ b/agent/agent-tooling/gradle.lockfile @@ -5,11 +5,11 @@ ch.qos.logback.contrib:logback-json-classic:0.1.5=runtimeClasspath ch.qos.logback.contrib:logback-json-core:0.1.5=runtimeClasspath ch.qos.logback:logback-classic:1.3.15=runtimeClasspath ch.qos.logback:logback-core:1.3.15=runtimeClasspath -com.azure:azure-core-http-netty:1.16.0=runtimeClasspath -com.azure:azure-core:1.56.0=runtimeClasspath +com.azure:azure-core-http-netty:1.16.1=runtimeClasspath +com.azure:azure-core:1.56.1=runtimeClasspath com.azure:azure-identity:1.17.0=runtimeClasspath com.azure:azure-json:1.5.0=runtimeClasspath -com.azure:azure-monitor-opentelemetry-autoconfigure:1.3.0=runtimeClasspath +com.azure:azure-monitor-opentelemetry-autoconfigure:1.4.0-beta.1=runtimeClasspath com.azure:azure-sdk-bom:1.2.38=runtimeClasspath com.azure:azure-storage-blob:12.31.2=runtimeClasspath com.azure:azure-storage-common:12.30.2=runtimeClasspath @@ -48,8 +48,8 @@ io.netty:netty-resolver-dns-classes-macos:4.2.4.Final=runtimeClasspath io.netty:netty-resolver-dns-native-macos:4.2.4.Final=runtimeClasspath io.netty:netty-resolver-dns:4.2.4.Final=runtimeClasspath io.netty:netty-resolver:4.2.4.Final=runtimeClasspath -io.netty:netty-tcnative-boringssl-static:2.0.72.Final=runtimeClasspath -io.netty:netty-tcnative-classes:2.0.72.Final=runtimeClasspath +io.netty:netty-tcnative-boringssl-static:2.0.73.Final=runtimeClasspath +io.netty:netty-tcnative-classes:2.0.73.Final=runtimeClasspath io.netty:netty-transport-classes-epoll:4.2.4.Final=runtimeClasspath io.netty:netty-transport-classes-kqueue:4.2.4.Final=runtimeClasspath io.netty:netty-transport-native-epoll:4.2.4.Final=runtimeClasspath @@ -71,10 +71,9 @@ io.opentelemetry:opentelemetry-sdk-logs:1.53.0=runtimeClasspath io.opentelemetry:opentelemetry-sdk-metrics:1.53.0=runtimeClasspath io.opentelemetry:opentelemetry-sdk-trace:1.53.0=runtimeClasspath io.opentelemetry:opentelemetry-sdk:1.53.0=runtimeClasspath -io.opentelemetry:opentelemetry-semconv:0.14.1=runtimeClasspath -io.projectreactor.netty:reactor-netty-core:1.2.8=runtimeClasspath -io.projectreactor.netty:reactor-netty-http:1.2.8=runtimeClasspath -io.projectreactor:reactor-core:3.7.8=runtimeClasspath +io.projectreactor.netty:reactor-netty-core:1.2.9=runtimeClasspath +io.projectreactor.netty:reactor-netty-http:1.2.9=runtimeClasspath +io.projectreactor:reactor-core:3.7.9=runtimeClasspath net.java.dev.jna:jna-platform:5.17.0=runtimeClasspath net.java.dev.jna:jna:5.17.0=runtimeClasspath net.minidev:accessors-smart:2.5.2=runtimeClasspath diff --git a/licenses/more-licenses.md b/licenses/more-licenses.md index e1a5ed41113..45e4d07c6e8 100644 --- a/licenses/more-licenses.md +++ b/licenses/more-licenses.md @@ -1,7 +1,7 @@ # agent ## Dependency License Report -_2025-09-09 20:21:54 UTC_ +_2025-09-19 15:48:02 PDT_ ## Apache License, Version 2.0 **1** **Group:** `com.fasterxml.jackson.core` **Name:** `jackson-annotations` **Version:** `2.20` @@ -156,13 +156,13 @@ _2025-09-09 20:21:54 UTC_ > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**29** **Group:** `io.netty` **Name:** `netty-tcnative-boringssl-static` **Version:** `2.0.72.Final` +**29** **Group:** `io.netty` **Name:** `netty-tcnative-boringssl-static` **Version:** `2.0.73.Final` > - **Manifest Project URL**: [https://netty.io/](https://netty.io/) > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM Project URL**: [https://github.com/netty/netty-tcnative/netty-tcnative-boringssl-static/](https://github.com/netty/netty-tcnative/netty-tcnative-boringssl-static/) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**30** **Group:** `io.netty` **Name:** `netty-tcnative-classes` **Version:** `2.0.72.Final` +**30** **Group:** `io.netty` **Name:** `netty-tcnative-classes` **Version:** `2.0.73.Final` > - **Manifest Project URL**: [https://netty.io/](https://netty.io/) > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) @@ -237,63 +237,59 @@ _2025-09-09 20:21:54 UTC_ > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**47** **Group:** `io.opentelemetry` **Name:** `opentelemetry-semconv` **Version:** `0.14.1` -> - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java](https://github.com/open-telemetry/opentelemetry-java) -> - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) - -**48** **Group:** `io.opentelemetry.contrib` **Name:** `opentelemetry-jfr-connection` **Version:** `1.48.0-alpha` +**47** **Group:** `io.opentelemetry.contrib` **Name:** `opentelemetry-jfr-connection` **Version:** `1.48.0-alpha` > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java-contrib](https://github.com/open-telemetry/opentelemetry-java-contrib) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**49** **Group:** `io.projectreactor` **Name:** `reactor-core` **Version:** `3.7.8` +**48** **Group:** `io.projectreactor` **Name:** `reactor-core` **Version:** `3.7.9` > - **POM Project URL**: [https://github.com/reactor/reactor-core](https://github.com/reactor/reactor-core) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**50** **Group:** `io.projectreactor.netty` **Name:** `reactor-netty-core` **Version:** `1.2.8` +**49** **Group:** `io.projectreactor.netty` **Name:** `reactor-netty-core` **Version:** `1.2.9` > - **POM Project URL**: [https://github.com/reactor/reactor-netty](https://github.com/reactor/reactor-netty) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**51** **Group:** `io.projectreactor.netty` **Name:** `reactor-netty-http` **Version:** `1.2.8` +**50** **Group:** `io.projectreactor.netty` **Name:** `reactor-netty-http` **Version:** `1.2.9` > - **POM Project URL**: [https://github.com/reactor/reactor-netty](https://github.com/reactor/reactor-netty) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**52** **Group:** `net.java.dev.jna` **Name:** `jna` **Version:** `5.17.0` +**51** **Group:** `net.java.dev.jna` **Name:** `jna` **Version:** `5.17.0` > - **POM Project URL**: [https://github.com/java-native-access/jna](https://github.com/java-native-access/jna) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) > - **POM License**: GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1 - [https://www.gnu.org/licenses/lgpl-2.1](https://www.gnu.org/licenses/lgpl-2.1) > - **Embedded license files**: [jna-5.17.0.jar/META-INF/LICENSE](jna-5.17.0.jar/META-INF/LICENSE) -**53** **Group:** `net.java.dev.jna` **Name:** `jna-platform` **Version:** `5.17.0` +**52** **Group:** `net.java.dev.jna` **Name:** `jna-platform` **Version:** `5.17.0` > - **POM Project URL**: [https://github.com/java-native-access/jna](https://github.com/java-native-access/jna) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) > - **POM License**: GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1 - [https://www.gnu.org/licenses/lgpl-2.1](https://www.gnu.org/licenses/lgpl-2.1) > - **Embedded license files**: [jna-platform-5.17.0.jar/META-INF/LICENSE](jna-platform-5.17.0.jar/META-INF/LICENSE) -**54** **Group:** `net.minidev` **Name:** `accessors-smart` **Version:** `2.5.2` +**53** **Group:** `net.minidev` **Name:** `accessors-smart` **Version:** `2.5.2` > - **Project URL**: [https://urielch.github.io/](https://urielch.github.io/) > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**55** **Group:** `net.minidev` **Name:** `json-smart` **Version:** `2.5.2` +**54** **Group:** `net.minidev` **Name:** `json-smart` **Version:** `2.5.2` > - **Project URL**: [https://urielch.github.io/](https://urielch.github.io/) > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**56** **Group:** `org.apache.commons` **Name:** `commons-lang3` **Version:** `3.18.0` +**55** **Group:** `org.apache.commons` **Name:** `commons-lang3` **Version:** `3.18.0` > - **Project URL**: [https://commons.apache.org/proper/commons-lang/](https://commons.apache.org/proper/commons-lang/) > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) > - **Embedded license files**: [commons-lang3-3.18.0.jar/META-INF/LICENSE.txt](commons-lang3-3.18.0.jar/META-INF/LICENSE.txt) - [commons-lang3-3.18.0.jar/META-INF/NOTICE.txt](commons-lang3-3.18.0.jar/META-INF/NOTICE.txt) -**57** **Group:** `org.apache.commons` **Name:** `commons-text` **Version:** `1.14.0` +**56** **Group:** `org.apache.commons` **Name:** `commons-text` **Version:** `1.14.0` > - **Project URL**: [https://commons.apache.org/proper/commons-text](https://commons.apache.org/proper/commons-text) > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) > - **Embedded license files**: [commons-text-1.14.0.jar/META-INF/LICENSE.txt](commons-text-1.14.0.jar/META-INF/LICENSE.txt) - [commons-text-1.14.0.jar/META-INF/NOTICE.txt](commons-text-1.14.0.jar/META-INF/NOTICE.txt) -**58** **Group:** `org.slf4j` **Name:** `jcl-over-slf4j` **Version:** `2.0.17` +**57** **Group:** `org.slf4j` **Name:** `jcl-over-slf4j` **Version:** `2.0.17` > - **Project URL**: [http://www.slf4j.org](http://www.slf4j.org) > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) @@ -302,59 +298,59 @@ _2025-09-09 20:21:54 UTC_ ## Eclipse Public License - v 1.0 -**59** **Group:** `ch.qos.logback` **Name:** `logback-classic` **Version:** `1.3.15` +**58** **Group:** `ch.qos.logback` **Name:** `logback-classic` **Version:** `1.3.15` > - **Manifest Project URL**: [http://www.qos.ch](http://www.qos.ch) > - **Manifest License**: GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1 (Not Packaged) > - **POM License**: Eclipse Public License - v 1.0 - [http://www.eclipse.org/legal/epl-v10.html](http://www.eclipse.org/legal/epl-v10.html) > - **POM License**: GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1 - [https://www.gnu.org/licenses/lgpl-2.1](https://www.gnu.org/licenses/lgpl-2.1) -**60** **Group:** `ch.qos.logback` **Name:** `logback-core` **Version:** `1.3.15` +**59** **Group:** `ch.qos.logback` **Name:** `logback-core` **Version:** `1.3.15` > - **Manifest Project URL**: [http://www.qos.ch](http://www.qos.ch) > - **Manifest License**: GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1 (Not Packaged) > - **POM License**: Eclipse Public License - v 1.0 - [http://www.eclipse.org/legal/epl-v10.html](http://www.eclipse.org/legal/epl-v10.html) > - **POM License**: GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1 - [https://www.gnu.org/licenses/lgpl-2.1](https://www.gnu.org/licenses/lgpl-2.1) -**61** **Group:** `ch.qos.logback.contrib` **Name:** `logback-json-classic` **Version:** `0.1.5` +**60** **Group:** `ch.qos.logback.contrib` **Name:** `logback-json-classic` **Version:** `0.1.5` > - **Manifest License**: GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1 (Not Packaged) > - **POM License**: Eclipse Public License - v 1.0 - [http://www.eclipse.org/legal/epl-v10.html](http://www.eclipse.org/legal/epl-v10.html) > - **POM License**: GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1 - [https://www.gnu.org/licenses/lgpl-2.1](https://www.gnu.org/licenses/lgpl-2.1) -**62** **Group:** `ch.qos.logback.contrib` **Name:** `logback-json-core` **Version:** `0.1.5` +**61** **Group:** `ch.qos.logback.contrib` **Name:** `logback-json-core` **Version:** `0.1.5` > - **Manifest License**: GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1 (Not Packaged) > - **POM License**: Eclipse Public License - v 1.0 - [http://www.eclipse.org/legal/epl-v10.html](http://www.eclipse.org/legal/epl-v10.html) > - **POM License**: GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1 - [https://www.gnu.org/licenses/lgpl-2.1](https://www.gnu.org/licenses/lgpl-2.1) ## GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1 -**63** **Group:** `ch.qos.logback` **Name:** `logback-classic` **Version:** `1.3.15` +**62** **Group:** `ch.qos.logback` **Name:** `logback-classic` **Version:** `1.3.15` > - **Manifest Project URL**: [http://www.qos.ch](http://www.qos.ch) > - **Manifest License**: GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1 (Not Packaged) > - **POM License**: Eclipse Public License - v 1.0 - [http://www.eclipse.org/legal/epl-v10.html](http://www.eclipse.org/legal/epl-v10.html) > - **POM License**: GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1 - [https://www.gnu.org/licenses/lgpl-2.1](https://www.gnu.org/licenses/lgpl-2.1) -**64** **Group:** `ch.qos.logback` **Name:** `logback-core` **Version:** `1.3.15` +**63** **Group:** `ch.qos.logback` **Name:** `logback-core` **Version:** `1.3.15` > - **Manifest Project URL**: [http://www.qos.ch](http://www.qos.ch) > - **Manifest License**: GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1 (Not Packaged) > - **POM License**: Eclipse Public License - v 1.0 - [http://www.eclipse.org/legal/epl-v10.html](http://www.eclipse.org/legal/epl-v10.html) > - **POM License**: GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1 - [https://www.gnu.org/licenses/lgpl-2.1](https://www.gnu.org/licenses/lgpl-2.1) -**65** **Group:** `ch.qos.logback.contrib` **Name:** `logback-json-classic` **Version:** `0.1.5` +**64** **Group:** `ch.qos.logback.contrib` **Name:** `logback-json-classic` **Version:** `0.1.5` > - **Manifest License**: GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1 (Not Packaged) > - **POM License**: Eclipse Public License - v 1.0 - [http://www.eclipse.org/legal/epl-v10.html](http://www.eclipse.org/legal/epl-v10.html) > - **POM License**: GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1 - [https://www.gnu.org/licenses/lgpl-2.1](https://www.gnu.org/licenses/lgpl-2.1) -**66** **Group:** `ch.qos.logback.contrib` **Name:** `logback-json-core` **Version:** `0.1.5` +**65** **Group:** `ch.qos.logback.contrib` **Name:** `logback-json-core` **Version:** `0.1.5` > - **Manifest License**: GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1 (Not Packaged) > - **POM License**: Eclipse Public License - v 1.0 - [http://www.eclipse.org/legal/epl-v10.html](http://www.eclipse.org/legal/epl-v10.html) > - **POM License**: GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1 - [https://www.gnu.org/licenses/lgpl-2.1](https://www.gnu.org/licenses/lgpl-2.1) -**67** **Group:** `net.java.dev.jna` **Name:** `jna` **Version:** `5.17.0` +**66** **Group:** `net.java.dev.jna` **Name:** `jna` **Version:** `5.17.0` > - **POM Project URL**: [https://github.com/java-native-access/jna](https://github.com/java-native-access/jna) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) > - **POM License**: GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1 - [https://www.gnu.org/licenses/lgpl-2.1](https://www.gnu.org/licenses/lgpl-2.1) > - **Embedded license files**: [jna-5.17.0.jar/META-INF/LICENSE](jna-5.17.0.jar/META-INF/LICENSE) -**68** **Group:** `net.java.dev.jna` **Name:** `jna-platform` **Version:** `5.17.0` +**67** **Group:** `net.java.dev.jna` **Name:** `jna-platform` **Version:** `5.17.0` > - **POM Project URL**: [https://github.com/java-native-access/jna](https://github.com/java-native-access/jna) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) > - **POM License**: GNU LESSER GENERAL PUBLIC LICENSE, Version 2.1 - [https://www.gnu.org/licenses/lgpl-2.1](https://www.gnu.org/licenses/lgpl-2.1) @@ -362,70 +358,70 @@ _2025-09-09 20:21:54 UTC_ ## MIT License -**69** **Group:** `com.azure` **Name:** `azure-core` **Version:** `1.56.0` +**68** **Group:** `com.azure` **Name:** `azure-core` **Version:** `1.56.1` > - **POM Project URL**: [https://github.com/Azure/azure-sdk-for-java](https://github.com/Azure/azure-sdk-for-java) > - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT) -**70** **Group:** `com.azure` **Name:** `azure-core-http-netty` **Version:** `1.16.0` +**69** **Group:** `com.azure` **Name:** `azure-core-http-netty` **Version:** `1.16.1` > - **POM Project URL**: [https://github.com/Azure/azure-sdk-for-java](https://github.com/Azure/azure-sdk-for-java) > - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT) -**71** **Group:** `com.azure` **Name:** `azure-identity` **Version:** `1.17.0` +**70** **Group:** `com.azure` **Name:** `azure-identity` **Version:** `1.17.0` > - **POM Project URL**: [https://github.com/Azure/azure-sdk-for-java](https://github.com/Azure/azure-sdk-for-java) > - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT) -**72** **Group:** `com.azure` **Name:** `azure-json` **Version:** `1.5.0` +**71** **Group:** `com.azure` **Name:** `azure-json` **Version:** `1.5.0` > - **POM Project URL**: [https://github.com/Azure/azure-sdk-for-java](https://github.com/Azure/azure-sdk-for-java) > - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT) -**73** **Group:** `com.azure` **Name:** `azure-monitor-opentelemetry-autoconfigure` **Version:** `1.3.0` +**72** **Group:** `com.azure` **Name:** `azure-monitor-opentelemetry-autoconfigure` **Version:** `1.4.0-beta.1` > - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT) -**74** **Group:** `com.azure` **Name:** `azure-storage-blob` **Version:** `12.31.2` +**73** **Group:** `com.azure` **Name:** `azure-storage-blob` **Version:** `12.31.2` > - **POM Project URL**: [https://github.com/Azure/azure-sdk-for-java](https://github.com/Azure/azure-sdk-for-java) > - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT) -**75** **Group:** `com.azure` **Name:** `azure-storage-common` **Version:** `12.30.2` +**74** **Group:** `com.azure` **Name:** `azure-storage-common` **Version:** `12.30.2` > - **POM Project URL**: [https://github.com/Azure/azure-sdk-for-java](https://github.com/Azure/azure-sdk-for-java) > - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT) -**76** **Group:** `com.azure` **Name:** `azure-storage-internal-avro` **Version:** `12.16.2` +**75** **Group:** `com.azure` **Name:** `azure-storage-internal-avro` **Version:** `12.16.2` > - **POM Project URL**: [https://github.com/Azure/azure-sdk-for-java](https://github.com/Azure/azure-sdk-for-java) > - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT) -**77** **Group:** `com.azure` **Name:** `azure-xml` **Version:** `1.2.0` +**76** **Group:** `com.azure` **Name:** `azure-xml` **Version:** `1.2.0` > - **POM Project URL**: [https://github.com/Azure/azure-sdk-for-java](https://github.com/Azure/azure-sdk-for-java) > - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT) -**78** **Group:** `com.github.oshi` **Name:** `oshi-core` **Version:** `6.8.3` +**77** **Group:** `com.github.oshi` **Name:** `oshi-core` **Version:** `6.8.3` > - **Manifest Project URL**: [https://github.com/oshi/oshi/oshi-core](https://github.com/oshi/oshi/oshi-core) > - **Manifest License**: MIT;link="https://opensource.org/licenses/MIT" (Not Packaged) > - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT) -**79** **Group:** `com.microsoft.azure` **Name:** `msal4j` **Version:** `1.22.0` +**78** **Group:** `com.microsoft.azure` **Name:** `msal4j` **Version:** `1.22.0` > - **Project URL**: [https://github.com/AzureAD/microsoft-authentication-library-for-java](https://github.com/AzureAD/microsoft-authentication-library-for-java) > - **Manifest License**: "MIT License" (Not Packaged) > - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT) -**80** **Group:** `com.microsoft.azure` **Name:** `msal4j-persistence-extension` **Version:** `1.3.0` +**79** **Group:** `com.microsoft.azure` **Name:** `msal4j-persistence-extension` **Version:** `1.3.0` > - **POM Project URL**: [https://github.com/AzureAD/microsoft-authentication-library-for-java](https://github.com/AzureAD/microsoft-authentication-library-for-java) > - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT) -**81** **Group:** `org.slf4j` **Name:** `jcl-over-slf4j` **Version:** `2.0.17` +**80** **Group:** `org.slf4j` **Name:** `jcl-over-slf4j` **Version:** `2.0.17` > - **Project URL**: [http://www.slf4j.org](http://www.slf4j.org) > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) > - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT) > - **Embedded license files**: [jcl-over-slf4j-2.0.17.jar/META-INF/LICENSE.txt](jcl-over-slf4j-2.0.17.jar/META-INF/LICENSE.txt) -**82** **Group:** `org.slf4j` **Name:** `slf4j-api` **Version:** `2.0.17` +**81** **Group:** `org.slf4j` **Name:** `slf4j-api` **Version:** `2.0.17` > - **Project URL**: [http://www.slf4j.org](http://www.slf4j.org) > - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT) > - **Embedded license files**: [slf4j-api-2.0.17.jar/META-INF/LICENSE.txt](slf4j-api-2.0.17.jar/META-INF/LICENSE.txt) ## MIT-0 -**83** **Group:** `org.reactivestreams` **Name:** `reactive-streams` **Version:** `1.0.4` +**82** **Group:** `org.reactivestreams` **Name:** `reactive-streams` **Version:** `1.0.4` > - **Manifest Project URL**: [http://reactive-streams.org](http://reactive-streams.org) > - **POM Project URL**: [http://www.reactive-streams.org/](http://www.reactive-streams.org/) > - **POM License**: MIT-0 - [https://spdx.org/licenses/MIT-0.html](https://spdx.org/licenses/MIT-0.html) diff --git a/smoke-tests/framework/build.gradle.kts b/smoke-tests/framework/build.gradle.kts index 35abbc7d385..4d35f4cb040 100644 --- a/smoke-tests/framework/build.gradle.kts +++ b/smoke-tests/framework/build.gradle.kts @@ -31,5 +31,5 @@ dependencies { implementation("org.assertj:assertj-core") implementation("com.azure:azure-json:1.5.0") - implementation("com.azure:azure-monitor-opentelemetry-autoconfigure:1.3.0") + implementation("com.azure:azure-monitor-opentelemetry-autoconfigure:1.4.0-beta.1") } From 0f009a6c1e6584cb9e7808ae7c3580a79c1faa6f Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 19 Sep 2025 17:48:36 -0700 Subject: [PATCH 21/31] Fix --- .../com/microsoft/applicationinsights/smoketest/GrpcTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/smoke-tests/apps/gRPC/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/GrpcTest.java b/smoke-tests/apps/gRPC/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/GrpcTest.java index 39107334830..9f5ff3ac463 100644 --- a/smoke-tests/apps/gRPC/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/GrpcTest.java +++ b/smoke-tests/apps/gRPC/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/GrpcTest.java @@ -174,7 +174,8 @@ void doConversationTest() { entry("operation/synthetic", "False"), entry("cloud/roleInstance", "testroleinstance"), entry("cloud/roleName", "testrolename"), - entry("_MS.IsAutocollected", "True"))); + entry("_MS.IsAutocollected", "True"), + entry("_MS.SentToAMW", "False"))); } @Environment(JAVA_8) From 9aec7b3b3035ad90f07d80ca43844b0702405341 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Fri, 19 Sep 2025 17:50:15 -0700 Subject: [PATCH 22/31] Fix OpenTelemetryMetricTestToAmw and GrpcTest --- .../smoketest/OpenTelemetryMetricTestToAmw.java | 2 +- .../com/microsoft/applicationinsights/smoketest/GrpcTest.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java b/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java index 9310b1e290b..792f45f0d29 100644 --- a/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java +++ b/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java @@ -160,7 +160,7 @@ private void validateOtlpMetricsReceived(String name) throws Exception { List otlpMetrics = testing.mockedOtlpIngestion.extractMetricsFromRequests(otlpRequests); - assertThat(otlpMetrics).hasSize(3); + assertThat(otlpMetrics).hasSizeGreaterThanOrEqualTo(3); }); } diff --git a/smoke-tests/apps/gRPC/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/GrpcTest.java b/smoke-tests/apps/gRPC/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/GrpcTest.java index 9f5ff3ac463..6474fe3c545 100644 --- a/smoke-tests/apps/gRPC/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/GrpcTest.java +++ b/smoke-tests/apps/gRPC/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/GrpcTest.java @@ -96,7 +96,8 @@ void doSimpleTest() { entry("operation/synthetic", "False"), entry("cloud/roleInstance", "testroleinstance"), entry("cloud/roleName", "testrolename"), - entry("_MS.IsAutocollected", "True"))); + entry("_MS.IsAutocollected", "True"), + entry("_MS.SentToAMW", "False"))); } @Test From e549eb455bdc7c3b8bd3ba4751e46d3df8806800 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 19 Sep 2025 18:20:49 -0700 Subject: [PATCH 23/31] Fix --- .../agent/internal/PreAggregatedMetricsTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/PreAggregatedMetricsTest.java b/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/PreAggregatedMetricsTest.java index 7615964e25d..915d820215e 100644 --- a/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/PreAggregatedMetricsTest.java +++ b/agent/agent-tooling/src/test/java/com/microsoft/applicationinsights/agent/internal/PreAggregatedMetricsTest.java @@ -136,7 +136,7 @@ void generateHttpClientMetrics() { MetricTelemetryBuilder builder = MetricTelemetryBuilder.create(); MetricData metricData = metricDataCollection.iterator().next(); MetricDataMapper.updateMetricPointBuilder( - builder, metricData, metricData.getData().getPoints().iterator().next(), true, true); + builder, metricData, metricData.getData().getPoints().iterator().next(), true, true, false); TelemetryItem telemetryItem = builder.build(); MetricsData metricsData = (MetricsData) telemetryItem.getData().getBaseData(); @@ -211,7 +211,7 @@ void generateRpcClientMetrics() { MetricTelemetryBuilder builder = MetricTelemetryBuilder.create(); MetricData metricData = metricDataCollection.iterator().next(); MetricDataMapper.updateMetricPointBuilder( - builder, metricData, metricData.getData().getPoints().iterator().next(), true, true); + builder, metricData, metricData.getData().getPoints().iterator().next(), true, true, false); TelemetryItem telemetryItem = builder.build(); MetricsData metricsData = (MetricsData) telemetryItem.getData().getBaseData(); @@ -291,7 +291,7 @@ void generateHttpServerMetrics() { MetricTelemetryBuilder builder = MetricTelemetryBuilder.create(); MetricData metricData = target; MetricDataMapper.updateMetricPointBuilder( - builder, metricData, metricData.getData().getPoints().iterator().next(), true, true); + builder, metricData, metricData.getData().getPoints().iterator().next(), true, true, false); TelemetryItem telemetryItem = builder.build(); MetricsData metricsData = (MetricsData) telemetryItem.getData().getBaseData(); From 6933c4fb159788f031ed3b55ce370efc2922d791 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Fri, 19 Sep 2025 18:35:31 -0700 Subject: [PATCH 24/31] Fix sporadically failing JmxMetricTest --- .../smoketest/JmxMetricTest.java | 27 +++---------------- 1 file changed, 4 insertions(+), 23 deletions(-) diff --git a/smoke-tests/apps/JmxMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/JmxMetricTest.java b/smoke-tests/apps/JmxMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/JmxMetricTest.java index 2c4896631a1..e8e4c59af8d 100644 --- a/smoke-tests/apps/JmxMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/JmxMetricTest.java +++ b/smoke-tests/apps/JmxMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/JmxMetricTest.java @@ -19,10 +19,8 @@ import com.microsoft.applicationinsights.smoketest.schemav2.MetricData; import io.opentelemetry.proto.metrics.v1.Metric; import java.util.Arrays; -import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.Test; @@ -107,27 +105,10 @@ private void verifyJmxMetricsSentToOtlpEndpoint() { List metrics = testing.mockedOtlpIngestion.extractMetricsFromRequests(requests); - Map occurrences = new HashMap<>(); - - // counting all occurrences of the jmx metrics that are applicable to all java - // versions - for (Metric metric : metrics) { - String metricName = metric.getName(); - if (jmxMetricsAllJavaVersionsOtlp.contains(metricName)) { - if (occurrences.containsKey(metricName)) { - occurrences.put(metricName, occurrences.get(metricName) + 1); - } else { - occurrences.put(metricName, 1); - } - } - } - - // confirm that those metrics received once or twice - // (the collector seems to run for 5-10 sec) - assertThat(occurrences.keySet()).hasSize(jmxMetricsAllJavaVersionsOtlp.size()); - for (int value : occurrences.values()) { - assertThat(value).isBetween(1, 8); - } + // check the jmx metrics that are applicable to all java versions + assertThat(metrics) + .extracting(Metric::getName) + .containsAll(jmxMetricsAllJavaVersionsOtlp); }); } From ed8003b949785b06d736e714e6c360dca12babce Mon Sep 17 00:00:00 2001 From: Sean Li Date: Fri, 19 Sep 2025 18:55:40 -0700 Subject: [PATCH 25/31] remove unused variable --- .../smoketest/OpenTelemetryMetricTestToAmw.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java b/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java index 792f45f0d29..45aad7bb633 100644 --- a/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java +++ b/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java @@ -44,7 +44,7 @@ abstract class OpenTelemetryMetricTestToAmw { @TargetUri("/trackDoubleCounterMetric") void trackDoubleCounterMetric() throws Exception { validateCounterMetric("trackDoubleCounterMetric"); - validateOtlpMetricsReceived("trackDoubleCounterMetric"); + validateOtlpMetricsReceived(); } private void validateCounterMetric(String name) throws Exception { @@ -144,7 +144,7 @@ private void validateCounterMetric(String name) throws Exception { assertThat(properties3).containsEntry("_MS.SentToAMW", "True"); } - private void validateOtlpMetricsReceived(String name) throws Exception { + private void validateOtlpMetricsReceived() throws Exception { await() .atMost(10, SECONDS) .untilAsserted( From dabe36885d050ab4a59c9de4c2bbde90ca2c0058 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Mon, 22 Sep 2025 01:34:06 -0700 Subject: [PATCH 26/31] Remove useOtlpViaEnvVars and use useOtlpEndpoint --- .../HttpPreaggregatedMetricsTestOtlpEnabled.java | 2 +- .../smoketest/OpenTelemetryMetricTestToAmw.java | 2 +- .../smoketest/SmokeTestExtension.java | 11 ++++------- .../smoketest/SmokeTestExtensionBuilder.java | 9 +-------- 4 files changed, 7 insertions(+), 17 deletions(-) diff --git a/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java b/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java index 4acf65e4130..49ecdcc3135 100644 --- a/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java +++ b/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java @@ -32,7 +32,7 @@ abstract class HttpPreaggregatedMetricsTestOtlpEnabled { @RegisterExtension static final SmokeTestExtension testing = - SmokeTestExtension.builder().useOtlpViaEnvVars().build(); + SmokeTestExtension.builder().useOtlpEndpoint().build(); @Test @TargetUri("/httpUrlConnection") diff --git a/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java b/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java index 45aad7bb633..794b592e4cd 100644 --- a/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java +++ b/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java @@ -38,7 +38,7 @@ abstract class OpenTelemetryMetricTestToAmw { @RegisterExtension static final SmokeTestExtension testing = - SmokeTestExtension.builder().useOtlpViaEnvVars().build(); + SmokeTestExtension.builder().useOtlpEndpoint().build(); @Test @TargetUri("/trackDoubleCounterMetric") diff --git a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtension.java b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtension.java index 28844094cde..243a5968660 100644 --- a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtension.java +++ b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtension.java @@ -112,7 +112,6 @@ public class SmokeTestExtension private final List jvmArgs; private final boolean useDefaultHttpPort; private final boolean useOtlpEndpoint; - private final boolean useOtlpViaEnvVars; public static SmokeTestExtension create() { return builder().build(); @@ -138,8 +137,7 @@ public static SmokeTestExtensionBuilder builder() { Map envVars, List jvmArgs, boolean useDefaultHttpPort, - boolean useOtlpEndpoint, - boolean useOtlpViaEnvVars) { + boolean useOtlpEndpoint) { this.skipHealthCheck = skipHealthCheck; this.readOnly = readOnly; this.dependencyContainer = dependencyContainer; @@ -169,7 +167,6 @@ public static SmokeTestExtensionBuilder builder() { this.jvmArgs = jvmArgs; this.useDefaultHttpPort = useDefaultHttpPort; this.useOtlpEndpoint = useOtlpEndpoint; - this.useOtlpViaEnvVars = useOtlpViaEnvVars; mockedIngestion = new MockedAppInsightsIngestionServer(useOld3xAgent); } @@ -221,7 +218,7 @@ private void prepareEnvironment(Environment environment) throws Exception { mockedIngestion.startServer(); mockedIngestion.setRequestLoggingEnabled(true); mockedIngestion.setQuickPulseRequestLoggingEnabled(true); - if (useOtlpEndpoint || useOtlpViaEnvVars) { + if (useOtlpEndpoint) { mockedOtlpIngestion.startServer(); } network = Network.newNetwork(); @@ -425,7 +422,7 @@ private void startTestApplicationContainer() throws Exception { Testcontainers.exposeHostPorts(6060); Testcontainers.exposeHostPorts(4318); - if (useOtlpViaEnvVars) { + if (useOtlpEndpoint) { envVars.put("OTEL_METRICS_EXPORTER", "otlp,azure_monitor"); envVars.put("OTEL_EXPORTER_OTLP_METRICS_ENDPOINT", FAKE_OTLP_INGESTION_ENDPOINT); envVars.put("OTEL_EXPORTER_OTLP_PROTOCOL", "http/protobuf"); @@ -580,7 +577,7 @@ public void afterAll(ExtensionContext context) throws Exception { mockedIngestion.stopServer(); mockedIngestion.setRequestLoggingEnabled(false); mockedIngestion.setQuickPulseRequestLoggingEnabled(false); - if (useOtlpEndpoint || useOtlpViaEnvVars) { + if (useOtlpEndpoint) { mockedOtlpIngestion.stopServer(); } } diff --git a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtensionBuilder.java b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtensionBuilder.java index 2a232fe83c8..610141bb781 100644 --- a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtensionBuilder.java +++ b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/SmokeTestExtensionBuilder.java @@ -29,7 +29,6 @@ public class SmokeTestExtensionBuilder { private final List jvmArgs = new ArrayList<>(); private boolean useDefaultHttpPort; private boolean useOtlpEndpoint; - private boolean useOtlpViaEnvVars; public SmokeTestExtensionBuilder setDependencyContainer( String envVarName, GenericContainer container) { @@ -109,11 +108,6 @@ public SmokeTestExtensionBuilder useOtlpEndpoint() { return this; } - public SmokeTestExtensionBuilder useOtlpViaEnvVars() { - this.useOtlpViaEnvVars = true; - return this; - } - public SmokeTestExtension build() { return new SmokeTestExtension( dependencyContainer, @@ -131,7 +125,6 @@ public SmokeTestExtension build() { envVars, jvmArgs, useDefaultHttpPort, - useOtlpEndpoint, - useOtlpViaEnvVars); + useOtlpEndpoint); } } From 1cef19fb90737ead4147a149fdb2fcf0da2de61d Mon Sep 17 00:00:00 2001 From: Sean Li Date: Mon, 22 Sep 2025 13:24:20 -0700 Subject: [PATCH 27/31] Attempt to fix OtlpTest --- .github/workflows/build-common.yml | 2 +- agent/agent-tooling/build.gradle.kts | 2 +- agent/agent-tooling/gradle.lockfile | 2 +- licenses/more-licenses.md | 4 ++-- smoke-tests/framework/build.gradle.kts | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-common.yml b/.github/workflows/build-common.yml index 15bf7e63633..b72526a8748 100644 --- a/.github/workflows/build-common.yml +++ b/.github/workflows/build-common.yml @@ -10,7 +10,7 @@ on: env: # set this to : to build and test with an unreleased # version of the azure-monitor-opentelemetry-autoconfigure dependency - AZURE_MONITOR_OPENTELEMETRY_AUTOCONFIGURE_SNAPSHOT: Azure/azure-sdk-for-java:main + AZURE_MONITOR_OPENTELEMETRY_AUTOCONFIGURE_SNAPSHOT: Azure/azure-sdk-for-java:xiang17/FixOtlpTest jobs: spotless: diff --git a/agent/agent-tooling/build.gradle.kts b/agent/agent-tooling/build.gradle.kts index 7d5a4760970..05b29f0fcd1 100644 --- a/agent/agent-tooling/build.gradle.kts +++ b/agent/agent-tooling/build.gradle.kts @@ -21,7 +21,7 @@ dependencies { implementation(project(":agent:agent-profiler:agent-diagnostics")) implementation(project(":etw:java")) - implementation("com.azure:azure-monitor-opentelemetry-autoconfigure:1.4.0-beta.1") + implementation("com.azure:azure-monitor-opentelemetry-autoconfigure:1.4.0") compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-bootstrap") compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling") compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling-java9") diff --git a/agent/agent-tooling/gradle.lockfile b/agent/agent-tooling/gradle.lockfile index a7cbccd3600..d1e1826d162 100644 --- a/agent/agent-tooling/gradle.lockfile +++ b/agent/agent-tooling/gradle.lockfile @@ -9,7 +9,7 @@ com.azure:azure-core-http-netty:1.16.1=runtimeClasspath com.azure:azure-core:1.56.1=runtimeClasspath com.azure:azure-identity:1.17.0=runtimeClasspath com.azure:azure-json:1.5.0=runtimeClasspath -com.azure:azure-monitor-opentelemetry-autoconfigure:1.4.0-beta.1=runtimeClasspath +com.azure:azure-monitor-opentelemetry-autoconfigure:1.4.0=runtimeClasspath com.azure:azure-sdk-bom:1.2.38=runtimeClasspath com.azure:azure-storage-blob:12.31.2=runtimeClasspath com.azure:azure-storage-common:12.30.2=runtimeClasspath diff --git a/licenses/more-licenses.md b/licenses/more-licenses.md index 45e4d07c6e8..9b74e14b315 100644 --- a/licenses/more-licenses.md +++ b/licenses/more-licenses.md @@ -1,7 +1,7 @@ # agent ## Dependency License Report -_2025-09-19 15:48:02 PDT_ +_2025-09-22 13:09:37 PDT_ ## Apache License, Version 2.0 **1** **Group:** `com.fasterxml.jackson.core` **Name:** `jackson-annotations` **Version:** `2.20` @@ -374,7 +374,7 @@ _2025-09-19 15:48:02 PDT_ > - **POM Project URL**: [https://github.com/Azure/azure-sdk-for-java](https://github.com/Azure/azure-sdk-for-java) > - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT) -**72** **Group:** `com.azure` **Name:** `azure-monitor-opentelemetry-autoconfigure` **Version:** `1.4.0-beta.1` +**72** **Group:** `com.azure` **Name:** `azure-monitor-opentelemetry-autoconfigure` **Version:** `1.4.0` > - **POM License**: MIT License - [https://opensource.org/licenses/MIT](https://opensource.org/licenses/MIT) **73** **Group:** `com.azure` **Name:** `azure-storage-blob` **Version:** `12.31.2` diff --git a/smoke-tests/framework/build.gradle.kts b/smoke-tests/framework/build.gradle.kts index 4d35f4cb040..7be51e7e34c 100644 --- a/smoke-tests/framework/build.gradle.kts +++ b/smoke-tests/framework/build.gradle.kts @@ -31,5 +31,5 @@ dependencies { implementation("org.assertj:assertj-core") implementation("com.azure:azure-json:1.5.0") - implementation("com.azure:azure-monitor-opentelemetry-autoconfigure:1.4.0-beta.1") + implementation("com.azure:azure-monitor-opentelemetry-autoconfigure:1.4.0") } From c80af29baa5fe3d540ca3297774aec532cceb5fa Mon Sep 17 00:00:00 2001 From: Sean Li Date: Mon, 22 Sep 2025 14:00:59 -0700 Subject: [PATCH 28/31] ./gradlew :smoke-tests:apps:HttpPreaggregatedMetrics:spotlessApply --- .../smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java b/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java index 49ecdcc3135..b9f1bfc2157 100644 --- a/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java +++ b/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java @@ -31,8 +31,7 @@ abstract class HttpPreaggregatedMetricsTestOtlpEnabled { @RegisterExtension - static final SmokeTestExtension testing = - SmokeTestExtension.builder().useOtlpEndpoint().build(); + static final SmokeTestExtension testing = SmokeTestExtension.builder().useOtlpEndpoint().build(); @Test @TargetUri("/httpUrlConnection") From 0ebf62761b93bb569b6d12e136a53e378e7b4253 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Wed, 24 Sep 2025 14:23:17 -0700 Subject: [PATCH 29/31] ./gradlew :smoke-tests:apps:OpenTelemetryMetric:spotlessApply --- .../smoketest/OpenTelemetryMetricTestToAmw.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java b/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java index 794b592e4cd..be69f6825b6 100644 --- a/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java +++ b/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java @@ -37,8 +37,7 @@ abstract class OpenTelemetryMetricTestToAmw { @RegisterExtension - static final SmokeTestExtension testing = - SmokeTestExtension.builder().useOtlpEndpoint().build(); + static final SmokeTestExtension testing = SmokeTestExtension.builder().useOtlpEndpoint().build(); @Test @TargetUri("/trackDoubleCounterMetric") From 62fb98ccc8f1421fd533ca201a422062425126d0 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Wed, 24 Sep 2025 14:45:35 -0700 Subject: [PATCH 30/31] Change branch to main --- .github/workflows/build-common.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-common.yml b/.github/workflows/build-common.yml index b72526a8748..15bf7e63633 100644 --- a/.github/workflows/build-common.yml +++ b/.github/workflows/build-common.yml @@ -10,7 +10,7 @@ on: env: # set this to : to build and test with an unreleased # version of the azure-monitor-opentelemetry-autoconfigure dependency - AZURE_MONITOR_OPENTELEMETRY_AUTOCONFIGURE_SNAPSHOT: Azure/azure-sdk-for-java:xiang17/FixOtlpTest + AZURE_MONITOR_OPENTELEMETRY_AUTOCONFIGURE_SNAPSHOT: Azure/azure-sdk-for-java:main jobs: spotless: From 0e4ddbf65c6cee76a54e09bddd0c836caa996265 Mon Sep 17 00:00:00 2001 From: Sean Li Date: Thu, 25 Sep 2025 13:28:29 -0700 Subject: [PATCH 31/31] Remove inst/azure-monitor-opentelemetry-autoconfigure.properties. Remove branch in build-common.yml. --- .github/workflows/build-common.yml | 2 +- inst/azure-monitor-opentelemetry-autoconfigure.properties | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) delete mode 100644 inst/azure-monitor-opentelemetry-autoconfigure.properties diff --git a/.github/workflows/build-common.yml b/.github/workflows/build-common.yml index 15bf7e63633..3a744dcb52c 100644 --- a/.github/workflows/build-common.yml +++ b/.github/workflows/build-common.yml @@ -10,7 +10,7 @@ on: env: # set this to : to build and test with an unreleased # version of the azure-monitor-opentelemetry-autoconfigure dependency - AZURE_MONITOR_OPENTELEMETRY_AUTOCONFIGURE_SNAPSHOT: Azure/azure-sdk-for-java:main + AZURE_MONITOR_OPENTELEMETRY_AUTOCONFIGURE_SNAPSHOT: jobs: spotless: diff --git a/inst/azure-monitor-opentelemetry-autoconfigure.properties b/inst/azure-monitor-opentelemetry-autoconfigure.properties deleted file mode 100644 index 8c5a1732da2..00000000000 --- a/inst/azure-monitor-opentelemetry-autoconfigure.properties +++ /dev/null @@ -1,2 +0,0 @@ -name=azure-monitor-opentelemetry-autoconfigure -version=1.3.0