Rozproszone śledzenie za pomocą usług Spring Cloud Sleuth i Cloud Trace

1. Przegląd

Rozproszone śledzenie jest ważne, aby uzyskać wgląd w architekturę mikroserwisów wielowarstwowych i możliwość jej obserwowania. Gdy masz połączone wywołania usług, od usługi A do usługi B do usługi C, ważne jest, aby wiedzieć, czy wywołania się powiodły, a także jakie jest opóźnienie na każdym etapie.

W Spring Boot możesz użyć Spring Cloud Sleuth, aby bezproblemowo dodać instrumentację śledzenia rozproszonego do aplikacji. Domyślnie może przekazywać dane śledzenia do Zipkina.

Google Cloud Platform ma Cloud Trace, czyli usługę zarządzaną, która umożliwia przechowywanie danych śledzenia bez konieczności zarządzania własną instancją Zipkin ani pamięcią. Cloud Trace może też generować raporty o rozkładzie opóźnień i automatycznie wykrywać regresje wydajności.

Z aplikacji Spring Boot możesz korzystać z Cloud Trace na 2 sposoby:

  1. Użyj serwera proxy Stackdriver Trace Zipkin i skonfiguruj Spring Cloud Sleuth tak, aby używał tego serwera proxy jako punktu końcowego Zipkin.
  2. Możesz też użyć Spring Cloud GCP Trace, która bezproblemowo integruje się z Spring Cloud Sleuth i przesyła dane śledzenia bezpośrednio do Cloud Trace.

Z tego przewodnika dowiesz się, jak utworzyć nową aplikację Spring Boot i używać Spring Cloud GCP Trace do śledzenia rozproszonego.

Czego się nauczysz

  • Jak utworzyć aplikację Spring Boot w Javie i skonfigurować Cloud Trace.

Czego potrzebujesz

  • Projekt Google Cloud Platform
  • przeglądarka, np. Chrome lub Firefox;
  • Znajomość standardowych edytorów tekstu systemu Linux, takich jak Vim, EMACS lub Nano.

Jak zamierzasz korzystać z tego samouczka?

Tylko przeczytaj Przeczytaj i wykonaj ćwiczenia

Jak oceniasz swoje doświadczenie w tworzeniu aplikacji internetowych w HTML/CSS?

Początkujący Średnio zaawansowany Zaawansowany

Jak oceniasz korzystanie z usług Google Cloud Platform?

Początkujący Średnio zaawansowany Zaawansowany

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub użyj istniejącego. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Nazwa projektu to wyświetlana nazwa uczestników tego projektu. Jest to ciąg znaków, który nie jest używany przez interfejsy API Google. Zawsze możesz ją zaktualizować.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić po ustawieniu. Konsola Cloud automatycznie generuje unikalny ciąg znaków. Zwykle nie musisz się tym przejmować. W większości ćwiczeń z programowania musisz odwoływać się do identyfikatora projektu (zwykle oznaczanego jako PROJECT_ID). Jeśli wygenerowany identyfikator Ci się nie podoba, możesz wygenerować inny losowy identyfikator. Możesz też spróbować własnej nazwy i sprawdzić, czy jest dostępna. Po tym kroku nie można go zmienić i pozostaje on taki przez cały czas trwania projektu.
  • Warto wiedzieć, że istnieje też trzecia wartość, numer projektu, której używają niektóre interfejsy API. Więcej informacji o tych 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w konsoli Cloud, aby korzystać z zasobów i interfejsów API Google Cloud. Wykonanie tego laboratorium nie będzie kosztować dużo, a może nawet nic. Aby wyłączyć zasoby i uniknąć naliczania opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub projekt. Nowi użytkownicy Google Cloud mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Google Cloud Shell

Z Google Cloud i Kubernetes można korzystać zdalnie na laptopie, ale w tym ćwiczeniu programistycznym będziemy używać Google Cloud Shell, czyli środowiska wiersza poleceń działającego w chmurze.

Aktywowanie Cloud Shell

  1. W konsoli Cloud kliknij Aktywuj Cloud Shell 853e55310c205094.png.

55efc1aaa7a4d3ad.png

Jeśli uruchamiasz Cloud Shell po raz pierwszy, zobaczysz ekran pośredni z opisem tego środowiska. Jeśli pojawił się ekran pośredni, kliknij Dalej.

9c92662c6a846a5c.png

Uzyskanie dostępu do środowiska Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.

9f0e51b578fecce5.png

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera również stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i usprawnia proces uwierzytelniania. Większość zadań w tym module, a być może wszystkie, możesz wykonać w przeglądarce.

Po połączeniu z Cloud Shell zobaczysz, że uwierzytelnianie zostało już przeprowadzone, a projekt jest już ustawiony na Twój identyfikator projektu.

  1. Aby potwierdzić, że uwierzytelnianie zostało przeprowadzone, uruchom w Cloud Shell to polecenie:
gcloud auth list

Wynik polecenia

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Aby potwierdzić, że polecenie gcloud zna Twój projekt, uruchom w Cloud Shell to polecenie:
gcloud config list project

Wynik polecenia

[core]
project = <PROJECT_ID>

Jeśli nie, możesz go ustawić za pomocą tego polecenia:

gcloud config set project <PROJECT_ID>

Wynik polecenia

Updated property [core/project].

3. Tworzenie nowej usługi REST Spring Boot

Po uruchomieniu Cloud Shell możesz użyć wiersza poleceń, aby wygenerować nową aplikację Spring Boot za pomocą 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

Utwórz nowy kontroler REST, dodając nową klasę:

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

Sprawdź, czy masz odpowiednią wersję JVM dla aplikacji:

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

Aplikację Spring Boot możesz uruchomić normalnie za pomocą wtyczki Spring Boot. Pomińmy testy w tym module:

$ ./mvnw -DskipTests spring-boot:run

Po uruchomieniu aplikacji kliknij ikonę podglądu w przeglądarce 3a9b40fafa650b2b.png na pasku narzędzi Cloud Shell i wybierz Podejrzyj na porcie 8080.

3aca52f76c6c22a3.png

Po krótkim czasie powinien pojawić się wynik:

6793a3339447cbb5.png

W Cloud Shell powinny też być widoczne wiadomości dziennika z identyfikatorem śledzenia i identyfikatorem zakresu:

18d597c388de1ba.png

4. Korzystanie z Cloud Trace

Włączanie interfejsu Cloud Trace API

Aby używać Cloud Trace do przechowywania danych śledzenia, musisz najpierw włączyć interfejs Cloud Trace API. Aby włączyć interfejs API, wykonaj to polecenie:

$ gcloud services enable cloudtrace.googleapis.com

Konfigurowanie domyślnego uwierzytelniania aplikacji

Na potrzeby tego modułu musisz skonfigurować domyślne dane logowania aplikacji. Te dane logowania zostaną automatycznie pobrane przez moduł startowy Spring Cloud GCP Trace.

Najpierw zaloguj się:

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

Kliknij link, aby otworzyć nową kartę przeglądarki, a następnie kliknij Zezwól.

85f500de6f5dc0a8.png

Następnie skopiuj i wklej kod weryfikacyjny z powrotem do Cloud Shell i naciśnij Enter. Zobaczysz, że:

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

Dodawanie śledzenia Spring Cloud GCP

W tej usłudze do śledzenia użyliśmy już Spring Cloud Sleuth. Dodajmy Spring Cloud GCP Trace Starter, aby przekazywać dane do Cloud Trace.

Dodaj zależność 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>

Domyślnie Spring Cloud Sleuth nie próbkuje każdego żądania. Aby ułatwić testowanie, zwiększ w application.properties częstotliwość próbkowania do 100%, aby mieć pewność, że widzisz dane śledzenia, a także zignoruj niektóre adresy URL, które Cię nie interesują:

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

Ponownie uruchom aplikację i wyświetl ją za pomocą podglądu w przeglądarce Cloud Shell:

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

Domyślnie Spring Cloud GCP Trace grupuje dane śledzenia i wysyła je co 10 sekund lub po otrzymaniu minimalnej liczby danych śledzenia. Możesz to skonfigurować. Więcej informacji znajdziesz w dokumentacji referencyjnej Spring Cloud GCP Trace.

Wysyłanie żądania do usługi:

$ curl localhost:8080

W konsoli Cloud kliknij Operacje → Śledzenie → Lista logów czasu.

be48cb0f99b5f7c2.png

U góry zawęź zakres czasu do 1 godziny. Domyślnie opcja Automatyczne doładowanie jest włączona. Gdy dane śledzenia dotrą, powinny pojawić się w konsoli.

3522eef823df39d8.png

Dane śledzenia powinny pojawić się po około 30 sekundach.

9628f6e1d2e75b05.png

Aby wyświetlić szczegóły śledzenia, kliknij niebieski punkt:

ba9051a8d4f3e725.png

To było całkiem proste.

5. Tworzenie drugiej aplikacji internetowej Spring Boot

Otwórz nową sesję Cloud Shell, klikając ikonę +:

9799bee5fea95aa6.png

W nowej sesji utwórz drugą aplikację 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

Utwórz nowy kontroler REST, dodając nową klasę:

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

Dodawanie Spring Cloud GCP Trace do pliku 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>

Skonfiguruj Sleuth tak, aby próbkował 100% żądań:

src/main/resources/application.properties

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

Na koniec możesz uruchomić aplikację Spring Boot na porcie 8081 za pomocą wtyczki 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. Aktualizowanie pierwszej usługi w celu korzystania z drugiej usługi

Gdy trace-service-two jest uruchomiony, wróć do pierwszego okna sesji Cloud Shell i zmodyfikuj plik trace-service-one.

Najpierw zainicjuj nowy komponent 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);
        }
}

W WorkController.meeting() zadzwoń do usługi spotkań.

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

  ...
}

Ponownie uruchom usługę i wywołaj punkt końcowy z wiersza poleceń:

$ 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

W obu oknach sesji powinny być widoczne komunikaty logu z identyfikatorem śledzenia przekazywanym z jednej usługi do drugiej.

Na liście logów czasu w Cloud Trace powinien być widoczny drugi log czasu:

13490977f1638702.png

Możesz kliknąć nowy niebieski punkt i wyświetlić szczegóły śladu:

ca69ef9cdd13d4aa.png

Możesz też kliknąć dowolny przedział na tym diagramie, aby wyświetlić jego szczegóły.

7. Raport o rozkładzie opóźnień i skuteczności

Jeśli używasz Cloud Trace jako magazynu danych śledzenia, usługa ta może wykorzystywać dane do tworzenia raportu o rozkładzie czasu oczekiwania. Aby utworzyć taki raport, musisz mieć ponad 100 śladów:

c8713f3d9e51dc25.png

Pierwsze 100 żądań możesz uruchomić za pomocą narzędzia hey, które jest już zainstalowane w Cloud Shell.

$ hey localhost:8080 -n 150

Dodatkowo Cloud Trace może automatycznie wykrywać regresję wydajności tej samej usługi w 2 różnych okresach w sekcji Raport analizy.

8. Podsumowanie

W tym module utworzyliśmy 2 proste usługi i dodaliśmy śledzenie rozproszone za pomocą Spring Cloud Sleuth oraz użyliśmy Spring Cloud GCP do przesyłania informacji o śledzeniu do Cloud Trace.

9. Gratulacje!

Wiesz już, jak napisać pierwszą aplikację internetową App Engine.

Więcej informacji

Licencja

To zadanie jest licencjonowane na podstawie ogólnej licencji Creative Commons Attribution 2.0.