全部产品
Search
文档中心

Application Real-Time Monitoring Service:Gunakan OpenTelemetry SDK untuk Java untuk menambahkan kode instrumen kustom ke jejak

更新时间:Jul 06, 2025

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

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.

Penting

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:

  1. Dalam metode init dari OpenTelemetryController, tugas terjadwal dimulai menggunakan ScheduledExecutorService. Saat tugas terjadwal dimulai, ia membuat Rentang dan menutup Rentang ini ketika tugas berakhir.

  2. Dalam metode parent dari OpenTelemetryController, beberapa metode dari OpenTelemetry SDK dipanggil.

    1. Setiap kali metode ini dipanggil, ia membuat Rentang bernama parent dan menutup Rentang ini ketika metode berakhir.

    2. Metode ini juga memanggil SDK Baggage untuk menambahkan dua pasang Baggage bernama user.id dan user.name. Kedua Baggage ini akan disebarkan ke aplikasi hilir.

    3. Dua Atribut ditambahkan ke Rentang yang dibuat di Langkah 2.a.

  3. Dalam metode child dari OpenTelemetryController, operasi berikut dilakukan.

    1. Setiap kali metode ini dipanggil, ia membuat Rentang bernama child dan menutup Rentang ini ketika metode berakhir. Perhatikan bahwa Rentang ini adalah anak dari Rentang yang dibuat di Langkah 2.a.

    2. Metode ini mengambil konteks Jejak dan mencetak traceId.

    3. 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.

    image

  • 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).

    image.png

ARMS agent v3.x dan lebih baru

  • Langkah 1:

    2024-12-16_15-41-45

  • 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 child berada sebagai tumpukan metode dalam rentang bernama parent. Selain itu, atribut terkait rentang yang dihasilkan oleh OpenTelemetry SDK telah berhasil diatur (ditunjukkan oleh kotak biru).

    image

    image

Langkah terkait

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