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

1. Обзор

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

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

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

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

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

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

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

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

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

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

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

Прочтите только до конца Прочитайте его и выполните упражнения.

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

Новичок Средний Опытный

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

Новичок Средний Опытный

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

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

  1. Войдите в Google Cloud Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Имя проекта — это отображаемое имя для участников этого проекта. Это строка символов, не используемая API Google. Вы всегда можете обновить его.
  • Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (нельзя изменить после его установки). Cloud Console автоматически генерирует уникальную строку; обычно тебя не волнует, что это такое. В большинстве лабораторий кода вам потребуется указать идентификатор проекта (обычно идентифицируемый как PROJECT_ID ). Если вам не нравится сгенерированный идентификатор, вы можете создать другой случайный идентификатор. Альтернативно, вы можете попробовать свой собственный и посмотреть, доступен ли он. Его нельзя изменить после этого шага и он сохраняется на протяжении всего проекта.
  • К вашему сведению, есть третье значение — номер проекта , которое используют некоторые API. Подробнее обо всех трех этих значениях читайте в документации .
  1. Затем вам необходимо включить выставление счетов в Cloud Console, чтобы использовать облачные ресурсы/API. Прохождение этой кодовой лаборатории не будет стоить много, если вообще что-то стоить. Чтобы отключить ресурсы и избежать выставления счетов за пределами этого руководства, вы можете удалить созданные вами ресурсы или удалить проект. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .

Google Cloud Shell

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

Активировать Cloud Shell

  1. В Cloud Console нажмите «Активировать Cloud Shell». 853e55310c205094.png .

55efc1aaa7a4d3ad.png

Если вы запускаете Cloud Shell впервые, вы увидите промежуточный экран с описанием того, что это такое. Если вам был представлен промежуточный экран, нажмите «Продолжить» .

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

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

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

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

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

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте:
gcloud config list project

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

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

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

Updated property [core/project].

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

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

Создайте новый контроллер 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!";
  }
}

Убедитесь, что у вас есть правильная версия JVM для приложения:

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

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

$ ./mvnw -DskipTests spring-boot:run

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

3aca52f76c6c22a3.png

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

6793a3339447cbb5.png

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

18d597c388de1ba.png

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

Включить Cloud Trace API

Прежде чем использовать Cloud Trace для хранения данных трассировки, необходимо включить API Cloud Trace. Чтобы включить API, выполните:

$ gcloud services enable cloudtrace.googleapis.com

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

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

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

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

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

85f500de6f5dc0a8.png

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

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 для пересылки данных в Cloud Trace.

Добавьте зависимость 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>

По умолчанию 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 Web Preview, чтобы просмотреть его:

$ 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

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

be48cb0f99b5f7c2.png

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

3522eef823df39d8.png

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

9628f6e1d2e75b05.png

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

ba9051a8d4f3e725.png

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

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

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

9799bee5fea95aa6.png

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

Создайте новый контроллер 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

pom.xml

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

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

src/main/resources/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 -Dspring-boot.run.jvmArguments="-Dserver.port=8081"

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

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

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

  ...
}

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

$ 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

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

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

13490977f1638702.png

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

ca69ef9cdd13d4aa.png

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

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

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

c8713f3d9e51dc25.png

Вы можете выполнить эти первые 100+ запросов с помощью hey , который предварительно установлен в Cloud Shell !

$ hey localhost:8080 -n 150

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

8. Резюме

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

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

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

Узнать больше

Лицензия

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