原文はこちら。
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