Pelacakan terdistribusi dengan Spring Cloud Sleuth dan Cloud Trace

1. Ringkasan

Pelacakan terdistribusi penting untuk mendapatkan insight dan kemampuan observasi pada arsitektur microservice multi-tingkat. Jika Anda telah merangkai panggilan layanan ke panggilan layanan, dari layanan A ke layanan B hingga layanan C, penting untuk dipahami bahwa panggilan berhasil dan juga latensi di setiap langkah.

Di Spring Boot, Anda dapat menggunakan Spring Cloud Sleuth untuk menambahkan instrumentasi pelacakan terdistribusi dengan lancar ke aplikasi Anda. Secara default, tindakan ini dapat meneruskan data trace ke Zipkin.

Google Cloud Platform memiliki Cloud Trace, yaitu layanan terkelola yang dapat Anda gunakan untuk menyimpan data trace tanpa harus mengelola instance atau penyimpanan Zipkin Anda sendiri. Cloud Trace juga dapat menghasilkan laporan distribusi latensi dan otomatis mendeteksi regresi performa.

Anda memiliki dua opsi untuk menggunakan Cloud Trace dari aplikasi Spring Boot:

  1. Gunakan Proxy Stackdriver Trace Zipkin dan cukup konfigurasikan Spring Cloud Sleuth untuk menggunakan proxy ini sebagai endpoint Zipkin
  2. Atau, gunakan Spring Cloud GCP Trace, yang terintegrasi secara lancar dengan Spring Cloud Sleuth dan meneruskan data trace langsung ke Cloud Trace.

Dalam codelab ini, Anda akan mempelajari cara membangun aplikasi Spring Boot baru dan menggunakan Spring Cloud GCP Trace untuk pelacakan terdistribusi.

Yang akan Anda pelajari

  • Cara membuat aplikasi Java Spring Boot dan mengonfigurasi Cloud Trace.

Yang Anda butuhkan

  • Project Google Cloud Platform
  • Browser, seperti Chrome atau Firefox
  • Pemahaman tentang editor teks Linux standar seperti Vim, EMACs, atau Nano

Bagaimana Anda akan menggunakan tutorial ini?

Hanya membacanya Membacanya dan menyelesaikan latihan

Bagaimana Anda menilai pengalaman Anda membuat aplikasi web HTML/CSS?

Pemula Menengah Mahir

Bagaimana penilaian Anda terhadap pengalaman menggunakan layanan Google Cloud Platform?

Pemula Menengah Mahir

2. Penyiapan dan Persyaratan

Penyiapan lingkungan mandiri

  1. Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API. Anda dapat memperbaruinya kapan saja.
  • Project ID bersifat unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis membuat string unik; biasanya Anda tidak mementingkan kata-katanya. Di sebagian besar codelab, Anda harus merujuk Project ID-nya (umumnya diidentifikasi sebagai PROJECT_ID). Jika tidak suka dengan ID yang dibuat, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri, dan lihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan tersedia selama durasi project.
  • Sebagai informasi, ada nilai ketiga, Project Number, yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
  1. Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini tidak akan memakan banyak biaya, bahkan mungkin tidak sama sekali. Guna mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus project-nya. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

Google Cloud Shell

Meskipun Google Cloud dan Kubernetes dapat dioperasikan secara jarak jauh dari laptop Anda, dalam codelab ini kita akan menggunakan Google Cloud Shell, yakni lingkungan command line yang berjalan di Cloud.

Mengaktifkan Cloud Shell

  1. Dari Cloud Console, klik Aktifkan Cloud Shell 853e55310c205094.pngS.

55efc1aaa7a4d3ad.png

Jika ini pertama kalinya Anda memulai Cloud Shell, Anda akan melihat layar perantara yang menjelaskan apa itu Cloud Shell. Jika Anda melihat layar perantara, klik Lanjutkan.

9c92662c6a846a5c.pngS

Perlu waktu beberapa saat untuk penyediaan dan terhubung ke Cloud Shell.

9f0e51b578fecce5.pngS

Mesin virtual ini dimuat dengan semua alat pengembangan yang dibutuhkan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Sebagian besar pekerjaan Anda dalam codelab ini dapat dilakukan dengan browser.

Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda telah diautentikasi dan project sudah ditetapkan ke project ID Anda.

  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list

Output perintah

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa perintah gcloud mengetahui project Anda:
gcloud config list project

Output perintah

[core]
project = <PROJECT_ID>

Jika tidak, Anda dapat menyetelnya dengan perintah ini:

gcloud config set project <PROJECT_ID>

Output perintah

Updated property [core/project].

3. Membuat Layanan REST Spring Boot baru

Setelah Cloud Shell diluncurkan, Anda dapat menggunakan command line untuk membuat aplikasi Spring Boot baru dengan Spring Initializr:

$ curl https://start.spring.io/starter.tgz -d packaging=jar \
  -d bootVersion=2.7.6 \
  -d dependencies=web,lombok,cloud-gcp,distributed-tracing \
  -d jvmVersion=17 \
  -d type=maven-project \
  -d baseDir=trace-service-one | tar -xzvf - \
  && cd trace-service-one

Buat pengontrol REST baru dengan menambahkan class baru:

src/main/java/com/example/demo/WorkController.java

package com.example.demo;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Random;

@RestController
@Slf4j
public class WorkController {
  Random r = new Random();

  public void meeting() {
    try {
      log.info("meeting...");
      // Delay for random number of milliseconds.
      Thread.sleep(r.nextInt(500));
    } catch (InterruptedException e) {
    }
  }

  @GetMapping("/")
  public String work() {
    // What is work? Meetings!
    // When you hit this URL, it'll call meetings() 5 times.
    // Each time will have a random delay.
    log.info("starting to work");
    for (int i = 0; i < 5; i++) {
      this.meeting();
    }
    log.info("finished!");
    return "finished work!";
  }
}

Pastikan Anda memiliki versi JVM yang tepat untuk aplikasi tersebut:

$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64

Anda dapat memulai aplikasi Spring Boot secara normal dengan plugin Spring Boot. Mari lewati pengujian untuk lab ini:

$ ./mvnw -DskipTests spring-boot:run

Setelah aplikasi dimulai, klik ikon Web Preview 3a9b40fafa650b2b.pngS di toolbar Cloud Shell dan pilih preview di port 8080.

3aca52f76c6c22a3.pngS

Setelah menunggu sebentar, Anda akan melihat hasilnya:

6793a3339447cbb5.png

Di Cloud Shell, Anda juga akan melihat pesan log dengan ID trace dan ID span:

18d597c388de1ba.pngS

4. Menggunakan Cloud Trace

Mengaktifkan Cloud Trace API

Anda harus mengaktifkan Cloud Trace API terlebih dahulu sebelum menggunakan Cloud Trace untuk menyimpan data trace. Untuk mengaktifkan API, jalankan:

$ gcloud services enable cloudtrace.googleapis.com

Menyiapkan Kredensial Default Aplikasi

Untuk lab ini, Anda harus mengonfigurasi kredensial default aplikasi. Kredensial ini akan otomatis diambil oleh pemicu Spring Cloud GCP Trace.

Pertama, masuk:

$ gcloud auth application-default login
You are running on a Google Compute Engine virtual machine.
The service credentials associated with this virtual machine
will automatically be used by Application Default
Credentials, so it is not necessary to use this command.
If you decide to proceed anyway, your user credentials may be visible
to others with access to this virtual machine. Are you sure you want
to authenticate with your personal account?
Do you want to continue (Y/n)? Y

Go to the following link in your browser:
    https://accounts.google.com/o/oauth2/auth...
Enter verification code: ...

Klik link untuk membuka tab browser baru, lalu klik Izinkan

85f500de6f5dc0a8.pngS

Kemudian, salin dan tempel kembali kode verifikasi ke Cloud Shell dan tekan enter. Anda akan melihat:

Credentials saved to file: [/tmp/tmp.jm9bnQ4R9Q/application_default_credentials.json]
These credentials will be used by any library that requests
Application Default Credentials.

Menambahkan Spring Cloud GCP Trace

Di layanan ini, kita telah menggunakan Spring Cloud Sleuth untuk melakukan pelacakan. Mari kita tambahkan pemicu Spring Cloud GCP Trace untuk meneruskan data ke Cloud Trace.

Tambahkan dependensi Spring Cloud GCP Trace:

pom.xml

<project>
  ...
  <dependencies>
    ...
    <!-- Add Cloud Trace Starter -->
    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>spring-cloud-gcp-starter-trace</artifactId>
    </dependency>
  </dependencies>
  ...
</project>

Secara default, Spring Cloud Sleuth tidak mengambil sampel dari setiap permintaan. Untuk mempermudah pengujian, tingkatkan frekuensi sampel hingga 100% di application.properties untuk memastikan kita melihat data trace, serta mengabaikan beberapa URL yang tidak penting:

$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties

Jalankan kembali aplikasi, lalu gunakan Pratinjau Web Cloud Shell untuk melihat aplikasi:

$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run

Secara default, Spring Cloud GCP Trace mengelompokkan data trace dan mengirimkannya sekali setiap 10 detik, atau saat jumlah minimum data trace diterima. Hal ini dapat dikonfigurasi dan Anda dapat membaca dokumentasi referensi Spring Cloud GCP Trace untuk informasi selengkapnya.

Membuat permintaan ke layanan:

$ curl localhost:8080

Di Konsol Cloud, buka OperationsTraceTrace list

be48cb0f99b5f7c2.png

Di bagian atas, persempit rentang waktu menjadi 1 jam. Secara default, opsi Muat Ulang Otomatis diaktifkan. Jadi saat data trace tiba, data tersebut akan muncul di konsol.

3522eef823df39d8.pngS

Data rekaman aktivitas akan muncul dalam waktu sekitar 30 detik.

9628f6e1d2e75b05.pngS

Klik titik biru untuk melihat detail trace:

ba9051a8d4f3e725.png

Cukup mudah.

5. Membuat Aplikasi Web Spring Boot kedua

Buka sesi Cloud Shell baru dengan mengklik ikon +:

9799bee5fea95aa6.pngS

Pada sesi baru, buat aplikasi Spring Boot kedua:

$ curl https://start.spring.io/starter.tgz -d packaging=jar \
  -d bootVersion=2.7.6 \
  -d dependencies=web,lombok,cloud-gcp,distributed-tracing \
  -d jvmVersion=17 \
  -d type=maven-project \
  -d baseDir=trace-service-two | tar -xzvf - \
  && cd trace-service-two

Buat pengontrol REST baru dengan menambahkan class baru:

src/main/java/com/example/demo/MeetingController.java

package com.example.demo;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Random;

@RestController
@Slf4j
public class MeetingController {
  Random r = new Random();

  @GetMapping("/meet")
  public String meeting() {
    try {
      log.info("meeting...");
      Thread.sleep(r.nextInt(500 - 20 + 1) + 20);
    } catch (InterruptedException e) {
    }
    return "finished meeting";
  }
}

Menambahkan Spring Cloud GCP Trace ke pom.xml

pom.xml

<project>
  ...
  <dependencies>
    ...
    <!-- Add Cloud Trace starter -->
    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>spring-cloud-gcp-starter-trace</artifactId>
    </dependency>
  </dependencies>
  ...
</project>

Konfigurasikan Sleuth untuk mengambil sampel 100% permintaan:

src/main/resources/application.properties

$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties

Terakhir, Anda dapat memulai aplikasi Spring Boot pada port 8081 dengan plugin Spring Boot:

$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run -Dspring-boot.run.jvmArguments="-Dserver.port=8081"

6. Memperbarui Layanan Pertama untuk Menggunakan Layanan Kedua

Saat trace-service-two berjalan, kembali ke jendela sesi Cloud Shell pertama dan buat perubahan pada trace-service-one.

Pertama-tama, inisialisasi bean RestTemplate baru:

src/main/java/com/example/demo/DemoApplication.java

package com.example.demo;

...

import org.springframework.web.client.RestTemplate;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class DemoApplication {
        @Bean
        public RestTemplate restTemplate() {
                return new RestTemplate();
        }
        
        public static void main(String[] args) {
                SpringApplication.run(DemoApplication.class, args);
        }
}

Di WorkController.meeting(), lakukan panggilan ke layanan Rapat.

src/main/java/com/example/demo/WorkController.java

package com.example.demo;

...
import org.springframework.web.client.RestTemplate;
import org.springframework.beans.factory.annotation.Autowired;

@RestController
@Slf4j
public class WorkController {
  @Autowired
  RestTemplate restTemplate;

  public void meeting() {
    String result = restTemplate.getForObject("http://localhost:8081/meet", String.class);
    log.info(result);
  }

  ...
}

Mulai layanan lagi dan picu endpoint dari command line:

$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`

# The '&' places the process in the background. Bring it back to the foreground with 'fg'.
$ ./mvnw -DskipTests spring-boot:run &

$ curl localhost:8080

Di kedua jendela sesi, Anda akan melihat pesan log, dengan Trace ID yang disebarkan dari satu layanan ke layanan lainnya.

Dalam Trace List Cloud Trace, Anda akan melihat trace kedua:

13490977f1638702.pngS

Anda dapat mengklik titik biru baru dan melihat detail rekaman aktivitas:

ca69ef9cdd13d4aa.png

Anda juga dapat mengklik span mana pun dalam diagram ini untuk melihat detail span.

7. Distribusi Latensi & Laporan Performa

Saat Anda menggunakan Cloud Trace sebagai penyimpanan data trace, Cloud Trace dapat menggunakan data tersebut untuk membuat laporan distribusi latensi. Anda memerlukan lebih dari 100 trace untuk membuat laporan seperti ini:

c8713f3d9e51dc25.png

Anda dapat menjalankan 100+ permintaan pertama menggunakan ok, yang sudah terinstal di Cloud Shell.

$ hey localhost:8080 -n 150

Selain itu, Cloud Trace dapat otomatis mendeteksi regresi performa layanan yang sama di dua jangka waktu yang berbeda di bagian Laporan Analisis.

8. Ringkasan

Di lab ini, Anda telah membuat 2 layanan sederhana dan menambahkan pelacakan terdistribusi dengan Spring Cloud Sleuth, serta menggunakan Spring Cloud GCP untuk meneruskan informasi trace ke Cloud Trace.

9. Selamat!

Anda telah mempelajari cara membuat aplikasi web App Engine pertama Anda!

Pelajari Lebih Lanjut

Lisensi

Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.