Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
10
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
10
Help us understand the problem. What are the problem?