资讯专栏INFORMATION COLUMN

利用Zipkin追踪Mysql数据库调用链

warmcheng / 2375人阅读

摘要:注本文首发于公众号,可长按或扫描下面的小心心来订阅扩展组件是在微服务调用链追踪中心搭建一文中编写的与通信的工具组件,利用其追踪微服务调用链的,现在我们想追踪数据库调用链的话,可以扩展一下其功能。


概述

在前面:微服务调用链追踪中心搭建 一文中我们利用Zipkin搭建了一个微服务调用链的追踪中心,并且模拟了微服务调用的实验场景。利用Zipkin的库Brave,我们可以收集一个客户端请求从发出到被响应 经历了哪些组件哪些微服务请求总时长每个组件所花时长 等信息。

本文将讲述如何利用Zipkin对Mysql数据库的调用进行追踪,这里同样借助OpenZipkin库Brave来完成。

注: 本文首发于 My 公众号 CodeSheep ,可 长按扫描 下面的 小心心 来订阅 ↓ ↓ ↓


扩展ZipkinTool组件

ZipkinTool是在《微服务调用链追踪中心搭建》一文中编写的与Zipkin通信的工具组件,利用其追踪微服务调用链的,现在我们想追踪Mysql数据库调用链的话,可以扩展一下其功能。

pom.xml添加依赖:


        io.zipkin.brave
        brave-mysql
        4.0.6

在ZipkinConfiguration类中添加MySQLStatementInterceptorManagementBean

    @Bean
    public MySQLStatementInterceptorManagementBean mySQLStatementInterceptorManagementBean() {
        return new MySQLStatementInterceptorManagementBean(brave().clientTracer());
    }

添加Mysql数据库访问的微服务

依然继承前文:《微服务调用链追踪中心搭建》,我们改造一下文中的ServiceC这个微服务,在其中添加与Mysql数据库的交互。

pom.xml中添加JDBC和Mysql依赖

        
            org.springframework.boot
            spring-boot-starter-jdbc
        
        
            mysql
            mysql-connector-java
            runtime
        

application.properties中添加Mysql连接的配置

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

Controller中添加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

接下来创建数据库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...

Sql脚本执行完成后,可以看到zipkin相关的三个表已经建成:

创建数据库test:用作测试数据库

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”)

这里插入了一条数据用于实验。


启动zipkin服务
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数据库访问的微服务(即ServiceC)

在浏览器中输入:localhost:8883/mysqltest,如果看到以下输出,就可以证明数据库调用操作已经成功了!


Zipkin追踪数据库调用实际实验

浏览器输入:http://localhost:9411/zipkin/

打开Zipkin Web UI,点击服务名下拉列表能看见已经成功识别了Mysql数据库调用服务

选中mysqlservice后,点击Find Traces

可以看到 首次查询 Mysql的调用链追踪信息,有很多

随便点开某一个查看:

接下来浏览器中再次输入:localhost:8883/mysqltest

目的是再次触发Mysql的调用,然后再次Find Traces,可以看到追踪数据类似下图:包含两次Mysql的query动作:

点开第一个query查看,其实际上是在 尝试连接Mysql数据库

点开第二个query查看,发现这里才是 实际查询业务

从图形化界面上可以清楚地知道每个阶段的详细步骤与耗时,因此可以用来分析哪个SQL语句执行相对较慢。


后记

本文实验所用源码已经开源,需要的话请 自取。

作者更多的原创文章在此,欢迎观赏

My Personal Blog

作者更多的SpringBt实践文章在此:

Spring Boot应用监控实战

SpringBoot应用部署于外置Tomcat容器

ElasticSearch搜索引擎在SpringBt中的实践

初探Kotlin+SpringBoot联合编程

Spring Boot日志框架实践

SpringBoot优雅编码之:Lombok加持


如果有兴趣,也可以抽点时间看看作者一些关于容器化、微服务化方面的文章:

利用K8S技术栈打造个人私有云 连载文章

从一份配置清单详解Nginx服务器配置

Docker容器可视化监控中心搭建

利用ELK搭建Docker容器化应用日志中心

RPC框架实践之:Apache Thrift

RPC框架实践之:Google gRPC

微服务调用链追踪中心搭建

Docker容器跨主机通信

Docker Swarm集群初探

高效编写Dockerfile的几条准则



文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/47722.html

相关文章

  • 利用Zipkin追踪Mysql据库调用

    摘要:注本文首发于公众号,可长按或扫描下面的小心心来订阅扩展组件是在微服务调用链追踪中心搭建一文中编写的与通信的工具组件,利用其追踪微服务调用链的,现在我们想追踪数据库调用链的话,可以扩展一下其功能。 showImg(https://segmentfault.com/img/remote/1460000014751186); 概述 在前面:微服务调用链追踪中心搭建 一文中我们利用Zipki...

    姘存按 评论0 收藏0
  • 微服务调用追踪中心搭建

    摘要:一个客户端请求从发出到被响应经历了哪些组件哪些微服务请求总时长每个组件所花时长等信息我们有必要了解和收集,以帮助我们定位性能瓶颈进行性能调优,因此监控整个微服务架构的调用链十分有必要,本文将阐述如何使用搭建微服务调用链追踪中心。 showImg(https://segmentfault.com/img/remote/1460000014553707); 概述 一个完整的微服务系统包含...

    Pines_Cheng 评论0 收藏0
  • 个推基于Zipkin的分布式追踪实践

    摘要:分布式链路追踪现状分布式链路追踪的技术有很多,有开源的也有闭源的。个推的实践个推的微服务是基于和进行部署的,每个微服务对应于中的一组。整体的架构如下图所示个推基于的分布式链路追踪系统的整体架构其中,也容器化部署在集群中,简化了的搭建和部署。 showImg(https://segmentfault.com/img/remote/1460000019343537);作者:个推应用平台基础...

    stormgens 评论0 收藏0
  • springboot(2.1.0)+springcloud(Greenwich.M1)实现追踪

    摘要:主要问题由于新版本新版本实现链路追踪的一些新特性,使得我在实现的过程上踩了不少坑。同样一些场景下需要保存链路追踪的数据,以备后面观察对比,所以同样需要一个来存储数据。方法一,通过修改基配置文件后启动。 主要问题      由于springboot新版本(2.1.0)、springcloud新版本(Greenwich.M1)实现链路追踪sleuth+zipkin的一些新特性,使得我在实...

    Joonas 评论0 收藏0
  • Spring Cloud Sleuth 之Greenwich版本全攻略

    摘要:服务提供者提供一个接口,服务消费者通过消费服务。服务提供者服务提供者,对外提供一个,并向服务注册中心注册,这部分内容,不再讲述,见源码。 微服务架构是一个分布式架构,微服务系统按业务划分服务单元,一个微服务系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性较高,如果出现了错误和异常,很难去定位。主要体现在一个请求可能需要调用很多个服务,而内部服务的调用复杂性决定了问题难以定位...

    PascalXie 评论0 收藏0

发表评论

0条评论

warmcheng

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<