Skip to content

Commit 5d460bc

Browse files
committed
Use RestTestClient rather than REST Assured
Closes spring-projectsgh-47686
1 parent 0698095 commit 5d460bc

File tree

3 files changed

+61
-64
lines changed

3 files changed

+61
-64
lines changed

module/spring-boot-micrometer-metrics/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ dependencies {
6666

6767
dockerTestImplementation(project(":test-support:spring-boot-docker-test-support"))
6868
dockerTestImplementation(testFixtures(project(":core:spring-boot-docker-compose")))
69-
dockerTestImplementation("io.rest-assured:rest-assured")
69+
dockerTestImplementation("org.apache.httpcomponents.client5:httpclient5")
70+
dockerTestImplementation("org.springframework:spring-web")
7071
dockerTestImplementation("org.testcontainers:testcontainers-junit-jupiter")
7172

7273
testFixturesImplementation(project(":test-support:spring-boot-test-support"))

module/spring-boot-micrometer-metrics/src/dockerTest/java/org/springframework/boot/micrometer/metrics/testcontainers/otlp/GrafanaOpenTelemetryMetricsContainerConnectionDetailsFactoryIntegrationTests.java

Lines changed: 27 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.boot.micrometer.metrics.testcontainers.otlp;
1818

19+
import java.net.URI;
1920
import java.time.Duration;
2021

2122
import io.micrometer.core.instrument.Clock;
@@ -24,8 +25,6 @@
2425
import io.micrometer.core.instrument.Gauge;
2526
import io.micrometer.core.instrument.MeterRegistry;
2627
import io.micrometer.core.instrument.Timer;
27-
import io.restassured.RestAssured;
28-
import io.restassured.response.Response;
2928
import org.awaitility.Awaitility;
3029
import org.junit.jupiter.api.Test;
3130
import org.testcontainers.grafana.LgtmStackContainer;
@@ -41,8 +40,7 @@
4140
import org.springframework.context.annotation.Configuration;
4241
import org.springframework.test.context.TestPropertySource;
4342
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
44-
45-
import static org.assertj.core.api.Assertions.assertThat;
43+
import org.springframework.test.web.servlet.client.RestTestClient;
4644

4745
/**
4846
* Tests for {@link GrafanaOpenTelemetryMetricsContainerConnectionDetailsFactory}.
@@ -68,53 +66,39 @@ void connectionCanBeMadeToOpenTelemetryCollectorContainer() {
6866
Gauge.builder("test.gauge", () -> 12).register(this.meterRegistry);
6967
Timer.builder("test.timer").register(this.meterRegistry).record(Duration.ofMillis(123));
7068
DistributionSummary.builder("test.distributionsummary").register(this.meterRegistry).record(24);
71-
7269
Awaitility.given()
7370
.pollInterval(Duration.ofSeconds(2))
7471
.atMost(Duration.ofSeconds(10))
7572
.ignoreExceptions()
7673
.untilAsserted(() -> {
77-
Response response = RestAssured.given()
78-
.queryParam("query", "{job=\"test\"}")
79-
.get("%s/api/v1/query".formatted(container.getPrometheusHttpUrl()))
80-
.prettyPeek()
81-
.thenReturn();
82-
assertThat(response.getStatusCode()).isEqualTo(200);
83-
assertThat(response.body()
84-
.jsonPath()
85-
.getList("data.result.find { it.metric.__name__ == 'test_counter_total' }.value")).contains("42");
86-
assertThat(response.body()
87-
.jsonPath()
88-
.getList("data.result.find { it.metric.__name__ == 'test_gauge' }.value")).contains("12");
89-
assertThat(response.body()
90-
.jsonPath()
91-
.getList("data.result.find { it.metric.__name__ == 'test_timer_milliseconds_count' }.value"))
92-
.contains("1");
93-
assertThat(response.body()
94-
.jsonPath()
95-
.getList("data.result.find { it.metric.__name__ == 'test_timer_milliseconds_sum' }.value"))
96-
.contains("123");
97-
assertThat(response.body()
98-
.jsonPath()
99-
.getList(
100-
"data.result.find { it.metric.__name__ == 'test_timer_milliseconds_bucket' & it.metric.le == '+Inf' }.value"))
101-
.contains("1");
102-
assertThat(response.body()
103-
.jsonPath()
104-
.getList("data.result.find { it.metric.__name__ == 'test_distributionsummary_count' }.value"))
105-
.contains("1");
106-
assertThat(response.body()
107-
.jsonPath()
108-
.getList("data.result.find { it.metric.__name__ == 'test_distributionsummary_sum' }.value"))
109-
.contains("24");
110-
assertThat(response.body()
111-
.jsonPath()
112-
.getList(
113-
"data.result.find { it.metric.__name__ == 'test_distributionsummary_bucket' & it.metric.le == '+Inf' }.value"))
114-
.contains("1");
74+
RestTestClient restClient = RestTestClient.bindToServer().build();
75+
restClient.get()
76+
.uri(URI.create(container.getPrometheusHttpUrl() + "/api/v1/query?query=%7Bjob=%22test%22%7D"))
77+
.exchange()
78+
.expectStatus()
79+
.isOk()
80+
.expectBody()
81+
.jsonPath(metricWithValue("test_counter_total", "42"))
82+
.exists()
83+
.jsonPath(metricWithValue("test_timer_milliseconds_count", "1"))
84+
.exists()
85+
.jsonPath(metricWithValue("test_timer_milliseconds_sum", "123"))
86+
.exists()
87+
.jsonPath(metricWithValue("test_timer_milliseconds_bucket", "1"))
88+
.exists()
89+
.jsonPath(metricWithValue("test_distributionsummary_count", "1"))
90+
.exists()
91+
.jsonPath(metricWithValue("test_distributionsummary_sum", "24"))
92+
.exists()
93+
.jsonPath(metricWithValue("test_distributionsummary_bucket", "1"))
94+
.exists();
11595
});
11696
}
11797

98+
private String metricWithValue(String metric, String value) {
99+
return "$.data.result[?(@.metric.__name__==\"%s\" && \"%s\" in @.value)]".formatted(metric, value);
100+
}
101+
118102
@Configuration(proxyBeanMethods = false)
119103
@ImportAutoConfiguration(OtlpMetricsExportAutoConfiguration.class)
120104
static class TestConfiguration {

module/spring-boot-micrometer-metrics/src/dockerTest/java/org/springframework/boot/micrometer/metrics/testcontainers/otlp/OpenTelemetryMetricsContainerConnectionDetailsFactoryIntegrationTests.java

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,16 @@
1717
package org.springframework.boot.micrometer.metrics.testcontainers.otlp;
1818

1919
import java.time.Duration;
20+
import java.util.function.Consumer;
2021

2122
import io.micrometer.core.instrument.Clock;
2223
import io.micrometer.core.instrument.Counter;
2324
import io.micrometer.core.instrument.DistributionSummary;
2425
import io.micrometer.core.instrument.Gauge;
2526
import io.micrometer.core.instrument.MeterRegistry;
2627
import io.micrometer.core.instrument.Timer;
27-
import io.restassured.RestAssured;
28-
import io.restassured.response.Response;
2928
import org.awaitility.Awaitility;
29+
import org.jspecify.annotations.Nullable;
3030
import org.junit.jupiter.api.Test;
3131
import org.testcontainers.containers.GenericContainer;
3232
import org.testcontainers.junit.jupiter.Container;
@@ -40,12 +40,13 @@
4040
import org.springframework.boot.testsupport.container.TestImage;
4141
import org.springframework.context.annotation.Bean;
4242
import org.springframework.context.annotation.Configuration;
43+
import org.springframework.http.MediaType;
4344
import org.springframework.test.context.TestPropertySource;
4445
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
46+
import org.springframework.test.web.servlet.client.RestTestClient;
47+
import org.springframework.test.web.servlet.client.RestTestClient.ResponseSpec;
4548

46-
import static org.hamcrest.Matchers.containsString;
47-
import static org.hamcrest.Matchers.endsWith;
48-
import static org.hamcrest.Matchers.matchesPattern;
49+
import static org.assertj.core.api.Assertions.assertThat;
4950

5051
/**
5152
* Tests for {@link OpenTelemetryMetricsContainerConnectionDetailsFactory}.
@@ -59,7 +60,8 @@
5960
@Testcontainers(disabledWithoutDocker = true)
6061
class OpenTelemetryMetricsContainerConnectionDetailsFactoryIntegrationTests {
6162

62-
private static final String OPENMETRICS_001 = "application/openmetrics-text; version=0.0.1; charset=utf-8";
63+
private static final MediaType OPENMETRICS_001 = MediaType
64+
.parseMediaType("application/openmetrics-text; version=0.0.1; charset=utf-8");
6365

6466
private static final String CONFIG_FILE_NAME = "collector-config.yml";
6567

@@ -81,23 +83,33 @@ void connectionCanBeMadeToOpenTelemetryCollectorContainer() {
8183
DistributionSummary.builder("test.distributionsummary").register(this.meterRegistry).record(24);
8284
Awaitility.await()
8385
.atMost(Duration.ofSeconds(30))
84-
.untilAsserted(() -> whenPrometheusScraped().then()
85-
.statusCode(200)
86+
.untilAsserted(() -> whenPrometheusScraped().expectStatus()
87+
.isOk()
88+
.expectHeader()
8689
.contentType(OPENMETRICS_001)
87-
.body(endsWith("# EOF\n"), containsString(
88-
"{job=\"test\",service_name=\"test\",telemetry_sdk_language=\"java\",telemetry_sdk_name=\"io.micrometer\""),
89-
matchesPattern("(?s)^.*test_counter\\{.+} 42\\.0\\n.*$"),
90-
matchesPattern("(?s)^.*test_gauge\\{.+} 12\\.0\\n.*$"),
91-
matchesPattern("(?s)^.*test_timer_count\\{.+} 1\\n.*$"),
92-
matchesPattern("(?s)^.*test_timer_sum\\{.+} 123\\.0\\n.*$"),
93-
matchesPattern("(?s)^.*test_timer_bucket\\{.+,le=\"\\+Inf\"} 1\\n.*$"),
94-
matchesPattern("(?s)^.*test_distributionsummary_count\\{.+} 1\\n.*$"),
95-
matchesPattern("(?s)^.*test_distributionsummary_sum\\{.+} 24\\.0\\n.*$"),
96-
matchesPattern("(?s)^.*test_distributionsummary_bucket\\{.+,le=\"\\+Inf\"} 1\\n.*$")));
90+
.expectBody(String.class)
91+
.value((Consumer<@Nullable String>) (body) -> assertThat(body).endsWith("# EOF\n")
92+
.contains(
93+
"{job=\"test\",service_name=\"test\",telemetry_sdk_language=\"java\",telemetry_sdk_name=\"io.micrometer\"")
94+
.matches("(?s)^.*test_counter\\{.+} 42\\.0\\n.*$")
95+
.matches("(?s)^.*test_gauge\\{.+} 12\\.0\\n.*$")
96+
.matches("(?s)^.*test_timer_count\\{.+} 1\\n.*$")
97+
.matches("(?s)^.*test_timer_sum\\{.+} 123\\.0\\n.*$")
98+
.matches("(?s)^.*test_timer_bucket\\{.+,le=\"\\+Inf\"} 1\\n.*$")
99+
.matches("(?s)^.*test_distributionsummary_count\\{.+} 1\\n.*$")
100+
.matches("(?s)^.*test_distributionsummary_sum\\{.+} 24\\.0\\n.*$")
101+
.matches("(?s)^.*test_distributionsummary_bucket\\{.+,le=\"\\+Inf\"} 1\\n.*$")));
102+
97103
}
98104

99-
private Response whenPrometheusScraped() {
100-
return RestAssured.given().port(container.getMappedPort(9090)).accept(OPENMETRICS_001).when().get("/metrics");
105+
private ResponseSpec whenPrometheusScraped() {
106+
return RestTestClient.bindToServer()
107+
.baseUrl("http://" + container.getHost() + ":" + container.getMappedPort(9090))
108+
.build()
109+
.get()
110+
.uri("/metrics")
111+
.accept(OPENMETRICS_001)
112+
.exchange();
101113
}
102114

103115
@Configuration(proxyBeanMethods = false)

0 commit comments

Comments
 (0)