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

标签: | 发表时间:2021-09-22 08:20 | 作者:boling_cavalry
出处:https://blog.csdn.net/boling_cavalry

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos

关于采样(Sampling)

  • 采样很好理解:使用Jaeger时,未必需要将所有请求都上报到Jaeger,有时候只要抽取其中一部分观察即可,这就是按照一定策略进行采样;
  • Jaeger SDK是支持多种采样配置的,在分布式系统中,他们遵循的原则是前置判定(consistent upfront 或者head-based),简单来说,假如consumer服务调用provider服务,那么某一次请求只要consumer决定不采样,那么provider在处理这个请求的时候也不会采样,也就是说对于一次完整的trace,只要最前面的服务不上报到jaeger,那么整个trace后面涉及的服务都不会上报到jaeger
  • Jaeger采样配置分为客户端和服务端两种配置,默认用的是服务端配置
  • 本文咱们来了解如何在客户端(也就是接入Jaeger的应用)配置采样,并且动手验证效果,常用的客户端采样策略有以下三种:
  1. 固定:要么全部采样,要门全部不采样
  2. 比例:按照指定比例采样
  3. 限速:固定时间周期内采样固定数量,例如每秒一个
  • 接下来,逐个配置和体验这三种采样的效果

关于实战用的工程

  • 采样配置实战不涉及编码,只需要改一些配置,所以没必要大张旗鼓的新建工程写代码,用 《Jaeger开发入门(java版)》一文中的两个maven子工程即可:服务提供方jaeger-service-provider和服务调用方jaeger-service-consumer,都做成docker镜像,用docker-compose启动,网络架构如下图:
    在这里插入图片描述
  • 请确保项目的日志模板中已添加了traceId、spanId、sampled等变量,如下图红框所示,有了这些配置,咱们在日志中就能看到对应的trace是否被采样(这一步 非常重要):
    在这里插入图片描述
  • 为了方便修改代码后重新部署启动,我写了个名为full.sh的shell脚本文件,运行即可将修改后的代码制作成最新的镜像并用docker-compose运行起来:
  #!/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 ..
  • 如果您用的是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个请求:
    在这里插入图片描述
  • 用命令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
  • 上述命令可以看到sampling_strategies.json的内容如下,原来服务端的配置是比例采样,不过比例是百分之百,这就能解释为何所有请求都能在Jaeger的web页面查到trace信息了:
  {
  "default_strategy": {
    "type": "probabilistic",
    "param": 1
  }
}
  • 至此,采样配置实战已经完成,希望能给您提供一些参考,辅助您针对实际情况定制更加合适的采样策略

你不孤单,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列
作者:boling_cavalry 发表于 2021/09/22 08:20:53 原文链接 https://blog.csdn.net/boling_cavalry/article/details/120395628
阅读:12

相关 [jaeger 客户端 采样] 推荐:

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

- - 程序员欣宸的博客
这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos. 采样很好理解:使用Jaeger时,未必需要将所有请求都上报到Jaeger,有时候只要抽取其中一部分观察即可,这就是按照一定策略进行采样;. Jaeger采样配置分为客户端和服务端两种配置,默认用的是服务端配置.

SpringCloud项目接入Jaeger(下) - 掘金

- -
spring-cloud-sleuth这个组件时,会面临两个问题. 首先是日志中无法显示traceId和spanId这些链路信息,其次是不能在用. spring-cloud-sleuth所提供的方式进行链路传值. spring-cloud-sleuth是将traceId等链路信息保存在. slf4j的MDC(Mapped Diagnostic Contexts)中,然后通过%X{traceId}这种方式将traceId提取出来,比如打印到控制台的默认格式是:.

为Jaeger安装环境搭建监控基础设施

- - InfoQ - 促进软件开发领域知识与创新的传播
本文最初发表于 RedHat开发者博客,经原作者Juraci Paixão Kröhling和RedHat授权由InfoQ中文站翻译分享. 在生产环境中部署 Jaeger时,持续观察Jaeger实例,保证它的行为符合预期是非常重要的. 毕竟,Jaeger停机将会意味着跟踪数据的丢失,这样的话,我们很难理解生产环境的应用中究竟出现了什么问题.

[原]Java应用日志如何与Jaeger的trace关联

- - 程序员欣宸的博客
这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos. 经过 《Jaeger开发入门(java版)》的实战,相信您已经能将自己的应用接入Jaeger,并用来跟踪定位问题了,本文将介绍Jaeger一个小巧而强大的辅助功能,用少量改动大幅度提升定位问题的便利性:将业务日志与Jaeger的trace关联.

利用Jaeger打造云原生架构下分布式追踪系统

- -
Jaeger由Uber开源并被云原生基金会(CNCF)纳入孵化项目,背后有大厂和强大的组织支持,项目目前开发活跃;. 原生支持 OpenTracing 标准(可以认为是OpenTracing协议的参考实现),支持多种主流语言,可以复用大量的 OpenTracing 组件;. 高扩展,易伸缩,没有单点故障,可以随着业务方便扩容;.

MongoDB 客户端 MongoVue

- - haohtml's blog
今天在同事那里看到了一个很不错的MongoDB的客户端工具MongoVue,地址是 http://www.mongovue.com/. 做的不错,1.0版本的开始收费了,费用也不贵才35$. 真正需要的同学可以掏点钱买个吧,也算是支持这个工具,如果只是学习研究用的话我这里还有一个0.9.7版本,虽然比起1.0版来说有些bug,平常使用也够了,需要的同学可以单独联系我.

[转]memCached 客户端

- - 小鸥的博客
memcache客户端下载. 许多Web应用都将数据保存到DBMS中,应用服务器从中读取数据并在浏览器中显示. 但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响. memcached 是以LiveJournal 旗下Danga Interactive 公司的Brad Fitzpatric 为首开发的一款软件.

客户端·优化

- - 博客园_首页
网络连接和初始HTTP请求. 浏览器检索网页,先从URL开始,使用DNS确定IP地址,再用基于TCP和HTTP协议连接到服务器,请求相关的内容,得到相应,浏览器解析并呈现到屏幕上. 服务器响应后,浏览器响应不会同时全部到达,会陆续到达,有时候之间还会有时间间隔. 页面解析和新的资源请求浏览器等待数据包时,会解析得到包,并寻找可用新的HTTP请求,并启动,每一个服务器,浏览器一般最多同时打开两个请求连接.

微服务全链路跟踪:jaeger集成istio,并兼容uber-trace-id与b3 - lipeng的个人空间 - OSCHINA

- -
微服务全链路跟踪:grpc集成zipkin. 微服务全链路跟踪:grpc集成jaeger. 微服务全链路跟踪:springcloud集成jaeger. 微服务全链路跟踪:jaeger集成istio,并兼容uber-trace-id与b3. 微服务全链路跟踪:jaeger集成hystrix. 公司有自己的一套基于k8s的paas系统,并且集成了istio,这里主要是想讲解下springcloud服务如何集成istio.

BitCoin for Ubuntu 11.04 客户端

- Riku - Wow! Ubuntu
BitCoin 最近很热,大量的媒体、Blog ,甚至叽喳上都在谈论此物. 那么 BitCoin 到底为何物. [以下引用自 ivarptr 的文章,详情请看“通俗易懂讲解什么是 Bitcoin 虚拟货币”一文]. Bitcoin (为了便于书写和理解,下面如果是表示 “Bitcoin币”意思的地方我称呼其为“贝壳币”,取粤语相近的音译)是一种网络虚拟货币,跟腾讯公司的Q币类似,你可以使用贝壳币购买一些虚拟的物品,比如网络游戏当中的衣服、帽子、装备等,只要有人接受,你也可以使用贝壳币购买现实生活当中的物品.