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

如何在Dropwizard中通过HTTP暴露metrics指标并访问

Dropwizard Metrics Servlet 配置与访问指南

你引入的metrics-servlets包已经包含了指标暴露所需的Servlet组件,后续只需要完成核心注册表初始化、Servlet注册两步即可,具体操作如下:

1. 核心基础初始化

所有指标都存储在MetricRegistry实例中,需要保证全局单例:

// 放在公共包下,作为全局指标持有类
public class MetricsGlobalHolder {
    public static final MetricRegistry METRIC_REGISTRY = new MetricRegistry();
    static {
        // 可选:注册JVM内置指标,包含内存、GC、线程状态等常用观测数据
        METRIC_REGISTRY.registerAll(new MemoryUsageGaugeSet());
        METRIC_REGISTRY.registerAll(new GarbageCollectorMetricSet());
        METRIC_REGISTRY.registerAll(new ThreadStatesGaugeSet());
    }
}

注意:如果需要用内置JVM指标,需要额外引入metrics-jvm依赖,版本和metrics-servlets保持一致即可。

2. 注册暴露指标的Servlet

根据你使用的项目类型选择对应的注册方式:

非SpringBoot的原生Servlet项目

如果使用web.xml配置,直接添加如下Servlet映射:

<!-- 核心指标暴露Servlet -->
<servlet>
    <servlet-name>metricsServlet</servlet-name>
    <servlet-class>com.codahale.metrics.servlets.MetricsServlet</servlet-class>
    <init-param>
        <param-name>com.codahale.metrics.servlets.MetricsServlet.registry</param-name>
        <param-value>com.你的项目包路径.MetricsGlobalHolder</param-value>
    </init-param>
    <init-param>
        <param-name>prettyPrint</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>metricsServlet</servlet-name>
    <url-pattern>/metrics</url-pattern>
</servlet-mapping>

<!-- 可选:健康检查接口Servlet -->
<servlet>
    <servlet-name>healthCheckServlet</servlet-name>
    <servlet-class>com.codahale.metrics.servlets.HealthCheckServlet</servlet-class>
    <init-param>
        <param-name>com.codahale.metrics.servlets.HealthCheckServlet.registry</param-name>
        <param-value>com.你的项目包路径.MetricsGlobalHolder</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>healthCheckServlet</servlet-name>
    <url-pattern>/healthcheck</url-pattern>
</servlet-mapping>

<!-- 可选:线程栈Dump接口Servlet -->
<servlet>
    <servlet-name>threadDumpServlet</servlet-name>
    <servlet-class>com.codahale.metrics.servlets.ThreadDumpServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>threadDumpServlet</servlet-name>
    <url-pattern>/threads</url-pattern>
</servlet-mapping>

如果是Servlet 3.0+无xml配置的项目,通过ServletContext的addServlet方法注册,传入上述init参数即可。

SpringBoot项目

直接写配置类注册Servlet即可,不需要web.xml:

@Configuration
public class MetricsAutoConfig {
    @Bean
    public MetricRegistry metricRegistry() {
        MetricRegistry registry = new MetricRegistry();
        // 注册内置JVM指标
        registry.registerAll(new MemoryUsageGaugeSet());
        registry.registerAll(new GarbageCollectorMetricSet());
        registry.registerAll(new ThreadStatesGaugeSet());
        return registry;
    }

    @Bean
    public ServletRegistrationBean<MetricsServlet> metricsServlet(MetricRegistry metricRegistry) {
        MetricsServlet metricsServlet = new MetricsServlet(metricRegistry);
        ServletRegistrationBean<MetricsServlet> registration = new ServletRegistrationBean<>(metricsServlet, "/metrics");
        registration.addInitParameter("prettyPrint", "true");
        return registration;
    }

    // 健康检查、线程Dump的Servlet注册逻辑和上述一致
}

3. 指标访问方式

项目启动成功后,直接通过HTTP请求即可访问对应接口:

  • 访问http://项目IP:端口/项目上下文路径/metrics,即可获取所有注册的指标数据,开启prettyPrint后返回格式化后的JSON结构,方便直接查看
  • 配置了健康检查接口的话,访问/healthcheck可获取所有健康检查项的运行结果
  • 配置了线程Dump接口的话,访问/threads可获取当前JVM的全量线程栈快照

自定义业务指标埋点时,直接引用全局单例的MetricRegistry实例,调用counter、timer、gauge、histogram等API注册业务指标即可,注册完成的指标会自动出现在/metrics接口的返回结果中

注意事项

  • 所有metrics相关依赖(metrics-core、metrics-jvm等)版本必须和metrics-servlets保持一致,避免出现类冲突、方法不存在的兼容性问题
  • 生产环境务必给metrics相关接口增加权限校验,不要直接暴露在公网,避免服务运行数据泄露
  • metrics-servlets只提供HTTP拉取JSON格式指标的能力,如果需要将指标上报到Prometheus、Graphite等监控系统,需要额外引入对应Reporter组件实现主动上报逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:40:01