Contoh instrumentasi Java

Anda dapat melengkapi aplikasi Java untuk mengumpulkan data trace dan metrik dengan SDK OpenTelemetry dan kolektor OpenTelemetry, serta untuk menulis log JSON terstruktur yang berkorelasi ke output standar. Untuk bereksperimen dengan instrumentasi ini, Anda dapat mendownload dan menjalankan aplikasi Spring Boot contoh, yang menghasilkan data log, metrik, dan trace, serta mengekspornya ke projectGoogle Cloud Anda.

Tentang pendekatan instrumentasi

Saat menggunakan kolektor OpenTelemetry, Anda menginstrumentasi aplikasi dengan SDK dan pengekspor dalam proses OTLP SDK. Instrumentasi ini bersifat netral terhadap vendor. Anda juga men-deploy kolektor OpenTelemetry yang menerima telemetri dari pengekspor dalam proses, lalu mengekspor telemetri tersebut ke project Google Cloud Anda. Untuk mempelajari lebih lanjut kolektor, lihat Kolektor OpenTelemetry Buatan Google.

Sebaiknya gunakan kolektor OpenTelemetry untuk mengekspor data telemetri Anda jika lingkungan Anda mendukung penggunaan kolektor. Untuk beberapa lingkungan, Anda harus menggunakan pengekspor dalam proses yang langsung mengirim data ke projectGoogle Cloud Anda. Untuk mempelajari instrumentasi dalam proses, lihat Bermigrasi dari pengekspor Trace ke endpoint OTLP.

Untuk mempelajari instrumentasi lebih lanjut, lihat dokumen berikut:

Tentang instrumentasi manual dan tanpa kode

Instrumentasi yang dijelaskan dalam dokumen ini mengandalkan instrumentasi tanpa kode OpenTelemetry untuk mengirim telemetri ke project Google Cloud Anda. Untuk Java, instrumentasi tanpa kode mengacu pada praktik memasukkan bytecode secara dinamis ke dalam library dan framework untuk menangkap telemetri. Instrumentasi tanpa kode dapat mengumpulkan telemetri untuk hal-hal seperti panggilan HTTP masuk dan keluar. Untuk mengetahui informasi selengkapnya, lihat Agen Java.

OpenTelemetry juga menyediakan API untuk menambahkan instrumentasi kustom ke kode Anda sendiri. OpenTelemetry menyebutnya sebagai instrumentasi manual. Dokumen ini tidak menjelaskan instrumentasi manual. Untuk contoh dan informasi tentang topik tersebut, lihat Instrumentasi manual.

Sebelum memulai

  1. Instal Google Cloud CLI.

  2. Konfigurasi gcloud CLI agar menggunakan identitas gabungan Anda.

    Untuk mengetahui informasi selengkapnya, lihat Login ke gcloud CLI dengan identitas gabungan Anda.

  3. Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:

    gcloud init
  4. Buat atau pilih project Google Cloud .

    Peran yang diperlukan untuk memilih atau membuat project

    • Memilih project: Memilih project tidak memerlukan peran IAM tertentu—Anda dapat memilih project apa pun yang perannya telah diberikan kepada Anda.
    • Membuat project: Untuk membuat project, Anda memerlukan peran Project Creator (roles/resourcemanager.projectCreator), yang berisi izin resourcemanager.projects.create. Pelajari cara memberikan peran.
    • Buat project Google Cloud :

      gcloud projects create PROJECT_ID

      Ganti PROJECT_ID dengan nama untuk Google Cloud project yang Anda buat.

    • Pilih project Google Cloud yang Anda buat:

      gcloud config set project PROJECT_ID

      Ganti PROJECT_ID dengan nama project Google Cloud Anda.

  5. Pastikan penagihan diaktifkan untuk project Google Cloud Anda.

  6. Aktifkan Cloud Logging, Cloud Monitoring, Cloud Trace, dan Telemetry API, jika belum diaktifkan:

    Peran yang diperlukan untuk mengaktifkan API

    Untuk mengaktifkan API, Anda memerlukan izin serviceusage.services.enable. Jika Anda membuat project, kemungkinan Anda sudah memiliki izin ini melalui peran Pemilik (roles/owner). Jika tidak, Anda bisa mendapatkan izin ini melalui peran Service Usage Admin (roles/serviceusage.serviceUsageAdmin). Pelajari cara memberikan peran.

    gcloud services enable logging.googleapis.com monitoring.googleapis.com cloudtrace.googleapis.com telemetry.googleapis.com
  7. Untuk mendapatkan izin yang Anda perlukan agar aplikasi contoh dapat menulis data log, metrik, dan trace, minta administrator untuk memberi Anda peran IAM berikut:

    Izin ini sudah cukup jika Anda menjalankan contoh di Cloud Shell, di resource Google Cloud , atau di lingkungan pengembangan lokal. Untuk mempelajari cara mengonfigurasi project kuota, lihat Menetapkan project kuota.

    Untuk mendapatkan izin yang Anda perlukan untuk melihat data log, metrik, dan trace, minta administrator untuk memberi Anda peran IAM berikut pada project Anda:

    Untuk mengetahui informasi selengkapnya tentang pemberian peran, lihat Mengelola akses ke project, folder, dan organisasi.

    Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

Melengkapi aplikasi Anda untuk mengumpulkan trace, metrik, dan log

Untuk melengkapi aplikasi Anda agar dapat mengumpulkan data trace dan metrik serta menulis log JSON terstruktur ke output standar, lakukan langkah-langkah berikut:

  1. Mengonfigurasi aplikasi untuk menggunakan Agen Java OpenTelemetry
  2. Mengonfigurasi OpenTelemetry
  3. Mengonfigurasi logging terstruktur
  4. Menulis log terstruktur

Mengonfigurasi aplikasi Anda untuk menggunakan Agen Java OpenTelemetry

Untuk mengonfigurasi aplikasi agar menulis log terstruktur serta mengumpulkan data metrik dan trace menggunakan OpenTelemetry, perbarui pemanggilan aplikasi Anda untuk menggunakan Agen Java OpenTelemetry. Metode instrumentasi aplikasi ini disebut sebagai instrumentasi otomatis karena tidak memerlukan modifikasi kode aplikasi Anda.

Contoh kode berikut mengilustrasikan Dockerfile yang mendownload file JAR Agen Java OpenTelemetry dan memperbarui pemanggilan command line untuk meneruskan flag -javaagent.

Untuk melihat contoh lengkap, di toolbar contoh, pilih logo GitHub.

RUN wget -O /opentelemetry-javaagent.jar https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v2.32.0/opentelemetry-javaagent.jar
CMD sh -c "java -javaagent:/opentelemetry-javaagent.jar -jar app.jar \
	2>&1 | tee /var/log/app.log"

Atau, Anda dapat menetapkan flag -javaagent di variabel lingkungan JAVA_TOOL_OPTIONS:

export JAVA_TOOL_OPTIONS="-javaagent:PATH/TO/opentelemetry-javaagent.jar"

Mengonfigurasi OpenTelemetry

Konfigurasi default untuk Agen Java OpenTelemetry mengekspor trace dan metrik menggunakan protokol OTLP. Konfigurasi ini juga mengonfigurasi OpenTelemetry untuk menggunakan format W3C Trace Context untuk menyebarkan konteks trace. Konfigurasi ini memastikan bahwa span memiliki hubungan induk-turunan yang benar dalam trace.

Untuk mengetahui informasi dan opsi konfigurasi selengkapnya, lihat Instrumentasi otomatis Java OpenTelemetry.

Mengonfigurasi logging terstruktur

Untuk menyertakan informasi trace sebagai bagian dari log berformat JSON yang ditulis ke output standar, konfigurasikan aplikasi Anda untuk menghasilkan log terstruktur dalam format JSON. Sebaiknya gunakan Log4j2 sebagai implementasi logging Anda. Contoh kode berikut mengilustrasikan file log4j2.xml yang dikonfigurasi untuk menghasilkan log terstruktur JSON menggunakan Tata Letak Template JSON:

<!-- Format JSON logs for the Cloud Logging agent
https://cloud.google.com/logging/docs/structured-logging#special-payload-fields -->

<!-- Log4j2's JsonTemplateLayout includes a template for Cloud Logging's special JSON fields
(including trace and span IDs from Mapped Diagnostic Context (MDC) so that Cloud Logging can
correlate Logs and Spans)
https://logging.apache.org/log4j/2.x/manual/json-template-layout.html#event-templates -->
<JsonTemplateLayout eventTemplateUri="classpath:GcpLayout.json"/>

Konfigurasi sebelumnya mengekstrak informasi tentang span aktif dari Mapped Diagnostic Context SLF4J dan menambahkan informasi tersebut sebagai atribut ke log. Atribut ini kemudian dapat digunakan untuk menghubungkan log dengan trace:

  • logging.googleapis.com/trace: Nama resource trace yang terkait dengan entri log.
  • logging.googleapis.com/spanId: ID span dalam trace yang terkait dengan entri log.
  • logging.googleapis.com/trace_sampled: Nilai kolom ini harus berupa true atau false.

Untuk mengetahui informasi selengkapnya tentang kolom ini, lihat struktur LogEntry.

Menulis log terstruktur

Untuk menulis log terstruktur yang ditautkan ke trace, gunakan API logging SLF4J. Misalnya, pernyataan berikut menunjukkan cara memanggil metode Logger.info():

logger.info("handle /multi request with subRequests={}", subRequests);

Agen Java OpenTelemetry otomatis mengisi Mapped Diagnostic Context SLF4J dengan span context dari span aktif saat ini dalam OpenTelemetry Context. Mapped Diagnostic Context kemudian disertakan dalam log JSON seperti yang dijelaskan dalam Mengonfigurasi logging terstruktur.

Menjalankan aplikasi contoh yang dikonfigurasi untuk mengumpulkan telemetri

Instrumentasi dalam aplikasi contoh menggunakan format yang tidak bergantung pada vendor, seperti JSON untuk data log dan OTLP untuk data metrik dan trace. Aplikasi ini juga menggunakan Spring Boot Framework. Collector OpenTelemetry mengirimkan data log, metrik, dan trace ke project Anda menggunakan Telemetry API, yang menggunakan OTLP.

Aplikasi ini memiliki dua endpoint:

  • Endpoint /multi ditangani oleh fungsi handleMulti. Generator beban di aplikasi mengeluarkan permintaan ke endpoint /multi. Saat endpoint ini menerima permintaan, endpoint ini akan mengirimkan antara tiga hingga tujuh permintaan ke endpoint /single di server lokal.

    /**
     * handleMulti handles an http request by making 3-7 http requests to the /single endpoint.
     *
     * <p>OpenTelemetry instrumentation requires no changes here. It will automatically generate a
     * span for the controller body.
     */
    @GetMapping("/multi")
    public Mono<String> handleMulti() throws Exception {
      int subRequests = ThreadLocalRandom.current().nextInt(3, 8);
    
      // Write a structured log with the request context, which allows the log to
      // be linked with the trace for this request.
      logger.info("handle /multi request with subRequests={}", subRequests);
    
      // Make 3-7 http requests to the /single endpoint.
      return Flux.range(0, subRequests)
          .concatMap(
              i -> client.get().uri("http://localhost:8080/single").retrieve().bodyToMono(Void.class))
          .then(Mono.just("ok"));
    }
  • Endpoint /single ditangani oleh fungsi handleSingle. Saat menerima permintaan, endpoint ini akan tidur selama penundaan singkat, lalu merespons dengan string.

    /**
     * handleSingle handles an http request by sleeping for 100-200 ms. It writes the number of
     * milliseconds slept as its response.
     *
     * <p>OpenTelemetry instrumentation requires no changes here. It will automatically generate a
     * span for the controller body.
     */
    @GetMapping("/single")
    public String handleSingle() throws InterruptedException {
      int sleepMillis = ThreadLocalRandom.current().nextInt(100, 200);
      logger.info("Going to sleep for {}", sleepMillis);
      Thread.sleep(sleepMillis);
      logger.info("Finishing the request");
      return String.format("slept %s\n", sleepMillis);
    }

Mendownload dan men-deploy aplikasi

Untuk menjalankan contoh, lakukan hal berikut:

  1. Di konsol Google Cloud , aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah konsol Google Cloud , sesi Cloud Shell akan dimulai dan menampilkan prompt command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi pada sesi.

  2. Buat clone repositori:

    git clone https://github.com/GoogleCloudPlatform/opentelemetry-samples
    
  3. Buka direktori contoh:

    cd opentelemetry-samples/java/instrumentation-quickstart
    
  4. Bangun dan jalankan contoh:

    docker compose up --abort-on-container-exit
    

    Jika Anda tidak menjalankannya di Cloud Shell, jalankan aplikasi dengan variabel lingkungan GOOGLE_APPLICATION_CREDENTIALS yang mengarah ke file kredensial. Kredensial Default Aplikasi menyediakan file kredensial di $HOME/.config/gcloud/application_default_credentials.json.

    # Set environment variables
    export GOOGLE_CLOUD_PROJECT="PROJECT_ID"
    export GOOGLE_APPLICATION_CREDENTIALS="$HOME/.config/gcloud/application_default_credentials.json"
    export USERID="$(id -u)"
    
    # Run
    docker compose -f docker-compose.yaml -f docker-compose.creds.yaml up --abort-on-container-exit
    

Melihat metrik Anda

Instrumentasi OpenTelemetry di aplikasi contoh menghasilkan metrik Prometheus yang dapat Anda lihat menggunakan Metrics Explorer:

  • Prometheus/http_server_duration_milliseconds/histogram mencatat durasi permintaan server dan menyimpan hasilnya dalam histogram.

  • Prometheus/http_client_duration_milliseconds/histogram mencatat durasi permintaan klien dan menyimpan hasilnya dalam histogram.

Untuk melihat metrik yang dihasilkan oleh aplikasi contoh, lakukan hal berikut:
  1. Di konsol Google Cloud , buka halaman  Metrics explorer:

    Buka Metrics explorer

    Jika Anda menggunakan kotak penelusuran untuk menemukan halaman ini, pilih hasil yang subjudulnya adalah Monitoring.

  2. Di toolbar konsol Google Cloud , pilih project Google Cloud Anda. Untuk konfigurasi App Hub, pilih project host App Hub atau project pengelolaan folder khusus aplikasi.
  3. Pada elemen Metrik, luaskan menu Pilih metrik, masukkan http_server di panel filter, lalu gunakan submenu untuk memilih jenis dan metrik resource tertentu:
    1. Di menu Active resources, pilih Prometheus Target.
    2. Di menu Active metric categories, pilih Http.
    3. Di menu Active metrics, pilih metrik.
    4. Klik Terapkan.
  4. Untuk menambahkan filter, yang menghapus deret waktu dari hasil kueri, gunakan elemen Filter.

  5. Konfigurasi cara data dilihat.

    Jika pengukuran untuk metrik bersifat kumulatif, Metrics Explorer akan otomatis menormalisasi data yang diukur berdasarkan periode penyelarasan, sehingga diagram menampilkan rasio. Untuk mengetahui informasi selengkapnya, lihat Jenis, tipe, dan konversi.

    Saat nilai bilangan bulat atau ganda diukur, seperti dengan dua metrik counter, Metrics Explorer akan otomatis menjumlahkan semua deret waktu. Untuk melihat data rute HTTP /multi dan /single, tetapkan menu pertama entri Aggregation ke None.

    Untuk informasi selengkapnya tentang cara mengonfigurasi diagram, lihat Memilih metrik saat menggunakan Metrics Explorer.

Melihat trace Anda

Mungkin perlu waktu beberapa menit sebelum data trace Anda tersedia. Misalnya, saat data trace diterima oleh project Anda, Google Cloud Observability mungkin perlu membuat database untuk menyimpan data tersebut. Pembuatan database dapat memerlukan waktu beberapa menit, dan selama periode tersebut, tidak ada data trace yang tersedia untuk dilihat.

Untuk melihat data trace, lakukan hal berikut:

  1. Di konsol Google Cloud , buka halaman Trace explorer:

    Buka Trace explorer

    Anda juga dapat menemukan halaman ini menggunakan kotak penelusuran.

  2. Di bagian tabel halaman, pilih baris dengan nama span /multi.
  3. Di diagram Gantt pada panel Trace details, pilih span berlabel /multi.

    Panel yang menampilkan informasi tentang permintaan HTTP akan terbuka. Detail ini mencakup metode, kode status, jumlah byte, dan agen pengguna pemanggil.

  4. Untuk melihat log yang terkait dengan trace ini, pilih tab Logs & Events.

    Tab ini menampilkan setiap log. Untuk melihat detail entri log, luaskan entri log. Anda juga dapat mengklik View Logs dan melihat log menggunakan Logs Explorer.

Untuk mengetahui informasi selengkapnya tentang cara menggunakan halaman Trace Explorer, lihat Menemukan dan menjelajahi trace.

Melihat log

Dari Logs Explorer, Anda dapat memeriksa log, dan juga dapat melihat trace terkait, jika ada.

  1. Di konsol Google Cloud , buka halaman Logs Explorer:

    Buka Logs Explorer

    Jika Anda menggunakan kotak penelusuran untuk menemukan halaman ini, pilih hasil yang subjudulnya adalah Logging.

  2. Temukan log dengan deskripsi handle /multi request.

    Untuk melihat detail log, luaskan entri log.

  3. Klik Traces pada entri log dengan pesan "handle /multi request", lalu pilih View trace details.

    Panel Trace details akan terbuka dan menampilkan trace yang dipilih.

    Data log Anda mungkin tersedia beberapa menit sebelum data trace Anda tersedia. Jika Anda mengalami error saat melihat data trace, baik dengan menelusuri trace berdasarkan ID atau dengan mengikuti langkah-langkah dalam tugas ini, tunggu satu atau dua menit, lalu coba lagi tindakan tersebut.

Untuk mengetahui informasi selengkapnya tentang cara menggunakan Logs Explorer, lihat Melihat log menggunakan Logs Explorer.

Langkah berikutnya