すべてのプロダクト
Search
ドキュメントセンター

Application Real-Time Monitoring Service:OpenTelemetry Java SDK を使用したメトリックのカスタマイズ

最終更新日:Jun 22, 2026

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:メトリックの表示とアラートの設定

  1. ARMS コンソールで、Prometheus モニタリング > インスタンスリスト ページに移動します。上部のメニューバーから、アプリケーションがデプロイされているリージョンを選択します。名前が metricstore-apm-metrics-custom で始まる Prometheus ストレージインスタンスを検索し、[Shared Edition] をクリックして Grafana を開きます。

  2. Grafana ページで、[Explore] をクリックします。データソースのドロップダウンリストから、前のステップの Prometheus ストレージインスタンスを選択します。

    Grafana フォルダページで、フォルダが空の場合、このフォルダにはまだダッシュボードがありません というメッセージが表示されます。[+ ダッシュボードの作成] をクリックして新しいダッシュボードを追加するか、[ダッシュボードの管理] をクリックして既存のダッシュボードをフォルダに移動します。

  3. 次の図に示すように、PromQL を使用してコードで定義されたカスタムメトリックをクエリします。Grafana で カスタム可観測性ダッシュボード を作成することもできます。

    image

ARMS は、OpenTelemetry SDK で定義されたカスタムメトリックを Prometheus ストレージインスタンスにレポートして保存します。その後、これらのメトリックに対して アラートルールを作成 できます。

注意事項

  • ARMS は 15 秒間隔でメトリックをレポートします。

  • `counter` メトリックの場合、ARMS は各レポート間隔内の増分値をレポートし、累計値はレポートしません。