Membuat trace dan metrik dengan Java

Dokumen ini menjelaskan cara mengubah aplikasi Java untuk mengumpulkan data trace dan metrik menggunakan framework OpenTelemetry open source, dan cara menulis log JSON terstruktur ke output standar. Dokumen ini juga memberikan informasi tentang contoh aplikasi Java Spring Boot yang dapat Anda instal dan jalankan. Aplikasi dikonfigurasi untuk menghasilkan metrik, rekaman aktivitas, dan log. Langkah-langkahnya sama, baik Anda menggunakan Framework Spring Boot maupun tidak.

Untuk mempelajari instrumentasi lebih lanjut, lihat dokumen berikut:

Tentang instrumentasi manual dan otomatis

Instrumentasi yang dijelaskan dalam dokumen ini mengandalkan instrumentasi otomatis OpenTelemetry untuk mengirim telemetri ke project Google Cloud Anda. Untuk Java, instrumentasi otomatis mengacu pada praktik memasukkan bytecode secara dinamis ke dalam library dan framework untuk merekam telemetri. Instrumentasi otomatis dapat mengumpulkan telemetri untuk hal-hal seperti panggilan HTTP masuk dan keluar. Untuk informasi selengkapnya, lihat Instrumentasi Otomatis untuk 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 mengetahui contoh dan informasi tentang topik tersebut, lihat Instrumentasi manual.

Sebelum memulai

Aktifkan API Cloud Logging, Cloud Monitoring, and Cloud Trace.

Mengaktifkan API

Menginstrumentasikan aplikasi untuk mengumpulkan trace, metrik, dan log

Untuk melengkapi aplikasi Anda guna mengumpulkan data rekaman aktivitas dan metrik, serta menulis JSON terstruktur ke output standar, lakukan langkah-langkah berikut seperti yang dijelaskan di bagian berikutnya dalam dokumen ini:

  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 dapat menulis log terstruktur dan mengumpulkan metrik serta data trace menggunakan OpenTelemetry, perbarui pemanggilan aplikasi Anda untuk menggunakan Agen Java OpenTelemetry. Metode instrumentasi aplikasi ini dikenal sebagai instrumentasi otomatis karena tidak memerlukan perubahan kode aplikasi.

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

Untuk melihat contoh lengkapnya, klik Lainnya, lalu pilih Lihat di GitHub.

RUN wget -O /opentelemetry-javaagent.jar https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v1.31.0/opentelemetry-javaagent.jar
CMD sh -c "java -javaagent:/opentelemetry-javaagent.jar -cp app:app/lib/* com.example.demo.DemoApplication \
	2>&1 | tee /var/log/app.log"

Atau, Anda juga 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 dengan menggunakan protokol OTLP. Ini juga mengonfigurasi OpenTelemetry untuk menggunakan format Konteks Trace W3C untuk menyebarkan konteks trace. Konfigurasi ini memastikan bahwa span memiliki hubungan induk-turunan yang benar dalam rekaman aktivitas.

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

Mengonfigurasi logging terstruktur

Untuk menyertakan informasi rekaman aktivitas 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 penerapan 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
https://logging.apache.org/log4j/2.x/manual/json-template-layout.html#event-templates -->
<JsonTemplateLayout eventTemplateUri="classpath:GcpLayout.json">
  <!-- Extend the included GcpLayout to include the trace and span IDs from Mapped
  Diagnostic Context (MDC) so that Cloud Logging can correlate Logs and Spans

  Since log4j2 2.24.0, GcpLayout.json already includes trace context logging from MDC and
  the below additional fields are no longer needed -->
  <EventTemplateAdditionalField
    key="logging.googleapis.com/trace"
    format="JSON"
    value='{"$resolver": "mdc", "key": "trace_id"}'
  />
  <EventTemplateAdditionalField
    key="logging.googleapis.com/spanId"
    format="JSON"
    value='{"$resolver": "mdc", "key": "span_id"}'
  />
  <EventTemplateAdditionalField
    key="logging.googleapis.com/trace_sampled"
    format="JSON"
    value="true"
  />
</JsonTemplateLayout>

Konfigurasi sebelumnya mengekstrak informasi tentang span aktif dari Konteks Diagnostik yang Dipetakan SLF4J dan menambahkan informasi tersebut sebagai atribut ke log. Atribut ini kemudian dapat digunakan untuk mengaitkan log dengan rekaman aktivitas:

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

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

Menulis log terstruktur

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

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

Agen Java OpenTelemetry secara otomatis mengisi Konteks Diagnostik yang Dipetakan SLF4J dengan konteks span dari span aktif saat ini di Konteks OpenTelemetry. Konteks Diagnostik yang Dipetakan kemudian disertakan dalam log JSON seperti yang dijelaskan dalam Mengonfigurasi logging terstruktur.

Menjalankan aplikasi contoh yang dikonfigurasi untuk mengumpulkan telemetri

Aplikasi contoh menggunakan format yang netral terhadap vendor, termasuk JSON untuk log dan OTLP untuk metrik dan rekaman aktivitas, serta Framework Spring Boot. Untuk merutekan telemetri ke Google Cloud, contoh ini menggunakan Collector OpenTelemetry yang dikonfigurasi dengan pengekspor Google. Aplikasi ini memiliki dua endpoint:

  • Endpoint /multi ditangani oleh fungsi handleMulti. Generator beban di aplikasi mengirimkan permintaan ke endpoint /multi. Saat 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 endpoint ini menerima permintaan, endpoint 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 Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah 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 sesi.

  2. Meng-cloning repository

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

    cd opentelemetry-operations-java/examples/instrumentation-quickstart
    
  4. Build dan jalankan contoh:

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

    Jika Anda tidak menjalankan 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

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. Pada elemen Metric, luaskan menu Select a metric, 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.
  3. Konfigurasi cara data dilihat.

    Jika pengukuran untuk metrik bersifat kumulatif, Metrics Explorer akan otomatis menormalisasi data yang diukur menurut periode penyelarasan, yang akan menghasilkan diagram yang 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 untuk 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

Untuk melihat data rekaman aktivitas, 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. Pada diagram pencar, pilih rekaman aktivitas dengan URI /multi.
  3. Pada diagram Gantt di panel Trace details, pilih rentang yang berlabel /multi.

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

  4. Untuk melihat log yang terkait dengan rekaman aktivitas 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 informasi selengkapnya tentang cara menggunakan Cloud Trace Explorer, lihat Menemukan dan menjelajahi trace.

Melihat log

Dari Logs Explorer, Anda dapat memeriksa log, dan juga dapat melihat rekaman aktivitas 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 rekaman aktivitas yang dipilih.

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

Langkah selanjutnya