Skip to content

Commit c98c20c

Browse files
authored
Merge pull request #49339 from brunobat/fix-flacky-metrics-test
Fix flacky Metrics IT test
2 parents d90657a + aa8f982 commit c98c20c

File tree

1 file changed

+57
-53
lines changed
  • integration-tests/opentelemetry/src/test/java/io/quarkus/it/opentelemetry

1 file changed

+57
-53
lines changed

integration-tests/opentelemetry/src/test/java/io/quarkus/it/opentelemetry/MetricsTest.java

Lines changed: 57 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public void directCounterTest() {
8484

8585
@Test
8686
void testAllJvmMetrics() {
87-
// Force GC to run
87+
// Force GC to run in order to generate metrics data
8888
System.gc();
8989

9090
// generate load
@@ -103,40 +103,66 @@ void testAllJvmMetrics() {
103103
.isGreaterThanOrEqualTo(allMetrics.size());
104104
});
105105

106-
// System.out.println(getAllMetricNames("jvm."));
107-
108106
allMetrics.forEach(metricToAssert -> {
109107

108+
// metric is there and has at least 1 reading
110109
await().atMost(10, SECONDS)
111110
.untilAsserted(() -> assertThat(getMetrics(metricToAssert.name()).size())
112111
.withFailMessage("The metric " + metricToAssert.name())
113112
.isGreaterThan(0));
114113

115-
List<Map<String, Object>> metrics = getMetrics(metricToAssert.name());
116-
117-
assertThat(metrics.size())
118-
.withFailMessage(metricToAssert.name() + " not found")
119-
.isGreaterThan(0);
120-
121-
Map<String, Object> lastMetric = metrics.size() > 0 ? metrics.get(metrics.size() - 1) : null;
122-
123-
Double value = ((Number) ((Map) ((List) ((Map) (lastMetric.get("data")))
124-
.get("points"))
125-
.get(0))
126-
.get(metricToAssert.metricType().equals(HISTOGRAM) ? "sum" : "value"))
127-
.doubleValue();
128-
114+
// skip assertions from flaky metrics
129115
if (!metricToAssert.name().equals("jvm.memory.used_after_last_gc") &&
130116
!metricToAssert.name().equals("jvm.cpu.limit") &&
131-
!metricToAssert.name().equals("jvm.cpu.recent_utilization") && // skip value assertions on flaky metrics
117+
!metricToAssert.name().equals("jvm.cpu.recent_utilization") &&
132118
!metricToAssert.name().equals("jvm.system.cpu.utilization")) {
133-
assertThat(value)
134-
.withFailMessage("Metric should be greater than 0: " + metricToAssert.name + " value: " + value)
135-
.isGreaterThan(0d);
119+
120+
// Correct values might take some time to register
121+
await().atMost(10, SECONDS).untilAsserted(() -> assertThat(getLastReading(metricToAssert))
122+
.withFailMessage("Metric must be greater than 0: " + metricToAssert.name)
123+
.isGreaterThan(0d));
136124
}
137125
});
138126
}
139127

128+
@Test
129+
void testServerRequestDuration() {
130+
given()
131+
.when()
132+
.get("/nopath")
133+
.then()
134+
.statusCode(200);
135+
136+
await().atMost(10, SECONDS).until(() -> getMetrics("http.server.request.duration").size() > 2);
137+
138+
List<Map<String, Object>> metrics = getMetrics("http.server.request.duration");
139+
140+
Integer value = (Integer) ((Map) ((List) ((Map) (getMetrics("http.server.request.duration")
141+
.get(metrics.size() - 1)
142+
.get("data")))
143+
.get("points"))
144+
.get(0))
145+
.get("count");
146+
147+
assertThat(value).isGreaterThanOrEqualTo(1); // at least one endpoint was called once
148+
}
149+
150+
private static Set<String> getAllMetricNames(String prefix) {
151+
List<Map<String, Object>> foundMetrics = given()
152+
.when()
153+
.get("/export/metrics")
154+
.body().as(new TypeRef<>() {
155+
});
156+
157+
return foundMetrics.stream()
158+
.filter(m -> ((String) m.get("name")).startsWith(prefix))
159+
.map(m -> ((String) m.get("name")))
160+
.collect(Collectors.toSet());
161+
}
162+
163+
record MetricToAssert(String name, String description, String metricUnit, MetricDataType metricType) {
164+
}
165+
140166
protected Set<MetricToAssert> getJvmMetricsToAssert() {
141167
return Set.of(
142168
// new MetricToAssert("http.server.request.duration", "Duration of HTTP server requests.", "s",
@@ -174,41 +200,19 @@ protected Set<MetricToAssert> getJvmMetricsToAssert() {
174200
LONG_SUM));
175201
}
176202

177-
@Test
178-
void testServerRequestDuration() {
179-
given()
180-
.when()
181-
.get("/nopath")
182-
.then()
183-
.statusCode(200);
184-
185-
await().atMost(10, SECONDS).until(() -> getMetrics("http.server.request.duration").size() > 2);
186-
187-
List<Map<String, Object>> metrics = getMetrics("http.server.request.duration");
188-
189-
Integer value = (Integer) ((Map) ((List) ((Map) (getMetrics("http.server.request.duration")
190-
.get(metrics.size() - 1)
191-
.get("data")))
192-
.get("points"))
193-
.get(0))
194-
.get("count");
203+
private Double getLastReading(MetricToAssert metricToAssert) {
195204

196-
assertThat(value).isGreaterThanOrEqualTo(1); // at least one endpoint was called once
197-
}
205+
List<Map<String, Object>> metrics = getMetrics(metricToAssert.name());
198206

199-
private static Set<String> getAllMetricNames(String prefix) {
200-
List<Map<String, Object>> foundMetrics = given()
201-
.when()
202-
.get("/export/metrics")
203-
.body().as(new TypeRef<>() {
204-
});
207+
// assumes metric is there. The test asserts that already.
208+
Map<String, Object> lastReading = metrics.size() > 0 ? metrics.get(metrics.size() - 1) : null;
205209

206-
return foundMetrics.stream()
207-
.filter(m -> ((String) m.get("name")).startsWith(prefix))
208-
.map(m -> ((String) m.get("name")))
209-
.collect(Collectors.toSet());
210-
}
210+
List pointsList = (List) ((Map) (lastReading.get("data"))).get("points");
211211

212-
record MetricToAssert(String name, String description, String metricUnit, MetricDataType metricType) {
212+
// get last data point from the last reading
213+
return ((Number) ((Map) pointsList
214+
.get(pointsList.size() > 0 ? pointsList.size() - 1 : null))
215+
.get(metricToAssert.metricType().equals(HISTOGRAM) ? "sum" : "value"))
216+
.doubleValue();
213217
}
214218
}

0 commit comments

Comments
 (0)