Help us understand the problem. What is going on with this article?

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

kawasima
Clojure関連のことをブログがわりに書き綴ります。 ※ここでの発言はシステムエンジニアを代表するものであって、所属する組織は二の次です。
https://github.com/kawasima/
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした