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

Распределённая трассировка важна для получения аналитической информации и контроля за многоуровневой архитектурой микросервисов. При объединении вызовов между сервисами в цепочку, от сервиса 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 Proxy и просто настройте Spring Cloud Sleuth для использования этого прокси в качестве конечной точки Zipkin.
  2. Или используйте Spring Cloud GCP Trace, который легко интегрируется с Spring Cloud Sleuth и пересылает данные трассировки непосредственно в Stackdriver Trace.

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

Чему вы научитесь

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

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

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

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

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

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

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

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

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

Настройка среды для самостоятельного обучения

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

Скриншот от 2016-02-10 12:45:26.png

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

Далее вам необходимо включить биллинг в Cloud Console, чтобы использовать ресурсы Google Cloud.

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

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

Google Cloud Shell

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

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

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

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

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

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

После подключения к 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].

После запуска 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 вы также должны увидеть сообщения журнала с идентификатором трассировки и идентификатором диапазона:

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

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

Поиск Stackdriver Trace

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

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

По умолчанию 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

В Cloud Console перейдите в StackdriverTraceTrace list.

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

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

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

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

Откройте новый сеанс 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

pom.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/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 -Dserver.port=8081

При запущенном 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() выполните вызов службы 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)'`
$ ./mvnw -DskipTests spring-boot:run

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

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

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

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

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

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

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

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

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

Лицензия

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