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

  • 13
    Like
  • 0
    Comment

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

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

Dropwizard Metrics

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

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

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

pom.xml
<dependency>
   <groupId>net.unit8.metrics</groupId>
   <artifactId>metrics-mackerel</artifactId>
   <version>0.1.1</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キー

そうすると毎分メトリックが送られ、Mackerel上で自動的にグラフが描かれます。

image.png

まとめ

と、MackerelユーザグループでLTしたらMackerel本いただいたので、お礼としてJavaアプリケーションのMackerelモニタリング機構を作ってみました。
Spring Boot 2.0からはMetricsでなく、Micrometerが標準になっていくようなので、今後そちらにもチャレンジしてみたいと思います。