From 0f338837131b04b82bd9c1e7feb5a636d03f8a61 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Mon, 7 Jul 2025 14:24:28 -0700 Subject: [PATCH 01/11] Fix flaky live metrics smoke test --- .../smoketest/LiveMetricsTest.java | 63 ++++++++++--------- .../smoketest/SmokeTestExtension.java | 3 + .../MockedAppInsightsIngestionServer.java | 3 +- .../MockedQuickPulseServlet.java | 6 ++ 4 files changed, 44 insertions(+), 31 deletions(-) diff --git a/smoke-tests/apps/LiveMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/LiveMetricsTest.java b/smoke-tests/apps/LiveMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/LiveMetricsTest.java index e4ed179055a..370b71862f7 100644 --- a/smoke-tests/apps/LiveMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/LiveMetricsTest.java +++ b/smoke-tests/apps/LiveMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/LiveMetricsTest.java @@ -17,6 +17,8 @@ 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.awaitility.Awaitility.await; +import static org.junit.jupiter.api.Assertions.assertTrue; import com.azure.json.JsonProviders; import com.azure.json.JsonReader; @@ -28,9 +30,7 @@ import com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.models.Trace; import java.io.IOException; import java.time.Duration; -import java.util.ArrayList; import java.util.List; -import org.awaitility.Awaitility; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -41,42 +41,39 @@ abstract class LiveMetricsTest { @Test @TargetUri("/test") - void testTelemetryDataFlow() throws java.lang.Exception { - Awaitility.await() + void testTelemetryDataFlow() { + await() .atMost(Duration.ofSeconds(60)) .until(() -> testing.mockedIngestion.getCountForType("RequestData") == 1); - PostBodyVerifier postBodyVerifier = new PostBodyVerifier(); - assertThat(testing.mockedIngestion.isPingReceived()).isTrue(); - List postBodies = testing.mockedIngestion.getPostBodies(); - assertThat(postBodies).hasSizeGreaterThan(0); // should post at least once - - for (String postBody : postBodies) { - postBodyVerifier.searchPostBody(postBody); - } - - assertThat(postBodyVerifier.hasExceptionDoc()).isTrue(); - assertThat(postBodyVerifier.hasTraceDoc()).isTrue(); - assertThat(postBodyVerifier.hasDependency()).isTrue(); - assertThat(postBodyVerifier.hasRequest()).isTrue(); + await() + .untilAsserted( + () -> { + PostBodyVerifier verifier = new PostBodyVerifier(); + for (String postBody : testing.mockedIngestion.getPostBodies()) { + verifier.searchPostBody(postBody); + } + + assertTrue(verifier.hasExceptionDoc()); + assertTrue(verifier.hasTraceDoc()); + assertTrue(verifier.hasDependency()); + assertTrue(verifier.hasRequest()); + }); } - class PostBodyVerifier { - boolean foundExceptionDoc = false; - boolean foundTraceDoc = false; - boolean foundDependency = false; - boolean foundRequest = false; + static class PostBodyVerifier { + boolean foundExceptionDoc; + boolean foundTraceDoc; + boolean foundDependency; + boolean foundRequest; - public void searchPostBody(String postBody) { + public void searchPostBody(String postBody) throws IOException { // Each post body is a list with a singular MonitoringDataPoint - List dataPoints = new ArrayList<>(); - try { - JsonReader reader = JsonProviders.createReader(postBody); + List dataPoints; + try (JsonReader reader = JsonProviders.createReader(postBody)) { dataPoints = reader.readArray(MonitoringDataPoint::fromJson); - } catch (IOException e) { - throw new IllegalStateException("Failed to parse post request body", e); } // Because the mock ping/posts should succeed, we should only have one MonitoringDataPoint per @@ -143,7 +140,10 @@ private boolean hasDependency(List metrics) { String name = metric.getName(); double value = metric.getValue(); if (name.equals("\\ApplicationInsights\\Dependency Calls/Sec")) { - return value == 1; + // TODO wait for the live metrics from health check to be emitted + // before calling MockedQuickPulseServlet.resetData() + // then we can assert that the value is exactly == 1 + return value >= 1; } } return false; @@ -154,7 +154,10 @@ private boolean hasRequest(List metrics) { String name = metric.getName(); double value = metric.getValue(); if (name.equals("\\ApplicationInsights\\Requests/Sec")) { - return value == 1; + // TODO wait for the live metrics from health check to be emitted + // before calling MockedQuickPulseServlet.resetData() + // then we can assert that the value is exactly == 1 + return value >= 1; } } return false; 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 b5b876d0c0b..434d78a2593 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 @@ -284,6 +284,9 @@ private void clearOutAnyInitLogs() throws Exception { String contextRootUrl = getBaseUrl() + "/"; HttpHelper.getResponseCodeEnsuringSampled(contextRootUrl); waitForHealthCheckTelemetry(contextRootUrl); + // wait for live metrics to start sending data (needed for LiveMetricsTest) + await().untilAsserted(() -> assertThat(mockedIngestion.getPostBodies()).isNotEmpty()); + System.out.println("Clearing any RequestData from health check."); mockedIngestion.resetData(); } diff --git a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedAppInsightsIngestionServer.java b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedAppInsightsIngestionServer.java index 7556f6c4451..ba7cea2cbe3 100644 --- a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedAppInsightsIngestionServer.java +++ b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedAppInsightsIngestionServer.java @@ -55,7 +55,8 @@ public void stopServer() throws Exception { } public void resetData() { - this.servlet.resetData(); + servlet.resetData(); + quickPulseServlet.resetData(); } public boolean hasData() { diff --git a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java index 654dfef505e..240dfcbc284 100644 --- a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java +++ b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java @@ -78,4 +78,10 @@ public List getPostBodies() { public void setRequestLoggingEnabled(boolean enabled) { loggingEnabled = enabled; } + + public void resetData() { + synchronized (lock) { + postBodies.clear(); + } + } } From 92f3a05ab3812ac099cd39059423e35d1ff9096d Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Mon, 7 Jul 2025 14:26:47 -0700 Subject: [PATCH 02/11] more --- .../applicationinsights/smoketest/LiveMetricsTest.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/smoke-tests/apps/LiveMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/LiveMetricsTest.java b/smoke-tests/apps/LiveMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/LiveMetricsTest.java index 370b71862f7..ee61242edfe 100644 --- a/smoke-tests/apps/LiveMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/LiveMetricsTest.java +++ b/smoke-tests/apps/LiveMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/LiveMetricsTest.java @@ -140,10 +140,7 @@ private boolean hasDependency(List metrics) { String name = metric.getName(); double value = metric.getValue(); if (name.equals("\\ApplicationInsights\\Dependency Calls/Sec")) { - // TODO wait for the live metrics from health check to be emitted - // before calling MockedQuickPulseServlet.resetData() - // then we can assert that the value is exactly == 1 - return value >= 1; + return value == 1; } } return false; @@ -154,10 +151,7 @@ private boolean hasRequest(List metrics) { String name = metric.getName(); double value = metric.getValue(); if (name.equals("\\ApplicationInsights\\Requests/Sec")) { - // TODO wait for the live metrics from health check to be emitted - // before calling MockedQuickPulseServlet.resetData() - // then we can assert that the value is exactly == 1 - return value >= 1; + return value == 1; } } return false; From c6e9be2d7f51bf193bb11979c4a70c4b5918b02b Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Mon, 7 Jul 2025 15:37:45 -0700 Subject: [PATCH 03/11] refactor --- .../smoketest/LiveMetricsTest.java | 141 ++---------------- smoke-tests/framework/build.gradle.kts | 4 + .../smoketest/SmokeTestExtension.java | 8 +- .../fakeingestion/LiveMetricsVerifier.java | 120 +++++++++++++++ .../MockedAppInsightsIngestionServer.java | 8 +- .../MockedQuickPulseServlet.java | 20 ++- 6 files changed, 155 insertions(+), 146 deletions(-) create mode 100644 smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/LiveMetricsVerifier.java diff --git a/smoke-tests/apps/LiveMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/LiveMetricsTest.java b/smoke-tests/apps/LiveMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/LiveMetricsTest.java index ee61242edfe..b5517eb3c12 100644 --- a/smoke-tests/apps/LiveMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/LiveMetricsTest.java +++ b/smoke-tests/apps/LiveMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/LiveMetricsTest.java @@ -18,19 +18,9 @@ import static com.microsoft.applicationinsights.smoketest.EnvironmentValue.WILDFLY_13_JAVA_8_OPENJ9; import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import com.azure.json.JsonProviders; -import com.azure.json.JsonReader; -import com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.models.DocumentIngress; -import com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.models.DocumentType; -import com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.models.Exception; -import com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.models.MetricPoint; -import com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.models.MonitoringDataPoint; -import com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.models.Trace; -import java.io.IOException; + +import com.microsoft.applicationinsights.smoketest.fakeingestion.LiveMetricsVerifier; import java.time.Duration; -import java.util.List; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -46,127 +36,20 @@ void testTelemetryDataFlow() { .atMost(Duration.ofSeconds(60)) .until(() -> testing.mockedIngestion.getCountForType("RequestData") == 1); - assertThat(testing.mockedIngestion.isPingReceived()).isTrue(); - await() .untilAsserted( () -> { - PostBodyVerifier verifier = new PostBodyVerifier(); - for (String postBody : testing.mockedIngestion.getPostBodies()) { - verifier.searchPostBody(postBody); - } - - assertTrue(verifier.hasExceptionDoc()); - assertTrue(verifier.hasTraceDoc()); - assertTrue(verifier.hasDependency()); - assertTrue(verifier.hasRequest()); - }); - } + LiveMetricsVerifier verifier = testing.mockedIngestion.getLiveMetrics(); + + verifier.confirmDocsAreFiltered(); + verifier.confirmPerfCountersNonZero(); - static class PostBodyVerifier { - boolean foundExceptionDoc; - boolean foundTraceDoc; - boolean foundDependency; - boolean foundRequest; - - public void searchPostBody(String postBody) throws IOException { - // Each post body is a list with a singular MonitoringDataPoint - List dataPoints; - try (JsonReader reader = JsonProviders.createReader(postBody)) { - dataPoints = reader.readArray(MonitoringDataPoint::fromJson); - } - - // Because the mock ping/posts should succeed, we should only have one MonitoringDataPoint per - // post - assertThat(dataPoints).hasSize(1); - MonitoringDataPoint dataPoint = dataPoints.get(0); - - List docs = dataPoint.getDocuments(); - List metrics = dataPoint.getMetrics(); - - confirmDocsAreFiltered(docs); - confirmPerfCountersNonZero(metrics); - foundExceptionDoc = foundExceptionDoc || hasException(docs); - foundTraceDoc = foundTraceDoc || hasTrace(docs); - foundDependency = foundDependency || hasDependency(metrics); - foundRequest = foundRequest || hasRequest(metrics); - } - - public boolean hasExceptionDoc() { - return foundExceptionDoc; - } - - public boolean hasTraceDoc() { - return foundTraceDoc; - } - - public boolean hasDependency() { - return foundDependency; - } - - public boolean hasRequest() { - return foundRequest; - } - - private void confirmDocsAreFiltered(List docs) { - for (DocumentIngress doc : docs) { - assertThat(doc.getDocumentType()).isNotEqualTo(DocumentType.REMOTE_DEPENDENCY); - assertThat(doc.getDocumentType()).isNotEqualTo(DocumentType.REQUEST); - } - } - - private boolean hasException(List docs) { - for (DocumentIngress doc : docs) { - if (doc.getDocumentType().equals(DocumentType.EXCEPTION) - && ((Exception) doc).getExceptionMessage().equals("Fake Exception")) { - return true; - } - } - return false; - } - - private boolean hasTrace(List docs) { - for (DocumentIngress doc : docs) { - if (doc.getDocumentType().equals(DocumentType.TRACE) - && ((Trace) doc).getMessage().equals("This message should generate a trace")) { - return true; - } - } - return false; - } - - private boolean hasDependency(List metrics) { - for (MetricPoint metric : metrics) { - String name = metric.getName(); - double value = metric.getValue(); - if (name.equals("\\ApplicationInsights\\Dependency Calls/Sec")) { - return value == 1; - } - } - return false; - } - - private boolean hasRequest(List metrics) { - for (MetricPoint metric : metrics) { - String name = metric.getName(); - double value = metric.getValue(); - if (name.equals("\\ApplicationInsights\\Requests/Sec")) { - return value == 1; - } - } - return false; - } - - private void confirmPerfCountersNonZero(List metrics) { - for (MetricPoint metric : metrics) { - String name = metric.getName(); - double value = metric.getValue(); - if (name.equals("\\Process\\Physical Bytes") - || name.equals("\\% Process\\Processor Time Normalized")) { - assertThat(value).isNotEqualTo(0); - } - } - } + assertThat(verifier.getExceptionCount("Fake Exception")).isEqualTo(1); + assertThat(verifier.getTraceCount("This message should generate a trace")) + .isEqualTo(1); + assertThat(verifier.getDependencyCount()).isEqualTo(1); + assertThat(verifier.getRequestCount()).isEqualTo(1); + }); } @Environment(TOMCAT_8_JAVA_8) diff --git a/smoke-tests/framework/build.gradle.kts b/smoke-tests/framework/build.gradle.kts index 4b6ea5779ff..d26073f8a95 100644 --- a/smoke-tests/framework/build.gradle.kts +++ b/smoke-tests/framework/build.gradle.kts @@ -29,4 +29,8 @@ dependencies { implementation("ch.qos.logback:logback-classic") implementation("org.assertj:assertj-core") + + // Azure dependencies for PostBodyVerifier + implementation("com.azure:azure-json:1.0.0") + implementation("com.azure:azure-monitor-opentelemetry-autoconfigure:1.1.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 434d78a2593..8798b9a7e8f 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 @@ -281,11 +281,15 @@ protected String getAppContext() { private void clearOutAnyInitLogs() throws Exception { if (!skipHealthCheck) { + await().until(mockedIngestion::isReceivingLiveMetrics); String contextRootUrl = getBaseUrl() + "/"; HttpHelper.getResponseCodeEnsuringSampled(contextRootUrl); waitForHealthCheckTelemetry(contextRootUrl); - // wait for live metrics to start sending data (needed for LiveMetricsTest) - await().untilAsserted(() -> assertThat(mockedIngestion.getPostBodies()).isNotEmpty()); + await() + .untilAsserted( + () -> + assertThat(mockedIngestion.getLiveMetrics().getSuccessfulRequestCount()) + .isEqualTo(1)); System.out.println("Clearing any RequestData from health check."); mockedIngestion.resetData(); diff --git a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/LiveMetricsVerifier.java b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/LiveMetricsVerifier.java new file mode 100644 index 00000000000..98cc559a9a7 --- /dev/null +++ b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/LiveMetricsVerifier.java @@ -0,0 +1,120 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.microsoft.applicationinsights.smoketest.fakeingestion; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.azure.json.JsonProviders; +import com.azure.json.JsonReader; +import com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.models.DocumentIngress; +import com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.models.DocumentType; +import com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.models.Exception; +import com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.models.MetricPoint; +import com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.models.MonitoringDataPoint; +import com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.models.Trace; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class LiveMetricsVerifier { + + private final List points = new ArrayList<>(); + + public void apply(String postBody) throws IOException { + List dataPoints; + try (JsonReader reader = JsonProviders.createReader(postBody)) { + dataPoints = reader.readArray(MonitoringDataPoint::fromJson); + } + + // Because the mock ping/posts should succeed, there should be one MonitoringDataPoint per post + assertThat(dataPoints).hasSize(1); + points.add(dataPoints.get(0)); + } + + public int getRequestCount() { + return getMetricCount("\\ApplicationInsights\\Requests/Sec"); + } + + public int getSuccessfulRequestCount() { + return getMetricCount("\\ApplicationInsights\\Requests Succeeded/Sec"); + } + + public int getDependencyCount() { + return getMetricCount("\\ApplicationInsights\\Dependency Calls/Sec"); + } + + public int getExceptionCount(String exceptionMessage) { + int count = 0; + for (MonitoringDataPoint point : points) { + List docs = point.getDocuments(); + for (DocumentIngress doc : docs) { + if (doc.getDocumentType().equals(DocumentType.EXCEPTION)) { + Exception ex = (Exception) doc; + if (ex.getExceptionMessage().equals(exceptionMessage)) { + count++; + } + } + } + } + return count; + } + + public int getTraceCount(String traceMessage) { + int count = 0; + for (MonitoringDataPoint point : points) { + List docs = point.getDocuments(); + for (DocumentIngress doc : docs) { + if (doc.getDocumentType().equals(DocumentType.TRACE)) { + Trace trace = (Trace) doc; + if (trace.getMessage().equals(traceMessage)) { + count++; + } + } + } + } + return count; + } + + public void confirmDocsAreFiltered() { + for (MonitoringDataPoint point : points) { + List docs = point.getDocuments(); + for (DocumentIngress doc : docs) { + assertThat(doc.getDocumentType()).isNotEqualTo(DocumentType.REMOTE_DEPENDENCY); + assertThat(doc.getDocumentType()).isNotEqualTo(DocumentType.REQUEST); + } + } + } + + public void confirmPerfCountersNonZero() { + for (MonitoringDataPoint point : points) { + List metrics = point.getMetrics(); + for (MetricPoint metric : metrics) { + String name = metric.getName(); + double value = metric.getValue(); + if (name.equals("\\Process\\Physical Bytes") + || name.equals("\\% Process\\Processor Time Normalized")) { + assertThat(value).isNotEqualTo(0); + } + } + } + } + + private int getMetricCount(String metricName) { + int count = 0; + for (MonitoringDataPoint point : points) { + List metrics = point.getMetrics(); + for (MetricPoint metric : metrics) { + String name = metric.getName(); + double value = metric.getValue(); + if (name.equals(metricName)) { + if (Math.floor(value) != value) { + throw new IllegalStateException("Not an integer: " + value); + } + count += (int) value; + } + } + } + return count; + } +} diff --git a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedAppInsightsIngestionServer.java b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedAppInsightsIngestionServer.java index ba7cea2cbe3..8520636ccd5 100644 --- a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedAppInsightsIngestionServer.java +++ b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedAppInsightsIngestionServer.java @@ -284,12 +284,12 @@ public boolean test(Envelope input) { return items; } - public boolean isPingReceived() { - return quickPulseServlet.isPingReceived(); + public boolean isReceivingLiveMetrics() { + return quickPulseServlet.isReceivingLiveMetrics(); } - public List getPostBodies() { - return quickPulseServlet.getPostBodies(); + public LiveMetricsVerifier getLiveMetrics() { + return quickPulseServlet.getVerifier(); } @SuppressWarnings("SystemOut") diff --git a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java index 240dfcbc284..fc5d161fbea 100644 --- a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java +++ b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java @@ -6,8 +6,6 @@ import com.google.common.io.CharStreams; import java.io.IOException; import java.io.StringWriter; -import java.util.ArrayList; -import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -16,7 +14,8 @@ public class MockedQuickPulseServlet extends HttpServlet { private final AtomicBoolean pingReceived = new AtomicBoolean(false); - private final List postBodies = new ArrayList<>(); + private final AtomicBoolean postReceived = new AtomicBoolean(false); + private volatile LiveMetricsVerifier verifier = new LiveMetricsVerifier(); private final Object lock = new Object(); private static final String BODY = @@ -52,8 +51,9 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws I resp.getWriter().write(BODY); } else if (path.equals("/post")) { + postReceived.set(true); synchronized (lock) { - postBodies.add(body); + verifier.apply(body); } logit("post body: " + body); // continue to post @@ -65,14 +65,12 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws I } } - public boolean isPingReceived() { - return pingReceived.get(); + public boolean isReceivingLiveMetrics() { + return pingReceived.get() && postReceived.get(); } - public List getPostBodies() { - synchronized (lock) { - return new ArrayList<>(postBodies); - } + public LiveMetricsVerifier getVerifier() { + return verifier; } public void setRequestLoggingEnabled(boolean enabled) { @@ -81,7 +79,7 @@ public void setRequestLoggingEnabled(boolean enabled) { public void resetData() { synchronized (lock) { - postBodies.clear(); + verifier = new LiveMetricsVerifier(); } } } From 319ac587d0656384aeb97fd5d6216d7dab1d2791 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Mon, 7 Jul 2025 17:25:37 -0700 Subject: [PATCH 04/11] cleanup --- smoke-tests/framework/build.gradle.kts | 1 - .../smoketest/fakeingestion/MockedQuickPulseServlet.java | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/smoke-tests/framework/build.gradle.kts b/smoke-tests/framework/build.gradle.kts index d26073f8a95..3858db0c6f8 100644 --- a/smoke-tests/framework/build.gradle.kts +++ b/smoke-tests/framework/build.gradle.kts @@ -30,7 +30,6 @@ dependencies { implementation("org.assertj:assertj-core") - // Azure dependencies for PostBodyVerifier implementation("com.azure:azure-json:1.0.0") implementation("com.azure:azure-monitor-opentelemetry-autoconfigure:1.1.0") } diff --git a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java index fc5d161fbea..801a09bdc74 100644 --- a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java +++ b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java @@ -13,8 +13,8 @@ public class MockedQuickPulseServlet extends HttpServlet { - private final AtomicBoolean pingReceived = new AtomicBoolean(false); - private final AtomicBoolean postReceived = new AtomicBoolean(false); + private final AtomicBoolean pingReceived = new AtomicBoolean(); + private final AtomicBoolean postReceived = new AtomicBoolean(); private volatile LiveMetricsVerifier verifier = new LiveMetricsVerifier(); private final Object lock = new Object(); From 0829ed99371cdfd2ddca3c8e5f5e030da4c8d622 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Mon, 7 Jul 2025 19:38:22 -0700 Subject: [PATCH 05/11] fix --- .../fakeingestion/MockedAppInsightsIngestionServer.java | 1 + .../smoketest/fakeingestion/MockedQuickPulseServlet.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedAppInsightsIngestionServer.java b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedAppInsightsIngestionServer.java index 8520636ccd5..9dc5291b8ee 100644 --- a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedAppInsightsIngestionServer.java +++ b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedAppInsightsIngestionServer.java @@ -52,6 +52,7 @@ public void stopServer() throws Exception { System.out.println("Stopping fake Breeze ingestion..."); server.stop(); server.join(); + quickPulseServlet.resetData(); } public void resetData() { diff --git a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java index 801a09bdc74..3ebac459e4d 100644 --- a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java +++ b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java @@ -79,6 +79,8 @@ public void setRequestLoggingEnabled(boolean enabled) { public void resetData() { synchronized (lock) { + pingReceived.set(false); + postReceived.set(false); verifier = new LiveMetricsVerifier(); } } From 767548869bf00eb873187b0936fed17d6d307759 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Mon, 7 Jul 2025 19:48:02 -0700 Subject: [PATCH 06/11] debug --- .../smoketest/fakeingestion/MockedQuickPulseServlet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java index 3ebac459e4d..ea5c92d04df 100644 --- a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java +++ b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java @@ -19,7 +19,7 @@ public class MockedQuickPulseServlet extends HttpServlet { private final Object lock = new Object(); private static final String BODY = - "{\"ETag\":\"fake::etag\",\"Metrics\":[],\"QuotaInfo\":null,\"DocumentStreams\":[{\"Id\":\"all-types-default\",\"DocumentFilterGroups\":[{\"TelemetryType\":\"Request\",\"Filters\":{\"Filters\":[{\"FieldName\":\"Success\",\"Predicate\":\"Equal\",\"Comparand\":\"false\"}]}},{\"TelemetryType\":\"Dependency\",\"Filters\":{\"Filters\":[{\"FieldName\":\"Success\",\"Predicate\":\"Equal\",\"Comparand\":\"false\"}]}},{\"TelemetryType\":\"Exception\",\"Filters\":{\"Filters\":[]}},{\"TelemetryType\":\"Event\",\"Filters\":{\"Filters\":[]}},{\"TelemetryType\":\"Trace\",\"Filters\":{\"Filters\":[]}}]}]}"; + "{\"ETag\":\"fake::etag\",\"Metrics\":[],\"QuotaInfo\":null,\"DocumentStreams\":[{\"Id\":\"all-types-default\",\"DocumentFilterGroups\":[{\"TelemetryType\":\"Request\",\"Filters\":{\"Filters\":[{\"FieldName\":\"Success\",\"Predicate\":\"Equal\",\"Comparand\":\"true\"}]}},{\"TelemetryType\":\"Dependency\",\"Filters\":{\"Filters\":[{\"FieldName\":\"Success\",\"Predicate\":\"Equal\",\"Comparand\":\"false\"}]}},{\"TelemetryType\":\"Exception\",\"Filters\":{\"Filters\":[]}},{\"TelemetryType\":\"Event\",\"Filters\":{\"Filters\":[]}},{\"TelemetryType\":\"Trace\",\"Filters\":{\"Filters\":[]}}]}]}"; private volatile boolean loggingEnabled; From 50414448ac83c983c49bd10b43afaf720a9388b9 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Mon, 7 Jul 2025 20:41:43 -0700 Subject: [PATCH 07/11] fix --- smoke-tests/apps/AzureSdk/build.gradle.kts | 3 +-- .../smoketest/LiveMetricsTest.java | 4 ++-- .../smoketest/SmokeTestExtension.java | 2 +- .../fakeingestion/LiveMetricsVerifier.java | 23 +++++++++++++++---- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/smoke-tests/apps/AzureSdk/build.gradle.kts b/smoke-tests/apps/AzureSdk/build.gradle.kts index 299fa5fb5cb..c1a2263a5fb 100644 --- a/smoke-tests/apps/AzureSdk/build.gradle.kts +++ b/smoke-tests/apps/AzureSdk/build.gradle.kts @@ -7,6 +7,5 @@ dependencies { exclude("org.springframework.boot", "spring-boot-starter-tomcat") } // want to test with one of the earliest version supported, and not managed version used in agent - implementation(enforcedPlatform("com.azure:azure-sdk-bom:1.2.13")) - implementation("com.azure:azure-core") + implementation("com.azure:azure-core:1.39.0") } diff --git a/smoke-tests/apps/LiveMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/LiveMetricsTest.java b/smoke-tests/apps/LiveMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/LiveMetricsTest.java index b5517eb3c12..5445307ea16 100644 --- a/smoke-tests/apps/LiveMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/LiveMetricsTest.java +++ b/smoke-tests/apps/LiveMetrics/src/smokeTest/java/com/microsoft/applicationinsights/smoketest/LiveMetricsTest.java @@ -47,8 +47,8 @@ void testTelemetryDataFlow() { assertThat(verifier.getExceptionCount("Fake Exception")).isEqualTo(1); assertThat(verifier.getTraceCount("This message should generate a trace")) .isEqualTo(1); - assertThat(verifier.getDependencyCount()).isEqualTo(1); - assertThat(verifier.getRequestCount()).isEqualTo(1); + assertThat(verifier.getDependencyCountFromMetric()).isEqualTo(1); + assertThat(verifier.getRequestCountFromMetric()).isEqualTo(1); }); } 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 8798b9a7e8f..ed0e6edaa5d 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 @@ -288,7 +288,7 @@ private void clearOutAnyInitLogs() throws Exception { await() .untilAsserted( () -> - assertThat(mockedIngestion.getLiveMetrics().getSuccessfulRequestCount()) + assertThat(mockedIngestion.getLiveMetrics().getRequestCount(contextRootUrl)) .isEqualTo(1)); System.out.println("Clearing any RequestData from health check."); diff --git a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/LiveMetricsVerifier.java b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/LiveMetricsVerifier.java index 98cc559a9a7..0f16adce315 100644 --- a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/LiveMetricsVerifier.java +++ b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/LiveMetricsVerifier.java @@ -12,6 +12,7 @@ import com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.models.Exception; import com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.models.MetricPoint; import com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.models.MonitoringDataPoint; +import com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.models.Request; import com.azure.monitor.opentelemetry.autoconfigure.implementation.quickpulse.swagger.models.Trace; import java.io.IOException; import java.util.ArrayList; @@ -32,16 +33,28 @@ public void apply(String postBody) throws IOException { points.add(dataPoints.get(0)); } - public int getRequestCount() { + public int getRequestCountFromMetric() { return getMetricCount("\\ApplicationInsights\\Requests/Sec"); } - public int getSuccessfulRequestCount() { - return getMetricCount("\\ApplicationInsights\\Requests Succeeded/Sec"); + public int getDependencyCountFromMetric() { + return getMetricCount("\\ApplicationInsights\\Dependency Calls/Sec"); } - public int getDependencyCount() { - return getMetricCount("\\ApplicationInsights\\Dependency Calls/Sec"); + public int getRequestCount(String url) { + int count = 0; + for (MonitoringDataPoint point : points) { + List docs = point.getDocuments(); + for (DocumentIngress doc : docs) { + if (doc.getDocumentType().equals(DocumentType.REQUEST)) { + Request request = (Request) doc; + if (request.getUrl().equals(url)) { + count++; + } + } + } + } + return count; } public int getExceptionCount(String exceptionMessage) { From ed1e991b83785f622db7c0c86a9fab783bb1b763 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Tue, 8 Jul 2025 08:11:26 -0700 Subject: [PATCH 08/11] fix --- .../smoketest/fakeingestion/LiveMetricsVerifier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/LiveMetricsVerifier.java b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/LiveMetricsVerifier.java index 0f16adce315..cf5290fa413 100644 --- a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/LiveMetricsVerifier.java +++ b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/LiveMetricsVerifier.java @@ -48,7 +48,7 @@ public int getRequestCount(String url) { for (DocumentIngress doc : docs) { if (doc.getDocumentType().equals(DocumentType.REQUEST)) { Request request = (Request) doc; - if (request.getUrl().equals(url)) { + if (url.equals(request.getUrl())) { count++; } } From 4f9a614d706c9fa7fc23a74bc443c6e7e554279e Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Tue, 8 Jul 2025 08:19:44 -0700 Subject: [PATCH 09/11] fix --- .../smoketest/fakeingestion/LiveMetricsVerifier.java | 1 - 1 file changed, 1 deletion(-) diff --git a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/LiveMetricsVerifier.java b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/LiveMetricsVerifier.java index cf5290fa413..4cda17a476b 100644 --- a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/LiveMetricsVerifier.java +++ b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/LiveMetricsVerifier.java @@ -94,7 +94,6 @@ public void confirmDocsAreFiltered() { List docs = point.getDocuments(); for (DocumentIngress doc : docs) { assertThat(doc.getDocumentType()).isNotEqualTo(DocumentType.REMOTE_DEPENDENCY); - assertThat(doc.getDocumentType()).isNotEqualTo(DocumentType.REQUEST); } } } From 479d73030ccb2715fe513c4805559e45c850aa01 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Tue, 8 Jul 2025 08:33:01 -0700 Subject: [PATCH 10/11] handle old 3.x agent --- .../smoketest/SmokeTestExtension.java | 22 +++++++++++-------- .../MockedAppInsightsIngestionServer.java | 6 ++--- .../MockedQuickPulseServlet.java | 9 +++++++- 3 files changed, 24 insertions(+), 13 deletions(-) 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 ed0e6edaa5d..8ba8af59450 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 @@ -75,8 +75,7 @@ public class SmokeTestExtension private static final File appFile = new File(System.getProperty("ai.smoke-test.test-app-file")); // TODO (trask) make private and expose methods on AiSmokeTest(?) - protected final MockedAppInsightsIngestionServer mockedIngestion = - new MockedAppInsightsIngestionServer(); + protected final MockedAppInsightsIngestionServer mockedIngestion; protected final MockedOtlpIngestionServer mockedOtlpIngestion = new MockedOtlpIngestionServer(); @@ -167,6 +166,8 @@ public static SmokeTestExtensionBuilder builder() { this.jvmArgs = jvmArgs; this.useDefaultHttpPort = useDefaultHttpPort; this.useOtlpEndpoint = useOtlpEndpoint; + + mockedIngestion = new MockedAppInsightsIngestionServer(useOld3xAgent); } private static String getProfilerEndpoint(ProfilerState profilerState) { @@ -281,16 +282,19 @@ protected String getAppContext() { private void clearOutAnyInitLogs() throws Exception { if (!skipHealthCheck) { - await().until(mockedIngestion::isReceivingLiveMetrics); + if (!useOld3xAgent) { + await().until(mockedIngestion::isReceivingLiveMetrics); + } String contextRootUrl = getBaseUrl() + "/"; HttpHelper.getResponseCodeEnsuringSampled(contextRootUrl); waitForHealthCheckTelemetry(contextRootUrl); - await() - .untilAsserted( - () -> - assertThat(mockedIngestion.getLiveMetrics().getRequestCount(contextRootUrl)) - .isEqualTo(1)); - + if (!useOld3xAgent) { + await() + .untilAsserted( + () -> + assertThat(mockedIngestion.getLiveMetrics().getRequestCount(contextRootUrl)) + .isEqualTo(1)); + } System.out.println("Clearing any RequestData from health check."); mockedIngestion.resetData(); } diff --git a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedAppInsightsIngestionServer.java b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedAppInsightsIngestionServer.java index 9dc5291b8ee..bd62c9295d3 100644 --- a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedAppInsightsIngestionServer.java +++ b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedAppInsightsIngestionServer.java @@ -27,14 +27,14 @@ public class MockedAppInsightsIngestionServer { private final MockedQuickPulseServlet quickPulseServlet; private final Server server; - public MockedAppInsightsIngestionServer() { + public MockedAppInsightsIngestionServer(boolean usingOld3xAgent) { server = new Server(DEFAULT_PORT); ServletHandler handler = new ServletHandler(); server.setHandler(handler); servlet = new MockedAppInsightsIngestionServlet(); profilerSettingsServlet = new MockedProfilerSettingsServlet(); - quickPulseServlet = new MockedQuickPulseServlet(); + quickPulseServlet = new MockedQuickPulseServlet(usingOld3xAgent); handler.addServletWithMapping(new ServletHolder(profilerSettingsServlet), "/profiler/*"); handler.addServletWithMapping(new ServletHolder(quickPulseServlet), "/QuickPulseService.svc/*"); @@ -295,7 +295,7 @@ public LiveMetricsVerifier getLiveMetrics() { @SuppressWarnings("SystemOut") public static void main(String[] args) throws Exception { - MockedAppInsightsIngestionServer i = new MockedAppInsightsIngestionServer(); + MockedAppInsightsIngestionServer i = new MockedAppInsightsIngestionServer(false); System.out.println("Starting mocked ingestion on port " + DEFAULT_PORT); Runtime.getRuntime() .addShutdownHook( diff --git a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java index ea5c92d04df..9cf2b631edd 100644 --- a/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java +++ b/smoke-tests/framework/src/main/java/com/microsoft/applicationinsights/smoketest/fakeingestion/MockedQuickPulseServlet.java @@ -13,6 +13,7 @@ public class MockedQuickPulseServlet extends HttpServlet { + private final boolean usingOld3xAgent; private final AtomicBoolean pingReceived = new AtomicBoolean(); private final AtomicBoolean postReceived = new AtomicBoolean(); private volatile LiveMetricsVerifier verifier = new LiveMetricsVerifier(); @@ -23,7 +24,9 @@ public class MockedQuickPulseServlet extends HttpServlet { private volatile boolean loggingEnabled; - public MockedQuickPulseServlet() {} + public MockedQuickPulseServlet(boolean usingOld3xAgent) { + this.usingOld3xAgent = usingOld3xAgent; + } @SuppressWarnings("SystemOut") private void logit(String message) { @@ -34,6 +37,10 @@ private void logit(String message) { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { + if (usingOld3xAgent) { + // the old 3.x agent doesn't conform to the expectations of this mock server + return; + } Readable reader = req.getReader(); StringWriter sw = new StringWriter(); CharStreams.copy(reader, sw); From 3b8456473d562788a663d2342be7b5f029d9bf15 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Tue, 8 Jul 2025 09:53:09 -0700 Subject: [PATCH 11/11] workaround --- .../smoketest/SmokeTestExtension.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) 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 8ba8af59450..1a8891204f6 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 @@ -39,6 +39,7 @@ import java.util.function.Predicate; import java.util.stream.Collectors; import javax.annotation.Nullable; +import org.awaitility.core.ConditionTimeoutException; import org.junit.jupiter.api.extension.AfterAllCallback; import org.junit.jupiter.api.extension.AfterEachCallback; import org.junit.jupiter.api.extension.BeforeAllCallback; @@ -289,11 +290,16 @@ private void clearOutAnyInitLogs() throws Exception { HttpHelper.getResponseCodeEnsuringSampled(contextRootUrl); waitForHealthCheckTelemetry(contextRootUrl); if (!useOld3xAgent) { - await() - .untilAsserted( - () -> - assertThat(mockedIngestion.getLiveMetrics().getRequestCount(contextRootUrl)) - .isEqualTo(1)); + try { + await() + .untilAsserted( + () -> + assertThat(mockedIngestion.getLiveMetrics().getRequestCount(contextRootUrl)) + .isEqualTo(1)); + } catch (ConditionTimeoutException e) { + // TODO (trask) need to fix race condition in live metrics + // where sometimes it loses telemetry + } } System.out.println("Clearing any RequestData from health check."); mockedIngestion.resetData();