如何在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
相关产品推荐
相关产品推荐

