之前在healthcheck中介紹了怎樣通過metrics lib往系統中增加一些簡單的健康偵測。如今講講dropwizard metrics更重要的部分。記錄系統的度量信息。
dropwizard提供了多種度量方式:最簡單記數counter,復雜點的實用於計算時間分布的histogram,用於計算速率的meter,以及同一時候有histogram和meter功能的timer。有興趣能夠去看看實現細節,類非常少,非常easy讀懂。
Metrics的報告方式和healthcheck非常相似。庫自生提供的各種報告渠道。
也能夠非常easy自己擴展。
Metrics提供了各種包,能夠幫助簡化開發。當中metrics-servlet能夠直接把metrics和healthcheck的信息在web request里面展示出來。
接下來給個使用的樣例。對Web應用的請求進行度量,然后通過AdminServlet獲取metrics和healthcheck信息。
- 在maven中導入須要的包
<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>
- 創建用來注冊metrics和healtcheck的servlet
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;
}
}
- 在Spring Web action中創建timer。增加到MetricsServletContextListener的MetricRegistery中,對每一個方法開始調用time得到context,結束運行context.stop
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();
}
}
- 在Web.xml中配置AdminServlet訪問路徑,配置2個listener
<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的功能包能夠參考使用手冊