ARMS menyediakan metrik Pemantauan Aplikasi umum. Anda dapat mengimpor OpenTelemetry Java SDK untuk menyesuaikan metrik. Topik ini menjelaskan cara menyesuaikan metrik dan mengkuerinya di Grafana.
Prasyarat
Aplikasi Anda telah terhubung ke Pemantauan Aplikasi ARMS. Untuk informasi selengkapnya, lihat Akses aplikasi.
Versi agen ARMS adalah 4.5.0 atau yang lebih baru.
Impor dependensi
Impor OpenTelemetry Java SDK dengan menambahkan dependensi Maven berikut. Untuk informasi selengkapnya, lihat dokumen 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>Langkah-langkah untuk menyesuaikan metrik
OpenTelemetry saat ini mendukung empat jenis metrik berikut. ARMS mendukung semua jenis kecuali Histogram.
Counter: Mencatat nilai kumulatif yang meningkat secara monoton. Contoh: Jumlah total permintaan HTTP dan jumlah titik kegagalan.
UpDownCounter: Mencatat nilai non-monotonik yang dapat meningkat atau menurun, seperti jumlah koneksi aktif. Contoh: Jumlah permintaan konkuren dan jumlah tugas dalam antrian.
Histogram (tidak didukung): Mencatat distribusi nilai, seperti latensi dan ukuran tanggapan, serta mendukung perhitungan kuantil. Contoh: Distribusi latensi permintaan (P90 dan P95) dan ukuran unggah file.
Gauge: Menangkap nilai instan pada waktu tertentu, seperti penggunaan CPU atau Penggunaan memori. Contoh: suhu sistem dan Penggunaan memori real-time.
Langkah 1: Tambahkan metrik kustom ke kode
Kode berikut menunjukkan contoh penjualan kilat sederhana yang mendefinisikan dua metrik:
product_seckill_count: Jumlah percobaan penjualan kilat.
product_current_stock: Stok saat ini.
Saat Anda mengambil meter, yaitu kelas pabrik untuk mendefinisikan metrik, Anda meneruskan parameter bernama product_seckill. Parameter ini berfungsi sebagai nama kelompok. Semua metrik yang didefinisikan oleh meter ini termasuk dalam kelompok tersebut. Nama kelompok ini 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 {
// Static inventory counter
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();
// Define the metric factory class. Note that product_seckill is important.
Meter meter = agentOpenTelemetry.getMeter("product_seckill");
// Define a counter metric to record the number of flash sale attempts.
seckillCounter = meter.counterBuilder("product_seckill_count")
.setUnit("1")
.setDescription("seckill product count")
.build();
// Define a gauge metric to represent the current inventory of the product.
observableLongGauge = meter.gaugeBuilder("product_current_stock").ofLongs().buildWithCallback((measurement -> {
// Record the current product quantity.
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.";
}
// Try to deduct the inventory.
if (stock.decrementAndGet() >= 0) {
seckillCounter.add(1, Attributes.of(seckillResult, "success"));
return "Flash sale successful. Remaining inventory: " + stock.get();
} else {
stock.incrementAndGet(); // Rollback
seckillCounter.add(1, Attributes.of(seckillResult, "success"));
return "Flash sale failed. The product is sold out.";
}
}
}
Langkah 2: Konfigurasi pengumpulan metrik di Konsol
Di Konsol, ubah konfigurasi pengumpulan metrik kustom dan tambahkan parameter yang Anda gunakan untuk membuat meter pada langkah sebelumnya.

Langkah 3: Lihat metrik dan konfigurasi peringatan
Di bilah menu atas halaman di Konsol ARMS, pilih Wilayah tempat aplikasi Anda diterapkan.
Instans dengan tipe Prometheus for Application Monitoring adalah instans Pemantauan Aplikasi default.

Klik Shared Edition untuk membuka halaman Grafana. Klik Explore dan pilih instans Prometheus dari langkah sebelumnya sebagai Sumber data.

Anda dapat menggunakan Prometheus Query Language (PromQL) untuk mengkueri metrik yang Anda definisikan dalam kode, seperti yang ditunjukkan pada gambar berikut. Anda juga dapat menyesuaikan Dasbor di Grafana.

Pada tahap ini, metrik yang Anda definisikan menggunakan OpenTelemetry SDK dilaporkan ke dan disimpan dalam instans Prometheus di ARMS. Anda kemudian dapat membuat aturan peringatan untuk metrik tersebut.
Catatan
ARMS melaporkan metrik dengan interval 15 detik.
Untuk metrik Counter, ARMS melaporkan kenaikan dalam setiap epoch pelaporan, bukan nilai kumulatifnya. Artinya, ARMS melaporkan peningkatan nilai metrik setiap 15 detik.