ARMS mencakup metrik Pemantauan Aplikasi bawaan. Untuk menentukan metrik Anda sendiri, gunakan OpenTelemetry Java SDK. Topik ini menjelaskan cara membuat metrik kustom dan melakukan kueri terhadapnya di Grafana.
Prasyarat
-
Aplikasi Anda telah terhubung ke ARMS Application Monitoring. Untuk informasi selengkapnya, lihat Akses aplikasi.
-
Agen ARMS harus menggunakan versi 4.5.0 atau lebih baru.
Tambahkan dependensi
Tambahkan dependensi Maven berikut untuk mengimpor OpenTelemetry Java SDK. Untuk informasi selengkapnya, lihat dokumentasi resmi 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>
Prosedur
OpenTelemetry mendukung empat jenis instrumen metrik utama:
-
Counter: Mencatat nilai yang hanya meningkat seiring waktu. Gunakan counter untuk melacak data kumulatif, seperti jumlah total permintaan HTTP atau error.
-
UpDownCounter: Mencatat nilai yang dapat naik atau turun. Gunakan UpDownCounter untuk melacak nilai non-monotonik, seperti jumlah koneksi aktif atau tugas dalam antrian.
-
Histogram (Tidak didukung): Mencatat distribusi statistik dari sekumpulan nilai, seperti latensi permintaan atau ukuran respons. Instrumen ini dapat digunakan untuk menghitung kuantil (misalnya, P90 atau P95).
-
Gauge: Menangkap nilai instan pada titik waktu tertentu. Gunakan gauge untuk melacak nilai yang dapat berubah secara arbitrer, seperti penggunaan CPU atau Penggunaan memori.
Langkah 1: Tambahkan metrik kustom
Kode berikut memberikan contoh sederhana aplikasi penjualan kilat. Kode tersebut mendefinisikan dua metrik:
-
product_seckill_count: Jumlah upaya penjualan kilat. -
product_current_stock: Stok produk saat ini.
Saat Anda mendapatkan kelas pabrik meter untuk mendefinisikan metrik, parameter product_seckill diteruskan. Parameter ini berfungsi sebagai pengenal kelompok. Semua metrik yang kemudian didefinisikan menggunakan meter ini termasuk dalam kelompok ini, yang digunakan dalam konfigurasi selanjutnya.
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 {
// Penghitung stok statis.
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();
// Definisikan kelas pabrik metrik. Nama 'product_seckill' penting.
Meter meter = agentOpenTelemetry.getMeter("product_seckill");
// Definisikan counter untuk mencatat jumlah upaya penjualan kilat.
seckillCounter = meter.counterBuilder("product_seckill_count")
.setUnit("1")
.setDescription("seckill product count")
.build();
// Definisikan gauge untuk merepresentasikan stok produk saat ini.
observableLongGauge = meter.gaugeBuilder("product_current_stock").ofLongs().buildWithCallback((measurement -> {
// Catat jumlah produk saat ini.
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 "Penjualan kilat gagal. Produk telah habis.";
}
// Coba kurangi stok.
if (stock.decrementAndGet() >= 0) {
seckillCounter.add(1, Attributes.of(seckillResult, "success"));
return "Penjualan kilat berhasil. Stok tersisa: " + stock.get();
} else {
stock.incrementAndGet(); // Rollback.
seckillCounter.add(1, Attributes.of(seckillResult, "failed"));
return "Penjualan kilat gagal. Produk telah habis.";
}
}
}
Langkah 2: Konfigurasi pengumpulan metrik
Di Konsol, ubah Konfigurasi Pengumpulan Metrik Kustom dengan menambahkan nama kelompok yang Anda tentukan saat membuat Meter pada langkah sebelumnya.
Konfigurasi ini hanya berlaku untuk versi agen 4.5.0 atau lebih baru dan tidak memerlukan restart aplikasi. Setelah selesai, klik Save.
Langkah 3: Lihat metrik dan konfigurasi alert
-
Di Konsol ARMS, buka halaman . Dari bilah menu atas, pilih Wilayah tempat aplikasi Anda dideploy. Cari instans penyimpanan Prometheus yang namanya diawali dengan
metricstore-apm-metrics-custom, lalu klik Shared Edition untuk membuka Grafana. -
Di halaman Grafana, klik Explore. Dari daftar drop-down sumber data, pilih instans penyimpanan Prometheus dari langkah sebelumnya.
Di halaman folder Grafana, jika foldernya kosong, Anda akan melihat pesan
This folder doesn't have any dashboards yet. Klik + Create Dashboard untuk menambahkan dasbor baru, atau klik Manage dashboards untuk memindahkan dasbor yang sudah ada ke dalam folder tersebut. -
Gunakan PromQL untuk melakukan kueri terhadap metrik kustom yang didefinisikan dalam kode Anda, seperti yang ditunjukkan pada gambar berikut. Anda juga dapat membuat dasbor observabilitas kustom di Grafana.

ARMS melaporkan dan menyimpan metrik kustom yang didefinisikan dengan OpenTelemetry SDK di instans penyimpanan Prometheus Anda. Anda kemudian dapat membuat aturan alert untuk metrik-metrik tersebut.
Catatan penggunaan
-
ARMS melaporkan metrik dengan interval 15 detik.
-
Untuk metrik
counter, ARMS melaporkan nilai inkremental dalam setiap interval pelaporan, bukan total kumulatifnya.