Jika Anda menggunakan Pemantauan Aplikasi dari Application Real-Time Monitoring Service (ARMS) untuk memantau aplikasi dengan framework Java umum, agen ARMS secara otomatis menginstrumen framework tersebut. Anda dapat mengumpulkan informasi jejak tanpa perlu memodifikasi kode bisnis. Untuk mencerminkan status eksekusi metode bisnis dalam informasi jejak, gunakan OpenTelemetry SDK untuk Java untuk menambahkan kode instrumen kustom ke kode tersebut. Topik ini menjelaskan cara menggunakan SDK untuk menginstrumen aplikasi Anda, serta menangkap konteks jejak, baggage kustom, dan atribut.
Untuk informasi mengenai komponen dan framework yang didukung oleh ARMS, lihat Komponen dan framework Java yang didukung oleh ARMS.
Prasyarat
Aplikasi Anda dipantau di Pemantauan Aplikasi.
Agen ARMS adalah V2.9.1.2 atau lebih baru. Jika versinya lebih lama, perbarui.
Tambahkan dependensi
Tambahkan dependensi Maven berikut untuk memperkenalkan OpenTelemetry SDK untuk Java. Untuk informasi lebih lanjut, lihat Instrumen.
<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>Kompatibilitas antara ARMS dan instrumen berbasis OpenTelemetry
Istilah
Hanya beberapa istilah yang umum digunakan yang diperkenalkan di sini. Untuk informasi tentang nama lainnya, lihat Spesifikasi OpenTelemetry.
Rentang: operasi spesifik dalam permintaan, seperti panggilan jarak jauh atau panggilan metode internal.
SpanContext: konteks untuk jejak permintaan tunggal, yang mencakup informasi seperti traceId dan spanId.
Atribut: bidang atribut tambahan dari rentang, yang digunakan untuk mencatat informasi penting.
Baggage: pasangan nilai-kunci yang disebarkan di seluruh jejak lengkap.
Gunakan OpenTelemetry SDK untuk Java
Anda dapat menggunakan SDK untuk melakukan operasi berikut:
Buat Rentang baru menggunakan kode instrumen.
Tambahkan Atribut ke Rentang.
Sebarkan item Baggage dalam konteks jejak.
Akses konteks jejak dan keluarkan pengenal seperti traceId dan spanId.
Contoh kode berikut menunjukkan cara menggunakan SDK untuk melakukan operasi sebelumnya.
Anda harus mengambil instance OpenTelemetry dengan memanggil metode GlobalOpenTelemetry.get(), bukan langsung menggunakan instance OpenTelemetry yang dibuat secara manual menggunakan SDK. Jika tidak, data Rentang yang dihasilkan oleh instrumen SDK menjadi tidak terlihat saat menggunakan agen ARMS v4.x.
@RestController
@RequestMapping("/ot")
public class OpenTelemetryController {
private Tracer tracer;
private ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
@PostConstruct
public void init() {
OpenTelemetrySdk.builder()
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
.buildAndRegisterGlobal();
tracer = GlobalOpenTelemetry.get().getTracer("manual-sdk", "1.0.0");
ses.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
Span span = tracer.spanBuilder("schedule")
.setAttribute("schedule.time", System.currentTimeMillis())
.startSpan();
try (Scope scope = span.makeCurrent()) {
System.out.println("scheduled!");
Thread.sleep(500L);
span.setAttribute("schedule.success", true);
System.out.println(Span.current().getSpanContext().getTraceId()); // Dapatkan ID jejak.
} catch (Throwable t) {
span.setStatus(StatusCode.ERROR, t.getMessage());
} finally {
span.end();
}
}
}, 10, 30, TimeUnit.SECONDS);
}
@ResponseBody
@RequestMapping("/parent")
public String parent() {
Span span = tracer.spanBuilder("parent").setSpanKind(SpanKind.SERVER).startSpan();
try (Scope scope = span.makeCurrent()) {
// Gunakan Baggage untuk menyebarkan tag kustom layanan.
Baggage baggage = Baggage.current().toBuilder()
.put("user.id", "1")
.put("user.name", "name")
.build();
try (Scope baggageScope = baggage.storeInContext(Context.current()).makeCurrent()) {
child();
}
span.setAttribute("http.method", "GET");
span.setAttribute("http.uri", "/parent");
} finally {
span.end();
}
return "parent";
}
private void child() {
Span span = tracer.spanBuilder("child").startSpan();
try (Scope scope = span.makeCurrent()) {
System.out.println("current traceId = " + Span.current().getSpanContext().getTraceId());
System.out.println("userId in baggage = " + Baggage.current().getEntryValue("user.id"));
Thread.sleep(1000);
} catch (Throwable e) {
span.setStatus(StatusCode.ERROR, e.getMessage());
} finally {
span.end();
}
}
}Detail:
Dalam metode
initdariOpenTelemetryController, tugas terjadwal dimulai menggunakan ScheduledExecutorService. Saat tugas terjadwal dimulai, ia membuat Rentang dan menutup Rentang ini ketika tugas berakhir.Dalam metode
parentdariOpenTelemetryController, beberapa metode dari OpenTelemetry SDK dipanggil.Setiap kali metode ini dipanggil, ia membuat Rentang bernama
parentdan menutup Rentang ini ketika metode berakhir.Metode ini juga memanggil SDK Baggage untuk menambahkan dua pasang Baggage bernama
user.iddanuser.name. Kedua Baggage ini akan disebarkan ke aplikasi hilir.Dua Atribut ditambahkan ke Rentang yang dibuat di Langkah 2.a.
Dalam metode
childdariOpenTelemetryController, operasi berikut dilakukan.Setiap kali metode ini dipanggil, ia membuat Rentang bernama
childdan menutup Rentang ini ketika metode berakhir. Perhatikan bahwa Rentang ini adalah anak dari Rentang yang dibuat di Langkah 2.a.Metode ini mengambil konteks Jejak dan mencetak traceId.
Metode ini juga mengambil dan mencetak item Baggage (user.id dan user.name) yang ditambahkan di Langkah 2.b.
Perbandingan versi agen
Versi agen ARMS yang berbeda memberikan dukungan yang berbeda untuk langkah-langkah sebelumnya, seperti yang ditunjukkan dalam tabel berikut.
Langkah | ARMS Agent v4.x dan lebih baru | ARMS Agent v3.x dan lebih lama |
1 | Didukung. Rentang baru dihasilkan. | Didukung. Rentang baru dihasilkan. |
2.1 | Didukung | Didukung |
2.2 | Didukung | Tidak didukung |
2.3 | Didukung | Didukung |
3.1 | Didukung | Didukung. Rentang ini digunakan sebagai tumpukan metode dari Rentang yang dibuat di Langkah 2.a. |
3.2 | Didukung. TraceId yang dicetak sama dengan yang disediakan oleh agen. | Tidak didukung. TraceId yang dicetak berbeda dari yang disediakan oleh agen. |
3.2 | Didukung | Didukung |
Efek instrumen
ARMS agent v4.x dan lebih baru
Langkah 1:
Rentang yang dihasilkan melalui OpenTelemetry SDK dapat dilihat secara normal.

Langkah 2 dan Langkah 3:
Rentang yang dihasilkan melalui OpenTelemetry SDK (ditunjukkan oleh kotak merah) dan rentang yang dihasilkan oleh instrumen di Tomcat (ditunjukkan oleh kotak kuning) merupakan bagian dari jejak yang sama. Atribut terkait dengan rentang yang dihasilkan oleh OpenTelemetry SDK telah berhasil diatur (ditunjukkan oleh kotak biru).

ARMS agent v3.x dan lebih baru
Langkah 1:

Langkah 2 dan Langkah 3:
Rentang yang dihasilkan melalui OpenTelemetry SDK (ditunjukkan oleh kotak merah) dan rentang yang dihasilkan oleh instrumen di Tomcat (ditunjukkan oleh kotak kuning) merupakan bagian dari jejak yang sama. Rentang bernama
childberada sebagai tumpukan metode dalam rentang bernamaparent. Selain itu, atribut terkait rentang yang dihasilkan oleh OpenTelemetry SDK telah berhasil diatur (ditunjukkan oleh kotak biru).

Langkah terkait
Dengan mengaitkan ID jejak dengan log bisnis aplikasi, Anda dapat dengan cepat mengaksesnya untuk mengidentifikasi, menganalisis, dan menyelesaikan kesalahan apa pun.