摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/SkyWalking/ 「芋道源码」欢迎转载,保留摘要,谢谢!
- 1. 概述
- 2. SpringMVC 示例
- 3. 忽略部分 URL 的追踪
- 4. MySQL 示例
- 5. Redis 示例
- 6. MongoDB 示例
- 7. Elasticsearch 示例
- 8. RocketMQ 示例
- 9. Kafka 示例
- 10. RabbitMQ 示例
- 11. ActiveMQ 示例
- 12. 日志框架示例
- 13. 自定义追踪方法
- 14. OpenTracing 示例
- 15. Spring 异步任务示例
- 16. Dubbo 示例
- 666. 彩蛋
本文在提供完整代码示例,可见 https://github.com/YunaiV/SpringBoot-Labs 的 lab-39 目录。
原创不易,给点个 Star 嘿,一起冲鸭!
1. 概述
如果胖友还没了解过分布式链路追踪 SkyWalking,建议先阅读下艿艿写的 《芋道 SkyWalking 极简入门》 文章。虽然这篇文章标题是安装部署,实际可以理解成《一文带你快速入门 SkyWalking》,哈哈哈。
可能会有胖友会有疑惑,Spring Boot 不是一个单体应用么,为什么可以使用 SkyWalking 进行分布式链路追踪呢?其实这里有一个误区!即使是一个 Spring Boot 单体应用,我们一般可能会和以下服务打交道:
- 关系数据库,例如说 MySQL、Oracle、SQLServer、PostgreSQL 等等。
- 文档数据库,例如说 MongoDB 等等。
- 缓存数据库,例如说 Redis、Memcached 等等。
- 外部三方服务,例如说微信公众号、微信支付、支付宝支付、短信平台等等。
那么即使是一个 Spring Boot 单体应用,就已经涉及到分布在不同进程中的服务。此时,就已经满足使用 SkyWalking 进行分布式链路追踪的条件,同时也是非常有必要的。例如说,我们线上某个 API 接口访问非常慢,可以通过 SkyWalking 来排查,是因为 MySQL 查询比较慢呢,还是调用的第三方服务比较慢。
在本文中,我们会比《芋道 SkyWalking 极简入门》提供更多在 Spring Boot 中使用的示例。例如说:
- 对 SpringMVC 的 API 接口的链路追踪
- 对 JDBC 访问 MySQL 的链路追踪
- 对 Jedis 访问 Redis 的链路追踪
- 对 RocketMQ 的消息的发送和消费的链路追踪
- 等等等等
2. SpringMVC 示例
示例代码对应仓库:lab-39-springmvc。
本小节,我们来搭建一个 SkyWalking 对 SpringMVC 的 API 接口的链路追踪。该链路通过如下插件实现收集:
- spring/mvc-annotation-3.x-plugin
- spring/mvc-annotation-4.x-plugin
- spring/mvc-annotation-5.x-plugin
2.1 引入依赖
在 pom.xml
文件中,引入相关依赖。
|
- 具体每个依赖的作用,胖友自己认真看下艿艿添加的所有注释噢。
2.2 配置文件
在 application.yml
中,添加服务器端口配置,如下:
server:
|
- 设置服务器的端口为 8079 ,避免和 SkyWalking UI 占用的 8080 冲突。
2.3 DemoController
在 cn.iocoder.springboot.lab39.skywalkingdemo.controller
包路径下,创建 DemoController 类,提供示例 API 接口。代码如下:
@RestController
|
2.4 Application
创建 Application.java
类,配置 @SpringBootApplication
注解即可。代码如下:
@SpringBootApplication
|
2.5 IDEA 配置
通过 IDEA 的「Run/Debug Configurations」配置使用 SkyWalking Agent。如下图所示:
然后,执行 Application#main(String[] args)
方法,启动该 Spring Boot 应用。如果说控制台打印如下日志,说明 SkyWalking Agent 基本加载成功:
# 加载 SkyWalking Agent
|
2.6 简单测试
1、首先,使用浏览器,访问下 http://127.0.0.1:8079/demo/echo 地址,请求下 Spring Boot 应用提供的 API。因为,我们要追踪下该链路。
2、然后,继续使用浏览器,打开 http://127.0.0.1:8080/ 地址,进入 SkyWalking UI 界面。如下图所示:
3、之后,点击「拓扑图」菜单,进入查看拓扑图的界面,可以看到 SpringMVC 小方块。如下图所示:
4、再之后,点击「追踪」菜单,进入查看链路数据的界面。如下图所示:
3. 忽略部分 URL 的追踪
示例代码对应仓库:lab-39-springmvc 。
在「2. SpringMVC 示例」小节中,我们已经实现了对 SpringMVC 提供的 HTTP API 接口的链路追踪。但是,我们可能希望忽略部分特殊 URL 的追踪,例如说,健康检查的 HTTP API。
所以,我们可以使用 SkyWalking 提供 trace-ignore-plugin
插件,可以实现忽略部分 URL 的追踪。
本小节,我们无需单独搭建项目,而是直接使用 lab-39-springmvc 项目即可。
3.1 复制插件
trace-ignore-plugin
插件,在 optional-plugins
目录下,是可选插件,所以我们需要复制到 plugins
目录下。命令行操作如下:
# 查看当前所在目录
|
3.2 配置文件
trace-ignore-plugin
插件,读取 apm-trace-ignore-plugin.config
配置文件,默认情况下不存在,所以我们需要进行创建并配置。命令行操作如下:
# 查看当前所在目录
|
配置文件内容如下:
# If the operation name of the first span is matching, this segment should be ignored
|
trace.ignore_path
配置项,设置忽略的 URL 路径,基于 Ant 风格路径表达式。- 这里,我们配置了读取环境变量
SW_AGENT_TRACE_IGNORE_PATH
,这样方便我们自定义。
3.3 IDEA 配置
通过 IDEA 的「Run/Debug Configurations」配置使用 SkyWalking Agent。如下图所示:
然后,执行 Application#main(String[] args)
方法,启动该 Spring Boot 应用。
3.4 简单测试
1、首先,使用浏览器,访问下 http://127.0.0.1:8079/demo/hello 地址,请求下 Spring Boot 应用提供的 API。
2、然后,查看 SkyWaking Agent 日志,可以看到该 URL 的链路追踪被忽略日志。操作命令如下:
# 查看当前所在目录
|
3、之后,在 SkyWalking UI 的查看链路追踪的界面,也看不到该 URL 对应的链路数据。如下图所示:
4. MySQL 示例
示例代码对应仓库:lab-39-mysql。
本小节,我们来搭建一个 SkyWalking 对 MySQL 操作的链路追踪。该链路通过如下插件实现收集:
- jdbc-commons
- mysql-common
- mysql-5.x-plugin
- mysql-6.x-plugin
- mysql-8.x-plugin
我们将使用 Spring JdbcTemplate 进行 MySQL 的操作。对 Spring JdbcTemplate 感兴趣的胖友,可以后续去看看《芋道 Spring Boot JdbcTemplate 入门》文章。
4.1 引入依赖
在 pom.xml
文件中,引入相关依赖。
|
- 具体每个依赖的作用,胖友自己认真看下艿艿添加的所有注释噢。
4.2 配置文件
在 application.yml
中,添加 MySQL 配置,如下:
server:
|
这里,胖友记得在测试的数据库中,创建 t_user
表,并插入一条 id = 1
的记录。SQL 脚本如下:
CREATE TABLE `t_user` (
|
4.3 DemoController
在 cn.iocoder.springboot.lab39.skywalkingdemo.controller
包路径下,创建 DemoController 类,提供示例 API 接口。代码如下:
@RestController
|
- 在
/demo/mysql
接口中,会执行一次 MySQL 的查询。
4.4 MySQLApplication
创建 MySQLApplication.java
类,配置 @SpringBootApplication
注解即可。代码如下:
@SpringBootApplication
|
4.5 IDEA 配置
通过 IDEA 的「Run/Debug Configurations」配置使用 SkyWalking Agent。如下图所示:
然后,执行 MySQLApplication#main(String[] args)
方法,启动该 Spring Boot 应用。
4.6 简单测试
1、首先,使用浏览器,访问下 http://127.0.0.1:8079/demo/mysql 地址,请求下 Spring Boot 应用提供的 API。因为,我们要追踪下该链路。
2、然后,继续使用浏览器,打开 http://127.0.0.1:8080/ 地址,进入 SkyWalking UI 界面。如下图所示:
接着,点击「Database Dashboard」选项,再点击「Database」选项,可以以数据库为维度的监控数据。如下图所示:
3、之后,点击「拓扑图」菜单,进入查看拓扑图的界面,可以看到 MySQL 小方块。如下图所示:
4、再之后,点击「追踪」菜单,进入查看链路数据的界面。如下图所示:
点击红圈的 MySQL 操作的链路数据,可以看到数据的 SQL 语句。如下图所示:
这里,我们暂时无法看到 SQL 的数据参数,可以通过修改 config/agent.config
配置文件,将 plugin.mysql.trace_sql_parameters
配置项,设置为 true
。例如:
# mysql plugin configuration
|
- 当然,也可以通过
SW_MYSQL_TRACE_SQL_PARAMETERS
环境变量。
5. Redis 示例
示例代码对应仓库:lab-39-redis。
本小节,我们来搭建一个 SkyWalking 对 Redis 操作的链路追踪。该链路通过如下插件实现收集:
- jedis-2.x-plugin
- redisson-3.x-plugin
- lettuce-5.x-plugin
我们将使用 Spring Data Redis + Jedis 进行 Redis 的操作。对 Spring Data Redis 感兴趣的胖友,可以后续去看看《芋道 Spring Boot Redis 入门》文章。
5.1 引入依赖
在 pom.xml
文件中,引入相关依赖。
|
- 具体每个依赖的作用,胖友自己认真看下艿艿添加的所有注释噢。
5.2 配置文件
在 application.yml
中,添加 Redis 配置,如下:
server:
|
5.3 DemoController
在 cn.iocoder.springboot.lab39.skywalkingdemo.controller
包路径下,创建 DemoController 类,提供示例 API 接口。代码如下:
@RestController
|
- 在
/demo/redis
接口中,会执行一次 Redis GET 操作。
5.4 RedisApplication
创建 RedisApplication.java
类,配置 @SpringBootApplication
注解即可。代码如下:
@SpringBootApplication
|
5.5 IDEA 配置
通过 IDEA 的「Run/Debug Configurations」配置使用 SkyWalking Agent。如下图所示:
然后,执行 RedisApplication#main(String[] args)
方法,启动该 Spring Boot 应用。
5.6 简单测试
1、首先,使用浏览器,访问下 http://127.0.0.1:8079/demo/redis 地址,请求下 Spring Boot 应用提供的 API。因为,我们要追踪下该链路。
2、然后,继续使用浏览器,打开 http://127.0.0.1:8080/ 地址,进入 SkyWalking UI 界面。如下图所示:
3、之后,点击「拓扑图」菜单,进入查看拓扑图的界面,可以看到 Redis 小方块。如下图所示:
4、再之后,点击「追踪」菜单,进入查看链路数据的界面。如下图所示:
点击红圈的 Redis 操作的链路数据,可以看到 Redis 具体操作。如下图所示:
不过没有看到 Redis 操作的具体参数。因为 Spring Data Redis 会把提前具体参数转换成二进制数组,导致 jedis-2.x-plugin
插件的 JedisMethodInterceptor 不进行收集。代码如下:
// JedisMethodInterceptor.java
|
6. MongoDB 示例
示例代码对应仓库:lab-39-mongodb。
本小节,我们来搭建一个 SkyWalking 对 MongoDB 操作的链路追踪。该链路通过如下插件实现收集:
- mongodb-2.x-plugin
- mongodb-3.x-plugin
我们将使用 Spring Data MongoDB 进行 MongoDB 的操作。对 Spring Data MongoDB 感兴趣的胖友,可以后续去看看《芋道 Spring Boot MongoDB 入门》文章。
6.1 引入依赖
在 pom.xml
文件中,引入相关依赖。
|
- 具体每个依赖的作用,胖友自己认真看下艿艿添加的所有注释噢。
6.2 配置文件
在 application.yml
中,添加 Redis 配置,如下:
server:
|
6.3 DemoController
在 cn.iocoder.springboot.lab39.skywalkingdemo.controller
包路径下,创建 DemoController 类,提供示例 API 接口。代码如下:
@RestController
|
- 在
/demo/mongodb
接口中,会执行一次 MongoDB 查询操作。 - UserDO 实体类,直接点击查看。
6.4 MongoDBApplication
创建 MongoDBApplication.java
类,配置 @SpringBootApplication
注解即可。代码如下:
// Application.java
|
6.5 插件配置
默认情况下,SkyWalking Agent MongoDB 插件,不记录操作参数,需要通过配置。命令行操作如下:
# 查看当前所在目录
|
额外新增如下配置内容如下:
# mongodb plugin configuration
|
- 这样,默认情况下还是保持不记录操作参数,可通过
SW_MONGODB_TRACE_PARAM
环境变量开启。
6.6 IDEA 配置
通过 IDEA 的「Run/Debug Configurations」配置使用 SkyWalking Agent。如下图所示:
然后,执行 MongoDBApplication#main(String[] args)
方法,启动该 Spring Boot 应用。
6.7 简单测试
1、首先,使用浏览器,访问下 http://127.0.0.1:8079/demo/mongodb 地址,请求下 Spring Boot 应用提供的 API。因为,我们要追踪下该链路。
2、然后,继续使用浏览器,打开 http://127.0.0.1:8080/ 地址,进入 SkyWalking UI 界面。如下图所示:
接着,点击「Database Dashboard」选项,再点击「Database」选项,可以以数据库为维度的监控数据。如下图所示:
3、之后,点击「拓扑图」菜单,进入查看拓扑图的界面,可以看到 MongoDB 小方块。如下图所示:
4、再之后,点击「追踪」菜单,进入查看链路数据的界面。如下图所示:
点击红圈的 MongoDB 操作的链路数据,可以看到操作语句。如下图所示:
7. Elasticsearch 示例
示例代码对应仓库:lab-39-elasticsearch-jest。
本小节,我们来搭建一个 SkyWalking 对 Elasticsearch 操作的链路追踪。该链路通过如下插件实现收集:
- elasticsearch-5.x-plugin
- elasticsearch-6.x-plugin
不过略微翻车了。原因是:
- SkyWalking
6.6.0
版本的elasticsearch-5.x-plugin
插件,暂时只支持 transport-client5.2.x
-5.6.x
版本。什么意思呢?如果使用 Elasticsearch TCP 协议的客户端,不能使用6.X
开始的版本。 - SkyWalking
6.6.0
版本的elasticsearch-6.x-plugin
插件,暂时只支持 Elasticsearch Rest 协议的客户端。
听起来好像也没啥问题?目前项目中,一般不会直接使用 Elasticsearch 原生的 TCP 协议和 Rest 协议的客户端,而是采用 Spring Data Elasticsearch 库。该库的主流版本是基于 Elasticsearch TCP 协议的客户端,并且使用 transport-client
的 6.X
开始的版本。因此,在我们使用 Spring Data Elasticsearch 主流版本的情况下,SkyWalking 暂时无法实现对 Elasticsearch 的链路追踪。具体艿艿测试的代码示例,可见 lab-39-elasticsearch 仓库。?? 等后面 SkyWalking 提供了支持,艿艿再来更新一波。
不过,目前 Elasticsearch 官方较为推荐采用它提供的 Rest 协议。所以我们也可以采用 Spring Data Jest 库。而 Spring Data Jest 是基于 Jest 之上,对 Spring Data 的实现。Jest 是基于 Elasticsearch Rest 协议的第三方客户端,其内部采用 HttpClient 发起 HTTP 请求。因此,我们可以采用 SkyWalking 的 httpClient-4.x-plugin
插件,间接实现对 Elasticsearch 的链路追踪。咳咳咳 ??
因此,我们最终使用 Spring Data Jest 进行 Elasticsearch 的操作。对 Elasticsearch 感兴趣的胖友,可以后续去看看《芋道 Spring Boot Elasticsearch 入门》文章。
7.1 引入依赖
在 pom.xml
文件中,引入相关依赖。
|
- 具体每个依赖的作用,胖友自己认真看下艿艿添加的所有注释噢。
因为 Spring Data Jest 3.3.0.RELEASE
版本,最高只能支持 Elasticsearch 6.8.4
版本,所以 ?? 艿艿又不得不搭建一个 Elasticsearch 6.8.4
版本的服务。心疼自己 5 秒钟,各种倒腾。
7.2 配置文件
在 application.yml
中,添加 Redis 配置,如下:
server:
|
7.3 DemoController
在 cn.iocoder.springboot.lab39.skywalkingdemo.controller
包路径下,创建 DemoController 类,提供示例 API 接口。代码如下:
@RestController
|
- 在
/demo/elasticsearch
接口中,会执行一次 Elasticsearch 插入和查询操作。 - ESUserDO 实体类,直接点击查看。
- ESUserRepository ES 数据访问类,直接点击查看。
7.4 ElasticsearchJestApplication
创建 ElasticsearchJestApplication.java
类,配置 @SpringBootApplication
注解即可。代码如下:
|
7.5 简单测试
通过 IDEA 的「Run/Debug Configurations」配置使用 SkyWalking Agent。如下图所示:
然后,执行 ElasticsearchJestApplication#main(String[] args)
方法,启动该 Spring Boot 应用。
1、首先,使用浏览器,访问下 http://127.0.0.1:8079/demo/elasticsearch 地址,请求下 Spring Boot 应用提供的 API。因为,我们要追踪下该链路。
2、然后,继续使用浏览器,打开 http://127.0.0.1:8080/ 地址,进入 SkyWalking UI 界面。如下图所示:
3、之后,点击「拓扑图」菜单,进入查看拓扑图的界面,可以看到特殊的小方块,就是 Elasticsearch 服务。如下图所示:
4、再之后,点击「追踪」菜单,进入查看链路数据的界面。如下图所示:
点击红圈的使用 HttpClient 发起 HTTP 请求,操作 Elasticsearch 的链路数据。如下图所示:
不过没有看到 HTTP 请求的具体参数。如果想要的话,胖友需要自行去修改 httpClient-4.x-plugin
插件。不过要注意,因为 HTTP 请求的具体参数可能很长,所以最好做下最大长度的截取。
8. RocketMQ 示例
示例代码对应仓库:lab-39-rocketmq。
本小节,我们来搭建一个 SkyWalking 对 RocketMQ 消息的发送和消费的链路追踪。该链路通过如下插件实现收集:
- rocketMQ-3.x-plugin
- rocketMQ-4.x-plugin
我们将使用 RocketMQ-Spring 进行 RocketMQ 的操作。对 RocketMQ 感兴趣的胖友,可以后续去看看《芋道 Spring Boot 消息队列 RocketMQ 入门》文章。
考虑到让示例更简单,我们的示例项目包含 RocketMQ 的生产者 Producer 和消费者 Consumer。
8.1 引入依赖
在 pom.xml
文件中,引入相关依赖。
|
- 具体每个依赖的作用,胖友自己认真看下艿艿添加的所有注释噢。
8.2 配置文件
在 application.yml
中,添加 RocketMQ 配置,如下:
server:
|
8.3 DemoController
在 cn.iocoder.springboot.lab39.skywalkingdemo.controller
包路径下,创建 DemoController 类,提供示例 API 接口。代码如下:
@RestController
|
- 在
/demo/rocketmq
接口中,会执行一次 RocketMQ 发送消息的操作。 - DemoMessage 消息类,直接点击查看。
- DemoProducer 生产者类,直接点击查看。
- DemoConsumer 消费者类,直接点击查看。
8.4 RocketMQApplication
创建 RocketMQApplication.java
类,配置 @SpringBootApplication
注解即可。代码如下:
@SpringBootApplication
|
8.5 IDEA 配置
通过 IDEA 的「Run/Debug Configurations」配置使用 SkyWalking Agent。如下图所示:
然后,执行 RocketMQApplication#main(String[] args)
方法,启动该 Spring Boot 应用。
8.6 简单测试
1、首先,使用浏览器,访问下 http://127.0.0.1:8079/demo/rocketmq 地址,请求下 Spring Boot 应用提供的 API。因为,我们要追踪下该链路。
2、然后,继续使用浏览器,打开 http://127.0.0.1:8080/ 地址,进入 SkyWalking UI 界面。如下图所示:
3、之后,点击「拓扑图」菜单,进入查看拓扑图的界面,可以看到 RocketMQ 小方块。如下图所示:
4、再之后,点击「追踪」菜单,进入查看链路数据的界面。如下图所示:
注意,可以看到 RocketMQ 消息的发送,到该消息的异步的消费,都被串联在一个整体链路中。这样对我们日常排查问题,会非常便捷舒服。
点击 RocketMQ Producer 发送消息的链路数据,可以看到 Producer 发送消息的 Topic。如下图所示:
点击 RocketMQ Consumer 消费消息的链路数据,可以看到 Consumer 消费消息的 Topic。如下图所示:
8.7 阿里云的消息队列 ONS 服务
可能部分胖友采用的是阿里云的消息队列 ONS 服务,使用的是 ons-client
库进行 RocketMQ 消息的发送和消费。那么此时,我们就无法使用 SkyWalking 进行 RocketMQ 的链路追踪了。怎么解决呢?
① 方案一,参考 SkyWalking rocketMQ-4.x-plugin
插件的源码,修改成支持 ons-client
库的链路追踪。ons-client
库的代码,和 rocketmq-client
的代码是非常接近的,胖友只要稍微改改就能支持。
② 方案二,阿里云的消息队列 ONS 服务,已经支持 rocketmq-client
进行 RocketMQ 消息的发送和消费。这样,我们就可以继续使用 SkyWalking rocketMQ-4.x-plugin
插件来进行链路追踪。
不过要注意,阿里云消息 ONS 服务大于开源的 RocketMQ 中间件,所以用到 ONS 服务的独有的特性的功能,还是需要使用 ons-client
库。
目前艿艿线上所采用的是方案一,新建了一个 ons-1.x-plugin
插件,实现了对 ONS 服务的链路追踪。
9. Kafka 示例
示例代码对应仓库:lab-39-kafka。
本小节,我们来搭建一个 SkyWalking 对 Kafka 消息的发送和消费的链路追踪。该链路通过如下插件实现收集:
- kafka-plugin
我们将使用 Spring-Kafka 进行 Kafka 的操作。对 Kafka 感兴趣的胖友,可以后续去看看《芋道 Spring Boot 消息队列 Kafka 入门》文章。
考虑到让示例更简单,我们的示例项目包含 Kafka 的生产者 Producer 和消费者 Consumer。
9.1 引入依赖
在 pom.xml
文件中,引入相关依赖。
|
- 具体每个依赖的作用,胖友自己认真看下艿艿添加的所有注释噢。
友情提示: SkyWalking
kafka-plugin
对高版本的kafka-clients
的链路追踪兼容性还存在一点问题,无法追踪到 Kafka Producer 发送消息。所以,这里我们将
spring-kafka
的版本从2.3.3.RELEASE
修改成2.2.11.RELEASE
,以使用kafka-clients
的低版版本2.0.1
。
9.2 配置文件
在 application.yml
中,添加 Kafka 配置,如下:
server:
|
9.3 DemoController
在 cn.iocoder.springboot.lab39.skywalkingdemo.controller
包路径下,创建 DemoController 类,提供示例 API 接口。代码如下:
@RestController
|
- 在
/demo/kafka
接口中,会执行一次 Kafka 发送消息的操作。 - DemoMessage 消息类,直接点击查看。
- DemoProducer 生产者类,直接点击查看。
- DemoConsumer 消费者类,直接点击查看。
9.4 KafkaApplication
创建 KafkaApplication.java
类,配置 @SpringBootApplication
注解即可。代码如下:
@SpringBootApplication
|
9.5 IDEA 配置
通过 IDEA 的「Run/Debug Configurations」配置使用 SkyWalking Agent。如下图所示:
然后,执行 KafkaApplication#main(String[] args)
方法,启动该 Spring Boot 应用。
9.6 简单测试
1、首先,使用浏览器,访问下 http://127.0.0.1:8079/demo/kafka 地址,请求下 Spring Boot 应用提供的 API。因为,我们要追踪下该链路。
2、然后,继续使用浏览器,打开 http://127.0.0.1:8080/ 地址,进入 SkyWalking UI 界面。如下图所示:
3、之后,点击「拓扑图」菜单,进入查看拓扑图的界面,可以看到 Kafka 小方块。如下图所示:
4、再之后,点击「追踪」菜单,进入查看链路数据的界面。如下图所示:
注意,可以看到 Kafka 消息的发送,到该消息的异步的消费,都被串联在一个整体链路中。这样对我们日常排查问题,会非常便捷舒服。
点击 Kafka Producer 发送消息的链路数据,可以看到 Kafka 发送消息的 Topic。如下图所示:
点击 Kafka Consumer 消费消息的链路数据,可以看到 Consumer 消费消息的 Topic。如下图所示:
10. RabbitMQ 示例
示例代码对应仓库:lab-39-rabbitmq-demo。
本小节,我们来搭建一个 SkyWalking 对 Rabbitmq 消息的发送和消费的链路追踪。该链路通过如下插件实现收集:
- rabbitmq-5.x-plugin
我们将使用 Spring-AMQP 进行 RabbitMQ 的操作。对 RabbitMQ 感兴趣的胖友,可以后续去看看《芋道 Spring Boot 消息队列 RabbitMQ 入门》文章。
考虑到让示例更简单,我们的示例项目包含 RabbitMQ 的生产者 Producer 和消费者 Consumer。
10.1 引入依赖
在 pom.xml
文件中,引入相关依赖。
|
- 具体每个依赖的作用,胖友自己认真看下艿艿添加的所有注释噢。
10.2 配置文件
在 application.yml
中,添加 RabbitMQ 配置,如下:
server:
|
10.3 DemoController
在 cn.iocoder.springboot.lab39.skywalkingdemo.controller
包路径下,创建 DemoController 类,提供示例 API 接口。代码如下:
@RestController
|
- 在
/demo/rabbitmq
接口中,会执行一次 RabbitMQ 发送消息的操作。 - RabbitConfig 配置类,直接点击查看。
- DemoMessage 消息类,直接点击查看。
- DemoProducer 生产者类,直接点击查看。
- DemoConsumer 消费者类,直接点击查看。
10.4 RabbitMQApplication
创建 RabbitMQApplication.java
类,配置 @SpringBootApplication
注解即可。代码如下:
@SpringBootApplication
|
10.5 IDEA 配置
通过 IDEA 的「Run/Debug Configurations」配置使用 SkyWalking Agent。如下图所示:
然后,执行 KafkaApplication#main(String[] args)
方法,启动该 Spring Boot 应用。
10.6 简单测试
1、首先,使用浏览器,访问下 http://127.0.0.1:8079/demo/rabbitmq 地址,请求下 Spring Boot 应用提供的 API。因为,我们要追踪下该链路。
2、然后,继续使用浏览器,打开 http://127.0.0.1:8080/ 地址,进入 SkyWalking UI 界面。如下图所示:
3、之后,点击「拓扑图」菜单,进入查看拓扑图的界面,可以看到 RabbitMQ 小方块。如下图所示:
4、再之后,点击「追踪」菜单,进入查看链路数据的界面。如下图所示:
注意,可以看到 RabbitMQ 消息的发送,到该消息的异步的消费,都被串联在一个整体链路中。这样对我们日常排查问题,会非常便捷舒服。
点击 RabbitMQ Producer 发送消息的链路数据,可以看到 RabbitMQ 发送消息的 RoutingKey、Exchange。如下图所示:
点击 RabbitMQ Consumer 消费消息的链路数据,可以看到 Consumer 消费消息的 RoutingKey、Exchange、Queue。如下图所示:
11. ActiveMQ 示例
示例代码对应仓库:lab-39-activemq。
本小节,我们来搭建一个 SkyWalking 对 ActiveMQ 消息的发送和消费的链路追踪。该链路通过如下插件实现收集:
- activemq-5.x-plugin
我们将使用 Spring-JMS 进行 ActiveMQ 的操作。对 ActiveMQ 感兴趣的胖友,可以后续去看看《芋道 Spring Boot 消息队列 ActiveMQ 入门》文章。
考虑到让示例更简单,我们的示例项目包含 ActiveMQ 的生产者 Producer 和消费者 Consumer。
11.1 引入依赖
在 pom.xml
文件中,引入相关依赖。
|
- 具体每个依赖的作用,胖友自己认真看下艿艿添加的所有注释噢。
11.2 配置文件
在 application.yml
中,添加 ActiveMQ 配置,如下:
server:
|
11.3 DemoController
在 cn.iocoder.springboot.lab39.skywalkingdemo.controller
包路径下,创建 DemoController 类,提供示例 API 接口。代码如下:
@RestController
|
- 在
/demo/activemq
接口中,会执行一次 ActiveMQ 发送消息的操作。 - DemoMessage 消息类,直接点击查看。
- DemoProducer 生产者类,直接点击查看。
- DemoConsumer 消费者类,直接点击查看。
11.4 ActiveMQApplication
创建 ActiveMQApplication.java
类,配置 @SpringBootApplication
注解即可。代码如下:
@SpringBootApplication
|
11.5 IDEA 配置
通过 IDEA 的「Run/Debug Configurations」配置使用 SkyWalking Agent。如下图所示:
然后,执行 ActiveMQApplication#main(String[] args)
方法,启动该 Spring Boot 应用。
11.6 简单测试
1、首先,使用浏览器,访问下 http://127.0.0.1:8079/demo/activemq 地址,请求下 Spring Boot 应用提供的 API。因为,我们要追踪下该链路。
2、然后,继续使用浏览器,打开 http://127.0.0.1:8080/ 地址,进入 SkyWalking UI 界面。如下图所示:
3、之后,点击「拓扑图」菜单,进入查看拓扑图的界面,可以看到 ActiveMQ 小方块。如下图所示:
4、再之后,点击「追踪」菜单,进入查看链路数据的界面。如下图所示:
注意,可以看到 ActiveMQ 消息的发送,到该消息的异步的消费,都被串联在一个整体链路中。这样对我们日常排查问题,会非常便捷舒服。
点击 ActiveMQ Producer 发送消息的链路数据,可以看到 ActiveMQ 发送消息的 Queue。如下图所示:
点击 ActiveMQ Consumer 消费消息的链路数据,可以看到 Consumer 消费消息的 Queue。如下图所示:
12. 日志框架示例
示例代码对应仓库:lab-39-logback。
在使用 SkyWalking 排查问题的时候,我们可能希望能够跟链路的日志进行关联,那么我们可以将链路编号( SkyWalking TraceId )记录到日志中,从而进行关联。
友情提示:艿艿自己的项目里,在一些业务数据希望跟 SkyWalking 链路进行关联时,会考虑新增一个
traceId
字段,存储 SkyWalking TraceId。例如说:
- 发送聊天消息时,消息记录上会存储链路编号。
- 创建交易订单时,订单记录上会存储链路编号。
这样,在排查该数据记录时,我们就可以拿着
traceId
字段,去查响应的链路信息和日志信息。
SkyWalking 提供了多种日志框架的支持,通过不同的插件:
- apm-toolkit-log4j-1.x-activation :支持 Log4j1 日志框架,对应《Application-toolkit-log4j-1.x.md》文档。
- apm-toolkit-log4j-2.x-activation :支持 Log4j2 日志框架,对应《Application-toolkit-log4j-2.x.md》文档。
- apm-toolkit-logback-1.x-activation :支持 Logback 日志框架,对应《Application-toolkit-logback-1.x.md》文档。
本小节,我们来搭建一个 SLF4J + Logback 日志的 SkyWalking TraceId 的集成示例。对 Logging 感兴趣的胖友,可以后续去看看《芋道 Spring Boot 日志框架 Logging 入门》文章。
12.1 引入依赖
在 pom.xml
文件中,引入相关依赖。
|
- 具体每个依赖的作用,胖友自己认真看下艿艿添加的所有注释噢。
12.2 应用配置文件
在 application.yml
中,添加配置,如下:
server:
|
12.3 Logback 配置文件
在 logback-spring.xml
中,添加 Logback 配置,如下:
|
日志配置有点长哈,主要配置 2 处地方,我们来看看图。如下图锁标记:
12.4 DemoController
在 cn.iocoder.springboot.lab39.skywalkingdemo.controller
包路径下,创建 DemoController 类,提供示例 API 接口。代码如下:
@RestController
|
- 在
/demo/logback
接口中,会执行一次日志的记录。
12.5 LogbackApplication
创建 LogbackApplication.java
类,配置 @SpringBootApplication
注解即可。代码如下:
@SpringBootApplication
|
12.6 IDEA 配置
通过 IDEA 的「Run/Debug Configurations」配置使用 SkyWalking Agent。如下图所示:
然后,执行 LogbackApplication#main(String[] args)
方法,启动该 Spring Boot 应用。启动日志如下:
// ... 省略其它日志
|
- 因为此时没有 SkyWalking TraceId,所以
%tid
占位符被替换成了TID:N/A
。
12.7 简单测试
1、首先,使用浏览器,访问下 http://127.0.0.1:8079/demo/logback 地址,请求下 Spring Boot 应用提供的 API。因为,我们要追踪下该链路。看到日志如下:
2020-01-05 21:21:51.521 INFO 18611 TID:22.37.15782305114330001 --- [nio-8079-exec-1] c.i.s.l.s.controller.DemoController : 测试日志
|
%tid
占位符被替换成了 SkyWalking TraceId22.37.15782305114330001
。
2、然后,可以使用该 SkyWalking TraceId 在 SkyWalking UI 中,进行检索。如下图所示:
具体实现原理,感兴趣的胖友,可以看看《SkyWalking 源码分析 —— traceId 集成到日志组件》文章。
13. 自定义追踪方法
示例代码对应仓库:lab-39-trace-annotations。
在上述的示例中,我们都是通过 SkyWalking 提供的插件,实现对指定框架的链路追踪。那么,如果我们希望对项目中的业务方法,实现链路追踪,方便我们排查问题,需要怎么做呢?SkyWalking 提供了两种方式:
- 方式一,通过 SkyWalking
@Trace
注解,可见《Application-toolkit-trace.md》文档。 - 方式二,通过 SkyWalking XML
<enhanced />
配置,可见《Customize-enhance-trace.md》文档。
艿艿在项目中,使用 SkyWalking @Trace
注解较多,所以本小节我们就来看看它的使用示例。
13.1 引入依赖
在 pom.xml
文件中,引入相关依赖。
|
- 具体每个依赖的作用,胖友自己认真看下艿艿添加的所有注释噢。
13.2 配置文件
在 application.yml
中,添加配置,如下:
server:
|
13.3 DemoController
在 cn.iocoder.springboot.lab39.skywalkingdemo.controller
包路径下,创建 DemoController 类,提供示例 API 接口。代码如下:
@RestController
|
-
在
#echo()
方法上,添加了 SkyWalking@Trace
注解,实现 SkyWalking 指定方法的追踪,会创建一个 SkyWalking LocalSpan。同时,可以通过operationName
属性,设置操作名。 -
在
<X>
处,通过ActiveSpan#tag(String key, String value)
方法,设置该 LocalSpan 的标签。ActiveSpan 还有其它方法,如下:ActiveSpan.error()
方法:将当前 Span 标记为出错状态.ActiveSpan.error(String errorMsg)
方法:将当前 Span 标记为出错状态, 并带上错误信息.ActiveSpan.error(Throwable throwable)
方法:将当前 Span 标记为出错状态, 并带上 Throwable。ActiveSpan.debug(String debugMsg)
方法:在当前 Span 添加一个 debug 级别的日志信息.ActiveSpan.info(String infoMsg)
方法:在当前 Span 添加一个 info 级别的日志信息.
另外,我们可以使用 TraceContext#traceId()
方法,获得当前的 SkyWalking TraceId 链路追踪编号。
13.4 TraceAnnotationsApplication
创建 TraceAnnotationsApplication.java
类,配置 @SpringBootApplication
注解即可。代码如下:
@SpringBootApplication
|
13.5 IDEA 配置
通过 IDEA 的「Run/Debug Configurations」配置使用 SkyWalking Agent。如下图所示:
然后,执行 TraceAnnotationsApplication#main(String[] args)
方法,启动该 Spring Boot 应用。
13.6 简单测试
1、首先,使用浏览器,访问下 http://127.0.0.1:8079/demo/trace_annotations 地址,请求下 Spring Boot 应用提供的 API。因为,我们要追踪下该链路。
2、然后,查看 SkyWalking UI 链路界面,可以看到我们自定义追踪的方法。示例如下图:
点击红圈的 @Trace
注解的链路数据,可以看到具体信息。如下图所示:
具体实现原理,感兴趣的胖友,可以看看《SkyWalking 源码分析 —— @Trace 注解想要追踪的任何方法》文章。
14. OpenTracing 示例
示例代码对应仓库:lab-39-opentracing。
在开始本节之前,推荐胖友先阅读下《OpenTracing 官方标准 —— 中文版》规范,对 OpenTracing 有个简单的了解。
在 opentracing-java 项目中,定义了 OpenTracing Java API。而 SkyWalking apm-toolkit-opentracing 项目,提供了对该 OpenTracing Java API 的实现。因此,我们可以使用它,实现比「13. 自定义追踪方法」小节,更加灵活的自定义追踪,同时可以做到和 SkyWalking 特性无关,毕竟咱使用的是 OpenTracing Java API。
下面,我们来搭建一个 OpenTracing Java API 的使用示例。
14.1 引入依赖
在 pom.xml
文件中,引入相关依赖。
|
- 具体每个依赖的作用,胖友自己认真看下艿艿添加的所有注释噢。
14.2 配置文件
在 application.yml
中,添加配置,如下:
server:
|
14.3 DemoController
在 cn.iocoder.springboot.lab39.skywalkingdemo.controller
包路径下,创建 DemoController 类,提供示例 API 接口。代码如下:
@RestController
|
- 在
/demo/opentracing
接口中的<X>
处,我们使用 Opentracing Java API 创建了一个 Span。 - 更多的 Opentracing Java API 的使用,可以看看 opentracing-java 项目提供的示例哈。
14.4 OpentracingApplication
创建 OpentracingApplication.java
类,配置 @SpringBootApplication
注解即可。代码如下:
@SpringBootApplication
|
14.5 IDEA 配置
通过 IDEA 的「Run/Debug Configurations」配置使用 SkyWalking Agent。如下图所示:
然后,执行 OpentracingApplication#main(String[] args)
方法,启动该 Spring Boot 应用。
14.6 简单测试
1、首先,使用浏览器,访问下 http://127.0.0.1:8079/demo/opentracing 地址,请求下 Spring Boot 应用提供的 API。因为,我们要追踪下该链路。
2、然后,查看 SkyWalking UI 链路界面,可以看到使用 Opentracing 创建的链路。示例如下图:
点击红圈的 Opentracing 创建的链路数据,可以看到具体信息。如下图所示:
15. Spring 异步任务示例
示例代码对应仓库:lab-39-async。
本小节,我们来搭建一个 SkyWalking 对 Spring 异步任务的链路追踪。该链路通过如下插件实现收集:
- spring-plugins/async-annotation-plugin
下面,我们来搭建一个 Spring 异步任务的使用示例。。对 Spring 异步任务感兴趣的胖友,可以后续去看看《芋道 Spring Boot 异步任务入门》文章。
15.1 引入依赖
在 pom.xml
文件中,引入相关依赖。
|
- 具体每个依赖的作用,胖友自己认真看下艿艿添加的所有注释噢。
15.2 配置文件
在 application.yml
中,添加配置,如下:
server:
|
15.3 DemoController
在 cn.iocoder.springboot.lab39.skywalkingdemo.controller
包路径下,创建 DemoController 类,提供示例 API 接口。代码如下:
// DemoController.java
|
- 在
DemoService#async()
方法上,我们添加了 Spring@Async
注解,实现 Spring 异步任务。
15.4 AsyncApplication
创建 AsyncApplication.java
类,配置 @SpringBootApplication
注解即可。代码如下:
@SpringBootApplication
|
- 通过
@EnableAsync
注解,开启 Spring@Async
异步任务的支持。这里,我们设置了proxyTargetClass = true
,使用 CGLIB 实现动态代理,忘记当时踩过什么坑,好像是和 SkyWalking 发生了啥冲突,不太记得了。
15.5 IDEA 配置
通过 IDEA 的「Run/Debug Configurations」配置使用 SkyWalking Agent。如下图所示:
然后,执行 OpentracingApplication#main(String[] args)
方法,启动该 Spring Boot 应用。
15.6 简单测试
1、首先,使用浏览器,访问下 http://127.0.0.1:8079/demo/async 地址,请求下 Spring Boot 应用提供的 API。因为,我们要追踪下该链路。
2、然后,查看 SkyWalking UI 链路界面,可以看 Spring 异步任务的链路。示例如下图:
另外,如果胖友不想使用 Spring 提供的异步任务的功能,想自己使用线程池实现异步,同时又想实现对该异步任务的链路追踪,可以参考《SkyWalking —— Application-toolkit-trace-cross-thread.md》文档。
16. Dubbo 示例
示例代码对应仓库:
- 服务 API 项目:lab-39-skywalking-dubbo-api
- 服务 Provider 项目:skywalking-dubbo-provider
- 服务 Consumer 项目:skywalking-dubbo-consumer
本小节,我们来搭建一个 SkyWalking 对 Dubbo 的远程 RPC 调用的链路追踪。该链路通过如下插件实现收集:
- dubbo-2.7.x-conflict-patch
- dubbo-2.7.x-plugin
- dubbo-conflict-patch
- dubbo-plugin
我们来新建一个 lab-39-skywalking-dubbo
模块,一共包含三个子项目。最终如下图所示:
另外,考虑到目前 Dubbo 主要使用 Zookeeper 作为注册中心,所以本小节也是使用 Zookeeper。不了解的胖友,后续可以看看《Zookeeper 极简入门》文章。
16.1 搭建 API 项目
创建 lab-39-skywalking-dubbo-api
项目,服务接口,定义 Dubbo Service API 接口,提供给消费者使用。
16.1.1 UserService
创建 UserService 接口,定义用户服务 RPC Service 接口。代码如下:
public interface UserService {
|
16.2 搭建服务提供者
创建 skywalking-dubbo-provider
项目,服务提供者,实现 lab-39-skywalking-dubbo-api
项目定义的 Dubbo Service API 接口,提供相应的服务。
16.2.1 引入依赖
创建 pom.xml
文件中,引入依赖。
|
- 具体每个依赖的作用,胖友自己认真看下艿艿添加的所有注释噢。
16.2.2 配置文件
在 application.yml
中,添加 Dubbo 配置,如下:
spring:
|
关于
dubbo
配置项,胖友可以后续阅读《芋道 Spring Boot Dubbo 入门》文章。
16.2.3 UserServiceImpl
创建 UserServiceImpl 类,实现 UserService 接口,用户服务具体实现类。代码如下:
|
16.2.4 ProviderApplication
创建 ProviderApplication 类,服务提供者的启动类。代码如下:
@SpringBootApplication
|
16.2.5 IDEA 配置项
通过 IDEA 的「Run/Debug Configurations」配置使用 SkyWalking Agent。如下图所示:
16.3 搭建服务消费者
创建 skywalking-dubbo-consumer
项目,服务消费者,会调用 lab-39-skywalking-dubbo-provider
项目提供的 User Service 服务。
16.3.1 引入依赖
创建 pom.xml
文件中,引入依赖。和「16.2.1 引入依赖」基本是一致的,胖友可以点击 pom.xml
文件查看。
16.3.2 配置文件
在 application.yml
中,添加 Dubbo 配置,如下:
server:
|
关于
dubbo
配置项,胖友可以后续阅读《芋道 Spring Boot Dubbo 入门》文章。
16.3.3 UserController
创建 UserController 类,提供调用 UserService 服务的 HTTP 接口。代码如下:
@RestController
|
16.3.4 ConsumerApplication
创建 ConsumerApplication 类,服务消费者的启动类。代码如下:
@SpringBootApplication
|
16.3.5 IDEA 配置项
通过 IDEA 的「Run/Debug Configurations」配置使用 SkyWalking Agent。如下图所示:
16.4 简单测试
使用 ProviderApplication 启动服务提供者,使用 ConsumerApplication 启动服务消费者。
① 首先,使用浏览器,访问 http://127.0.0.1:8079/user/get?id=1 地址,使用 Dubbo 调用 user-service-provider
服务。因为,我们要追踪下该链路。
② 然后,继续使用浏览器,打开 http://127.0.0.1:8080/ 地址,进入 SkyWalking UI 界面。如下图所示:
③ 之后,点击「拓扑图」菜单,进入查看拓扑图的界面,可以看到两个服务的小方块,以及对应的调用关系。如下图所示:
④ 再之后,点击「追踪」菜单,进入查看链路数据的界面。如下图所示:
17. 抽样收集示例
示例代码对应仓库:lab-39-springmvc 。
在访问量较少时,链路全量收集不会对系统带来多少负担,同时能够完整的观测到系统的运行状况。但是在访问量较大时,全量的链路收集,对链路收集的客户端(应用)、服务端(例如说 SkyWalking OAP Collector)、存储器(例如说 Elastcsearch)都会带来较大的性能开销,甚至会影响应用的正常运行。
因此,在访问量级较大的情况下,我们往往会选择抽样采样,只选择收集部分链路信息。SkyWalking Agent 在 agent/config/agent.config
配置文件中,定义了 agent.sample_n_per_3_secs
配置项,设置每 3 秒可收集的链路数据的数量。
Negative or zero means off, by default.SAMPLE_N_PER_3_SECS means sampling N TraceSegment in 3 seconds tops.
- 默认配置下,不进行限制,即获取全部链路数据。
友情提示:哈哈哈~如果访问量不是特别大,建议还是全量收集!
本小节,我们无需单独搭建项目,而是直接使用 lab-39-springmvc 项目即可。
17.1 SkyWalking Agent 配置文件
修改 SkyWalking Agent 的 agent/config/agent.config
配置文件,开放 agent.sample_n_per_3_secs
配置项,支持使用 SW_AGENT_SAMPLE
环境变量。命令行操作如下:
# 查看当前所在目录
|
配置文件内容如下:
# The number of sampled traces per 3 seconds
|
这样,每个项目可以通过 SW_AGENT_SAMPLE
环境变量,可以实现自定义抽样收集数量。
17.2 IDEA 配置
通过 IDEA 的「Run/Debug Configurations」配置使用 SkyWalking Agent。如下图所示:
通过设置 SW_AGENT_SAMPLE
环境变量为 1,实现每 3 秒只收集一个链路数据,方便演示测试。
17.3 简单测试
① 首先,使用浏览器,疯狂访问下 http://127.0.0.1:8079/demo/echo 地址,请求下 Spring Boot 应用提供的 API。
② 之后,在 SkyWalking UI 的查看链路追踪的界面,看到只有部分链路被收集。?? 这里暂时就不贴图了,嘿嘿~
666. 彩蛋
发现给自己挖了一个深坑,竟然硬生生在一个周末,把主流框架的示例,一个一个搭建处理,并进行测试。
有一点要注意,SkyWalking Agent 提供的插件,是基于我们使用的框架的方法,通过 AOP 的方式进行追踪,所以可能存在不兼容的情况,毕竟框架的代码在不断迭代,方法可能存在一定的变更。因此,一定要注意查看《SkyWalking —— Supported-list.md》文档。
本文暂时没有评论,来添加一个吧(●'◡'●)