1. Panoramica
Il tracciamento distribuito è importante per ottenere informazioni e osservabilità in un'architettura di microservizi a più livelli. Quando hai concatenato chiamate da servizio a servizio, dal servizio A al servizio B al servizio C, è importante capire se le chiamate sono andate a buon fine e anche la latenza in ogni passaggio.
In Spring Boot, puoi utilizzare Spring Cloud Sleuth per aggiungere facilmente l'instrumentazione di tracciamento distribuito alla tua applicazione. Per impostazione predefinita, può inoltrare i dati di traccia a Zipkin.
Google Cloud Platform offre Cloud Trace, un servizio gestito che consente di archiviare i dati di traccia senza dover gestire la propria istanza Zipkin o l'archiviazione. Cloud Trace può anche generare report sulla distribuzione della latenza e rilevare automaticamente le regressioni delle prestazioni.
Hai due opzioni per utilizzare Cloud Trace da un'applicazione Spring Boot:
- Utilizza un proxy Stackdriver Trace Zipkin e configura semplicemente Spring Cloud Sleuth per utilizzare questo proxy come endpoint Zipkin
- In alternativa, utilizza Spring Cloud GCP Trace, che si integra perfettamente con Spring Cloud Sleuth e inoltra i dati di traccia direttamente a Cloud Trace.
In questo codelab imparerai a creare una nuova applicazione Spring Boot e a utilizzare Spring Cloud GCP Trace per il tracciamento distribuito.
Cosa imparerai a fare
- Come creare un'applicazione Java Spring Boot e configurare Cloud Trace.
Che cosa ti serve
- Un progetto Google Cloud
- Un browser, ad esempio Chrome o Firefox
- Familiarità con gli editor di testo standard di Linux, ad esempio Vim, EMAC o Nano
Come utilizzerai questo tutorial?
Come valuti la tua esperienza di creazione di app web HTML/CSS?
Come valuti la tua esperienza di utilizzo dei servizi Google Cloud Platform?
2. Configurazione e requisiti
Configurazione dell'ambiente autonomo
- Accedi alla console Google Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un account Gmail o Google Workspace, devi crearne uno.



- Il nome del progetto è il nome visualizzato per i partecipanti a questo progetto. È una stringa di caratteri non utilizzata dalle API di Google. Puoi sempre aggiornarlo.
- L'ID progetto è univoco in tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo l'impostazione). La console Cloud genera automaticamente una stringa univoca, di solito non ti interessa di cosa si tratta. Nella maggior parte dei codelab, dovrai fare riferimento all'ID progetto (in genere identificato come
PROJECT_ID). Se l'ID generato non ti piace, puoi generarne un altro casuale. In alternativa, puoi provare a crearne uno e vedere se è disponibile. Non può essere modificato dopo questo passaggio e rimane per tutta la durata del progetto. - Per tua informazione, esiste un terzo valore, un numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
- Successivamente, devi abilitare la fatturazione in Cloud Console per utilizzare le risorse/API Cloud. Completare questo codelab non costa molto, se non nulla. Per arrestare le risorse ed evitare addebiti oltre a quelli previsti in questo tutorial, puoi eliminare le risorse che hai creato o il progetto. I nuovi utenti di Google Cloud possono beneficiare del programma prova senza costi di 300$.
Google Cloud Shell
Sebbene Google Cloud e Kubernetes possano essere gestiti da remoto dal tuo laptop, in questo codelab utilizzeremo Google Cloud Shell, un ambiente a riga di comando in esecuzione nel cloud.
Attiva Cloud Shell
- Nella console Cloud, fai clic su Attiva Cloud Shell
.

Se è la prima volta che avvii Cloud Shell, viene visualizzata una schermata intermedia che ne descrive le funzionalità. Se è stata visualizzata una schermata intermedia, fai clic su Continua.

Bastano pochi istanti per eseguire il provisioning e connettersi a Cloud Shell.

Questa macchina virtuale è caricata con tutti gli strumenti di sviluppo necessari. Offre una home directory permanente da 5 GB e viene eseguita in Google Cloud, migliorando notevolmente le prestazioni e l'autenticazione della rete. Gran parte del lavoro per questo codelab, se non tutto, può essere svolto con un browser.
Una volta eseguita la connessione a Cloud Shell, dovresti vedere che il tuo account è autenticato e il progetto è impostato sul tuo ID progetto.
- Esegui questo comando in Cloud Shell per verificare che l'account sia autenticato:
gcloud auth list
Output comando
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- Esegui questo comando in Cloud Shell per verificare che il comando gcloud conosca il tuo progetto:
gcloud config list project
Output comando
[core] project = <PROJECT_ID>
In caso contrario, puoi impostarlo con questo comando:
gcloud config set project <PROJECT_ID>
Output comando
Updated property [core/project].
3. Crea un nuovo servizio REST Spring Boot
Dopo l'avvio di Cloud Shell, puoi utilizzare la riga di comando per generare una nuova applicazione Spring Boot con 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
Crea un nuovo controller REST aggiungendo una nuova classe:
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!";
}
}
Assicurati di avere la versione JVM corretta per l'applicazione:
$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
Puoi avviare l'applicazione Spring Boot normalmente con il plug-in Spring Boot. Saltiamo i test per questo lab:
$ ./mvnw -DskipTests spring-boot:run
Una volta avviata l'applicazione, fai clic sull'icona Anteprima web
nella barra degli strumenti di Cloud Shell e scegli Anteprima sulla porta 8080.

Dopo una breve attesa, dovresti vedere il risultato:

In Cloud Shell dovresti visualizzare anche i messaggi di log con ID traccia e ID intervallo:

4. Utilizzo di Cloud Trace
Abilita l'API Cloud Trace
Prima di utilizzare Cloud Trace per archiviare i dati di traccia, devi abilitare l'API Cloud Trace. Per abilitare l'API, esegui:
$ gcloud services enable cloudtrace.googleapis.com
Configurare le credenziali predefinite dell'applicazione
Per questo lab, devi configurare una credenziale predefinita dell'applicazione. Questa credenziale verrà rilevata automaticamente da Spring Cloud GCP Trace starter.
Innanzitutto, accedi:
$ 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: ...
Fai clic sul link per aprire una nuova scheda del browser, quindi fai clic su Consenti.

Quindi, copia e incolla il codice di verifica in Cloud Shell e premi Invio. Dovresti vedere:
Credentials saved to file: [/tmp/tmp.jm9bnQ4R9Q/application_default_credentials.json]
These credentials will be used by any library that requests
Application Default Credentials.
Aggiungi Spring Cloud GCP Trace
In questo servizio abbiamo già utilizzato Spring Cloud Sleuth per la tracciabilità. Aggiungiamo Spring Cloud GCP Trace starter per inoltrare i dati a Cloud Trace.
Aggiungi la dipendenza 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>
Per impostazione predefinita, Spring Cloud Sleuth non campiona ogni richiesta. Per semplificare un po' i nostri test, aumenta la frequenza di campionamento al 100% in application.properties per assicurarti di visualizzare i dati di traccia, nonché ignorare alcuni URL che non ci interessano:
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
Esegui di nuovo l'applicazione e utilizza l'anteprima web di Cloud Shell per visualizzarla:
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format 'value(core.project)'`
$ ./mvnw -DskipTests spring-boot:run
Per impostazione predefinita, Spring Cloud GCP Trace raggruppa i dati di traccia e li invia ogni 10 secondi o quando viene ricevuto un numero minimo di dati di traccia. Questo è configurabile e puoi consultare la documentazione di riferimento di Spring Cloud GCP Trace per saperne di più.
Effettua una richiesta al servizio:
$ curl localhost:8080
Nella console Cloud, vai a Operations → Trace → Elenco tracce.

In alto, riduci l'intervallo di tempo a 1 ora. Per impostazione predefinita, l'opzione Ricarica automatica è attiva. Quindi, man mano che arrivano i dati di tracciamento, dovrebbero essere visualizzati nella console.

I dati di traccia dovrebbero essere visualizzati in circa 30 secondi.

Fai clic sul punto blu per visualizzare i dettagli della traccia:

È stato piuttosto semplice.
5. Crea una seconda applicazione web Spring Boot
Apri una nuova sessione di Cloud Shell facendo clic sull'icona +:

Nella nuova sessione, crea la seconda applicazione Spring Boot:
$ 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
Crea un nuovo controller REST aggiungendo una nuova classe:
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";
}
}
Aggiungi Spring Cloud GCP Trace a 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>
Configura Sleuth in modo che campioni il 100% delle richieste:
src/main/resources/application.properties
$ echo "
spring.sleuth.sampler.probability=1.0
spring.sleuth.web.skipPattern=(^cleanup.*|.+favicon.*)
" > src/main/resources/application.properties
Infine, puoi avviare l'applicazione Spring Boot sulla porta 8081 con il plug-in 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. Aggiorna il primo servizio per utilizzare il secondo servizio
Mentre trace-service-two è in esecuzione, torna alla prima finestra della sessione di Cloud Shell e modifica trace-service-one.
Innanzitutto, inizializza un nuovo bean RestTemplate:
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);
}
}
In WorkController.meeting(), effettua una chiamata al servizio Riunione.
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);
}
...
}
Avvia di nuovo il servizio e attiva l'endpoint dalla riga di comando:
$ 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
In entrambe le finestre della sessione, dovresti visualizzare i messaggi di log, con l'ID traccia propagato da un servizio all'altro.
Nell'elenco delle tracce di Cloud Trace, dovresti vedere la seconda traccia:

Puoi fare clic sul nuovo punto blu e visualizzare i dettagli della traccia:

Puoi anche fare clic su qualsiasi intervallo in questo diagramma per visualizzarne i dettagli.
7. Report sulla distribuzione e sul rendimento della latenza
Quando utilizzi Cloud Trace come archivio dei dati di traccia, Cloud Trace può utilizzare i dati per generare il report sulla distribuzione della latenza. Per creare il report in questo modo, devi avere più di 100 tracce:

Puoi eseguire le prime 100 e più richieste utilizzando hey, che è preinstallato in Cloud Shell.
$ hey localhost:8080 -n 150
Inoltre, Cloud Trace può rilevare automaticamente la regressione delle prestazioni dello stesso servizio in due periodi di tempo diversi in Report di analisi.
8. Riepilogo
In questo lab hai creato due semplici servizi e hai aggiunto il tracciamento distribuito con Spring Cloud Sleuth e hai utilizzato Spring Cloud GCP per inoltrare le informazioni sulle tracce a Cloud Trace.
9. Complimenti!
Hai imparato a scrivere la tua prima applicazione web App Engine.
Scopri di più
- Cloud Trace: https://cloud.google.com/trace/
- Progetto Spring su GCP: http://cloud.spring.io/spring-cloud-gcp/
- Repository GitHub di Spring su GCP: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java su Google Cloud: https://cloud.google.com/java/
Licenza
Questo lavoro è concesso in licenza ai sensi di una licenza Creative Commons Attribution 2.0 Generic.