Using Micrometer in Helidon Applications

原文はこちら。
The original article was written by Tim Quinn (Consulting Member of Technical Staff at Oracle).
https://medium.com/helidon/using-micrometer-in-helidon-applications-c8dfc7ccd1de

MicroProfile Metrics仕様にインスパイアされたメトリクスのサポートなどにより、OracleのProject HelidonはJavaベースのマイクロサービスの構築作業を簡素化してくれます。

Project Helidon
https://helidon.io/
Metrics for Eclipse MicroProfile
https://download.eclipse.org/microprofile/microprofile-metrics-2.3/microprofile-metrics-spec-2.3.html

Helidonには組み込み済みのメトリックがありますが、アプリケーション開発者は同じMicroProfileにインスパイアされたAPIを使って独自のメトリックを追加することもできます。
Helidon 2.3.0では、Micrometerメトリックのビルトインサポートが追加されています。Micrometer APIとアノテーションを使用して、独自のアプリケーションメトリックを作成・更新し、Helidonが作成するエンドポイントから利用可能にできます(これは組み込みのHelidonメトリクス機能を置き換えるものではありません)。

この記事では、Micrometerサポートと独自のMicrometerメトリックをHelidon SE/MPアプリに追加する方法を紹介します。ここでは、Helidon CLIでSEまたはMP QuickStartアプリケーションを作成したと仮定します。

Helidon SE QuickStart
https://helidon.io/docs/v2/#/se/guides/02_quickstart
Helidon MP QuickStart
https://helidon.io/docs/v2/#/mp/guides/02_quickstart
Helidon CLI
https://helidon.io/docs/v2/#/about/05_cli

Adding Micrometer support to your SE app

Modify pom.xml

Helidon Micrometer統合の依存関係を追加します。

<dependency>
    <groupId>io.helidon.integrations.micrometer/groupId>
    <artifactId>helidon-integrations-micrometer</artifactId>
</dependency>

Modify Main.java

メインクラスではエンドポイントや選択するHelidonの組み込み機能のためのHelidonルーティングを構成しています。メインクラスを変更してMicrometerSupportも作成、登録します。

import io.helidon.integrations.micrometer.MicrometerSupport;
...
MicrometerSupport micrometerSupport = MicrometerSupport.create();
GreetService greetService = 
        new GreetService(config, micrometerSupport.registry());
...
Routing.builder()
    .register(health)
    .register(metrics)
    .register(micrometerSupport)
    .register("/greet", greetService)
    .build();

この新たな.registerの呼び出しにより、Helidonの組み込みMicrometerサポートの/micrometerエンドポイントを公開し、Prometheus形式の出力を生成できるようにします。

Modify GreetService.java

GreetServiceクラスを書き換え、コンストラクタがパラメータとしてMicrometerレジストリを受け入れ、GETアクセスでMicrometerメーターを作成・更新するようにします。

importを追加します。

import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;

MicrometerのMeterRegistryとMicrometerのCounterフィールドを宣言します。

private final MeterRegistry meterRegistry;
private final Counter getCounter;

コンストラクタを変更し、MeterRegistryパラメータを受け入れて保存し、カウンタを作成するようにします。

GreetService(Config config, MeterRegistry meterRegistry) {
    this.meterRegistry = meterRegistry;
    getCounter = meterRegistry.counter("greeting.get");
    greeting.set(config.get("app.greeting").asString()
        .orElse("Ciao"));
}

このupdateメソッドを変更して全てのGET HTTP操作のためのリクエストハンドラを追加します。 このハンドラはMicrometerカウンタをアップデートしてから、サービスのための他のハンドラを妨害せずに、次のハンドラにリクエストを渡します。

public void update(Routing.Rules rules) {
    rules
        .get((req, resp) -> {
            getCounter.increment();
            req.next();
        })
        .get("/", this::getDefaultMessageHandler)
        .get("/{name}", this::getMessageHandler)
        .put("/greeting", this::updateGreetingHandler);
}

Try it

手を入れたアプリケーションをビルドし、実行します。

mvn package
java -jar target/quickstart-se.jar

新たなエンドポイントにアクセスします。

% curl http://localhost:8080/micrometer
# HELP greeting_get_total
# TYPE greeting_get_total counter
greeting_get_total 0.0

少なくとも1個のgreeting(あいさつ)を受け取ります。

% curl http://localhost:8080/greet
{"message":"Hello World!"}
% curl http://localhost:8080/greet/reader
{"message":"Hello reader!"}

Micrometerの出力を再度チェックします。値の変化に着目してください。

curl http://localhost:8080/micrometer
# HELP greeting_get_total
# TYPE greeting_get_total counter
greeting_get_total 2.0

Add Micrometer support to your MP app

Helidon MPアプリケーションでMicrometerの @Counted@Timed アノテーションを利用できます。

Modify pom.xml

CDIに対応したHelidon Micrometerの依存関係を追加します。

<dependency>
    <groupId>io.helidon.integrations.micrometer</groupId>
    <artifactId>helidon-integrations-micrometer-cdi</artifactId>
</dependency>

Add Micrometer annotations to GreetResource.java

Micrometerアノテーションを使用して、すべてのGETアクセスを(時間と呼び出し回数で)追跡し、パーソナライズされたあいさつのすべてのリクエストを個別にカウントします。

2個のGETメソッドに同じ@Timedアノテーションを使います。まず再利用可能な定数を定義します。

private static final String GETS_TIMER_NAME = "allGets";
private static final String GETS_TIMER_DESCR = 
        "Tracks all GET operations";

以下の2個のアノテーションを追加します。

  • 両方のGETメソッドにMicrometerの@Timedアノテーション
  • パーソナライズされたGETメソッドにMicrometerの@Countedアノテーション
@GET
@Timed(value = GETS_TIMER_NAME, description = GETS_TIMER_DESCR)
@Produces(MediaType.APPLICATION_JSON)
public JsonObject getDefaultMessage() {
    ...
}
...
@Counted(value = "personalizedGets", 
        description = "Counts personalized GET operations")
@Timed(value = GETS_TIMER_NAME, description = GETS_TIMER_DESCR)
@Path("/{name}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public JsonObject getMessage(@PathParam("name") String name) {
    ...
}

Try it

手を入れたアプリケーションをビルドし、実行します。

mvn package
java -jar target/quickstart-mp.jar

Micrometerエンドポイントにアクセスします。

curl http://localhost:8080/micrometer
# HELP allGets_seconds_max Tracks all GET operations
# TYPE allGets_seconds_max gauge
allGets_seconds_max 0.0
# HELP allGets_seconds Tracks all GET operations
# TYPE allGets_seconds summary
allGets_seconds_count 0.0
allGets_seconds_sum 0.0
# HELP personalizedGets_total Counts personalized GET operations
# TYPE personalizedGets_total counter
personalizedGets_total 0.0

少なくとも1個のgreeting(あいさつ)を受け取ります。

% curl http://localhost:8080/greet
{"message":"Hello World!"}
% curl http://localhost:8080/greet/reader
{"message":"Hello reader!"}

Micrometerの出力を再度確認し、値に変更があることに着目します。

curl http://localhost:8080/micrometer
# HELP allGets_seconds_max Tracks all GET operations
# TYPE allGets_seconds_max gauge
allGets_seconds_max 0.003666501
# HELP allGets_seconds Tracks all GET operations
# TYPE allGets_seconds summary
allGets_seconds_count 2.0
allGets_seconds_sum 0.003923641
# HELP personalizedGets_total Counts personalized GET operation
# TYPE personalizedGets_total counter
personalizedGets_total 1.0

Summary

わずかな変更で、Helidon SE/MPアプリケーションに独自のメトリックに対するMicrometerサポートを追加し、それらのメトリックを組み込みの /micrometer エンドポイントでアクセスできるよう構成できます。

Helidonの組み込みメトリックは、引き続き /metrics エンドポイントで利用できます。

Helidon SEおよびHelidon MPにおけるMicrometerサポートの詳細については、以下のドキュメントをご覧ください。

SE — Micrometer Metrics
https://helidon.io/docs/latest/#/se/metrics/02_micrometer
MP — Micrometer Metrics
https://helidon.io/docs/latest/#/mp/metrics/02_micrometer


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中