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

Spring Boot + Micrometer + Prometheus Exporter で任意のメトリクスを簡単に取得する

More than 1 year has passed since last update.

ここでは Spring Boot + Micrometer + Prometheus Exporter の組みわせで任意のメトリクスの取得を行う方法について書きます。

Settings

Spring Boot が導入されている環境で Micrometer を有効にするには、pom や gradle などで必要なライブラリを設定します。

example

ここでは pom の例を書きます。

pom.xml
<!-- 必須 -->
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-core</artifactId>
    <version>${micrometer.version}</version>
</dependency>
<!-- spring boot 1.5x を使っている場合は必要 -->
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-spring-legacy</artifactId>
    <version>${micrometer.version}</version>
</dependency>
<!-- 以下、Prometheus Exporter を有効にする場合は必要 -->
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
    <version>${micrometer.version}</version>
</dependency>
<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>simpleclient</artifactId>
    <version>${prometheus.version}</version>
</dependency>
<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>simpleclient_common</artifactId>
    <version>${prometheus.version}</version>
</dependency>

micrometer-core

micrometer を使用する際に必須となるライブラリです。

micrometer-spring-legacy

micormeter は Spring Boot 2,x から公式のメトリクスツールの扱いになっています。その関係もあり、2.x より古いバージョン(1.5.x)を使用する場合は、バックポート用のライブラリが必要です。1.5.xの環境で動かしているのであればこちらを指定します。

micrometer-registry-prometheus / simpleclient /simpleclient_common

取得したメトリクスをどのような形で伝搬・表示させるかについては、micrometer-registry-** というライブラリで任意のものを選択します。

ここでは Prometheus Exporter を使いたいので、prometheus 関連の registry を指定します。

また、prometheus 関連の処理を Java で行う場合は、prometheus が提供しているライブラリ(simpleclient、simpleclient_common)も指定する必要があります。

Code

アプリケーションコードへの埋め込み方は以下です。

Counter を初期化

初期化した Counter を用いて increment

SadaController.java
@RestController
public class SadaController {
    @Autowired
    protected MeterRegistry meterRegistry;

    private Counter metricsCounter;

    @PostConstruct
    public void init() { 
        metricsCounter = meterRegistry.counter("api.sada.count"); // initialize
    }

    @RequestMapping(path = "/sada", method = { RequestMethod.GET })
    @ApiOperation(value = "sada")
    @ApiResponses(value = { @ApiResponse(code = 200, response = String.class, message = "echo") })
    public String sada(@RequestParam(name = "echo", required = false, defaultValue = "masashi") @Valid String echo) {
        metricsCounter.increment(); // increment
        return echo;
    }

Prometheus Exporter

micrometer-registry-prometheus をライブラリに追加していると、Spring Boot 起動時に自動的に /prometheus エンドポイントが有効になります。

標準で JVM や Thread の状態についてメトリクスが取得できるようになっています。

それに加えて、上述のようなカスタムメトリクスについても、Prometheus Exporter 経由で取得可能となります。

# TYPE api_sada_count_total counter
api_sada_count_total 15.0

上記は、上述の Controller を呼び出した回数が、メトリクスとして取得された例です。

このような形で取得したメトリクスについては、Prometheus や Datadog に取り込むことが可能です。

まとめにかえて

Micrometer の最もシンプルな使い方は以上ですが、他にも多種多様な機能があるので、詳しく知りたい方は公式ドキュメントに Go だ。

https://micrometer.io/docs

moaikids
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
ユーザーは見つかりませんでした