/执行器/普罗米修斯在@SpringbootTest中缺失

我正在使用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>

那么在我的应用程序中,属性我有以下属性

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解决了我的问题


答案 1

我遇到了同样的问题。在通过 spring 上下文 ConditionEvaluator 进行一些跟踪后,我发现新引入的条件 on 阻止了终结点加载。@ConditionalOnEnabledMetricsExport("prometheus")PrometheusMetricsExportAutoConfiguration

这是由于 https://github.com/spring-projects/spring-boot/pull/21658 和影响弹簧靴 2.4.x 的预期行为

修复:向测试中添加@AutoConfigureMetrics

@AutoConfigureMetrics
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class IntegrationTest {

答案 2

它也发生在我身上,Spring Boot 2.4.1

我唯一能想到的是,@SpringBootTest中包含的端点正在使用@Endpoint注释。

例如:

@Endpoint(id = "metrics")
public class MetricsEndpoint {}

@Endpoint(id = "loggers")
public class LoggersEndpoint {}

普罗米修斯端点正在使用@WebEndpoint注释

@WebEndpoint(id = "prometheus")
public class PrometheusScrapeEndpoint {}

我没有发现这是否是它应该如何工作,或者是一个可能的错误


推荐