https://github.com/zq2599/blog_demos
内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;
采样很好理解:使用Jaeger时,未必需要将所有请求都上报到Jaeger,有时候只要抽取其中一部分观察即可,这就是按照一定策略进行采样;
Jaeger SDK是支持多种采样配置的,在分布式系统中,他们遵循的原则是前置判定(consistent upfront 或者head-based),简单来说,假如consumer服务调用provider服务,那么某一次请求只要consumer决定不采样,那么provider在处理这个请求的时候也不会采样,也就是说对于一次完整的trace,只要最前面的服务不上报到jaeger,那么整个trace后面涉及的服务都不会上报到jaeger
Jaeger采样配置分为客户端和服务端两种配置,默认用的是服务端配置
本文咱们来了解如何在客户端(也就是接入Jaeger的应用)配置采样,并且动手验证效果,常用的客户端采样策略有以下三种:
#!/bin/bash echo "停止docker-compose" 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 ..
固定采样的逻辑很简单:要么全部上报,要么一个也不报
固定采样的配置方式如下图红框所示:
要注意的是:根据前置判定(consistent upfront 或者head-based)原则,只要将上述配置写入jaeger-service-consumer项目的配置文件即可,至于jaeger-service-provider维持原状不做任何改动
执行前面写的full.sh脚本,编译构建部署
浏览器访问http://localhost:18080/hello,产生一些web请求,多访问几次
看jaeger-service-consumer容器的日志,如下图,红框中的sampled=false表示未采样,三此请求的日志都是如此:
执行前面写的full.sh脚本,编译构建部署
测试比例采样的方法就是发多个请求,检查采样的trace是否是总数的十分之一,我这里用jmeter来执行多次请求,您可以选择自己擅长的工具,或者写代码写脚本,甚至手动访问多次
使用jmeter可以控制请求次数,用的是Loop Controller,如下图红框所示:
docker logs jaeger-service-consumer| grep 'sampled=true'|wc -l
执行前面写的full.sh脚本,编译构建部署
咱们的配置是每秒钟一次采样,所以验证的时候要控制好发送请求的时长,我这里还是用jmeter来发请求的,如下图红框所示,jmeter有种Runtime Controller类型的控制器,可以控制持续请求的时长,我这里设置为10秒:
还记得[《分布式调用链跟踪工具Jaeger?两分钟极速体验》]、[《Jaeger开发入门(java版)》]等文章中的操作吗?那时咱们并没有添加任何与采样有关的配置,但是每次请求都能在Jaeger的web页面上查到对应的trace,也就是说所有请求全部被采样了,这是为啥?
如果配置文件中没有采样相关的内容,那么默认使用的就是远程配置,具体的信息就在jaeger的all-in-one容器中,执行下面这个命令,就能看到远程采样配置:
docker exec jaeger cat /etc/jaeger/sampling_strategies.json
{ "default_strategy": { "type": "probabilistic", "param": 1 } }
我是欣宸,期待与您一同畅游Java世界…
https://github.com/zq2599/blog_demos