【Spring Cloud Alibaba】Sleuth + Zipkin 链路追踪
作者:互联网
文章目录
【Spring Cloud Alibaba】Sleuth + Zipkin 链路追踪
1、Spring Cloud Sleuth
(1)基础概念
Spring Cloud Sleuth 官网:https://github.com/spring-cloud/spring-cloud-sleuth
Sleuth 配置了您开始所需的一切。这包括跟踪数据(跨度)报告到哪里、要保留多少跟踪(采样)、是否发送远程字段(行李)以及跟踪哪些库。
具体来说,Spring Cloud Sleuth…
- 将跟踪和跨度 ID 添加到 Slf4J MDC,因此您可以从日志聚合器中的给定跟踪或跨度中提取所有日志。
- 检测 Spring 应用程序的常见入口和出口点(servlet 过滤器、rest 模板、计划操作、消息通道、伪装客户端)。
如果 spring-cloud-sleuth-zipkin 可用,则应用程序将通过 HTTP 生成并报告与 Zipkin 兼容的跟踪。默认情况下,它将它们发送到本地主机(端口 9411)上的 Zipkin 收集器服务。使用 配置服务的位置 spring.zipkin.baseUrl。
(2)简单案例
我这里使用的是 Seata 模块的三个服务,他们之间刚好有调用关系,所以直接把新增加的内容添加进去即可
【Spring Cloud Alibaba】Seata 分布式事务:https://blog.csdn.net/qq_38762237/article/details/122249528
订单服务、账户服务、库存服务
在依赖文件中增加 spring-cloud-starter-sleuth 依赖,版本也是 spring cloud 统一管理的
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
访问下单连接
http://localhost:8008/bizOrder/createOrder?userId=1&productId=1&count=10&money=100
订单模块日志
账户模块日志
库存模块日志
有四个值:
[spring-cloud-alibaba-seata-account,925e6047bfe33192,53c6fa3097a02d6d,true]
- 第⼀个值:spring.application.name 应用名称。
- 第⼆个值,925e6047bfe33192,Sleuth ⽣成的⼀个 Trace ID,⽤来标识⼀条请求链路,⼀条请求链路中包含⼀个 Trace ID,多个 Span ID。
- 第三个值,4ef9402f9a9500a1、spanId 基本的⼯作单元,获取元数据,如发送⼀个 http。
- 第四个值:true,是否要将该信息输出到 zipkin 服务中来收集和展示。
同一个请求,也就是同一个请求链路,所有的 TraceID 都是相同的,其中每个请求都有自己的 SpanID 作为标识。到此,我们拿到了链路的相关数据,随着业务的复杂,链路之间的关系也随之杂乱,所有需要界面可视化来统一查看链路追踪的效果,接下来分析 Spring Cloud Zipkin
2、Spring Cloud Zipkin
Spring Cloud Zipkin 官网:https://zipkin.io/
Zipkin Github:https://github.com/openzipkin/zipkin/
Zipkin 是一个分布式追踪系统。它有助于收集对服务架构中的延迟问题进行故障排除所需的计时数据。功能包括收集和查找这些数据。
如果日志文件中有跟踪 ID,则可以直接跳转到它。否则,您可以根据服务、操作名称、标签和持续时间等属性进行查询。将为您总结一些有趣的数据,例如在服务中花费的时间百分比,以及操作是否失败。
Zipkin UI 还提供了一个依赖关系图,显示有多少跟踪请求通过每个应用程序。这有助于识别聚合行为,包括错误路径或对已弃用服务的调用。
应用程序需要“检测”以向 Zipkin 报告跟踪数据。这通常意味着配置跟踪器或检测库。最流行的向 Zipkin 报告数据的方式是通过 HTTP 或 Kafka,尽管还有许多其他选项,例如 Apache ActiveMQ、gRPC 和 RabbitMQ。提供给 UI 的数据存储在内存中,或持久存储在受支持的后端,例如 Apache Cassandra 或 Elasticsearch。
(1)安装部署
下载地址:
- 这里是 2.12.9:http://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/
- 这里是最近版本:https://search.maven.org/remote_content?g=io.zipkin&a=zipkin-server&v=LATEST&c=exec
然后使用命令启动
java -jar zipkin-server-2.23.16-exec.jar
启动效果
界面效果
3、Sleuth + Zipkin 链路追踪
在需要追踪的服务中,添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
增加配置
spring:
# 链路追踪
zipkin:
base-url: http://localhost:9411/
sleuth:
sampler:
probability: 1.0 #采样百分比
重启服务之后,再次调用下单接口
http://localhost:8008/bizOrder/createOrder?userId=1&productId=1&count=10&money=100
查看链路追踪日志
到此,链路追踪完成
4、Zipkin + MySQL 数据持久化
持久化就不用过多介绍了,用于保存链路追踪后的数据,避免生产环境服务关闭或者奔溃,方便查看原始的追踪信息
数据库表格式可以从Github下载
https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql
创建一个,名为 alibaba-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,
`remote_service_name` VARCHAR(255),
`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',
PRIMARY KEY (`trace_id_high`, `trace_id`, `id`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
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(`remote_service_name`) COMMENT 'for getTraces and getRemoteServiceNames';
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 and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces and autocomplete values';
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,
PRIMARY KEY (`day`, `parent`, `child`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
重新启动 Zipkin 服务,直接在启动命令上指定数据库信息
java -jar zipkin-server-2.23.16-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=localhost --MYSQL_TCP_PORT=3306 --MYSQL_USER=root --MYSQL_PASS=123456 --MYSQL_DB=alibaba-zipkin
重启服务之后,再次调用下单接口
http://localhost:8008/bizOrder/createOrder?userId=1&productId=1&count=10&money=100
重启效果
数据库中已经有了持久化数据
微信公众号
标签:COMMENT,Sleuth,trace,zipkin,Spring,Zipkin,链路,id 来源: https://blog.csdn.net/qq_38762237/article/details/122301160