ARMS には、組み込みの アプリケーションモニタリングメトリック が含まれています。独自のメトリックを定義するには、OpenTelemetry Java SDK を使用します。このトピックでは、カスタムメトリックを作成し、Grafana でクエリする方法について説明します。
前提条件
-
アプリケーションが ARMS アプリケーションモニタリングに接続されていること。詳細については、「アプリケーションアクセス」をご参照ください。
-
ARMS エージェントのバージョンが 4.5.0 以降であること。
依存関係の追加
次の Maven 依存関係を追加して、OpenTelemetry Java SDK をインポートします。詳細については、OpenTelemetry の公式ドキュメントをご参照ください。
<dependencies>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk-trace</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-sdk</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-bom</artifactId>
<version>1.23.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
操作手順
OpenTelemetry は、主に次の 4 種類のメトリックタイプをサポートしています:
-
カウンター:時間の経過とともに増加する一方の値を記録します。HTTP リクエストやエラーの合計数など、累積データを追跡する場合に使用します。
-
UpDownCounter:増減可能な値を記録します。アクティブな接続数やキュー内のタスク数など、非単調な値を追跡する場合に使用します。
-
ヒストグラム (非サポート):リクエストのレイテンシーや応答サイズなど、値のセットの統計分布を記録します。分位数 (例:P90 または P95) の計算に使用できます。
-
ゲージ:特定の時点での瞬間的な値をキャプチャします。CPU 使用率やメモリ使用量など、任意に変化する可能性のある値を追跡する場合に使用します。
ステップ 1:カスタムメトリックの追加
次のコードは、タイムセールアプリケーションの簡単な例です。次の 2 つのメトリックを定義します:
-
product_seckill_count:タイムセール試行回数。 -
product_current_stock:現在のプロダクト在庫。
メトリックを定義するために meter ファクトリークラスを取得する際に、`product_seckill` パラメーターが渡されます。このパラメーターはグループ識別子として機能します。この `meter` を使用して後続で定義されるすべてのメトリックは、このグループに属し、後の構成で使用されます。
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.LongCounter;
import io.opentelemetry.api.metrics.Meter;
import io.opentelemetry.api.metrics.ObservableLongGauge;
import javax.annotation.PreDestroy;
import java.util.concurrent.atomic.AtomicInteger;
class ProductService {
// 静的な在庫カウンター。
public final AtomicInteger stock = new AtomicInteger(0);
private LongCounter seckillCounter;
private ObservableLongGauge observableLongGauge;
private final AttributeKey<String> seckillResult = AttributeKey.stringKey("seckill_result");
public ProductService() {
OpenTelemetry agentOpenTelemetry = GlobalOpenTelemetry.get();
// メトリックファクトリークラスを定義します。「product_seckill」という名前は重要です。
Meter meter = agentOpenTelemetry.getMeter("product_seckill");
// タイムセール試行回数を記録するためのカウンターを定義します。
seckillCounter = meter.counterBuilder("product_seckill_count")
.setUnit("1")
.setDescription("seckill product count")
.build();
// 現在のプロダクト在庫を表すゲージを定義します。
observableLongGauge = meter.gaugeBuilder("product_current_stock").ofLongs().buildWithCallback((measurement -> {
// 現在のプロダクト数量を記録します。
measurement.record(stock.get());
}));
}
@PreDestroy
public void clear() {
observableLongGauge.close();
}
public void setKillProductCount(int count) {
stock.set(count);
}
public String seckillProduct() {
int currentStock = stock.get();
if (currentStock <= 0) {
seckillCounter.add(1, Attributes.of(seckillResult, "failed"));
return "Flash sale failed. The product is sold out.";
}
// 在庫を減らしてみます。
if (stock.decrementAndGet() >= 0) {
seckillCounter.add(1, Attributes.of(seckillResult, "success"));
return "Flash sale successful. Remaining stock: " + stock.get();
} else {
stock.incrementAndGet(); // ロールバック。
seckillCounter.add(1, Attributes.of(seckillResult, "failed"));
return "Flash sale failed. The product is sold out.";
}
}
}
ステップ 2:メトリック収集の設定
コンソールで、カスタムメトリック収集設定 を変更し、前のステップで `Meter` を作成したときに指定したグループ名を追加します。
この構成は、エージェントバージョン 4.5.0 以降でのみ有効で、アプリケーションの再起動は不要です。完了したら、[保存] をクリックします。
ステップ 3:メトリックの表示とアラートの設定
-
ARMS コンソールで、 ページに移動します。上部のメニューバーから、アプリケーションがデプロイされているリージョンを選択します。名前が
metricstore-apm-metrics-customで始まる Prometheus ストレージインスタンスを検索し、[Shared Edition] をクリックして Grafana を開きます。 -
Grafana ページで、[Explore] をクリックします。データソースのドロップダウンリストから、前のステップの Prometheus ストレージインスタンスを選択します。
Grafana フォルダページで、フォルダが空の場合、
このフォルダにはまだダッシュボードがありませんというメッセージが表示されます。[+ ダッシュボードの作成] をクリックして新しいダッシュボードを追加するか、[ダッシュボードの管理] をクリックして既存のダッシュボードをフォルダに移動します。 -
次の図に示すように、PromQL を使用してコードで定義されたカスタムメトリックをクエリします。Grafana で カスタム可観測性ダッシュボード を作成することもできます。

ARMS は、OpenTelemetry SDK で定義されたカスタムメトリックを Prometheus ストレージインスタンスにレポートして保存します。その後、これらのメトリックに対して アラートルールを作成 できます。
注意事項
-
ARMS は 15 秒間隔でメトリックをレポートします。
-
`counter` メトリックの場合、ARMS は各レポート間隔内の増分値をレポートし、累計値はレポートしません。