我使用的是springbooot 2.4.0,我添加了以下依赖项来启用prometheus指标:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>然后,在我的application.properties中,我有以下属性
management.endpoints.web.exposure.include=*
management.metrics.enable.all=true我正在尝试运行一个简单的集成测试,以查看我的自定义指标出现在/actuator/prometheus端点上。下面的代码
package com.example.demo;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.web.server.LocalServerPort;
import static io.restassured.RestAssured.given;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class IntegrationTest {
@LocalServerPort
private int port;
private String baseUrl;
@BeforeEach
public void setup() {
baseUrl = "http://localhost:" + port;
}
@Test
public void metricsEndpoint() throws Exception {
given().when().get(baseUrl + "/demo/actuator/prometheus")
.then()
.statusCode(200);
}
}我在这里得到的错误是
java.lang.AssertionError: 1 expectation failed.
Expected status code <200> but was <404>.而如果我对springboot提供的任何其他端点重复相同的请求,我会正确地得到响应,例如,我尝试了/ actuator /health,/actuator/info,/actuator/metrics等。
这只发生在使用@Springboot注解的集成测试期间,这很奇怪,因为如果我运行我的应用程序,并使用postman向地址localhost:8080/actuator/prometheus发出请求,我会正确地得到响应。
这就像在测试期间不加载prometheus注册表一样。
有人能帮上忙吗?
提前谢谢。
编辑:这个解决方案是由Johannes Klug提出的。添加注释@AutoConfigureMetrics解决了我的问题
发布于 2021-01-04 17:52:25
我也面临着同样的问题。在对spring-context ConditionEvaluator进行了一些跟踪之后,我发现PrometheusMetricsExportAutoConfiguration上新引入的@ConditionalOnEnabledMetricsExport("prometheus")条件阻止了端点的加载。
这是由于https://github.com/spring-projects/spring-boot/pull/21658和影响spring-boot 2.4.x而导致的预期行为
Fix:将@AutoConfigureMetrics添加到测试中
@AutoConfigureMetrics
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class IntegrationTest {发布于 2020-12-25 01:13:07
在Spring Boot 2.4.1中,这也发生在我身上
我唯一能想到的就是@SpringBootTest中包含的端点都使用了@Endpoint注释。
例如:
@Endpoint(id = "metrics")
public class MetricsEndpoint {}
@Endpoint(id = "loggers")
public class LoggersEndpoint {}prometheus端点使用@WebEndpoint注释
@WebEndpoint(id = "prometheus")
public class PrometheusScrapeEndpoint {}我不知道这是如何工作的,或者是一个可能的bug
发布于 2021-01-05 20:58:45
我在你的测试中看到,你在实际的执行器路径之前附加了"demo“。
given().when().get(baseUrl + "/demo/actuator/prometheus")
.then()
.statusCode(200);正确的url应该是baseUrl+"/actuator/prometheus“。
https://stackoverflow.com/questions/65360650
复制相似问题