写点什么

Jaeger 的客户端采样配置 (Java 版)

作者:Java高工P7
  • 2021 年 11 月 11 日
  • 本文字数:2130 字

    阅读完需:约 7 分钟

cd jaeger-service-provider && docker-compose down && cd ..


echo "编译构建"


mvn clean package -U -DskipTests


echo “创建 provider 镜像”


cd jaeger-service-provider && docker build -t bolingcavalry/jaeger-service-provider:0.0.1 . && cd ..


echo “创建 consumer 镜像”


cd jaeger-service-consumer && docker build -t bolingcavalry/jaeger-service-consumer:0.0.1 . && cd ..


echo "清理无效资源"


docker system prune --volumes -f


echo "启动 docker-compose"


cd jaeger-service-provider && docker-compose up -d && cd ..


  • 如果您用的是 IDEA,在下图红框位置添加一个自定义命令,选中上述 shell 文件,就可以在 IDEA 中用 run 命令来编译构建部署了:



  • 现在准备工作已经完成,开始实战吧,从最简单的固定采样开始;

固定采样

  • 固定采样的逻辑很简单:要么全部上报,要么一个也不报

  • 固定采样的配置方式如下图红框所示:



  • 要注意的是:根据前置判定(consistent upfront 或者 head-based)原则,只要将上述配置写入 jaeger-service-consumer 项目的配置文件即可,至于 jaeger-service-provider 维持原状不做任何改动

  • 执行前面写的 full.sh 脚本,编译构建部署

  • 浏览器访问 http://localhost:18080/hello,产生一些 web 请求,多访问几次

  • 看 jaeger-service-consumer 容器的日志,如下图,红框中的 sampled=false 表示未采样,三此请求的日志都是如此:



  • 再看 jaeger-service-provider 容器的日志,如下图红框,也全部都没有采样,这证明 Jaeger 的前置判定原则(consistent upfront 或者 head-based)是准确的,jaeger-service-consumer 是一次 trace 的源头,被它关闭了采样的 trace,在后续的服务中也会自动关闭采样:



  • 去 Jaeger 的 web 页面看看,空空如也,连服务列表中都没有 jaeger-service-consumer 和 jaeger-service-provider:



  • 试过了全部不采样,再来试试全部采样的配置,如下图红框:



  • 重新部署,再产生几次请求,去看 jaeger-service-consumer 容器的日志,如下图红框,全部都被采样了:



  • 去看 jaeger-service-provider 容器的日志,也是如此,所有 trace 都被采样:



  • 打开 Jaeger 的 web 页面,可见 jaeger-service-consumer 的三次请求对应的 trace 全部上报:



  • 至此,最简单的固定采样已完成,来看看更实用的比例采样

比例采样

  • 顾名思义,就是按照一定的百分比采样,配置如下图所示:



  • 执行前面写的 full.sh 脚本,编译构建部署

  • 测试比例采样的方法就是发多个请求,检查采样的 trace 是否是总数的十分之一,我这里用 jmeter 来执行多次请求,您可以选择自己擅长的工具,或者写代码写脚本,甚至手动访问多次

  • 使用 jmeter 可以控制请求次数,用的是 Loop Controller,如下图红框所示:



  • 向 jaeger-service-consumer 的/hello 接口发送完一百次请求后,可以从 docker 容器日志中检查采样情况,这里使用 grep 和 wc 命令的组合来统计日志中出现 sampled=true 和 sampled=false 的行数,完整的命令如下:


docker logs jaeger-service-consumer| grep 'sampled=true'|wc -l


  • 100 个请求,采样率百分之十,但是用上述命令得到的结果并不是精确值 10,而是 8,再统计未采样的日志行数(把 true 改成 false),得到的结果是 92,总数对得上,但是采样数并非精确的百分之十,如下图:



  • 然后将请求总数增加到一千条,得到的采样比例接近百分之十,如下:



  • 打开 Jaeger 的 web 页面,可见果然只有 106 个 trace:



  • 比例采样完成了,接下来是限速采样

限速采样

  • 关于限速,似乎不够具体不便于理解,但是看看官方文档上的关键字 leaky bucket,如下图红框,聪明的您一定想到了其中的关键,漏桶限流算法(注意,是漏桶,不是令牌桶,漏桶算法的峰值和桶大小有关):



  • 配置如下图红框所示:



  • 执行前面写的 full.sh 脚本,编译构建部署

  • 咱们的配置是每秒钟一次采样,所以验证的时候要控制好发送请求的时长,我这里还是用 jmeter 来发请求的,如下图红框所示,jmeter 有种 Runtime Controller 类型的控制器,可以控制持续请求的时长,我这里设置为 10 秒:



  • 用 jmeter 持续发送 10 秒的请求,从 jmeter 的汇总报告中可见一共发了 70 个请求:


![在这里插入图片描述](https://img-blog.csdnimg.cn/c0049a4ce42a4594b7cc14bfcded98fa.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA56iL5bqP5ZGY5qyj5a64,size_20,colo


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


r_FFFFFF,t_70,g_se,x_16)


  • 用命令 docker logs jaeger-service-consumer| grep ‘sampled=true’|wc -l 查看采样总数,10 秒的预期是 10 个,结果如下,并不精确,只是接近而已:



  • 清掉所有数据,将时长改成 100 秒试试,一共发出次 852 请求:



  • 采样总数为 96,接近预期:



  • 打开 Jaeger 的 web 页面也是 96 次 trace:


服务端配置一瞥

  • 还记得《分布式调用链跟踪工具Jaeger?两分钟极速体验》《Jaeger开发入门(java版)》等文章中的操作吗?那时咱们并没有添加任何与采样有关的配置,但是每次请求都能在 Jaeger 的 web 页面上查到对应的 trace,也就是说所有请求全部被采样了,这是为啥?

  • 如果配置文件中没有采样相关的内容,那么默认使用的就是远程配置,具体的信息就在 jaeger 的 all-in-one 容器中,执行下面这个命令,就能看到远程采样配置:


docker exec jaeger cat /etc/jaeger/sampling_strategies.json

用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
Jaeger的客户端采样配置(Java版)