Pelacakan terdistribusi dengan Spring Cloud Sleuth dan Stackdriver Trace

Pelacakan terdistribusi dengan Spring Cloud Sleuth dan Stackdriver Trace

Tentang codelab ini

subjectTerakhir diperbarui Feb 10, 2020
account_circleDitulis oleh Googler

1. Ringkasan

Pelacakan terdistribusi penting untuk mendapatkan insight dan kemampuan observasi ke arsitektur microservice bertingkat. Jika Anda telah menghubungkan layanan ke panggilan layanan, dari layanan A ke layanan B hingga layanan C, penting untuk memahami bahwa panggilan tersebut berhasil serta latensi di setiap langkah.

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

Google Cloud Platform memiliki Stackdriver Trace, sebuah layanan terkelola yang memungkinkan Anda menyimpan data rekaman aktivitas tanpa harus mengelola instance Zipkin sendiri atau penyimpanan. Stackdriver Trace juga dapat menghasilkan laporan distribusi latensi dan mendeteksi regresi performa secara otomatis.

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

  1. Gunakan Proxy Zipkin Stackdriver Trace 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 Stackdriver Trace.

Dalam codelab ini, Anda akan mempelajari cara mem-build 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 Stackdriver Trace.

Yang Anda butuhkan

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

Bagaimana Anda akan menggunakan tutorial ini?

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

Bagaimana penilaian Anda terhadap pengalaman menggunakan layanan Google Cloud Platform?

2. Penyiapan dan Persyaratan

Penyiapan lingkungan mandiri

Jika belum memiliki Akun Google (Gmail atau Google Apps), Anda harus membuatnya. Login ke Google Cloud Platform console (console.cloud.google.com) dan buat project baru:

Screenshot dari 10-02-2016 12:45:26.png

Ingat project ID, nama unik di semua project Google Cloud (maaf, nama di atas telah digunakan dan tidak akan berfungsi untuk Anda!) Project ID tersebut selanjutnya akan dirujuk di codelab ini sebagai PROJECT_ID.

Selanjutnya, Anda harus mengaktifkan penagihan di Cloud Console untuk menggunakan resource Google Cloud.

Menjalankan melalui codelab ini tidak akan menghabiskan biaya lebih dari beberapa dolar, tetapi bisa lebih jika Anda memutuskan untuk menggunakan lebih banyak resource atau jika Anda membiarkannya berjalan (lihat bagian "pembersihan" di akhir dokumen ini).

Pengguna baru Google Cloud Platform memenuhi syarat untuk mendapatkan uji coba gratis senilai$300.

Google Cloud Shell

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

Mengaktifkan Google Cloud Shell

Dari GCP Console, klik ikon Cloud Shell di toolbar kanan atas:

Kemudian klik "Mulai Cloud Shell":

Hanya perlu waktu beberapa saat untuk penyediaan dan terhubung ke lingkungan:

Mesin virtual ini berisi semua alat pengembangan yang Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB, dan berjalan di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Sebagian besar pekerjaan Anda di lab ini dapat dilakukan hanya dengan browser atau Google Chromebook.

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

Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:

gcloud auth list

Output perintah

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
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 Spring Boot REST 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 dependencies=web,lombok,cloud-gcp,cloud-starter-sleuth \
 
-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!";
 
}
}

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

$ ./mvnw -DskipTests spring-boot:run

Setelah aplikasi dimulai, klik ikon Pratinjau Web di toolbar Cloud Shell dan pilih pratinjau di port 8080.

Setelah menunggu beberapa saat, Anda akan melihat hasilnya:

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

4. Menggunakan Stackdriver Trace

Mengaktifkan Stackdriver Trace API

Anda harus mengaktifkan Stackdriver Trace API terlebih dahulu untuk menggunakan Stackdriver Trace untuk menyimpan data trace. Untuk mengaktifkan API, buka Layanan API → Library

Telusuri Stackdriver Trace

Klik Stackdriver Trace API, lalu klik Aktifkan jika belum diaktifkan.

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, login:

$ 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

Selanjutnya, salin dan tempel kode verifikasi kembali 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

Dalam layanan ini, kami telah menggunakan Spring Cloud Sleuth untuk pelacakan. Mari tambahkan starter Spring Cloud GCP Trace untuk meneruskan data ke Stackdriver Trace.

Tambahkan dependensi Spring Cloud GCP Trace:

pom.xml

<project>
  ...
 
<dependencies>
    ...
   
<!-- Add Stackdriver Trace Starter -->
   
<dependency>
     
<groupId>org.springframework.cloud</groupId>
     
<artifactId>spring-cloud-gcp-starter-trace</artifactId>
   
</dependency>
 
</dependencies>
  ...
</project>

Secara default, Spring Cloud Sleuth tidak mengambil sampel setiap permintaan. Untuk mempermudah pengujian, tingkatkan frekuensi sampel menjadi 100% di application.properties untuk memastikan kita melihat data rekaman aktivitas, serta abaikan 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 pelacakan dan mengirimkannya sekali setiap 10 detik, atau saat jumlah minimum data pelacakan diterima. Bagian ini dapat dikonfigurasi dan Anda dapat membaca dokumentasi referensi Spring Cloud GCP Trace untuk informasi lebih lanjut.

Buat permintaan ke layanan:

$ curl localhost:8080

Di Cloud Console, buka Stackdriver TraceDaftar trace

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

Data trace akan muncul dalam waktu sekitar 30 detik.

Klik titik biru untuk melihat detail trace:

Cukup mudah.

5. Membuat Aplikasi Web Spring Boot kedua

Buka sesi Cloud Shell baru dengan mengklik ikon +:

Di sesi baru, buat aplikasi Spring Boot kedua:

$ curl https://start.spring.io/starter.tgz -d packaging=jar \
 
-d dependencies=web,lombok,cloud-gcp,cloud-starter-sleuth \
 
-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 Stackdriver Trace starter -->
   
<dependency>
     
<groupId>org.springframework.cloud</groupId>
     
<artifactId>spring-cloud-gcp-starter-trace</artifactId>
   
</dependency>
 
</dependencies>
  ...
</project>

Mengonfigurasi 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 di port 8081 dengan plugin Spring Boot:

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

6. Mengupdate Layanan Pertama untuk Menggunakan Layanan Kedua

Saat trace-service-two sedang berjalan, kembalilah ke jendela sesi Cloud Shell pertama dan lakukan perubahan pada trace-service-one.

Pertama, lakukan inisialisasi kacang 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(), hubungi 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 Pratinjau Web:

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

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

Dalam Daftar Trace Stackdriver Trace, Anda akan melihat trace kedua:

Anda dapat mengklik titik biru yang baru dan melihat detail trace:

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

7. Distribusi Latensi &Laporan Performa

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

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

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 Stackdriver Trace.

9. Selamat!

Anda telah mempelajari cara menulis aplikasi web App Engine pertama Anda.

Pelajari Lebih Lanjut

Lisensi

Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.