全部产品
Search
文档中心

Application Real-Time Monitoring Service:Gunakan OpenTelemetry untuk melaporkan data jejak aplikasi Android

更新时间:Jun 27, 2025

Setelah Anda menggunakan OpenTelemetry untuk menginstrumentasi aplikasi dan melaporkan data jejak ke Managed Service for OpenTelemetry, Managed Service for OpenTelemetry mulai memantau aplikasi. Anda dapat melihat data pemantauan aplikasi seperti topologi aplikasi, jejak, transaksi abnormal, transaksi lambat, dan analisis SQL. Topik ini menjelaskan cara menginstrumentasi aplikasi Android dan melaporkan data jejak aplikasi Android menggunakan OpenTelemetry.

Sebelum memulai

Untuk mendapatkan titik akhir Managed Service for OpenTelemetry, ikuti langkah-langkah berikut:

  1. Masuk ke Konsol Managed Service for OpenTelemetry.

  2. Di bilah navigasi sisi kiri, klik Cluster Configurations. Di halaman yang muncul, klik tab Access point information.

  3. Di bilah navigasi atas, pilih wilayah. Di bagian Cluster Information, aktifkan Show Token.

  4. Atur parameter Client ke OpenTelemetry.

    Dapatkan titik akhir Managed Service for OpenTelemetry di kolom Related Information tabel di bagian bawah.OT接入点信息

    Catatan

    Jika aplikasi Anda diterapkan di lingkungan produksi Alibaba Cloud, gunakan titik akhir Virtual Private Cloud (VPC). Jika tidak, gunakan titik akhir publik.

Kode contoh

Dalam contoh ini, OpenTelemetry digunakan untuk melaporkan data jejak aplikasi Android. Metode yang digunakan dalam contoh ini juga berlaku untuk aplikasi yang ditulis dalam Java atau Kotlin.

Anda dapat mengunduh kode contoh dari opentelemetry-android-demo.

Langkah 1: Buat dan konfigurasikan aplikasi

  1. Buat aplikasi.

    1. Buat aplikasi di Android Studio. Pilih Tampilan Dasar Aktivitas dan klik Berikutnya.image..png

    2. Pilih Java atau Kotlin sebagai Bahasa, pilih API 24: Android 7.0 (Nougat) sebagai SDK Minimum, lalu klik Selesai.

  2. Tambahkan dependensi.

    Tambahkan dependensi berikut ke file build.gradle modul atau proyek.

    Dalam contoh ini, versi OpenTelemetry SDK untuk Java adalah 1.25.0. Untuk informasi tentang versi SDK, lihat Rilis opentelemetry-java. Untuk informasi tentang kode contoh 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. Konfigurasikan pengaturan jaringan.

    1. Buat file bernama network_security_config.xml di direktori app/res/xml dan tambahkan konten berikut ke file tersebut:

      <!-- Untuk melihat konten lengkap file, kunjungi 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 dengan titik akhir yang telah Anda peroleh sesuai instruksi di bagian "Sebelum memulai" topik ini. Titik akhir tidak boleh berisi http://, nomor port, atau jalur URL. -->
          <domain includeSubdomains="true">tracing-analysis-dc-hz.aliyuncs.com</domain>
        </domain-config>
      </network-security-config>
    2. Tambahkan konten berikut ke file app/src/main/AndroidManifest.xml untuk mengizinkan aplikasi mengakses jaringan:

      <!-- Untuk melihat konten lengkap file, kunjungi 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 akses jaringan. -->
        <uses-permission android:name="android.permission.INTERNET" />
      
        <application
          ...
          <!-- Tambahkan baris berikut untuk mengonfigurasi jaringan untuk nama domain tempat Anda ingin melaporkan data. -->
          android:networkSecurityConfig="@xml/network_security_config"
          ...>
      
          ...
        </application>
      
      </manifest>

Langkah 2: Inisialisasi OpenTelemetry

  1. Buat kelas utilitas OpenTelemetry.

    Buat file OpenTelemetryUtil di direktori tempat file MainActivity berada dan tambahkan konten berikut ke file OpenTelemetryUtil.

    • Metode 1: Laporkan data jejak melalui gRPC

      /**
       Kunjungi tautan berikut untuk melihat kode lengkap:
       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. Tampilkan data jejak di log atau baris perintah. Komentari baris ini jika Anda tidak membutuhkannya. 
          // Ganti <gRPC-endpoint> dengan titik akhir yang telah Anda peroleh sesuai instruksi di bagian "Sebelum memulai" topik ini, dan ganti <gRPC-token> dengan token otentikasi. 
          .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 yang digunakan untuk membuat rentang. 
      tracer = openTelemetry.getTracer("android-tracer", "1.0.0");
      /**
       Kunjungi tautan berikut untuk melihat kode lengkap:
       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 data jejak melalui gRPC. */
      val sdkTracerProvider = SdkTracerProvider.builder()
          .addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create())) // Opsional. Tampilkan data jejak di log atau baris perintah. Komentari baris ini jika Anda tidak membutuhkannya. 
      	// Ganti <gRPC-endpoint> dengan titik akhir yang telah Anda peroleh sesuai instruksi di bagian "Sebelum memulai" topik ini, dan ganti <gRPC-token> dengan token otentikasi. 
          .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 yang digunakan untuk membuat rentang. 
      tracer = openTelemetry.getTracer("android-tracer", "1.0.0")
    • Metode 2: Laporkan data jejak melalui HTTP

      /**
       Kunjungi tautan berikut untuk melihat kode lengkap:
       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. Tampilkan data jejak di log atau baris perintah. Komentari baris ini jika Anda tidak membutuhkannya.
          // Ganti <HTTP-endpoint> dengan titik akhir yang telah Anda peroleh sesuai instruksi di bagian "Sebelum memulai" topik ini. 
          .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 yang digunakan untuk membuat rentang. 
      tracer = openTelemetry.getTracer("android-tracer", "1.0.0");
      /**
       Kunjungi tautan berikut untuk melihat kode lengkap:
       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 data jejak melalui HTTP. */
      val sdkTracerProvider = SdkTracerProvider.builder()
          .addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create())) // Opsional. Tampilkan data jejak di log atau baris perintah. Komentari baris ini jika Anda tidak membutuhkannya. 
      	// Ganti <HTTP-endpoint> dengan titik akhir yang telah Anda peroleh sesuai instruksi di bagian "Sebelum memulai" topik ini. 
          .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 yang digunakan untuk membuat rentang. 
      tracer = openTelemetry.getTracer("android-tracer", "1.0.0")
  2. Inisialisasi OpenTelemetry selama inisialisasi aplikasi.

    Panggil metode OpenTelemetryUtil.init() di metode onCreate kelas MainActivity.

    /**
     Kunjungi tautan berikut untuk melihat kode lengkap:
     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 berikut untuk menginisialisasi OpenTelemetry. 
            OpenTelemetryUtil.init();
            ...
        }
        ...
    }
    /**
     Kunjungi tautan berikut untuk melihat kode lengkap:
     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 berikut untuk menginisialisasi OpenTelemetry. 
            OpenTelemetryUtil.init()
    
                ...
        }
    }

Langkah 3: Buat rentang untuk melacak data jejak

  1. Buat rentang.

    Di metode pemantauan acara ketuk tombol di file FirstFragment, buat rentang bernama First Fragment Button onClick.

    /**
     Kunjungi tautan berikut untuk melihat kode lengkap:
     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 rentang.
        Span span = tracer.spanBuilder("First Fragment Button onClick").startSpan();
    	try (Scope scope = span.makeCurrent()) {
            // Dapatkan ID jejak.
            System.out.println(span.getSpanContext().getTraceId());
            ...
        } finally {
            span.end();
        }
    }
    /**
     Kunjungi tautan berikut untuk melihat kode lengkap:
     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 rentang.
        val span = tracer.spanBuilder("First Fragment Button onClick").startSpan()
        try {
            span.makeCurrent().use { scope ->
                // Dapatkan ID jejak.
                println(span.spanContext.traceId)
                // Dapatkan ID rentang.
                println(span.spanContext.spanId)
                
                findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment)
            }
        } catch (t: Throwable) {
            span.setStatus(StatusCode.ERROR, "Ada yang salah di onClick")
            throw t
        } finally {
            span.end()
        }
    }
  2. Konfigurasikan atribut dan acara untuk rentang.

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

    /**
     Kunjungi tautan berikut untuk melihat kode lengkap:
     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) {
        // Konfigurasikan status rentang.
        span.setStatus(StatusCode.ERROR, "Ada yang salah di onClick");
        throw t;
    } finally {
        span.end(); 
    }
    /**
     Kunjungi tautan berikut untuk melihat kode lengkap:
     https://github.com/alibabacloud-observability/android-demo/blob/master/AndroidKotlinDemo/app/src/main/java/com/example/androidkotlindemo/FirstFragment.kt
    */
    
    ...
    try {
        ...
    } catch (t: Throwable) {
        // Konfigurasikan status rentang.
        span.setStatus(StatusCode.ERROR, "Ada yang salah di onClick")
        throw t
    } finally {
        span.end()
    }
  4. Buat rentang bersarang.

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

Langkah 4: Jalankan proyek untuk melihat data jejak yang dilaporkan

  1. Jalankan proyek dan simulasi ketuk tombol pada halaman aplikasi.image..png

    Anda dapat melihat log di Logcat, termasuk informasi rentang yang diekspor menggunakan LoggingSpanExporter.

    image..png

  2. Masuk ke Konsol ARMS. Di bilah navigasi sisi kiri, pilih Application Monitoring > Applications. Di halaman Applications, klik nama aplikasi. Di halaman yang muncul, lihat data jejak.

    Catatan

    Jika ikon image ditampilkan di kolom Language, aplikasi terhubung ke Pemantauan Aplikasi. Jika tanda hubung (-) ditampilkan, aplikasi terhubung ke Managed Service for OpenTelemetry.

    image..png

Langkah 5: Hubungkan aplikasi klien dan aplikasi server

  1. Ubah format untuk melewati data jejak di header permintaan HTTP.

    • Protokol yang berbeda menggunakan header permintaan HTTP yang berbeda untuk melewati konteks jejak. Misalnya, OpenTelemtry secara default menggunakan format W3C Trace Context dan mendukung format lainnya, dan Zipkin menggunakan format B3 atau B3 Multi. Untuk informasi lebih lanjut, lihat Tentukan format untuk melewati data jejak.

    • Atur format untuk melewati data jejak untuk aplikasi klien berdasarkan protokol yang digunakan oleh aplikasi server. Dengan cara ini, aplikasi klien Android dan aplikasi server dapat dihubungkan.

      • Jika aplikasi server menggunakan format W3C Trace Context dari OpenTelemetry, Anda tidak perlu menentukan parameter textPropagators untuk aplikasi klien.

      • Jika aplikasi server menggunakan format B3 atau B3 Multi dari Zipkin, atur parameter textPropagators ke B3Propagator untuk aplikasi klien.

        // Tentukan format B3 untuk melewati data jejak. 
        OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
                .setTracerProvider(sdkTracerProvider)
                .setPropagators(ContextPropagators.create(TextMapPropagator.composite(
                        B3Propagator.injectingMultiHeaders(),
                        B3Propagator.injectingSingleHeader())))
                .buildAndRegisterGlobal();
      • Jika aplikasi server menggunakan protokol Jaeger, Anda harus mengatur parameter textPropagators ke JaegerPropagator untuk aplikasi klien.

        // Tentukan format Jaeger untuk melewati data jejak. 
        OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
                .setTracerProvider(sdkTracerProvider)
                .setPropagators(ContextPropagators.create(TextMapPropagator.composite(
                        JaegerPropagator.getInstance())))
                .buildAndRegisterGlobal();
      • Anda juga dapat menentukan beberapa format untuk melewati data jejak.

        // Tentukan format W3C Trace Context, B3, dan Jaeger untuk melewati data jejak. 
        // Tentukan format Jaeger untuk melewati data 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.

    opentelemetry-okhttp-3.0 adalah plugin instrumentasi otomatis yang disediakan oleh OpenTelemetry untuk framework OkHttp. Ini secara otomatis mencegat semua permintaan jaringan yang dikirim menggunakan framework OkHttp3 dan membuat jejak.

    • Tambahkan 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 konfigurasi 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 melakukan panggilan HTTP standar.
          public Call.Factory createTracedClient(OpenTelemetry openTelemetry) {
              return OkHttpTelemetry.builder(openTelemetry).build().newCallFactory(createClient());
          }
      
          // Konfigurasi OkHttpClient Anda di sini:
          private OkHttpClient createClient() {
              return new OkHttpClient.Builder().build();
          }
      }
  3. Gunakan OkHttp3 untuk mengirim permintaan jaringan guna mengakses aplikasi server.

    private void callHttpService() throws IOException {
        Tracer tracer = OpenTelemetryUtil.getTracer();
        // Buat rentang.
        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()) {
            // Gunakan OkHttp untuk menjalankan permintaan jaringan.
            OkHttpConfiguration configuration = new OkHttpConfiguration();
            Call.Factory tracedClient = configuration.createTracedClient(GlobalOpenTelemetry.get());
    
            Request request = new Request.Builder().url("${Alamat Server}").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 kesalahan.
                e.printStackTrace();
            }
        }  finally {
            span.end();
        }
    }

    Lihat kode lengkap untuk memanggil metode callHttpService secara asinkron dalam event onClick

    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 rentang.
                    Span span = tracer.spanBuilder("First Fragment Button onClick").startSpan();
                    try (Scope scope = span.makeCurrent()) {
                        // Dapatkan ID jejak.
                        System.out.println(span.getSpanContext().getTraceId());
                        // Dapatkan ID rentang.
                        System.out.println(span.getSpanContext().getSpanId());
                        // Konfigurasikan atribut.
                        span.setAttribute("key", "value");
    
                        Attributes eventAttributes = Attributes.of(
                                AttributeKey.stringKey("key"), "value",
                                AttributeKey.longKey("result"), 0L);
    
                        // Tambahkan acara.
                        span.addEvent("onClick", eventAttributes);
    
                        parentSpan();
    
                        NavHostFragment.findNavController(FirstFragment.this)
                                .navigate(R.id.action_FirstFragment_to_SecondFragment);
                    } catch (Throwable t) {
                        span.setStatus(StatusCode.ERROR, "Ada yang salah di 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 rentang.
            Span span = tracer.spanBuilder("Parent Span").startSpan();
            try (Scope scope = span.makeCurrent()) {
                // Dapatkan ID jejak.
                System.out.println(span.getSpanContext().getTraceId());
                // Dapatkan ID rentang.
                System.out.println(span.getSpanContext().getSpanId());
                executorService.execute(new Runnable() {
                    @Override
                    public void run() {
                        // Jalankan permintaan jaringan.
                        try {
                            callHttpService();
                        } catch (IOException e) {
                            throw new RuntimeException(e);
                        }
                        // Setelah eksekusi selesai, gunakan handler untuk beralih kembali ke thread utama untuk memproses hasilnya.
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                // Perbarui antarmuka pengguna (UI) dan lakukan operasi lainnya.
                                childSpan();
                            }
                        });
                    }
                });
    
                executorService.shutdown();
            } finally {
                span.end();
            }
        }
    
        public void childSpan() {
            // Dapatkan tracer.
            Tracer tracer = OpenTelemetryUtil.getTracer();
            // Buat rentang.
            Span span = tracer.spanBuilder("Child Span").startSpan();
            try (Scope scope = span.makeCurrent()) {
                // Dapatkan ID jejak.
                System.out.println(span.getSpanContext().getTraceId());
                // Dapatkan ID rentang.
                System.out.println(span.getSpanContext().getSpanId());
            } finally {
                span.end();
            }
        }
    
        private void callHttpService() throws IOException {
            Tracer tracer = OpenTelemetryUtil.getTracer();
            // Buat rentang.
            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()) {
                // Gunakan OkHttp untuk menjalankan permintaan jaringan.
                OkHttpConfiguration configuration = new OkHttpConfiguration();
                Call.Factory tracedClient = configuration.createTracedClient(GlobalOpenTelemetry.get());
    
                Request request = new Request.Builder().url("${Alamat Server}").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 kesalahan.
                    e.printStackTrace();
                }
            }  finally {
                span.end();
            }
        }
    
    }
  4. Lihat jejak antara aplikasi klien dan aplikasi server di halaman Penjelajah Jejak.

    Gambar berikut menunjukkan contoh. Dalam contoh ini, AsyncRequestZipkinServer adalah aplikasi Android dan zipkin-demo-server adalah aplikasi server.

    image