基于Java配置的Spring MVC:如何配置Actuator展示http.server.requests指标
问题:Spring MVC集成Actuator后无法获取
http.server.requests指标 环境信息
- Spring 6.2.0-SNAPSHOT
- Spring Boot 3.2.4
- JDK 23
- Tomcat 10.1.20
现状
已通过Java配置实现Actuator健康检查、信息端点、beans端点等功能,metrics端点可正常访问,但http.server.requests指标始终缺失,访问http://localhost:8080/actuator/metrics/http.server.requests提示找不到该指标。
当前配置代码
package my.config; import org.springframework.boot.actuate.autoconfigure.beans.BeansEndpointAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties; import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties; import org.springframework.boot.actuate.autoconfigure.health.HealthContributorAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.info.InfoEndpointAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.metrics.*; import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.observation.ObservationAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.system.DiskSpaceHealthContributorAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.system.DiskSpaceHealthIndicatorProperties; import org.springframework.boot.actuate.endpoint.ExposableEndpoint; import org.springframework.boot.actuate.endpoint.web.*; import org.springframework.boot.actuate.endpoint.web.annotation.ControllerEndpointsSupplier; import org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointsSupplier; import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping; import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.boot.actuate.info.*; import org.springframework.boot.actuate.system.DiskSpaceHealthIndicator; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration; import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletPath; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; import org.springframework.util.unit.DataSize; import java.io.File; import java.util.*; @Configuration @ImportAutoConfiguration({ EndpointAutoConfiguration.class, WebEndpointAutoConfiguration.class, HealthContributorAutoConfiguration.class, HealthEndpointAutoConfiguration.class, BeansEndpointAutoConfiguration.class, DiskSpaceHealthContributorAutoConfiguration.class, MetricsAutoConfiguration.class, SimpleMetricsExportAutoConfiguration.class, CompositeMeterRegistryAutoConfiguration.class, ObservationAutoConfiguration.class, JvmMetricsAutoConfiguration.class, MetricsEndpointAutoConfiguration.class, SystemMetricsAutoConfiguration.class, InfoEndpointAutoConfiguration.class, JavaInfoContributor.class, OsInfoContributor.class, EnvironmentInfoContributor.class, BuildInfoContributor.class, ProjectInfoAutoConfiguration.class, }) @EnableConfigurationProperties(CorsEndpointProperties.class) public class SpringBootActuatorConfig { @Bean public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier, ServletEndpointsSupplier servletEndpointsSupplier, ControllerEndpointsSupplier controllerEndpointsSupplier, EndpointMediaTypes endpointMediaTypes, CorsEndpointProperties corsProperties, WebEndpointProperties webEndpointProperties) { List<ExposableEndpoint<?>> allEndpoints = new ArrayList<>(); Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints(); allEndpoints.addAll(webEndpoints); allEndpoints.addAll(servletEndpointsSupplier.getEndpoints()); allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints()); EndpointMapping endpointMapping = new EndpointMapping(webEndpointProperties.getBasePath()); return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints, endpointMediaTypes, corsProperties.toCorsConfiguration(), new EndpointLinksResolver(allEndpoints, webEndpointProperties.getBasePath()), true); } @Bean DispatcherServletPath dispatcherServletPath() { return () -> "/"; } @Bean public DiskSpaceHealthIndicator diskSpaceHealthIndicatorForCDriveAt100Mb(DiskSpaceHealthIndicatorProperties properties) { return new MyDiskSpaceHealthIndicator(new File("C:/"), DataSize.ofMegabytes(100)); } private static class MyDiskSpaceHealthIndicator extends DiskSpaceHealthIndicator { public MyDiskSpaceHealthIndicator(File path, DataSize threshold) { super(path, threshold); } @Override protected void doHealthCheck(Health.Builder builder) throws Exception { super.doHealthCheck(builder); builder.withDetail("custom details", "whatever"); } } @Component private static class MyInfoContributor implements InfoContributor { @Override public void contribute(Info.Builder builder) { Map<String, Integer> details = new HashMap<>(); details.put("active", 42); details.put("inactive", 88); builder.withDetail("myInfo", details); } } @Configuration private static class ActuatorConfiguration { public ActuatorConfiguration() { } @Bean public HealthIndicator sampleHealthIndicator() { return Health.up() .withDetail("info", "Sample Health") ::build; } } }
已配置的系统属性
-Dmanagement.endpoint.info.enabled=true -Dmanagement.endpoint.metrics.enabled=true -Dmanagement.endpoint.health.enabled=true -Dmanagement.endpoint.beans.enabled=true -Dmanagement.endpoints.web.exposure.include=* -Dmanagement.endpoint.health.show-details=always -Dinfo.env.stuff=hello -Dspring.threads.virtual.enabled=true
解决方案
1. 补充Web MVC Metrics自动配置
在@ImportAutoConfiguration中添加WebMvcMetricsAutoConfiguration.class,该类负责启用Web MVC请求的指标收集:
@ImportAutoConfiguration({ // ... 现有配置类 WebMvcMetricsAutoConfiguration.class, // ... })
2. 确认观测功能启用
显式配置观测开关(默认已开启,避免意外关闭):
-Dmanagement.observations.enabled=true
3. 移除自定义的WebMvcEndpointHandlerMapping
手动创建的WebMvcEndpointHandlerMapping可能覆盖了Spring Boot默认的观测拦截器配置,建议删除该Bean,使用自动配置的实例,确保普通请求的HandlerMapping包含指标收集拦截器。
4. 触发请求后检查指标
http.server.requests指标是请求触发后才会生成,需先访问几个应用内的Controller接口,再查询metrics端点。
验证步骤
- 应用配置修改后重启应用
- 访问应用内任意接口(如业务Controller接口)
- 再次访问
http://localhost:8080/actuator/metrics/http.server.requests,即可看到指标数据
内容的提问来源于stack exchange,提问作者Bob Brown
相关产品推荐
相关产品推荐

