应用级监控
1. Maven
引入依赖。
<!-- 依赖于metrics-core, metrics-healthchecks, metrics-json, metrics-jvm,jackson; 所以只需要引入这一个即可 -->
<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-servlets</artifactId>
<!-- 这个版本是SpringBoot1.5.7推荐的 -->
<version>3.1.5</version>
</dependency>
2. 自定义类
健康检查HealthCheck
public class CustomHealthCheckContextListener extends com.codahale.metrics.servlets.HealthCheckServlet.ContextListener {
@Override
protected HealthCheckRegistry getHealthCheckRegistry() {
HealthCheckRegistry healthCheckRegistry = MetricsObjectFactory.getHealthCheckRegistry();
register(healthCheckRegistry);
return healthCheckRegistry;
}
private void register(HealthCheckRegistry healthCheckRegistry){
// A health check which returns healthy if no threads are deadlocked.
healthCheckRegistry.register("thread-deadlock", new ThreadDeadlockHealthCheck());
}
}
Metrics
public class CustomMetricsContextListener extends com.codahale.metrics.servlets.MetricsServlet.ContextListener {
@Override
protected MetricRegistry getMetricRegistry() {
MetricRegistry metricRegistry = MetricsObjectFactory.getMetricRegistry();
JvmMetrics.metrics(metricRegistry);
return metricRegistry;
}
}
public class JvmMetrics {
// 通过集成好的AdminServlet访问
public static void metrics(MetricRegistry metricRegistry) {
metricRegistry.register("jvm.gc", new GarbageCollectorMetricSet());
metricRegistry.register("jvm.memory", new MemoryUsageGaugeSet());
metricRegistry.register("jvm.thread-states", new ThreadStatesGaugeSet());
metricRegistry.register("jvm.fd.usage", new GarbageCollectorMetricSet());
metricRegistry.register("jvm.classloader", new ClassLoadingGaugeSet());
//A gauge for the ratio of used to total file descriptors.
metricRegistry.register("jvm.fileDescriptorRatio", new FileDescriptorRatioGauge());
}
}
3. web.xml
在web.xml中配置dropwizard内置的AdminServlet
<servlet>
<servlet-name>metricsAdminServlet</servlet-name>
<servlet-class>com.codahale.metrics.servlets.AdminServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>metricsAdminServlet</servlet-name>
<url-pattern>/metrics/*</url-pattern>
</servlet-mapping>
<listener>
<listener-class>com.lq.learning.struts.metrics.servlet.CustomHealthCheckContextListener</listener-class>
</listener>
<listener>
<listener-class>com.lq.learning.struts.metrics.servlet.CustomMetricsContextListener</listener-class>
</listener>
4. structs.xml
这一步算是写本篇文章的主因了。按照struts2的底层实现原理,请求在到达dropwizard内置的AdminServlet之前,必然要先经过struts2的核心Filter – StrutsPrepareAndExecuteFilter
。而经过翻找源码就会发现struts2提供的配置属性struts.action.extension
(这个字符串被定义在org.apache.struts2.StrutsConstants
类中,而其被解析则是在InitOperations.buildExcludedPatternsList
方法中)。
<constant name="struts.action.extension" value="/metrics/*" />
5. 访问
http://localhost:9999/projectName/metrics