全部產品
Search
文件中心

Application Real-Time Monitoring Service:通過OpenTelemetry Java SDK自訂指標

更新時間:Aug 02, 2025

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 當前支援的指標類型大體有以下四類,目前除了Histogram(長條圖),其餘類型ARMS都支援。

  • Counter(計數器) 用途:記錄單調遞增的累積值(只能增加,不能減少)。 樣本:HTTP 要求總數、錯誤發生次數。

  • UpDownCounter(可增減計數器) 用途:記錄可增減的非單調值(如當前活躍串連數)。 樣本:並發請求數、隊列中的任務數。

  • Histogram(長條圖,暫不支援) 用途:記錄值的分布(如延遲、響應大小),支援計算分位元。 樣本:請求延遲分布(P90、P95)、檔案上傳大小。

  • Gauge(儀錶) 用途:捕獲某一時刻的瞬時值(如 CPU 使用率、記憶體佔用)。 樣本:系統溫度、即時記憶體使用量量。

步驟1:代碼中增加自訂指標

下面的代碼是一段搶購商品的簡單範例程式碼,其中定義了兩個指標:

  • 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");
        //定義一個counter指標,用於記錄商品搶購的次數
        seckillCounter = meter.counterBuilder("product_seckill_count")
                .setUnit("1")
                .setDescription("seckill product count")
                .build();

        //定義一個gauge指標,代表當前庫存的商品數量
        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 "搶購失敗,商品已售罄";
        }
        // 嘗試扣減庫存
        if (stock.decrementAndGet() >= 0) {
            seckillCounter.add(1, Attributes.of(seckillResult, "success"));
            return "搶購成功,剩餘庫存:" + stock.get();
        } else {
            stock.incrementAndGet(); // 復原
            seckillCounter.add(1, Attributes.of(seckillResult, "success"));
            return "搶購失敗,商品已售罄";
        }
    }
}

步驟2:在控制台配置指標採集

在控制台修改自訂指標採集配置,新增上一步建立 meter 時填入的參數。

image.png

步驟3:查看指標並配置警示

  1. ARMS控制台Prometheus監控 > 執行個體列表頁面頂部功能表列選擇應用接入的地區。

    執行個體類型為Prometheus for 應用監控的執行個體即為預設整合的應用監控執行個體。

    2024-10-29_11-56-55

  2. 單擊右側共用版進入 Grafana 頁面,然後單擊 Explore,選擇資料來源為上一步對應的 Prometheus 執行個體名稱。

    2025-07-31_16-26-27

  3. 您可以通過 PromQL 簡單查詢在代碼中定義的指標,如下圖所示,也可以在 Grafana 中自訂展示大盤

    image

自此通過 OpenTelemetry SDK 定義的指標就已經成功上報並儲存到 ARMS 服務端 Prometheus 儲存執行個體中了,後續您可以對 Prometheus 儲存執行個體中的指標建立警示規則

注意事項

  • 目前 ARMS 指標上報間隔為 15 秒一次。

  • 對於 Counter 類指標,ARMS 目前上報的不是累計值,而是一個上報周期內的增加值,即每 15 秒該指標的增加值。