Verteiltes Tracing mit Spring Cloud Sleuth und Cloud Trace

1. Übersicht

Verteiltes Tracing ist wichtig, um Einblicke und Beobachtbarkeit für eine mehrstufige Mikrodienstarchitektur zu gewinnen. Wenn Sie Dienst- und Dienstaufrufe verkettet haben, von Dienst A über Dienst B bis Dienst C, ist es wichtig zu verstehen, dass die Aufrufe erfolgreich waren, und auch die Latenz bei jedem Schritt.

In Spring Boot können Sie Spring Cloud Sleuth verwenden, um Ihrer Anwendung nahtlos die verteilte Tracing-Instrumentierung hinzuzufügen. Standardmäßig können die Trace-Daten an Zipkin weitergeleitet werden.

Zur Google Cloud Platform gehört Cloud Trace, ein verwalteter Dienst, mit dem Sie Trace-Daten speichern können, ohne eine eigene Zipkin-Instanz oder einen eigenen Speicher verwalten zu müssen. Cloud Trace kann außerdem Latenzverteilungsberichte erstellen und Leistungsabfälle automatisch erkennen.

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

  1. Verwenden Sie einen Stackdriver Trace Zipkin-Proxy und konfigurieren Sie Spring Cloud Sleuth einfach so, dass dieser Proxy als Zipkin-Endpunkt verwendet wird.
  2. Alternativ können Sie Spring Cloud GCP Trace verwenden, das sich nahtlos in Spring Cloud Sleuth einbinden und die Trace-Daten direkt an Cloud Trace weiterleitet.

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

Aufgaben in diesem Lab

  • Spring Boot Java-Anwendung erstellen und Cloud Trace konfigurieren

Voraussetzungen

  • Google Cloud Platform-Projekt
  • Browser, z. B. Chrome oder Firefox
  • Erfahrung mit standardmäßigen Linux-Texteditoren wie vim, EMAC oder Nano

Wie möchten Sie diese Anleitung nutzen?

<ph type="x-smartling-placeholder"></ph> Nur bis zum Ende lesen Lies sie dir durch und absolviere die Übungen

Wie würden Sie Ihre Erfahrung mit der Erstellung von HTML/CSS-Web-Apps bewerten?

<ph type="x-smartling-placeholder"></ph> Neuling Leicht fortgeschritten Kompetent

Wie würden Sie Ihre Erfahrungen im Umgang mit Google Cloud Platform-Diensten bewerten?

<ph type="x-smartling-placeholder"></ph> Neuling Mittel Kompetent

2. Einrichtung und Anforderungen

Umgebung für das selbstbestimmte Lernen einrichten

  1. Melden Sie sich in der Google Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes Projekt. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie eines erstellen.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Der Projektname ist der Anzeigename für die Projektteilnehmer. Es handelt sich um eine Zeichenfolge, die von Google APIs nicht verwendet wird. Sie können sie jederzeit aktualisieren.
  • Die Projekt-ID ist für alle Google Cloud-Projekte eindeutig und unveränderlich. Sie kann nach dem Festlegen nicht mehr geändert werden. Die Cloud Console generiert automatisch einen eindeutigen String. ist Ihnen meist egal, was es ist. In den meisten Codelabs musst du auf deine Projekt-ID verweisen, die üblicherweise als PROJECT_ID bezeichnet wird. Wenn Ihnen die generierte ID nicht gefällt, können Sie eine weitere zufällige ID generieren. Alternativ können Sie einen eigenen verwenden und nachsehen, ob er verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts erhalten.
  • Zur Information gibt es noch einen dritten Wert, die Projektnummer, die von manchen APIs verwendet wird. Weitere Informationen zu allen drei Werten finden Sie in der Dokumentation.
  1. Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Cloud-Ressourcen/APIs verwenden zu können. Dieses Codelab ist kostengünstig. Sie können die von Ihnen erstellten Ressourcen oder das Projekt löschen, um Ressourcen herunterzufahren, um zu vermeiden, dass über diese Anleitung hinaus Kosten anfallen. Neue Google Cloud-Nutzer haben Anspruch auf das kostenlose Testprogramm mit 300$Guthaben.

Google Cloud Shell

Sie können Google Cloud und Kubernetes über Ihren Laptop remote bedienen. In diesem Codelab verwenden wir jedoch Google Cloud Shell, eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird.

Cloud Shell aktivieren

  1. Klicken Sie in der Cloud Console auf Cloud Shell aktivieren 853e55310c205094.png.

55efc1aaa7a4d3ad.png

Wenn Sie Cloud Shell zum ersten Mal starten, wird ein Zwischenbildschirm mit einer Beschreibung der Funktion angezeigt. Wenn ein Zwischenbildschirm angezeigt wird, klicken Sie auf Weiter.

9c92662c6a846a5c.png

Die Bereitstellung und Verbindung mit Cloud Shell dauert nur einen Moment.

9f0e51b578fecce5.png

Diese virtuelle Maschine verfügt über alle erforderlichen Entwicklertools. Es bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und wird in Google Cloud ausgeführt. Dadurch werden die Netzwerkleistung und die Authentifizierung erheblich verbessert. Viele, wenn nicht sogar alle Arbeiten in diesem Codelab können mit einem Browser erledigt werden.

Sobald Sie mit Cloud Shell verbunden sind, sollten Sie sehen, dass Sie authentifiziert sind und das Projekt auf Ihre Projekt-ID eingestellt ist.

  1. Führen Sie in Cloud Shell den folgenden Befehl aus, um zu prüfen, ob Sie authentifiziert sind:
gcloud auth list

Befehlsausgabe

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Führen Sie in Cloud Shell den folgenden Befehl aus, um zu prüfen, ob der gcloud-Befehl Ihr Projekt kennt:
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 die Befehlszeile verwenden, um mit Spring Initializr eine neue Spring Boot-Anwendung zu generieren:

$ 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

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

Überprüfen Sie, ob Sie die richtige JVM-Version für die Anwendung haben:

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

Sie können die Spring Boot-Anwendung normal mit dem Spring Boot-Plug-in starten. In diesem Lab überspringen wir die Tests:

$ ./mvnw -DskipTests spring-boot:run

Anschließend klicken Sie in der Cloud Shell-Symbolleiste auf "Web Preview" (Webvorschau) 5a9b40fafa650b2b.png und wählenPreview on port 8080 (Vorschau auf Port 8080) aus.

3aca52f76c6c22a3.png

Nach einer kurzen Wartezeit sollten Sie folgendes Ergebnis sehen:

6793a3339447cbb5.png

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

18d597c388de1ba.png

4. Cloud Trace verwenden

Cloud Trace API aktivieren

Sie müssen zuerst die Cloud Trace API aktivieren, bevor Sie Ihre Trace-Daten mit Cloud Trace speichern können. Führen Sie folgenden Befehl aus, um die API zu aktivieren:

$ gcloud services enable cloudtrace.googleapis.com

Standardanmeldedaten für Anwendungen einrichten

Für dieses Lab müssen Sie Standardanmeldedaten für Anwendungen konfigurieren. Diese Anmeldedaten werden automatisch vom Spring Cloud GCP Trace-Starter ausgewählt.

Melden Sie sich zunächst 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.

85f500de6f5dc0a8.png

Kopieren Sie dann den Bestätigungscode, fügen Sie ihn 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

In diesem Dienst haben wir bereits Spring Cloud Sleuth zum Tracing verwendet. Fügen Sie den Spring Cloud GCP Trace-Starter hinzu, um die Daten an Cloud Trace weiterzuleiten.

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

pom.xml

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

Standardmäßig erfasst Spring Cloud Sleuth nicht jede Anfrage. Um unsere Tests etwas einfacher zu gestalten, erhöhen Sie die Stichprobenrate in application.properties auf 100 %, damit wir die Trace-Daten sehen und einige URLs ignorieren, die uns nicht wichtig 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 sie anzusehen:

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

Spring Cloud GCP Trace fasst Trace-Daten standardmäßig zusammen und sendet sie alle 10 Sekunden oder wenn eine Mindestanzahl von Trace-Daten empfangen wird. Dies ist konfigurierbar. 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 VorgängeTraceTrace-Liste

be48cb0f99b5f7c2.png

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

3522eef823df39d8.png

Die Trace-Daten sollten in etwa 30 Sekunden angezeigt werden.

9628f6e1d2e75b05.png

Klicken Sie auf den blauen Punkt, um die Tracedetails aufzurufen:

ba9051a8d4f3e725.png

Das war ziemlich einfach!

5. Zweite Spring Boot-Webanwendung erstellen

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

9799bee5fea95aa6.png

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

$ 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

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 zu pom.xml hinzufügen

pom.xml

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

Konfigurieren Sie Sleuth so, dass 100% der Anfragen erfasst werden:

src/main/resources/application.properties

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

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

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

6. Ersten Dienst aktualisieren, um zweiten Dienst zu nutzen

Während trace-service-two ausgeführt wird, kehren Sie zum ersten Cloud Shell-Sitzungsfenster zurück und ändern Sie trace-service-one.

Initialisieren Sie 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() den Besprechungsdienst 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 neu und lösen Sie den Endpunkt über die Befehlszeile aus:

$ 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 beiden Sitzungsfenstern sollten die Protokollmeldungen angezeigt werden, wobei die Trace-ID von einem Dienst an einen anderen weitergegeben wird.

In der Trace-Liste von Cloud Trace sollte der zweite Trace angezeigt werden:

13490977f1638702.png

Sie können auf den neuen blauen Punkt klicken, um die Trace-Details aufzurufen:

ca69ef9cdd13d4aa.png

Sie können auch auf eine Span in diesem Diagramm klicken, um die Details anzuzeigen.

7. Latenzverteilung und Leistungsbericht

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

c8713f3d9e51dc25.png

Für die ersten 100 Anfragen können Sie hey verwenden, das in Cloud Shell vorinstalliert ist.

$ hey localhost:8080 -n 150

Darüber hinaus kann Cloud Trace unter Analysebericht automatisch Leistungsabfälle desselben Dienstes über zwei verschiedene Zeiträume hinweg 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 Spring Cloud GCP verwendet, um die Trace-Informationen an Cloud Trace weiterzuleiten.

9. Glückwunsch!

Jetzt wissen Sie, wie Sie Ihre erste App Engine-Webanwendung schreiben.

Weitere Informationen

Lizenz

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