Мониторинг приложений Spring Boot на практике

Spring Boot задняя часть сервер Docker
Мониторинг приложений Spring Boot на практике

Обзор

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

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

Примечание:Эта статья была впервые опубликована на моем официальном аккаунтеCodeSheep,Могунажиматьилисканированиепоследующийбудь остороженЗаходи подписывайся ↓ ↓ ↓

CodeSheep · 程序羊


Расширить компонент ZipkinTool

ZipkinTool находится в"Построение микросервисного центра отслеживания цепочки вызовов"Инструментальный компонент, написанный в этой статье, который взаимодействует с Zipkin, использует его для отслеживания цепочки вызовов микросервиса.Теперь, если мы хотим отслеживать цепочку вызовов базы данных Mysql, мы можем расширить его функцию.

  • pom.xml добавить зависимости:
<dependency>
        <groupId>io.zipkin.brave</groupId>
        <artifactId>brave-mysql</artifactId>
        <version>4.0.6</version>
</dependency>
  • Добавьте MySQLStatementInterceptorManagementBean в класс ZipkinConfiguration.
    @Bean
    public MySQLStatementInterceptorManagementBean mySQLStatementInterceptorManagementBean() {
        return new MySQLStatementInterceptorManagementBean(brave().clientTracer());
    }

Добавьте микросервис для доступа к базе данных Mysql.

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

  • Добавьте зависимости JDBC и Mysql в pom.xml.
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
  • Добавьте конфигурацию подключения Mysql в application.properties.
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://你的Mysql服务所在IP:3307/test?useSSL=false\
  &statementInterceptors=com.github.kristofa.brave.mysql.MySQLStatementInterceptor\
  &zipkinServiceName=mysqlService
spring.datasource.username=root
spring.datasource.password=XXXXXX
  • Добавьте код JdbcTemplate для доступа к базе данных в контроллере.
    @GetMapping("/mysqltest”)
    public String mysqlTest() {
        String name = jdbcTemplate.queryForObject( "SELECT name FROM user WHERE id = 1", String.class );
        return "Welcome " + name;
    }

Запустите службу базы данных Mysql

1. Запустите контейнер Mysql

docker run -d -p 3307:3306 \
-v ~/mysql/data:/var/lib/mysql \
-v ~/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=XXXXXX \
--name mysql mysql

2. Запустите другой контейнер Mysql, получите к нему доступ и выполните некоторые настройки.

  • Сначала введите командную строку mysql
docker run -it --rm \
--link mysql:mysql mysql \
mysql -hmysql -u root -p

进入Mysql的命令行

  • Затем создайте базу данных zipkin: используется для хранения данных, собранных Zipkin.
CREATE DATABASE `zipkin`

CREATE TABLE IF NOT EXISTS zipkin_spans (
  `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit’,
  `trace_id` BIGINT NOT NULL,
  `id` BIGINT NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  `parent_id` BIGINT,
  `debug` BIT(1),
  `start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL’,
  `duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query’
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

ALTER TABLE zipkin_spans ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `id`) COMMENT 'ignore insert on duplicate’;
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`, `id`) COMMENT 'for joining with zipkin_annotations’;
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds’;
ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames’;
ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range’;

CREATE TABLE IF NOT EXISTS zipkin_annotations (
  `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit’,
  `trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id’,
  `span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id’,
  `a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1’,
  `a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB’,
  `a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation’,
  `a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp’,
  `endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null’,
  `endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address’,
  `endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null’,
  `endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null’
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate’;
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans’;
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds’;
ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames’;
ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces’;
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces’;
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job’;

CREATE TABLE IF NOT EXISTS zipkin_dependencies (
  `day` DATE NOT NULL,
  `parent` VARCHAR(255) NOT NULL,
  `child` VARCHAR(255) NOT NULL,
  `call_count` BIGINT,
  `error_count` BIGINT
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

ALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`);

Здесь создаются три таблицы данных.

Файл Sql можно получить по следующей ссылке: https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql/src/main/resources/mysql.sql.

После выполнения скрипта Sql вы увидите, что были построены три таблицы, относящиеся к zipkin:

Zipkin相关的三个表

Zipkin相关的三个表

  • Создать тест базы данных: использовать в качестве тестовой базы данных
CREATE DATABASE `test`
CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `name` varchar(100) DEFAULT NULL ,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET = utf8;

insert into user values (1,”hansonwang99”)

Здесь вставляется часть данных для эксперимента.

创建test数据库并插入一条数据


Запустите службу зипкин

docker run -d -p 9411:9411 \
--link mysql:mysql \
-e STORAGE_TYPE=mysql \
-e MYSQL_HOST=mysql \
-e MYSQL_TCP_PORT=3306 \
-e MYSQL_DB=zipkin \
-e MYSQL_USER=root \
-e MYSQL_PASS=XXXXXX \
 --name zipkin openzipkin/zipkin

Запустите микрослужбу (т.е. службу), которая обращается к базе данных Mysql.

Введите: localhost:8883/mysqltest в браузере. Если вы увидите следующий вывод, это может свидетельствовать об успешном выполнении операции вызова базы данных!

数据库调用操作已经成功


База данных трассировки Zipkin вызывает фактический эксперимент

  • **Ввод через браузер: **http://localhost:9411/zipkin/

Откройте веб-интерфейс Zipkin, щелкните раскрывающийся список имени службы, чтобы убедиться, что служба вызовов базы данных Mysql успешно идентифицирована.

成功识别Mysql数据库调用服务

  • После выбора mysqlservice нажмите «Найти следы».

можно увидетьпервый запросИнформация об отслеживании цепочки вызовов Mysql, существует множество

首次查询Mysql所产生的Traces信息

Нажмите на любой для просмотра:

随机查看某一个具体的Trace信息

  • **Далее снова введите в браузере: **localhost:8883/mysqltest

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

两次Mysql的query动作

Нажмите на первый запрос для просмотра, который на самом деле находится вПопробуйте подключиться к базе данных Mysql

第一个query详情

Нажмите на второй запрос для просмотра и обнаружите, что этоФактический запрос бизнеса

第二个query详情

Из графического интерфейса вы можете четко узнать подробные шаги и затраты времени на каждом этапе, поэтому его можно использовать для анализа того, какой оператор SQL выполняется относительно медленно.


постскриптум

Исходный код, использованный в этом эксперименте, был открытым, если необходимо, пожалуйста,самовывоз.

Другие практические статьи автора SpringBt находятся здесь:


Если вам интересно, вы также можете уделить время прочтению некоторых статей автора о контейнеризации и микросервисах:


CodeSheep · 程序羊