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" diff --git a/agent/agent-tooling/build.gradle.kts b/agent/agent-tooling/build.gradle.kts index d51b1eb06b8..462a1ba745b 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") 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 68d1134526d..e63fd541a23 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=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/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) { 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..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 @@ -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; @@ -274,7 +275,8 @@ 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 +367,20 @@ private static SpanExporter buildTraceExporter( private static MetricExporter buildMetricExporter( Configuration configuration, TelemetryClient telemetryClient, - List metricFilters) { + List metricFilters, + ConfigProperties configProperties) { + + String otelMetricsEndpoint = configProperties.getString("otel.exporter.otlp.metrics.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()); } 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/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/licenses/more-licenses.md b/licenses/more-licenses.md index 635bc8bf167..820e1e95686 100644 --- a/licenses/more-licenses.md +++ b/licenses/more-licenses.md @@ -156,13 +156,13 @@ _2025-09-25 22:10:08 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-25 22:10:08 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-25 22:10:08 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-25 22:10:08 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` > - **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.9.0` +**77** **Group:** `com.github.oshi` **Name:** `oshi-core` **Version:** `6.9.0` > - **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/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 80423e435e8..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 @@ -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/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..b9f1bfc2157 --- /dev/null +++ b/smoke-tests/apps/HttpPreaggregatedMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/HttpPreaggregatedMetricsTestOtlpEnabled.java @@ -0,0 +1,130 @@ +// 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 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().useOtlpEndpoint().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 {} +} 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/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); }); } 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..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 @@ -20,6 +20,8 @@ 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().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 1bc05995639..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 @@ -54,7 +54,9 @@ 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"); + 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 0953e282707..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 @@ -50,7 +50,9 @@ 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"); + assertThat(telemetry.rdEnvelope.getTags()).containsEntry("ai.session.id", "mysession"); } @Test diff --git a/smoke-tests/apps/OpenTelemetryMetric/build.gradle.kts b/smoke-tests/apps/OpenTelemetryMetric/build.gradle.kts index 49822a2d9f6..032875462e8 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/OpenTelemetryMetricTest.java b/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTest.java index a6e935361fe..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,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) 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..be69f6825b6 --- /dev/null +++ b/smoke-tests/apps/OpenTelemetryMetric/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/OpenTelemetryMetricTestToAmw.java @@ -0,0 +1,201 @@ +// 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 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().useOtlpEndpoint().build(); + + @Test + @TargetUri("/trackDoubleCounterMetric") + void trackDoubleCounterMetric() throws Exception { + validateCounterMetric("trackDoubleCounterMetric"); + validateOtlpMetricsReceived(); + } + + 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() 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).hasSizeGreaterThanOrEqualTo(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..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 @@ -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/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..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 @@ -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", @@ -95,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 @@ -152,7 +154,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", @@ -172,7 +175,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) diff --git a/smoke-tests/framework/build.gradle.kts b/smoke-tests/framework/build.gradle.kts index 35abbc7d385..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.3.0") + implementation("com.azure:azure-monitor-opentelemetry-autoconfigure:1.4.0") } 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..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 @@ -422,6 +422,12 @@ private void startTestApplicationContainer() throws Exception { Testcontainers.exposeHostPorts(6060); Testcontainers.exposeHostPorts(4318); + 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"); + } + GenericContainer container; if (REMOTE_DEBUG || useDefaultHttpPort) { FixedHostPortGenericContainer fixedPortContainer =