Edited at

MackerelでJavaのアプリケーションモニタリングをする

More than 1 year has passed since last update.

Mackerelは、現状ではサーバの監視がメインで使われているかと思いますが、サービスメトリックという仕組みを使うと、アプリケーションの様々な状態も収集・監視出来るようになります(「Mackerelサーバ監視実践入門」p77より)。

ということで、Javaのアプリケーションモニタリングが出来る仕組みを作ってみました。


Dropwizard Metrics

Metricsは、Javaアプリケーションのメトリックを取得するのに、色んなフレームワークで使われています。そして、集めた値をGangliaやGraphiteに送信することができます。この送信する役割をReporterと呼んでいます。

このReporterは比較的簡単に作れるので、metrics-graphiteを参考にMackerelバージョンを作ってみました。

https://github.com/kawasima/metrics-mackerel

これを使うと↓程度のコードでMackerelにメトリックを送信できるようになります。

:warning: 0.1.1以下のバージョンには、キャッシュクリア漏れの重大なバグがあるので、必ず0.2.0以上をお使いください。


pom.xml

<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で収集されるので、これを送信してみます。

:warning: 注意 : これはあくまでも動作検証用のサンプルですので、もし実際に使われる場合は、必要なメトリックに絞り込んでご利用ください :bow:

@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上で自動的にグラフが描かれます。

image.png


まとめ

と、MackerelユーザグループでLTしたらMackerel本いただいたので、お礼としてJavaアプリケーションのMackerelモニタリング機構を作ってみました。

Spring Boot 2.0からはMetricsでなく、Micrometerが標準になっていくようなので、今後そちらにもチャレンジしてみたいと思います。