You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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端点。

验证步骤

  1. 应用配置修改后重启应用
  2. 访问应用内任意接口(如业务Controller接口)
  3. 再次访问http://localhost:8080/actuator/metrics/http.server.requests,即可看到指标数据

内容的提问来源于stack exchange,提问作者Bob Brown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 11:01:04