Распределенная трассировка с помощью Spring Cloud Sleuth и Stackdriver Trace

Распределенная трассировка с помощью Spring Cloud Sleuth и Stackdriver Trace

О практической работе

subjectПоследнее обновление: февр. 10, 2020
account_circleАвтор: сотрудник Google

1. Обзор

Распределенная трассировка важна для понимания и наблюдения за многоуровневой архитектурой микросервисов. Когда вы связываете вызовы между сервисами, от сервиса A к сервису B и к сервису C, важно понимать, что вызовы были успешными, а также задержку на каждом этапе.

В Spring Boot вы можете использовать Spring Cloud Sleuth, чтобы беспрепятственно добавлять инструментарий распределенной трассировки в свое приложение. По умолчанию он может пересылать данные трассировки в Zipkin.

В Google Cloud Platform есть Stackdriver Trace — управляемая служба, позволяющая хранить данные трассировки без необходимости управлять собственным экземпляром Zipkin или хранилищем. Stackdriver Trace также может создавать отчеты о распределении задержек и автоматически обнаруживать снижение производительности.

У вас есть два варианта использования Stackdriver Trace из приложения Spring Boot:

  1. Используйте прокси- сервер Stackdriver Trace Zipkin и просто настройте Spring Cloud Sleuth для использования этого прокси-сервера в качестве конечной точки Zipkin.
  2. Или используйте Spring Cloud GCP Trace, который легко интегрируется с Spring Cloud Sleuth и передает данные трассировки непосредственно в Stackdriver Trace.

В этой лаборатории кода вы узнаете, как создать новое приложение Spring Boot и использовать Spring Cloud GCP Trace для распределенной трассировки.

Что вы узнаете

  • Как создать Java-приложение Spring Boot и настроить Stackdriver Trace.

Что вам понадобится

  • Проект облачной платформы Google
  • Браузер, такой как Chrome или Firefox
  • Знакомство со стандартными текстовыми редакторами Linux, такими как Vim, EMACs или Nano

Как вы будете использовать этот учебник?

Как бы вы оценили свой опыт создания веб-приложений HTML/CSS?

Как бы вы оценили свой опыт использования сервисов Google Cloud Platform?

2. Установка и требования

Самостоятельная настройка среды

Если у вас еще нет учетной записи Google (Gmail или Google Apps), вы должны создать ее. Войдите в консоль Google Cloud Platform ( console.cloud.google.com ) и создайте новый проект:

Скриншот от 10 февраля 2016 г., 12:45:26.png

Запомните идентификатор проекта, уникальное имя для всех проектов Google Cloud (имя выше уже занято и не будет работать для вас, извините!). Позже в этой кодовой лаборатории он будет упоминаться как PROJECT_ID .

Затем вам нужно включить выставление счетов в облачной консоли, чтобы использовать ресурсы Google Cloud.

Прохождение этой кодовой лаборатории не должно стоить вам больше нескольких долларов, но может стоить больше, если вы решите использовать больше ресурсов или оставите их работающими (см. раздел «Очистка» в конце этого документа).

Новые пользователи Google Cloud Platform имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Облачная оболочка Google

В то время как Google Cloud и Kubernetes можно управлять удаленно с вашего ноутбука, в этой кодовой лаборатории мы будем использовать Google Cloud Shell , среду командной строки, работающую в облаке.

Активировать облачную оболочку Google

В консоли GCP щелкните значок Cloud Shell на верхней правой панели инструментов:

Затем нажмите «Запустить Cloud Shell»:

Подготовка и подключение к среде займет всего несколько минут:

Эта виртуальная машина загружена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог размером 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Многое, если не все, из вашей работы в этом лабораторном занятии можно выполнить просто с помощью браузера или вашего Google Chromebook.

После подключения к Cloud Shell вы должны увидеть, что вы уже прошли аутентификацию и что для проекта уже задан ваш PROJECT_ID .

Выполните следующую команду в Cloud Shell, чтобы подтвердить, что вы прошли аутентификацию:

gcloud auth list

Вывод команды

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

Вывод команды

[core]
project = <PROJECT_ID>

Если это не так, вы можете установить его с помощью этой команды:

gcloud config set project <PROJECT_ID>

Вывод команды

Updated property [core/project].

3. Создайте новую службу Spring Boot REST

После запуска Cloud Shell вы можете использовать командную строку для создания нового приложения Spring Boot с помощью 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

Создайте новый контроллер REST, добавив новый класс:

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

Вы можете нормально запустить приложение Spring Boot с помощью подключаемого модуля Spring Boot. Пропустим тесты для этой лаборатории:

$ ./mvnw -DskipTests spring-boot:run

После запуска приложения щелкните значок веб-просмотра. на панели инструментов Cloud Shell и выберите предварительный просмотр на порту 8080 .

После небольшого ожидания вы должны увидеть результат:

В Cloud Shell вы также должны увидеть сообщения журнала с идентификатором трассировки и идентификатором диапазона:

4. Использование трассировки Stackdriver

Включить API трассировки Stackdriver

Сначала необходимо включить Stackdriver Trace API, чтобы использовать Stackdriver Trace для хранения данных трассировки. Чтобы включить API, перейдите в Службы API → Библиотека .

Поиск трассировки Stackdriver

Щелкните Stackdriver Trace API , затем щелкните Включить , если он еще не включен.

Настройка учетных данных приложения по умолчанию

Для этого практического занятия вам потребуется настроить учетные данные приложения по умолчанию. Эти учетные данные будут автоматически получены стартером Spring Cloud GCP Trace.

Сначала войдите в систему:

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

Нажмите на ссылку, чтобы открыть новую вкладку браузера, а затем нажмите Разрешить

Затем скопируйте и вставьте код подтверждения обратно в Cloud Shell и нажмите клавишу ввода. Тебе следует увидеть:

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

В этом сервисе мы уже использовали Spring Cloud Sleuth для трассировки. Давайте добавим стартер Spring Cloud GCP Trace для пересылки данных в Stackdriver Trace.

Добавьте зависимость Spring Cloud GCP Trace:

пом.xml

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

По умолчанию Spring Cloud Sleuth не выполняет выборку каждого запроса. Чтобы немного упростить наше тестирование, увеличьте частоту выборки до 100% в application.properties , чтобы убедиться, что мы видим данные трассировки, а также игнорировать некоторые URL-адреса, которые нам не нужны:

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

Запустите приложение еще раз и используйте веб-просмотр Cloud Shell для просмотра приложения:

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

По умолчанию Spring Cloud GCP Trace группирует данные трассировки и отправляет их каждые 10 секунд или при получении минимального количества данных трассировки. Это настраивается, и вы можете обратиться к справочной документации Spring Cloud GCP Trace для получения дополнительной информации.

Сделать запрос в сервис:

$ curl localhost:8080

В облачной консоли перейдите в StackdriverТрассировкаСписок трассировок .

Вверху сузьте временной диапазон до 1 часа. По умолчанию автообновление включено . Таким образом, по мере поступления данных трассировки они должны отображаться в консоли!

Данные трассировки должны появиться примерно через 30 секунд.

Нажмите на синюю точку, чтобы увидеть подробности трассировки:

Это было довольно просто!

5. Создайте второе веб-приложение Spring Boot

Откройте новый сеанс Cloud Shell, щелкнув значок + :

В новом сеансе создайте второе приложение 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

Создайте новый контроллер REST, добавив новый класс:

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 в pom.xml

пом.xml

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

Настройте Sleuth для выборки 100% запросов:

src/основной/ресурсы/application.properties

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

Наконец, вы можете запустить приложение Spring Boot на порту 8081 с помощью плагина Spring Boot:

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

6. Обновите первую службу, чтобы использовать вторую службу

Пока у вас работает trace-service-two , вернитесь к первому окну сеанса Cloud Shell и внесите изменения в trace-service-one .

Сначала инициализируйте новый 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);
       
}
}

В WorkController.meeting() сделайте вызов службы собраний.

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

 
...
}

Запустите службу снова и активируйте конечную точку из Web Preview:

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

В обоих окнах сеанса вы должны увидеть сообщения журнала с идентификатором трассировки, передаваемым от одной службы к другой.

В списке трассировки Stackdriver Trace вы должны увидеть вторую трассировку:

Вы можете нажать на новую синюю точку и увидеть детали трассировки:

Вы также можете щелкнуть любой отрезок на этой диаграмме, чтобы просмотреть подробные сведения о пролете.

7. Распределение задержки и отчет о производительности

Когда вы используете Stackdriver Trace в качестве хранилища данных трассировки, Stackdriver Trace может использовать данные для создания отчета о распределении задержки. Вам понадобится более 100 трассировок, чтобы построить такой отчет:

Кроме того, Stackdriver Trace может автоматически обнаруживать снижение производительности одного и того же сервиса в течение двух разных периодов времени в отчете об анализе .

8. Резюме

В этой лабораторной работе вы создали 2 простых сервиса и добавили распределенную трассировку с помощью Spring Cloud Sleuth, а также использовали Spring Cloud GCP для пересылки информации трассировки в Stackdriver Trace.

9. Поздравляем!

Вы научились писать свое первое веб-приложение App Engine!

Учить больше

Лицензия

Эта работа находится под лицензией Creative Commons Attribution 2.0 Generic License.