The English version of quarkus.io is the official project site. Translated sites are community supported on a best-effort basis.
このページを編集

Micrometer および OpenTelemetry エクステンション

preview

このエクステンションは、 Quarkus アプリケーションにおける Micrometer と OpenTelemetry 両方のサポートを提供します。 両方のエクステンションを、 Micrometer メトリクスを OpenTelemetry 経由で送信可能にするブリッジとともに組み込むことで、 統合を合理化します。

この技術は、previewと考えられています。

preview では、下位互換性やエコシステムでの存在は保証されていません。具体的な改善には設定や API の変更が必要になるかもしれませんが、 stable になるための計画は現在進行中です。フィードバックは メーリングリストGitHub の課題管理 で受け付けています。

とりうるステータスの完全なリストについては、 FAQの項目 を参照してください。

このドキュメントは、 本コンポーネントおよびその他のオブザーバビリティ関連コンポーネントを扱う Quarkus でのオブザーバビリティリファレンスガイド の一部です。

  • このエクステンションは Quarkus バージョン 3.19 以降で使用可能です。

  • Micrometer エクステンションの詳細については、 Micrometer ガイド を参照してください。

  • OpenTelemetry エクステンションに関する情報は、 OpenTelemetry ガイド で提供されています。

このエクステンションを使用すると、 通常通り Micrometer API を使用しながら、 メトリクスを OpenTelemetry エクステンションで処理させることができます。

例として、 Micrometer の @Timed アノテーションを使用してメソッドの実行時間を測定します。

import io.micrometer.core.annotation.Timed;
//...
@Timed(name = "timer_metric")
public String timer() {
    return "OK";
}

出力されるテレメトリーデータは OpenTelemetry SDK によって処理され、 quarkus-opentelemetry エクステンションのエクスポーターを使用して OTLP プロトコルで送信されます。

これにより、 quarkus-micrometerquarkus-opentelemetry エクステンションを個別に独立して使用する場合に生じる、 同一アプリケーション内での独立した Micrometer レジストリと OpenTelemetry SDK の両方をメモリに保持するオーバーヘッドが削減されます。

OpenTelemetry SDK がすべてのメトリクスを処理します。 Micrometer メトリクス (手動または自動) と OpenTelemetry メトリクスの両方を使用できます。 この単一のエクステンションですべて利用可能です。

OpenTelemetry および Micrometer エクステンションのすべての設定は、 quarkus-micrometer-opentelemetry で利用可能です。

このブリッジは、 Quarkiverse にある単純な OTLP レジストリ以上のものです。 このエクステンションでは、 OpenTelemetry SDK が micrometer/micrometer-1.5 OpenTelemetry インストルメンテーションライブラリーに基づいた Micrometer レジストリ実装を提供します。

使用方法

すでに Quarkus プロジェクトが構成されている場合は、 プロジェクトのベースディレクトリで以下のコマンドを実行することで、 quarkus-micrometer-opentelemetry エクステンションをプロジェクトに追加できます。

コマンドラインインタフェース
quarkus extension add micrometer-opentelemetry
Maven
./mvnw quarkus:add-extension -Dextensions='micrometer-opentelemetry'
Gradle
./gradlew addExtension --extensions='micrometer-opentelemetry'

これにより、 ビルドファイルに以下が追加されます。

pom.xml
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-micrometer-opentelemetry</artifactId>
</dependency>
build.gradle
implementation("io.quarkus:quarkus-micrometer-opentelemetry")

設定

エクステンションが存在する場合、 Micrometer はデフォルトで有効になり、 OpenTelemetry のトレース、 メトリクス、 ログも同様に有効になります。

HTTP サーバーおよび JVM メトリクスの OpenTelemetry メトリクス自動インストルメンテーションは、 Micrometer で収集可能なため、 デフォルトで無効になっています。

Micrometer の特定の自動メトリクスはすべてデフォルトで無効になっており、 例えば JVM メトリクスの場合は次のように設定することで有効にできます。

quarkus.micrometer.binder.jvm=true

application.properties ファイル内。

このエクステンションで使用できるその他のプロパティーについては、 以下を参照してください。

Micrometer と OpenTelemetry におけるメトリクスの違い

API の違い

各フレームワークで生成されるメトリクスは異なる API に従っており、 マッピングは 1 対 1 ではありません。

基本的な API の違いの 1 つは、 レイテンシー (実行時間) メトリクスとイベントの頻度を記録するために、 Micrometer は Timer を使用し、 OpenTelemetry は Histogram を使用することです。

Micrometer で @Timed アノテーションを使用すると、 OpenTelemetry 側で 2 つの異なるメトリクスが作成されます。 1 つは max 値用の Gauge で、 もう 1 つは Histogram です。

Micrometer の DistributionSummary は、 Histogrammax 値用の DoubleGauge に変換されます。 DistributionSummary の作成時にサービスレベル目標 (slo) が true に設定されている場合、 それらに対して追加のヒストグラムが作成されます。

この表は、 2 つのフレームワーク間の違いを示しています。

Micrometer OpenTelemetry

DistributionSummary

<Metric name> (Histogram), <Metric name>.max (DoubleGauge)

SLO 付きの DistributionSummary

<Metric name> (Histogram), <Metric name>.max (DoubleGauge), <Metric name>.histogram (DoubleGauge)

LongTaskTimer

<Metric name>.active (ObservableLongUpDownCounter), <Metric name>.duration (ObservableDoubleUpDownCounter)

Timer

<Metric name> (Histogram), <Metric name>.max (ObservableDoubleGauge)

セマンティックコンベンションの違い

2 つのフレームワークは異なるセマンティックコンベンションに従っています。 OpenTelemetry メトリクスは OpenTelemetry Semantic Conventions に基づいており、 現在も活発に開発されています (2025 年初頭時点)。 一方、 Micrometer のメトリクスコンベンション形式は古くから存在し、 あまり変化していません。

application.properties ファイルにこれら 2 つの設定が行われている場合。

quarkus.micrometer.binder.jvm=true
quarkus.micrometer.binder.http-server.enabled=true

JVM および HTTP サーバーのメトリクスは Micrometer によって収集されます。

次に、 Micrometer によって収集されたメトリクスの例として、 quarkus-micrometer-registry-prometheus エンドポイントの出力 (/q/metrics) と、 このブリッジでの OTLP プロトコル出力の比較を示します。

対応する OpenTelemetry Semantic Convention へのリンクも参考として提供されていますが、 現在このブリッジでは使用されていません。

Table 1. Micrometer メトリクス出力比較。 Prometheus レジストリ対 OpenTelemetry ブリッジ
Micrometer Meter Java 定義 Quarkus Micrometer Prometheus 出力 (/q/metrics/ での表示) 本ブリッジの OpenTelemetry 出力名 (OTLP 出力での表示) 関連する OpenTelemetry Semantic Convention (適用外)

@Timed インターセプターを使用する場合。

method.timed (Histogram), method.timed.max (DoubleGauge)

該当なし

@Counted インターセプターを使用する場合。

method.counted (DoubleSum)

該当なし

http.server.active.requests (Gauge)

http_server_active_requests (Gauge)

http.server.active.requests (DoubleGauge)

http.server.active_requests (UpDownCounter)

http.server.requests (Timer)

http_server_requests_seconds_count, http_server_requests_seconds_sum, http_server_requests_seconds_max (Gauge)

http.server.requests (Histogram), http.server.requests.max (DoubleGauge)

http.server.request.duration (Histogram)

http.server.bytes.read (DistributionSummary)

http_server_bytes_read_count, http_server_bytes_read_sum , http_server_bytes_read_max (Gauge)

http.server.bytes.read (Histogram), http.server.bytes.read.max (DoubleGauge)

http.server.request.body.size (Histogram)

http.server.bytes.write (DistributionSummary)

http_server_bytes_write_count, http_server_bytes_write_sum , http_server_bytes_write_max (Gauge)

http.server.bytes.write (Histogram), http.server.bytes.write.max (DoubleGauge)

http.server.response.body.size (Histogram)

http.server.connections (LongTaskTimer)

http_server_connections_seconds_active_count, http_server_connections_seconds_duration_sum http_server_connections_seconds_max (Gauge)

http.server.connections.active (LongSum), http.server.connections.duration (DoubleGauge)

該当なし

jvm.threads.live (Gauge)

jvm_threads_live_threads (Gauge)

jvm.threads.live (DoubleGauge)

jvm.threads.live (UpDownCounter)

jvm.threads.started (FunctionCounter)

jvm_threads_started_threads_total (Counter)

jvm.threads.started (DoubleSum)

jvm.threads.live (UpDownCounter)

jvm.threads.daemon (Gauge)

jvm_threads_daemon_threads (Gauge)

jvm.threads.daemon (DoubleGauge)

jvm.threads.live (UpDownCounter)

jvm.threads.peak (Gauge)

jvm_threads_peak_threads (Gauge)

jvm.threads.peak (DoubleGauge)

該当なし

jvm.threads.states (ステートごとの Gauge)

jvm_threads_states_threads (Gauge)

jvm.threads.states (DoubleGauge)

jvm.threads.live (UpDownCounter)

データが含まれていない場合、 一部のメトリクスが出力から欠落することがあります。

出力の確認

Grafana-OTel-LGTM Dev Service

Grafana-OTel-LGTM Dev Service を使用できます。

この Dev Service には、 データを可視化するための Grafana、 ログを保存するための Loki、 トレースを保存するための Tempo、 およびメトリクスを保存するための Prometheus が含まれています。 また、 データを受信するための OTel コレクターも提供されます。

Logging エクスポーター

application.properties ファイルでエクスポーターを logging に設定することで、 すべてのメトリクスをコンソールに出力できます。

quarkus.otel.metrics.exporter=logging (1)
quarkus.otel.metric.export.interval=10000ms (2)
1 エクスポーターを logging に設定します。 通常、 これを設定する必要はありません。 デフォルトは cdi です。
2 メトリクスをエクスポートする間隔を設定します。 デフォルトは 1m ですが、 デバッグには長すぎます。

また、 以下の依存関係をプロジェクトに追加します。

<dependency>
    <groupId>io.opentelemetry</groupId>
    <artifactId>opentelemetry-exporter-logging</artifactId>
</dependency>

関連コンテンツ