标签:metrics timer counter dropwizard 度量
之前在healthcheck中介绍了如何通过metrics lib往系统中加入一些简单的健康侦测,现在讲讲dropwizard metrics更重要的部分,记录系统的度量信息。dropwizard提供了多种度量方式:最简单记数counter,复杂点的有用于计算时间分布的histogram,用于计算速率的meter,以及同时有histogram和meter功能的timer。有兴趣可以去看看实现细节,类很少,很容易读懂。
Metrics的报告方式和healthcheck非常类似,库自生提供的各种报告渠道。也可以很容易自己扩展。
Metrics提供了各种包,可以帮助简化开发。其中metrics-servlet可以直接把metrics和healthcheck的信息在web request里面展示出来。
接下来给个使用的例子,对Web应用的请求进行度量,然后通过AdminServlet获取metrics和healthcheck信息。
<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-core</artifactId>
<version>${metrics.version}</version>
</dependency>
<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-servlets</artifactId>
<version>${metrics.version}</version>
</dependency>
<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-json</artifactId>
<version>${metrics.version}</version>
</dependency>
<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-healthchecks</artifactId>
<version>${metrics.version}</version>
</dependency>
public class HealthCheckServletContextListener extends HealthCheckServlet.ContextListener{
public static final HealthCheckRegistry HEALTH_CHECK_REGISTRY = new HealthCheckRegistry();
@Override
protected HealthCheckRegistry getHealthCheckRegistry() {
return HEALTH_CHECK_REGISTRY;
}
}
public class MetricsServletContextListener extends MetricsServlet.ContextListener {
public static final MetricRegistry METRIC_REGISTRY = new MetricRegistry();
@Override
protected MetricRegistry getMetricRegistry() {
return METRIC_REGISTRY;
}
}
private final Timer executions = MetricsServletContextListener.METRIC_REGISTRY.timer(MetricRegistry.name(SignupController.class, "executions"));
@Autowired
private UserService userService;
@RequestMapping(method = RequestMethod.POST)
public String register(@Valid User user, BindingResult bindingResult, RedirectAttributes redirectAttributes) {
final Timer.Context context = executions.time();
if (bindingResult.hasErrors()) {
redirectAttributes.addFlashAttribute("user", user);
redirectAttributes.addFlashAttribute(BindingResult.MODEL_KEY_PREFIX + "user", bindingResult);
context.stop();
return "redirect:/";
}
try {
userService.registerUser(user);
redirectAttributes.addFlashAttribute("username", user.getUsername());
return "redirect:/";
} catch (UserExistsException e) {
return "redirect:/";
} finally {
context.stop();
}
}
<listener>
<listener-class>com.cloud.demo.HealthCheckServletContextListener </listener-class>
</listener>
<listener>
<listener-class>com.cloud.demo.MetricsServletContextListener</listener-class>
</listener>
<servlet>
<servlet-name>metrics</servlet-name>
<servlet-class>com.codahale.metrics.servlets.AdminServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>metrics</servlet-name>
<url-pattern>/metrics/*</url-pattern>
</servlet-mapping>
这样就可以通过/metrics/healthcheck或者/metrics/metrics查看系统度量数据。
记住:系统度量最重要的是要分析系统中需要什么样的度量信息,技术实现反而不是那么重要。
更多dropwizard的功能包可以参考使用手册
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:metrics timer counter dropwizard 度量
原文地址:http://blog.csdn.net/cloud_ll/article/details/47136715