Pelacakan terdistribusi penting untuk mendapatkan insight dan kemampuan pengamatan terhadap arsitektur microservice multi-tingkat. Saat Anda telah membuat panggilan layanan berantai, dari layanan A ke layanan B ke layanan C, penting untuk memahami bahwa panggilan tersebut berhasil dan juga latensi di setiap langkah.
Di Spring Boot, Anda dapat menggunakan Spring Cloud Sleuth untuk menambahkan instrumentasi pelacakan terdistribusi ke aplikasi Anda dengan lancar. Secara default, agen ini dapat meneruskan data rekaman aktivitas ke Zipkin.
Google Cloud Platform memiliki Stackdriver Trace, yang merupakan layanan terkelola yang memungkinkan Anda menyimpan data rekaman aktivitas tanpa harus mengelola instance Zipkin atau penyimpanan Anda sendiri. Stackdriver Trace juga dapat menghasilkan laporan distribusi latensi dan otomatis mendeteksi regresi performa.
Anda memiliki dua opsi untuk menggunakan Stackdriver Trace dari aplikasi Spring Boot:
- Gunakan Stackdriver Trace Zipkin Proxy dan cukup konfigurasi Spring Cloud Sleuth untuk menggunakan proxy ini sebagai endpoint Zipkin
- Atau, gunakan Spring Cloud GCP Trace, yang terintegrasi secara lancar dengan Spring Cloud Sleuth dan meneruskan data rekaman aktivitas langsung ke Stackdriver Trace.
Dalam codelab ini, Anda akan mempelajari cara membuat 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, EMACs, atau Nano
Bagaimana Anda akan menggunakan tutorial ini?
Sejauh mana pengalaman Anda membuat aplikasi web HTML/CSS?
Bagaimana penilaian Anda terhadap pengalaman menggunakan layanan Google Cloud Platform?
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:
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 Konsol Cloud 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 menggunakan laptop Anda, dalam codelab ini, kita akan menggunakan Google Cloud Shell, lingkungan command line yang berjalan di Cloud.
Mengaktifkan Google Cloud Shell
Dari Konsol GCP, klik ikon Cloud Shell di toolbar kanan atas:
Kemudian, klik "Start 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 beroperasi 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 Anda.
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].
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 lewati pengujian untuk lab ini:
$ ./mvnw -DskipTests spring-boot:run
Setelah aplikasi dimulai, klik ikon Pratinjau Web di toolbar Cloud Shell, lalu pilih preview on port 8080.
Setelah menunggu sebentar, Anda akan melihat hasilnya:
Di Cloud Shell, Anda juga akan melihat pesan log dengan ID trace dan ID rentang:
Aktifkan Stackdriver Trace API
Anda harus mengaktifkan Stackdriver Trace API terlebih dahulu untuk menggunakan Stackdriver Trace guna menyimpan data rekaman aktivitas. Untuk mengaktifkan API, buka API Services → 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 Spring Cloud GCP Trace starter.
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
Kemudian, salin dan tempel kode verifikasi kembali ke Cloud Shell, lalu 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.
Tambahkan Spring Cloud GCP Trace
Dalam layanan ini, kita sudah 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 rasio sampel menjadi 100% di application.properties
untuk memastikan kita melihat data rekaman aktivitas, serta mengabaikan beberapa URL yang tidak kita perhatikan:
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
Jalankan aplikasi lagi, dan 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 setiap 10 detik, atau saat jumlah minimum data trace diterima. Hal ini dapat dikonfigurasi dan Anda dapat melihat dokumentasi referensi Spring Cloud GCP Trace untuk mengetahui informasi selengkapnya.
Buat permintaan ke layanan:
$ curl localhost:8080
Di Konsol Cloud, buka Stackdriver → Trace → Trace list
Di bagian atas, perkecil rentang waktu menjadi 1 jam. Secara default, Muat Ulang Otomatis aktif. Jadi, saat data rekaman aktivitas tiba, data tersebut akan muncul di konsol.
Data rekaman aktivitas akan muncul dalam waktu sekitar 30 detik.
Klik titik biru untuk melihat detail rekaman aktivitas:
Cukup mudah!
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";
}
}
Tambahkan 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>
Konfigurasi 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
Saat trace-service-two
berjalan, kembali ke jendela sesi Cloud Shell pertama dan lakukan modifikasi pada trace-service-one
.
Pertama, lakukan 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 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 Aktivitas yang diteruskan dari satu layanan ke layanan lainnya.
Di Daftar Aktivitas Stackdriver Trace, Anda akan melihat aktivitas kedua:
Anda dapat mengklik titik biru baru dan melihat detail rekaman aktivitas:
Anda juga dapat mengklik rentang mana pun dalam diagram ini untuk melihat detail rentang.
Saat Anda menggunakan Stackdriver Trace sebagai penyimpanan data pelacakan, Stackdriver Trace dapat menggunakan data tersebut untuk membuat laporan distribusi latensi. Anda memerlukan lebih dari 100 rekaman aktivitas untuk membuat laporan seperti ini:
Selain itu, Stackdriver Trace dapat otomatis mendeteksi regresi performa layanan yang sama di dua jangka waktu yang berbeda dalam Laporan Analisis.
Di lab ini, Anda telah membuat 2 layanan sederhana dan menambahkan distributed tracing dengan Spring Cloud Sleuth, serta menggunakan Spring Cloud GCP untuk meneruskan informasi rekaman aktivitas ke Stackdriver Trace.
Anda telah mempelajari cara menulis aplikasi web App Engine pertama Anda.
Pelajari Lebih Lanjut
- Stackdriver Trace: https://cloud.google.com/trace/
- Project Spring di GCP: http://cloud.spring.io/spring-cloud-gcp/
- Repositori GitHub Spring on GCP: https://github.com/spring-cloud/spring-cloud-gcp
- Java di Google Cloud Platform: https://cloud.google.com/java/
Lisensi
Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.