全部产品
Search
文档中心

Application Real-Time Monitoring Service:Gunakan OpenTelemetry SDK untuk Java untuk mengoper konteks lintas-proses

更新时间:Jul 06, 2025

Setelah mengintegrasikan layanan sub Pemantauan Aplikasi dari Application Real-Time Monitoring Service (ARMS) untuk memantau aplikasi berbasis kerangka kerja Java umum, agen ARMS secara otomatis memperalat kerangka kerja tersebut. Dengan cara ini, jejak dikumpulkan tanpa perlu memodifikasi kode Anda. Namun, untuk mengoper konteks lintas-proses, Anda dapat menginstal OpenTelemetry SDK untuk Java.

Untuk informasi tentang komponen dan kerangka kerja yang didukung oleh agen ARMS, lihat Komponen dan kerangka kerja Java yang didukung oleh ARMS.

Skenario

Ketika menggunakan protokol eksklusif untuk komunikasi lintas-proses, klien dan server mungkin tidak terhubung dalam jejak. Dalam kasus seperti itu, Anda harus secara manual mengambil konteks jejak di sisi klien, termasuk ID jejak, ID rentang, flag sampel, dan baggage, lalu mengoper konteks ke sisi server.

Prasyarat

  • Pemantauan Aplikasi ARMS telah diintegrasikan. Untuk informasi lebih lanjut, lihat Ikhtisar Pemantauan Aplikasi.

  • Agen ARMS adalah versi 4.x atau lebih baru. Untuk informasi tentang cara memperbarui agen ARMS, lihat Perbarui agen ARMS.

Tambahkan dependensi

Tambahkan dependensi Maven berikut untuk memperkenalkan OpenTelemetry SDK untuk Java. Untuk informasi lebih lanjut, lihat Instrumentasi.

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

Oper konteks lintas-proses

Dalam kode berikut, CustomRpcCallMessage menunjukkan entitas yang digunakan untuk komunikasi lintas-proses dalam protokol eksklusif, dan menggunakan headerMap untuk mengoper konteks. Jika headerMap hilang, modifikasi kode secara manual untuk menambahkan bidang headerMap.

class CustomRpcCallMessage {

    private Map<String, String> headerMap;
    //Omit other fields.

    public String getHeader(String key) {
        return headerMap.get(key);
    }

    public void setHeader(String key, String value) {
        this.headerMap.put(key, value);
    }

    public Map<String, String> getHeaderMap() {
        return headerMap;
    }
}

public class CrossProcessPropagateDemo {
    public static void clientSide(String[] args) {
        CustomRpcCallMessage rpcCall = new CustomRpcCallMessage();
        TextMapSetter<CustomRpcCallMessage> setter = new TextMapSetter<CustomRpcCallMessage>() {
            @Override
            public void set(CustomRpcCallMessage carrier, String key, String value) {
                carrier.setHeader(key, value);
            }
        };
        W3CTraceContextPropagator.getInstance().inject(Context.current(), rpcCall, setter);
        W3CBaggagePropagator.getInstance().inject(Context.current(), rpcCall, setter);
    }

    private static void serverSide() {
        //Receive requests from the server.
        CustomRpcCallMessage rpcCall ;
        TextMapGetter<CustomRpcCallMessage> getter = new TextMapGetter<CustomRpcCallMessage>() {
            @Override
            public Iterable<String> keys(CustomRpcCallMessage carrier) {
                return carrier.getHeaderMap().keySet();
            }

            @Override
            public String get(CustomRpcCallMessage carrier, String key) {
                return carrier.getHeader(key);
            }
        };
        Context context = W3CTraceContextPropagator.getInstance().extract(Context.current(), rpcCall, getter);
        context = W3CBaggagePropagator.getInstance().extract(context, rpcCall, getter);
        try (Scope scope = context.makeCurrent()) {
            //Omit the server processing logic. 
        }
    }
}

Dalam skenario bisnis nyata, Anda hanya perlu memodifikasi kelas implementasi variabel setter dan getter dalam potongan kode sebelumnya. Ini memastikan bahwa metode set dan get menyampaikan makna yang dimaksudkan.

Langkah terkait

Anda dapat mengaitkan ID jejak dengan log aplikasi untuk segera menemukan, menganalisis, dan menyelesaikan kesalahan. Untuk informasi lebih lanjut, lihat Kaitkan ID jejak dengan log untuk aplikasi Java.