All Products
Search
Document Center

Managed Service for OpenTelemetry:Instrumentasi aplikasi Android dengan OpenTelemetry

Last Updated:Jun 22, 2026

Setelah Anda melakukan instrumentasi aplikasi dengan OpenTelemetry dan melaporkan trace data ke Managed Service for OpenTelemetry, Managed Service for OpenTelemetry mulai memantau aplikasi tersebut. Anda dapat melihat berbagai data pemantauan, seperti topologi aplikasi, jejak (traces), transaksi abnormal, transaksi lambat, dan analisis SQL. Topik ini menjelaskan cara melakukan instrumentasi aplikasi Android dengan OpenTelemetry dan melaporkan data.

Prasyarat

Dapatkan titik akhir (endpoint)

Konsol baru

  1. Masuk ke Konsol Managed Service for OpenTelemetry. Di panel navigasi sebelah kiri, klik Integration Center.

  2. Pada halaman Integration Center, klik kartu OpenTelemetry di bagian Open Source Frameworks.

  3. Di panel OpenTelemetry, klik tab Start Integration, lalu pilih wilayah tempat Anda ingin melaporkan data.

    Catatan

    Saat Anda mengakses suatu wilayah untuk pertama kalinya, resource akan diinisialisasi secara otomatis di sana.

  4. Konfigurasikan parameter Connection Type dan Export Protocol, lalu salin titik akhirnya.

    • Connection Type: Jika layanan Anda dideploy di Alibaba Cloud dan berada di wilayah yang Anda pilih, kami menyarankan Anda mengatur parameter ini ke Alibaba Cloud VPC Network. Jika tidak, atur parameter ini ke Public Network.

    • Export Protocol: Atur parameter ini ke HTTP (disarankan) atau gRPC berdasarkan protokol yang didukung oleh client.

    75.jpg

Konsol lama

  1. Masuk ke Konsol Managed Service for OpenTelemetry.

  2. Di panel navigasi sebelah kiri, klik Cluster Configurations. Pada halaman yang muncul, klik tab Access point information.

  3. Di bilah navigasi atas, pilih wilayah tempat Anda ingin melaporkan data. Di bagian Cluster Information, aktifkan Show Token.

  4. Atur parameter Client ke OpenTelemetry.

    Di kolom Related Information pada tabel, salin titik akhirnya.ot旧版中.jpg

    Catatan

    Jika aplikasi Anda dideploy di lingkungan produksi Alibaba Cloud, gunakan titik akhir virtual private cloud (VPC). Jika tidak, gunakan titik akhir publik.

Aplikasi contoh

Topik ini menggunakan aplikasi contoh untuk menunjukkan cara melaporkan data jejak dari aplikasi Android dengan OpenTelemetry. Prosedur ini berlaku untuk aplikasi yang ditulis dalam Java maupun Kotlin.

Repositori kode contoh: opentelemetry-android-demo

Langkah 1: Buat dan konfigurasi aplikasi

  1. Buat aplikasi.

    1. Di Android Studio, buat aplikasi baru. Pilih templat Basic Views Activity, lalu klik Next.

    2. Pilih Java atau Kotlin sebagai bahasa, pilih API 24: Android 7.0 (Nougat) sebagai versi SDK minimum, lalu klik Finish.

  2. Tambahkan dependensi.

    Di file build.gradle tingkat modul atau proyek, tambahkan dependensi berikut.

    Contoh ini menggunakan versi 1.25.0 dari OpenTelemetry SDK untuk Java. Untuk versi lainnya, lihat Opentelemetry Java Releases. Untuk file build.gradle lengkap, lihat build.gradle.

    implementation platform('io.opentelemetry:opentelemetry-bom:1.25.0')
    implementation "io.opentelemetry:opentelemetry-api"
    implementation "io.opentelemetry:opentelemetry-context"
    implementation 'io.opentelemetry:opentelemetry-exporter-otlp'
    implementation 'io.opentelemetry:opentelemetry-exporter-logging'
    implementation 'io.opentelemetry:opentelemetry-extension-kotlin'
    implementation 'io.opentelemetry:opentelemetry-sdk'
    implementation 'io.opentelemetry:opentelemetry-semconv'
  3. Tambahkan konfigurasi jaringan.

    1. Di direktori app/res/xml, buat file bernama network_security_config.xml dan tambahkan konten berikut.

      <!-- Untuk konten file lengkap, lihat https://github.com/alibabacloud-observability/android-demo/blob/master/AndroidJavaDemo/app/src/main/res/xml/network_security_config.xml -->
      <?xml version="1.0" encoding="utf-8"?>
      <network-security-config>
        <domain-config cleartextTrafficPermitted="true">
          <!-- Ganti nama domain berikut dengan endpoint yang Anda peroleh di bagian Prasyarat. Jangan sertakan "http://", nomor port, atau path URL. -->
          <domain includeSubdomains="true">tracing-analysis-dc-hz.aliyuncs.com</domain>
        </domain-config>
      </network-security-config>
    2. Ubah file app/src/main/AndroidManifest.xml. Tambahkan dua baris berikut untuk memberikan izin jaringan kepada aplikasi.

      <!-- Untuk konten file lengkap, lihat https://github.com/alibabacloud-observability/android-demo/blob/master/AndroidJavaDemo/app/src/main/AndroidManifest.xml -->
      <?xml version="1.0" encoding="utf-8"?>
      <manifest ...>
        <!-- Tambahkan baris berikut untuk memberikan izin jaringan. -->
        <uses-permission android:name="android.permission.INTERNET" />
        <application
          ...
          <!-- Tambahkan baris berikut untuk mengonfigurasi pengaturan jaringan untuk domain tujuan pelaporan data. -->
          android:networkSecurityConfig="@xml/network_security_config"
          ...>
          ...
        </application>
      </manifest>

Langkah 2: Inisialisasi OpenTelemetry

  1. Buat kelas utilitas OpenTelemetry.

    Di direktori yang sama dengan MainActivity, buat file bernama OpenTelemetryUtil dan tambahkan konten berikut.

    • Opsi 1: Laporkan data jejak menggunakan gRPC

      /**
       Untuk kode lengkap, kunjungi tautan berikut:
       https://github.com/alibabacloud-observability/android-demo/blob/master/AndroidJavaDemo/app/src/main/java/com/example/androidjavademo/OpenTelemetryUtil.java
      */
      Resource otelResource = Resource.getDefault().merge(
          Resource.create(
              Attributes.of(
                  // Ganti <your-service-name> dengan nama aplikasi Anda.
              	ResourceAttributes.SERVICE_NAME, "<your-service-name>",
                  // Ganti <your-host-name> dengan nama host Anda.
              	ResourceAttributes.HOST_NAME, "<your-host-name>"
              )
          )
      );
      SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()
          .addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create())) // Opsional: Mencetak trace data ke konsol. Beri komentar pada baris ini untuk menonaktifkan fitur ini.
          // Ganti <gRPC-endpoint> dengan endpoint yang Anda peroleh di bagian Prasyarat dan ganti <gRPC-token> dengan token autentikasi Anda.
          .addSpanProcessor(BatchSpanProcessor.builder(
              OtlpGrpcSpanExporter.builder()
                   .setEndpoint("<gRPC-endpoint>") // Contoh: http://tracing-analysis-dc-hz.aliyuncs.com:8090
                   .addHeader("Authentication", "<gRPC-token>") // Contoh: xxxx@xxxx_xxxx@xxxx
                   .build()).build()
          )
          .setResource(otelResource)
          .build();
      OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
          .setTracerProvider(sdkTracerProvider)
          .setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
          .buildAndRegisterGlobal();
      // Dapatkan tracer untuk membuat span.
      tracer = openTelemetry.getTracer("android-tracer", "1.0.0");
      /**
       Untuk kode lengkap, kunjungi tautan berikut:
       https://github.com/alibabacloud-observability/android-demo/blob/master/AndroidKotlinDemo/app/src/main/java/com/example/androidkotlindemo/OpenTelemetryUtil.kt
      */
      val otelResource = Resource.getDefault().merge(
          Resource.create(
              Attributes.of(
                  ResourceAttributes.SERVICE_NAME, "<your-service-name>", // Ganti <your-service-name> dengan nama aplikasi Anda.
                  ResourceAttributes.HOST_NAME, "<your-host-name>"    // Ganti <your-host-name> dengan nama host Anda.
              )
          )
      )
      /* Laporkan trace data melalui gRPC. */
      val sdkTracerProvider = SdkTracerProvider.builder()
          .addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create())) // Opsional: Mencetak trace data ke konsol. Beri komentar pada baris ini untuk menonaktifkan fitur ini.
      	// Ganti <gRPC-endpoint> dengan endpoint yang Anda peroleh di bagian Prasyarat dan ganti <gRPC-token> dengan token autentikasi Anda.
          .addSpanProcessor(
              BatchSpanProcessor.builder(
                  OtlpGrpcSpanExporter.builder()
                      .setEndpoint("<gRPC-endpoint>") // Contoh: http://tracing-analysis-dc-hz.aliyuncs.com:8090
                      .addHeader("Authentication", "<gRPC-token>") // Contoh: xxxx@xxxx_xxxx@xxxx
                      .build()
              ).build()
          )
          .setResource(otelResource)
          .build()
      val openTelemetry: OpenTelemetry = OpenTelemetrySdk.builder()
          .setTracerProvider(sdkTracerProvider)
          .setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
          .buildAndRegisterGlobal()
      // Dapatkan tracer untuk membuat span.
      tracer = openTelemetry.getTracer("android-tracer", "1.0.0")
    • Opsi 2: Laporkan data jejak menggunakan HTTP

      /**
       Untuk kode lengkap, kunjungi tautan berikut:
       https://github.com/alibabacloud-observability/android-demo/blob/master/AndroidJavaDemo/app/src/main/java/com/example/androidjavademo/OpenTelemetryUtil.java
      */
      Resource otelResource = Resource.getDefault().merge(
          Resource.create(
              Attributes.of(
                  // Ganti <your-service-name> dengan nama aplikasi Anda.
                  ResourceAttributes.SERVICE_NAME, "<your-service-name>",
                  // Ganti <your-host-name> dengan nama host Anda.
                  ResourceAttributes.HOST_NAME, "<your-host-name>"
              )
          )
      );
      SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()
          .addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create())) // Opsional: Mencetak trace data ke konsol. Beri komentar pada baris ini untuk menonaktifkan fitur ini.
          // Ganti <HTTP-endpoint> dengan endpoint yang Anda peroleh di bagian Prasyarat.
          .addSpanProcessor(BatchSpanProcessor.builder(
              OtlpHttpSpanExporter.builder()
                   .setEndpoint("<HTTP-endpoint>") // Contoh: http://tracing-analysis-dc-hz.aliyuncs.com/adapt_xxxx@xxxx_xxxx@xxxx/api/otlp/traces
                   .build()).build()
          )
          .setResource(otelResource)
          .build();
      OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
          .setTracerProvider(sdkTracerProvider)
          .setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
          .buildAndRegisterGlobal();
      // Dapatkan tracer untuk membuat span.
      tracer = openTelemetry.getTracer("android-tracer", "1.0.0");
      /**
       Untuk kode lengkap, kunjungi tautan berikut:
       https://github.com/alibabacloud-observability/android-demo/blob/master/AndroidKotlinDemo/app/src/main/java/com/example/androidkotlindemo/OpenTelemetryUtil.kt
      */
      val otelResource = Resource.getDefault().merge(
          Resource.create(
              Attributes.of(
                  ResourceAttributes.SERVICE_NAME, "<your-service-name>", // Ganti <your-service-name> dengan nama aplikasi Anda.
                  ResourceAttributes.HOST_NAME, "<your-host-name>"    // Ganti <your-host-name> dengan nama host Anda.
              )
          )
      )
      /* Laporkan trace data melalui HTTP. */
      val sdkTracerProvider = SdkTracerProvider.builder()
          .addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create())) // Opsional: Mencetak trace data ke konsol. Beri komentar pada baris ini untuk menonaktifkan fitur ini.
      	// Ganti <HTTP-endpoint> dengan endpoint yang Anda peroleh di bagian Prasyarat.
          .addSpanProcessor(BatchSpanProcessor.builder(
              OtlpHttpSpanExporter.builder()
                  .setEndpoint("<HTTP-endpoint>") // Contoh: http://tracing-analysis-dc-hz.aliyuncs.com/adapt_xxxx@xxxx_xxxx@xxxx/api/otlp/traces
                  .build()).build()
                           )
          .setResource(otelResource)
          .build();
      val openTelemetry: OpenTelemetry = OpenTelemetrySdk.builder()
          .setTracerProvider(sdkTracerProvider)
          .setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
          .buildAndRegisterGlobal()
      // Dapatkan tracer untuk membuat span.
      tracer = openTelemetry.getTracer("android-tracer", "1.0.0")
  2. Inisialisasi OpenTelemetry saat aplikasi dimulai.

    Di metode onCreate MainActivity, panggil metode OpenTelemetryUtil.init().

    /**
     Untuk kode lengkap, kunjungi tautan berikut:
     https://github.com/alibabacloud-observability/android-demo/blob/master/AndroidJavaDemo/app/src/main/java/com/example/androidjavademo/MainActivity.java
    */
    ...
    public class MainActivity extends AppCompatActivity {
    	...
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // Tambahkan baris ini untuk menginisialisasi OpenTelemetry.
            OpenTelemetryUtil.init();
            ...
        }
        ...
    }
    /**
     Untuk kode lengkap, kunjungi tautan berikut:
     https://github.com/alibabacloud-observability/android-demo/blob/master/AndroidKotlinDemo/app/src/main/java/com/example/androidkotlindemo/MainActivity.kt
    */
    ...
    class MainActivity : AppCompatActivity() {
        ...
        override fun onCreate(savedInstanceState: Bundle?) {
            WindowCompat.setDecorFitsSystemWindows(window, false)
            super.onCreate(savedInstanceState)
            // Tambahkan baris ini untuk menginisialisasi OpenTelemetry.
            OpenTelemetryUtil.init()
                ...
        }
    }

Langkah 3: Buat span untuk melacak data

  1. Buat span.

    Di file FirstFragment, buat span bernama First Fragment Button onClick di penanganan klik tombol.

    /**
     Untuk kode lengkap, kunjungi tautan berikut:
     https://github.com/alibabacloud-observability/android-demo/blob/master/AndroidJavaDemo/app/src/main/java/com/example/androidjavademo/FirstFragment.java
    */
    public void onClick(View view) {
        // Dapatkan tracer.
        Tracer tracer = OpenTelemetryUtil.getTracer();
    	// Buat span.
        Span span = tracer.spanBuilder("First Fragment Button onClick").startSpan();
    	try (Scope scope = span.makeCurrent()) {
            // Dapatkan ID jejak (trace ID).
            System.out.println(span.getSpanContext().getTraceId());
            ...
        } finally {
            span.end();
        }
    }
    /**
     Untuk kode lengkap, kunjungi tautan berikut:
     https://github.com/alibabacloud-observability/android-demo/blob/master/AndroidKotlinDemo/app/src/main/java/com/example/androidkotlindemo/FirstFragment.kt
    */
    binding.buttonFirst.setOnClickListener {
        // Dapatkan tracer.
        val tracer: Tracer = OpenTelemetryUtil.getTracer()!!
        // Buat span.
        val span = tracer.spanBuilder("First Fragment Button onClick").startSpan()
        try {
            span.makeCurrent().use { scope ->
                // Dapatkan ID jejak (trace ID).
                println(span.spanContext.traceId)
                // Dapatkan ID span.
                println(span.spanContext.spanId)
                findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment)
            }
        } catch (t: Throwable) {
            span.setStatus(StatusCode.ERROR, "Something wrong in onClick")
            throw t
        } finally {
            span.end()
        }
    }
  2. Atur atribut dan event untuk span.

    /**
     Untuk kode lengkap, kunjungi tautan berikut:
     https://github.com/alibabacloud-observability/android-demo/blob/master/AndroidJavaDemo/app/src/main/java/com/example/androidjavademo/FirstFragment.java
    */
    // Atur atribut.
    span.setAttribute("key", "value");
    Attributes eventAttributes = Attributes.of(
        AttributeKey.stringKey("key"), "value",
        AttributeKey.longKey("result"), 0L);
    // Tambahkan event.
    span.addEvent("onClick", eventAttributes);
    /**
     Untuk kode lengkap, kunjungi tautan berikut:
     https://github.com/alibabacloud-observability/android-demo/blob/master/AndroidKotlinDemo/app/src/main/java/com/example/androidkotlindemo/FirstFragment.kt
    */
    // Atur atribut.
    span.setAttribute("key", "value")
    val eventAttributes =
        Attributes.of(
            AttributeKey.stringKey("key"), "value",
            AttributeKey.longKey("result"), 0L
        )
    // Tambahkan event.
    span.addEvent("onClick", eventAttributes)
  3. Atur status untuk span.

    /**
     Untuk kode lengkap, kunjungi tautan berikut:
     https://github.com/alibabacloud-observability/android-demo/blob/master/AndroidJavaDemo/app/src/main/java/com/example/androidjavademo/FirstFragment.java
    */
    ...
    try (Scope scope = span.makeCurrent()) {
        ...
    } catch (Throwable t) {
        // Atur status span.
        span.setStatus(StatusCode.ERROR, "Something wrong in onClick");
        throw t;
    } finally {
        span.end(); 
    }
    /**
     Untuk kode lengkap, kunjungi tautan berikut:
     https://github.com/alibabacloud-observability/android-demo/blob/master/AndroidKotlinDemo/app/src/main/java/com/example/androidkotlindemo/FirstFragment.kt
    */
    ...
    try {
        ...
    } catch (t: Throwable) {
        // Atur status span.
        span.setStatus(StatusCode.ERROR, "Something wrong in onClick")
        throw t
    } finally {
        span.end()
    }
  4. Buat span bersarang.

    /**
     Untuk kode lengkap, kunjungi tautan berikut:
     https://github.com/alibabacloud-observability/android-demo/blob/master/AndroidJavaDemo/app/src/main/java/com/example/androidjavademo/FirstFragment.java
    */
    public void parentSpan() {
        // Dapatkan tracer.
        Tracer tracer = OpenTelemetryUtil.getTracer();
        // Buat span.
        Span span = tracer.spanBuilder("Parent Span").startSpan();
        try (Scope scope = span.makeCurrent()) {
            // Dapatkan ID jejak (trace ID).
            System.out.println(span.getSpanContext().getTraceId());
            // Dapatkan ID span.
            System.out.println(span.getSpanContext().getSpanId());
            childSpan();
        } finally {
            span.end();
        }
    }
    public void childSpan() {
        // Dapatkan tracer.
        Tracer tracer = OpenTelemetryUtil.getTracer();
        // Buat span.
        Span span = tracer.spanBuilder("Child Span").startSpan();
        try (Scope scope = span.makeCurrent()) {
            // Dapatkan ID jejak (trace ID).
            System.out.println(span.getSpanContext().getTraceId());
            // Dapatkan ID span.
            System.out.println(span.getSpanContext().getSpanId());
        } finally {
            span.end();
        }
    }
    /**
     Untuk kode lengkap, kunjungi tautan berikut:
     https://github.com/alibabacloud-observability/android-demo/blob/master/AndroidKotlinDemo/app/src/main/java/com/example/androidkotlindemo/FirstFragment.kt
    */
    // Span bersarang
    fun parentSpan() {
        // Dapatkan tracer.
        val tracer: Tracer = OpenTelemetryUtil.getTracer()!!
        // Buat span.
        val span = tracer.spanBuilder("Parent Span").startSpan()
        try {
            span.makeCurrent().use { scope ->
                // Dapatkan ID jejak (trace ID).
                println(span.spanContext.traceId)
                // Dapatkan ID span.
                println(span.spanContext.spanId)
                childSpan()
            }
        } finally {
            span.end()
        }
    }
    // Span bersarang
    fun childSpan() {
        // Dapatkan tracer.
        val tracer: Tracer = OpenTelemetryUtil.getTracer()!!
        // Buat span.
        val span = tracer.spanBuilder("Child Span").startSpan()
        try {
            span.makeCurrent().use { scope ->
                // Dapatkan ID jejak (trace ID).
                println(span.spanContext.traceId)
                // Dapatkan ID span.
                println(span.spanContext.spanId)
            }
        } finally {
            span.end()
        }
    }

Langkah 4: Jalankan proyek dan lihat data jejak

  1. Jalankan proyek dan ketuk tombol di halaman aplikasi demo. Di panel Running Devices Android Studio, emulator (misalnya, Pixel 3a API 33) berhasil menjalankan aplikasi AndroidJavaDemo dan menampilkan halaman First Fragment default.

    Periksa Logcat untuk melihat informasi span yang diekspor oleh LoggingSpanExporter.

    System.out  I  0c8b92db3d8b038ea3eedd0ec25a4abb
    System.out  I  9ecd666297f5d8f6
    System.out  I  0c8b92db3d8b038ea3eedd0ec25a4abb
    System.out  I  7e7eaffe7bd23cb8
    System.out  I  0c8b92db3d8b038ea3eedd0ec25a4abb
    System.out  I  98ef17d962ecf4d1
    LoggingSpanExporter  I  'Child Span' : 0c8b92db3d8b038ea3eedd0ec25a4abb 98ef17d962ecf4d1 INTERNAL [tracer: android-tracer:1.0.0]
    LoggingSpanExporter  I  'Parent Span' : 0c8b92db3d8b038ea3eedd0ec25a4abb 7e7eaffe7bd23cb8 INTERNAL [tracer: android-tracer:1.0.0]
    LoggingSpanExporter  I  'First Fragment Button onClick' : 0c8b92db3d8b038ea3eedd0ec25a4abb 9ecd666297f5d8f6 INTERNAL [tracer: android-tracer:1.0.0]
    EGL_emulation  D  app_time_stats: avg=460.19ms min=2.23ms max=3653.05ms count=8
  2. Di halaman , klik nama aplikasi di bagian Applications. Di halaman yang muncul, lihat data jejaknya. Konsol Managed Service for OpenTelemetry

    Halaman detail jejak menampilkan metrik ringkasan (seperti durasi, jumlah aplikasi, kedalaman jejak, dan jumlah total span) serta daftar span. Contoh ini mencakup hierarki span tiga tingkat: span root First Fragment Button onClick (durasi: 6,835 ms), span anak Parent Span (durasi: 2,998 ms), dan span cucu Child Span (durasi: 0,14 ms). Nama aplikasi untuk semua span adalah otel-android-demo. Ini menunjukkan rincian waktu dan hubungan induk-anak.

Langkah 5: Hubungkan jejak client dan server

  1. Ubah format propagasi konteks jejak di header.

    • Protokol berbeda menggunakan header HTTP berbeda untuk meneruskan konteks jejak ke layanan downstream. Misalnya, OpenTelemetry menggunakan format W3C Trace Context secara default tetapi juga mendukung format lainnya. Zipkin menggunakan format B3 atau B3 Multi. Untuk informasi lebih lanjut tentang format propagasi konteks, lihat Tentukan format propagasi konteks untuk OpenTelemetry.

    • Untuk menghubungkan jejak client dan server, konfigurasikan textPropagators di client agar sesuai dengan protokol yang digunakan server:

      • Jika server menggunakan format W3C Trace Context default OpenTelemetry, Anda tidak perlu mengonfigurasi textPropagators di client.

      • Jika server menggunakan format B3 atau B3 Multi Zipkin, Anda harus mengatur textPropagators di client ke B3Propagator.

        // Atur format propagasi konteks B3.
        OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
                .setTracerProvider(sdkTracerProvider)
                .setPropagators(ContextPropagators.create(TextMapPropagator.composite(
                        B3Propagator.injectingMultiHeaders(),
                        B3Propagator.injectingSingleHeader())))
                .buildAndRegisterGlobal();
      • Jika server menggunakan protokol Jaeger, Anda harus mengatur textPropagators di client ke JaegerPropagator.

        // Atur format propagasi konteks Jaeger.
        OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
                .setTracerProvider(sdkTracerProvider)
                .setPropagators(ContextPropagators.create(TextMapPropagator.composite(
                        JaegerPropagator.getInstance())))
                .buildAndRegisterGlobal();
      • Anda juga dapat mengatur beberapa format propagasi konteks jejak.

        // Gunakan W3C Trace Context, B3, dan Jaeger sebagai format propagasi konteks jejak.
        OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
                .setTracerProvider(sdkTracerProvider)
                .setPropagators(ContextPropagators.create(TextMapPropagator.composite(
                        W3CTraceContextPropagator.getInstance(),
                        B3Propagator.injectingMultiHeaders(),
                        B3Propagator.injectingSingleHeader(),
                        JaegerPropagator.getInstance())))
                .buildAndRegisterGlobal();
  2. Impor okhttp3 dan opentelemetry-okhttp.

    Plugin opentelemetry-okhttp-3.0 untuk OkHttp secara otomatis melakukan instrumentasi aplikasi Anda dengan mencegat semua permintaan jaringan yang dikirim melalui OkHttp3 dan membuat jejak.

    • Tambahkan dua dependensi berikut ke file build.gradle.

      dependencies {
          ...
          implementation 'io.opentelemetry.instrumentation:opentelemetry-okhttp-3.0:2.3.0-alpha'
          implementation 'com.squareup.okhttp3:okhttp:4.12.0'
      }
    • Buat OkHttpConfiguration.

      import io.opentelemetry.api.OpenTelemetry;
      import io.opentelemetry.instrumentation.okhttp.v3_0.OkHttpTelemetry;
      import okhttp3.Call;
      import okhttp3.OkHttpClient;
      public class OkHttpConfiguration {
          //Gunakan implementasi Call.Factory ini untuk membuat panggilan client http standar.
          public Call.Factory createTracedClient(OpenTelemetry openTelemetry) {
              return OkHttpTelemetry.builder(openTelemetry).build().newCallFactory(createClient());
          }
          //konfigurasi OkHttpClient Anda ada di sini:
          private OkHttpClient createClient() {
              return new OkHttpClient.Builder().build();
          }
      }
  3. Gunakan OkHttp3 untuk mengirim permintaan jaringan ke server.

    private void callHttpService() throws IOException {
        Tracer tracer = OpenTelemetryUtil.getTracer();
        // Buat span.
        Span span = tracer.spanBuilder("AsyncRequestZipkinServer").startSpan();
        System.out.println("AsyncRequestZipkinServer TraceID: " + span.getSpanContext().getTraceId());
        System.out.println("AsyncRequestZipkinServer SpanID: " + span.getSpanContext().getSpanId());
        try (Scope scope = span.makeCurrent()) {
            // Kirim permintaan jaringan, misalnya dengan menggunakan OkHttp.
            OkHttpConfiguration configuration = new OkHttpConfiguration();
            Call.Factory tracedClient = configuration.createTracedClient(GlobalOpenTelemetry.get());
            Request request = new Request.Builder().url("${ServerAddress}").get().build();
            Call call = tracedClient.newCall(request);
            try (Response response = call.execute()) {
                // Proses respons.
                String responseBody = response.body().string();
                System.out.println(responseBody);
            } catch (IOException e) {
                // Tangani error.
                e.printStackTrace();
            }
        }  finally {
            span.end();
        }
    }

    Klik untuk melihat kode lengkap pemanggilan asinkron metode callHttpService.

    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Looper;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import androidx.annotation.NonNull;
    import androidx.fragment.app.Fragment;
    import androidx.navigation.fragment.NavHostFragment;
    import com.example.androidjavademo.databinding.FragmentFirstBinding;
    import java.io.IOException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import io.opentelemetry.api.GlobalOpenTelemetry;
    import io.opentelemetry.api.common.AttributeKey;
    import io.opentelemetry.api.common.Attributes;
    import io.opentelemetry.api.trace.Span;
    import io.opentelemetry.api.trace.StatusCode;
    import io.opentelemetry.api.trace.Tracer;
    import io.opentelemetry.context.Scope;
    import okhttp3.Call;
    import okhttp3.Request;
    import okhttp3.Response;
    public class FirstFragment extends Fragment {
        private FragmentFirstBinding binding;
        @Override
        public View onCreateView(
                LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState
        ) {
            binding = FragmentFirstBinding.inflate(inflater, container, false);
            return binding.getRoot();
        }
        public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
            binding.buttonFirst.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    // Dapatkan tracer.
                    Tracer tracer = OpenTelemetryUtil.getTracer();
                    // Buat span.
                    Span span = tracer.spanBuilder("First Fragment Button onClick").startSpan();
                    try (Scope scope = span.makeCurrent()) {
                        // Dapatkan ID jejak (trace ID).
                        System.out.println(span.getSpanContext().getTraceId());
                        // Dapatkan ID span.
                        System.out.println(span.getSpanContext().getSpanId());
                        // Atur atribut.
                        span.setAttribute("key", "value");
                        Attributes eventAttributes = Attributes.of(
                                AttributeKey.stringKey("key"), "value",
                                AttributeKey.longKey("result"), 0L);
                        // Tambahkan event.
                        span.addEvent("onClick", eventAttributes);
                        parentSpan();
                        NavHostFragment.findNavController(FirstFragment.this)
                                .navigate(R.id.action_FirstFragment_to_SecondFragment);
                    } catch (Throwable t) {
                        span.setStatus(StatusCode.ERROR, "Something wrong in onClick");
                        throw t;
                    } finally {
                        span.end();
                    }
                }
            });
        }
        @Override
        public void onDestroyView() {
            super.onDestroyView();
            binding = null;
        }
        public void parentSpan() {
            ExecutorService executorService = Executors.newSingleThreadExecutor();
            Handler handler = new Handler(Looper.getMainLooper());
            // Dapatkan tracer.
            Tracer tracer = OpenTelemetryUtil.getTracer();
            // Buat span.
            Span span = tracer.spanBuilder("Parent Span").startSpan();
            try (Scope scope = span.makeCurrent()) {
                // Dapatkan ID jejak (trace ID).
                System.out.println(span.getSpanContext().getTraceId());
                // Dapatkan ID span.
                System.out.println(span.getSpanContext().getSpanId());
                executorService.execute(new Runnable() {
                    @Override
                    public void run() {
                        // Kirim permintaan jaringan.
                        try {
                            callHttpService();
                        } catch (IOException e) {
                            throw new RuntimeException(e);
                        }
                        // Setelah eksekusi selesai, beralih ke thread utama menggunakan handler untuk memproses hasil.
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                // Perbarui UI atau lakukan tugas lainnya.
                                childSpan();
                            }
                        });
                    }
                });
                executorService.shutdown();
            } finally {
                span.end();
            }
        }
        public void childSpan() {
            // Dapatkan tracer.
            Tracer tracer = OpenTelemetryUtil.getTracer();
            // Buat span.
            Span span = tracer.spanBuilder("Child Span").startSpan();
            try (Scope scope = span.makeCurrent()) {
                // Dapatkan ID jejak (trace ID).
                System.out.println(span.getSpanContext().getTraceId());
                // Dapatkan ID span.
                System.out.println(span.getSpanContext().getSpanId());
            } finally {
                span.end();
            }
        }
        private void callHttpService() throws IOException {
            Tracer tracer = OpenTelemetryUtil.getTracer();
            // Buat span.
            Span span = tracer.spanBuilder("AsyncRequestZipkinServer").startSpan();
            System.out.println("AsyncRequestZipkinServer TraceID: " + span.getSpanContext().getTraceId());
            System.out.println("AsyncRequestZipkinServer SpanID: " + span.getSpanContext().getSpanId());
            try (Scope scope = span.makeCurrent()) {
                // Kirim permintaan jaringan, misalnya dengan menggunakan OkHttp.
                OkHttpConfiguration configuration = new OkHttpConfiguration();
                Call.Factory tracedClient = configuration.createTracedClient(GlobalOpenTelemetry.get());
                Request request = new Request.Builder().url("${ServerAddress}").get().build();
                Call call = tracedClient.newCall(request);
                try (Response response = call.execute()) {
                    // Proses respons.
                    String responseBody = response.body().string();
                    System.out.println(responseBody);
                } catch (IOException e) {
                    // Tangani error.
                    e.printStackTrace();
                }
            }  finally {
                span.end();
            }
        }
    }
  4. Di halaman Trace Explorer, lihat jejak end-to-end antara client dan server.

    AsyncRequestZipkinServer adalah aplikasi Android dan zipkin-demo-server adalah aplikasi sisi server.