Verteiltes Tracing mit Spring Cloud Sleuth und Stackdriver Trace

Verteiltes Tracing mit Spring Cloud Sleuth und Stackdriver Trace

Informationen zu diesem Codelab

subjectZuletzt aktualisiert: Feb. 10, 2020
account_circleVerfasst von einem Google-Mitarbeiter

1. Übersicht

Verteiltes Tracing ist wichtig, um Informationen in einer mehrschichtigen Mikrodienstarchitektur zu gewinnen und beobachtbar zu machen. Wenn Sie Dienstverbindungen zwischen Dienst A, Dienst B und Dienst C verketten, ist es wichtig zu verstehen, dass die Aufrufe erfolgreich waren, und auch die Latenz bei jedem Schritt.

Mit Spring Cloud Sleuth können Sie in Spring Boot die verteilte Tracing-Instrumentierung Ihrer Anwendung nahtlos hinzufügen. Standardmäßig kann sie die Trace-Daten an Zipkin weiterleiten.

Die Google Cloud Platform bietet Stackdriver Trace, einen verwalteten Dienst, mit dem Sie Trace-Daten speichern können, ohne Ihre eigene Zipkin-Instanz oder ihren eigenen Speicherplatz verwalten zu müssen. Stackdriver Trace kann auch Berichte zur Latenzverteilung erstellen und Leistungs Regressionen automatisch erkennen.

Sie haben zwei Möglichkeiten, Stackdriver Trace von einer Spring Boot-Anwendung zu verwenden:

  1. Verwenden Sie einen Stackdriver Trace Zipkin-Proxy und konfigurieren Sie einfach die Spring Cloud Sleuth, um diesen Proxy als Zipkin-Endpunkt zu verwenden.
  2. Alternativ können Sie auch Spring Cloud GCP Trace verwenden, der sich nahtlos in Spring Cloud Sleuth einbinden und die Trace-Daten direkt an Stackdriver Trace weiterleiten lässt.

In diesem Codelab lernen Sie, wie Sie eine neue Spring Boot-Anwendung erstellen und Spring Cloud GCP Trace für das verteilte Tracing verwenden.

Lerninhalte

  • Spring Boot-Java-Anwendung erstellen und Stackdriver Trace konfigurieren.

Voraussetzungen

  • Google Cloud Platform-Projekt
  • Ein Browser, wie Chrome oder Firefox
  • Kenntnisse in standardmäßigen Linux-Texteditoren wie Vim, EMACs oder Nano

Wie werden Sie diese Anleitung verwenden?

Wie würdest du deine Erfahrung beim Erstellen von HTML-/CSS-Webanwendungen bewerten?

Wie würdest du deine Erfahrung mit der Nutzung der Google Cloud Platform-Dienste bewerten?

2. Einrichtung und Anforderungen

Umgebung im eigenen Tempo einrichten

Wenn Sie noch kein Google-Konto haben (Gmail oder Google Apps), müssen Sie eines erstellen. Melden Sie sich unter console.cloud.google.com in der Google Cloud Platform Console an und erstellen Sie ein neues Projekt:

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

Notieren Sie sich die Projekt-ID, also den projektübergreifend nur einmal vorkommenden Namen eines Google Cloud-Projekts. Der oben angegebene Name ist bereits vergeben und kann leider nicht mehr verwendet werden. In diesem Codelab wird sie später als PROJECT_ID bezeichnet.

Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Google Cloud-Ressourcen zu nutzen.

Das Durchlaufen dieses Codelabs sollte nicht mehr als ein paar Dollar kosten. Es kann aber auch sein, dass Sie mehr Ressourcen brauchen oder sie weiterlaufen möchten (siehe Abschnitt „Bereinigen“ am Ende dieses Dokuments).

Neuen Google Cloud Platform-Nutzern steht ein kostenloser Testzeitraum im Wert von 300 $ zur Verfügung.

Google Cloud Shell

Sie können Google Cloud und Kubernetes von Ihrem Laptop aus per Fernzugriff ausführen. In diesem Codelab nutzen wir Google Cloud Shell, eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird.

Google Cloud Shell aktivieren

Klicken Sie in der GCP Console oben rechts in der Symbolleiste auf das Cloud Shell-Symbol:

Klicken Sie dann auf "Cloud Shell starten":

Die Bereitstellung und Verbindung mit der Umgebung dauert nur einen Moment:

Diese virtuelle Maschine verfügt über sämtliche Entwicklertools, die Sie benötigen. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft auf der Google Cloud, wodurch Netzwerkleistung und Authentifizierung deutlich verbessert werden. Sie können die meisten, wenn nicht sogar alle Schritte in diesem Lab einfach mit einem Browser oder Ihrem Google Chromebook durchführen.

Sobald Sie mit Cloud Shell verbunden sind, sollten Sie sehen, dass Sie bereits authentifiziert sind und dass das Projekt auf Ihre PROJECT_ID festgelegt ist.

Führen Sie in Cloud Shell den folgenden Befehl aus, um zu bestätigen, dass Sie authentifiziert sind:

gcloud auth list

Befehlsausgabe

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Befehlsausgabe

[core]
project = <PROJECT_ID>

Ist dies nicht der Fall, können Sie die Einstellung mit diesem Befehl vornehmen:

gcloud config set project <PROJECT_ID>

Befehlsausgabe

Updated property [core/project].

3. Neuen Spring-Boot-REST-Dienst erstellen

Nach dem Start von Cloud Shell können Sie über die Befehlszeile eine neue Spring Boot-Anwendung mit Spring Initializr generieren:

$ 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

Erstellen Sie einen neuen REST-Controller, indem Sie eine neue Klasse hinzufügen:

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!";
 
}
}

Sie können die Spring-Boot-Anwendung normal mit dem Spring-Boot-Plug-in starten. Lassen Sie die Tests für dieses Lab überspringen:

$ ./mvnw -DskipTests spring-boot:run

Klicken Sie nach dem Start der Anwendung in der Cloud Shell-Symbolleiste auf „Webvorschau“ und wählen Sie Vorschau auf Port 8080 aus.

Nach kurzer Wartezeit sollten Sie das Ergebnis sehen:

In Cloud Shell sollten Sie auch die Logeinträge mit Trace-ID und Span-ID sehen:

4. Stackdriver Trace verwenden

Stackdriver Trace API aktivieren

Sie müssen zuerst die Stackdriver Trace API aktivieren, um Ihre Trace-Daten mit Stackdriver Trace speichern zu können. Um die API zu aktivieren, wechseln Sie zu API-Dienste → Bibliothek

Suchen Sie nach Stackdriver Trace.

Klicken Sie auf Stackdriver Trace API und dann auf Aktivieren, wenn die API bereits aktiviert ist.

Standardanmeldedaten für Anwendungen einrichten

In diesem Lab müssen Sie die Standardanmeldedaten für Anwendungen konfigurieren. Diese Anmeldedaten werden vom Spring Cloud GCP Trace Starter automatisch abgerufen.

Melden Sie sich zuerst an:

$ 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: ...

Klicken Sie auf den Link, um einen neuen Browsertab zu öffnen, und dann auf Zulassen.

Kopieren Sie dann den Bestätigungscode und fügen Sie ihn wieder in Cloud Shell ein und drücken Sie die Eingabetaste. Hier sollten Sie dies sehen:

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

Spring Cloud GCP Trace hinzufügen

Bei diesem Dienst haben wir bereits die Spring Cloud Sleuth für das Tracing verwendet. Fügen Sie Spring Cloud GCP Trace Starter hinzu, um die Daten an Stackdriver Trace weiterzuleiten.

Fügen Sie die Spring Cloud GCP-Trace-Abhängigkeit hinzu:

pom.xml

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

Standardmäßig verwendet Spring Cloud Sleuth nicht jede Anfrage. Für ein einfaches Test: Erhöhen Sie die Stichprobenrate in application.properties auf 100 %, damit die Trace-Daten angezeigt werden. Ignorieren Sie außerdem URLs, die für uns nicht relevant sind:

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

Führen Sie die Anwendung noch einmal aus und verwenden Sie die Cloud Shell-Webvorschau, um die Anwendung anzusehen:

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

Standardmäßig erfasst Spring Cloud GCP Trace Trace-Daten und sendet sie alle 10 Sekunden bzw. wenn eine Mindestanzahl von Trace-Daten empfangen wird. Das kann konfiguriert werden. Weitere Informationen finden Sie in der Referenzdokumentation zu Spring Cloud GCP Trace.

Stellen Sie eine Anfrage an den Dienst:

$ curl localhost:8080

Gehen Sie in der Cloud Console zu StackdriverTraceTrace-Liste

Grenzen Sie den Zeitraum oben auf eine Stunde ein. Die Option Automatische Aktualisierung ist standardmäßig aktiviert. Sobald die Trace-Daten eintreffen, sollten sie in der Konsole zu sehen sein.

Die Trace-Daten sollten ungefähr ca. 30 Sekunden lang angezeigt werden.

Klicken Sie auf den blauen Punkt, um die Trace-Details aufzurufen:

Das war ziemlich einfach.

5. Zweite Spring-Boot-Webanwendung erstellen

Öffnen Sie eine neue Cloud Shell-Sitzung. Klicken Sie dazu auf das +-Symbol:

Erstellen Sie in der neuen Sitzung die zweite Spring-Boot-Anwendung:

$ 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

Erstellen Sie einen neuen REST-Controller, indem Sie eine neue Klasse hinzufügen:

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";
 
}
}

Spring Cloud GCP Trace zur Datei pom.xml hinzufügen

pom.xml

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

Konfigurieren Sie die Sleuth für 100% der Anfragen:

src/main/resources/application.properties

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

Danach können Sie die Spring-Boot-Anwendung auf Port 8081 mit dem Spring-Boot-Plug-in starten:

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

6. Ersten Dienst aktualisieren, um zweiten Dienst zu nutzen

Wenn trace-service-two ausgeführt wird, kehren Sie zum ersten Cloud Shell-Sitzungsfenster zurück und nehmen Änderungen an trace-service-one vor.

Initialisiere zuerst eine neue RestTemplate-Bean:

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);
       
}
}

Rufen Sie in WorkController.meeting() einen Anruf an.

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);
 
}

 
...
}

Starten Sie den Dienst noch einmal und lösen Sie den Endpunkt aus der Webvorschau aus:

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

In beiden Sitzungsfenstern sollten Sie die Logeinträge sehen, wobei die Trace-ID von einem Dienst an einen anderen weitergegeben wird.

In der Stackdriver Trace-Trace-Liste sollte der zweite Trace angezeigt werden:

Sie können auf den neuen blauen Punkt klicken und die Trace-Details anzeigen:

Sie können auch auf eine beliebige Spanne in diesem Diagramm klicken, um die zugehörigen Details aufzurufen.

7. Latenzverteilung &Leistungsbericht

Wenn Sie Stackdriver Trace als Trace-Datenspeicher verwenden, kann der Bericht mit Stackdriver Trace einen Bericht zur Latenzverteilung erstellen. Sie benötigen mehr als 100 Traces, um den Bericht so zu erstellen:

Darüber hinaus kann Stackdriver Trace automatisch im Rahmen des Analyseberichts die Leistungseinbuße desselben Dienstes bei zwei verschiedenen Zeiträumen erkennen.

8. Zusammenfassung

In diesem Lab haben Sie zwei einfache Dienste erstellt und verteiltes Tracing mit Spring Cloud Sleuth hinzugefügt. Außerdem haben Sie die Spring Cloud GCP verwendet, um die Trace-Informationen an Stackdriver Trace weiterzuleiten.

9. Glückwunsch!

Sie haben gelernt, wie Sie Ihre erste App Engine-Webanwendung schreiben.

Weitere Informationen

Lizenz

Dieser Text ist mit einer Creative Commons Attribution 2.0 Generic License lizenziert.