Mackerelは、現状ではサーバの監視がメインで使われているかと思いますが、サービスメトリックという仕組みを使うと、アプリケーションの様々な状態も収集・監視出来るようになります(「Mackerelサーバ監視実践入門」p77より)。
ということで、Javaのアプリケーションモニタリングが出来る仕組みを作ってみました。
Dropwizard Metrics
Metricsは、Javaアプリケーションのメトリックを取得するのに、色んなフレームワークで使われています。そして、集めた値をGangliaやGraphiteに送信することができます。この送信する役割をReporterと呼んでいます。
このReporterは比較的簡単に作れるので、metrics-graphiteを参考にMackerelバージョンを作ってみました。
https://github.com/kawasima/metrics-mackerel
これを使うと↓程度のコードでMackerelにメトリックを送信できるようになります。
0.1.1以下のバージョンには、キャッシュクリア漏れの重大なバグがあるので、必ず0.2.0以上をお使いください。
<dependency>
<groupId>net.unit8.metrics</groupId>
<artifactId>metrics-mackerel</artifactId>
<version>0.2.0</version>
</dependency>
final MackerelSender sender = new MackerelSender("[Mackerel上で定義したサービス名]", "[MackerelのAPIキー]");
final MackerelReporter reporter = MackerelReporter
.forRegistry(registry)
.build(sender);
簡単ですね!
Spring Bootで使う
Spring Bootでは、Actuatorが既に色々メトリックを集めてくれているので楽チンです。
メモリやスレッド数などのJVMのモニタリング値はSystemPublicMetricsで収集されるので、これを送信してみます。
注意 : これはあくまでも動作検証用のサンプルですので、もし実際に使われる場合は、必要なメトリックに絞り込んでご利用ください
@Configuration
@ConfigurationProperties(prefix = "mackerel")
public class MackerelConfig {
@Autowired
private MetricRegistry registry;
@Autowired
private SystemPublicMetrics systemPublicMetrics;
private String apiKey;
private String serviceName;
@PostConstruct
public void initialize() {
for (Metric<?> metric : systemPublicMetrics.metrics()) {
Gauge<Long> metricGauge = () -> metric.getValue().longValue();
String name = metric.getName();
if (!name.contains(".")) {
name += ".total";
}
registry.register(name, metricGauge);
}
final MackerelSender sender = new MackerelSender(serviceName, apiKey);
final MackerelReporter reporter = MackerelReporter
.forRegistry(registry)
.build(sender);
reporter.start(1, TimeUnit.MINUTES);
}
public void setApiKey(String apiKey) {
this.apiKey = apiKey;
}
public void setServiceName(String serviceName) {
this.serviceName = serviceName;
}
}
上記の例では、プロパティとして以下2つを設定してから動かしてください。
- mackerel.serviceName=Mackerelで定義したサービス名
- mackerel.apiKey=MackerelのAPIキー
そうすると5分毎にメトリックが送られ、Mackerel上で自動的にグラフが描かれます。
まとめ
と、MackerelユーザグループでLTしたらMackerel本いただいたので、お礼としてJavaアプリケーションのMackerelモニタリング機構を作ってみました。
Spring Boot 2.0からはMetricsでなく、Micrometerが標準になっていくようなので、今後そちらにもチャレンジしてみたいと思います。