LoginSignup
21
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-24

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が標準になっていくようなので、今後そちらにもチャレンジしてみたいと思います。

21
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
9