Śledzenie rozproszone za pomocą Spring Cloud Sleuth i Stackdriver Trace

Śledzenie rozproszone 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 swojej aplikacji. Domyślnie może przekazywać dane śledzenia do Zipkina.

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

Aplikacja Spring Boot może korzystać z Stackdriver 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 Stackdriver 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ć Stackdriver 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

Samodzielne konfigurowanie środowiska

Jeśli nie masz jeszcze konta Google (Gmail lub Google Apps), musisz je utworzyć. Zaloguj się w konsoli Google Cloud Platform (console.cloud.google.com) i utwórz nowy projekt:

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

Zapamiętaj identyfikator projektu, czyli unikalną nazwę we wszystkich projektach Google Cloud (podana powyżej nazwa jest już zajęta i nie będzie działać w Twoim przypadku). W dalszej części tego laboratorium będzie on nazywany PROJECT_ID.

Następnie musisz włączyć płatności w konsoli Cloud, aby móc korzystać z zasobów Google Cloud.

Wykonanie tego samouczka nie powinno kosztować więcej niż kilka dolarów, ale może okazać się droższe, jeśli zdecydujesz się wykorzystać więcej zasobów lub pozostawisz je uruchomione (patrz sekcja „Czyszczenie” na końcu tego dokumentu).

Nowi użytkownicy Google Cloud Platform mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Google Cloud Shell

Google Cloud i Kubernetes można obsługiwać zdalnie z laptopa, ale w tym module praktycznym będziemy używać Google Cloud Shell, czyli środowiska wiersza poleceń działającego w chmurze.

Aktywuj Google Cloud Shell

W konsoli GCP kliknij ikonę Cloud Shell na pasku narzędzi w prawym górnym rogu:

Następnie kliknij „Uruchom Cloud Shell”:

Udostępnienie środowiska i połączenie się z nim powinno zająć tylko kilka chwil:

Ta maszyna wirtualna zawiera wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelniania. Większość, jeśli nie wszystkie, zadań w tym laboratorium można wykonać za pomocą przeglądarki lub Chromebooka Google.

Po połączeniu z Cloud Shell zobaczysz, że jesteś już uwierzytelniony, a projekt jest już ustawiony na PROJECT_ID.

Aby potwierdzić, że masz autoryzację, uruchom w Cloud Shell to polecenie:

gcloud auth list

Wynik polecenia

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

Wynik polecenia

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

Wynik polecenia

Updated property [core/project].

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 dependencies=web,lombok,cloud-gcp,cloud-starter-sleuth \
  -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!";
  }
}

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ąd w przeglądarce  na pasku narzędzi Cloud Shell i wybierz Podejrzyj na porcie 8080.

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

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

Włączanie interfejsu Stackdriver Trace API

Aby używać Stackdriver Trace do przechowywania danych monitorowania, musisz najpierw włączyć interfejs Stackdriver Trace API. Aby włączyć interfejs API, otwórz Usługi API → Biblioteka.

Wyszukaj Stackdriver Trace.

Kliknij Stackdriver Trace API, a następnie Włącz, jeśli ten interfejs API nie jest włączony.

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.

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 starter Spring Cloud GCP Trace, aby przekazywać dane do Stackdriver Trace.

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

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 otwórz Stackdriver → Trace → Lista logów czasu.

U góry zawęź zakres czasu do 1 godziny. Domyślnie opcja Automatyczne ponowne wczytywanie jest włączona. Gdy dane śledzenia będą docierać, powinny pojawiać się w konsoli.

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

Aby wyświetlić szczegóły śledzenia, kliknij niebieską kropkę:

To było całkiem proste.

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

W nowej sesji utwórz drugą aplikację Spring Boot:

$ 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

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 Stackdriver Trace starter -->
    <dependency>
      <groupId>org.springframework.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 -Dserver.port=8081

Gdy trace-service-two jest uruchomiony, wróć do pierwszego okna sesji Cloud Shell i zmień 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 podglądu w internecie:

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

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 Stackdriver Trace powinien pojawić się drugi log czasu:

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

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

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

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

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 Stackdriver Trace.

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.