Skip to content

Commit 426adfc

Browse files
authored
Fix HBase test flakiness (#1615)
1 parent 49d738d commit 426adfc

File tree

4 files changed

+14
-54
lines changed

4 files changed

+14
-54
lines changed

jmx-scraper/src/integrationTest/java/io/opentelemetry/contrib/jmxscraper/assertions/MetricAssert.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,8 +249,8 @@ public final MetricAssert hasDataPointsWithAttributes(AttributeMatcherGroup... m
249249
}
250250

251251
info.description(
252-
"data point attributes '%s' for metric '%s' must match exactly one of the attribute sets '%s'",
253-
dataPointAttributes, actual.getName(), Arrays.asList(matcherGroups));
252+
"data point attributes '%s' for metric '%s' must match exactly one of the attribute sets '%s'.\nActual data points: %s",
253+
dataPointAttributes, actual.getName(), Arrays.asList(matcherGroups), dataPoints);
254254
integers.assertEqual(info, matchCount, 1);
255255
}
256256

jmx-scraper/src/integrationTest/java/io/opentelemetry/contrib/jmxscraper/target_systems/HBaseIntegrationTest.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,16 @@
1616
import org.testcontainers.containers.wait.strategy.Wait;
1717

1818
public class HBaseIntegrationTest extends TargetSystemIntegrationTest {
19-
private static final int DEFAULT_MASTER_SERVICE_PORT = 16000;
20-
2119
@Override
2220
protected GenericContainer<?> createTargetContainer(int jmxPort) {
2321
return new GenericContainer<>("dajobe/hbase")
2422
.withEnv("HBASE_MASTER_OPTS", genericJmxJvmArguments(jmxPort))
2523
.withStartupTimeout(Duration.ofMinutes(2))
26-
.withExposedPorts(jmxPort, DEFAULT_MASTER_SERVICE_PORT)
27-
.waitingFor(Wait.forListeningPorts(jmxPort, DEFAULT_MASTER_SERVICE_PORT));
24+
.withExposedPorts(jmxPort)
25+
// HBase initialization process is finished a long time after all the ports are opened.
26+
// Because of this it is necessary to wait for log message confirming that startup process
27+
// is complete.
28+
.waitingFor(Wait.forLogMessage(".+Master has completed initialization.+", 1));
2829
}
2930

3031
@Override

jmx-scraper/src/integrationTest/java/io/opentelemetry/contrib/jmxscraper/target_systems/MetricsVerifier.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,11 @@ private void verifyAllExpectedMetricsWereReceived(List<Metric> metrics) {
114114

115115
assertionNames.removeAll(receivedMetricNames);
116116
if (!assertionNames.isEmpty()) {
117-
fail("Metrics expected but not received: " + assertionNames);
117+
fail(
118+
"Metrics expected but not received: "
119+
+ assertionNames
120+
+ "\nReceived only: "
121+
+ receivedMetricNames);
118122
}
119123
}
120124
}

jmx-scraper/src/integrationTest/java/io/opentelemetry/contrib/jmxscraper/target_systems/TargetSystemIntegrationTest.java

Lines changed: 2 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,11 @@
2121
import java.nio.file.Path;
2222
import java.time.Duration;
2323
import java.util.ArrayList;
24-
import java.util.Arrays;
2524
import java.util.Collection;
2625
import java.util.List;
2726
import java.util.concurrent.BlockingQueue;
2827
import java.util.concurrent.ExecutionException;
2928
import java.util.concurrent.LinkedBlockingDeque;
30-
import java.util.function.Consumer;
3129
import java.util.stream.Collectors;
3230
import org.junit.jupiter.api.AfterAll;
3331
import org.junit.jupiter.api.AfterEach;
@@ -125,45 +123,6 @@ void endToEndTest(@TempDir Path tmpDir) {
125123
verifyMetrics();
126124
}
127125

128-
// TODO: This implementation is DEPRECATED and will be removed once all integration tests are
129-
// migrated to MetricsVerifier
130-
protected void waitAndAssertMetrics(Iterable<Consumer<Metric>> assertions) {
131-
await()
132-
.atMost(Duration.ofSeconds(30))
133-
.untilAsserted(
134-
() -> {
135-
List<ExportMetricsServiceRequest> receivedMetrics = otlpServer.getMetrics();
136-
assertThat(receivedMetrics).describedAs("no metric received").isNotEmpty();
137-
138-
List<Metric> metrics =
139-
receivedMetrics.stream()
140-
.map(ExportMetricsServiceRequest::getResourceMetricsList)
141-
.flatMap(rm -> rm.stream().map(ResourceMetrics::getScopeMetricsList))
142-
.flatMap(Collection::stream)
143-
.filter(
144-
// TODO: disabling batch span exporter might help remove unwanted metrics
145-
sm -> sm.getScope().getName().equals("io.opentelemetry.jmx"))
146-
.flatMap(sm -> sm.getMetricsList().stream())
147-
.collect(Collectors.toList());
148-
149-
assertThat(metrics)
150-
.describedAs("metrics reported but none from JMX scraper")
151-
.isNotEmpty();
152-
153-
for (Consumer<Metric> assertion : assertions) {
154-
assertThat(metrics).anySatisfy(assertion);
155-
}
156-
});
157-
}
158-
159-
// TODO: This implementation is DEPRECATED and will be removed once all integration tests are
160-
// migrated to MetricsVerifier
161-
@SafeVarargs
162-
@SuppressWarnings("varargs")
163-
protected final void waitAndAssertMetrics(Consumer<Metric>... assertions) {
164-
waitAndAssertMetrics(Arrays.asList(assertions));
165-
}
166-
167126
protected void verifyMetrics() {
168127
MetricsVerifier metricsVerifier = createMetricsVerifier();
169128
await()
@@ -185,18 +144,14 @@ protected void verifyMetrics() {
185144
.collect(Collectors.toList());
186145

187146
assertThat(metrics)
188-
.describedAs("metrics reported but none from JMX scraper")
147+
.describedAs("Metrics received but not suitable for JMX scraper")
189148
.isNotEmpty();
190149

191150
metricsVerifier.verify(metrics);
192151
});
193152
}
194153

195-
// TODO: This method is going to be abstract once all integration tests are migrated to
196-
// MetricsVerifier
197-
protected MetricsVerifier createMetricsVerifier() {
198-
return MetricsVerifier.create();
199-
}
154+
protected abstract MetricsVerifier createMetricsVerifier();
200155

201156
protected JmxScraperContainer customizeScraperContainer(
202157
JmxScraperContainer scraper, GenericContainer<?> target, Path tempDir) {

0 commit comments

Comments
 (0)