skywalking 请求链路采样设置和原理

目标

skywalking 默认情况会采集大量 trace 数据,这样可以比较全的追踪所有请求调用链路的请求,但同时对 ES 存储资源要求非常高,需要我们投入很大的存储节点才可以。那么有没有一种采样的请求上报的机制呢?答案是有的,通过设置采样数据的比例,我们就可以在资源成本和采集条目之前取得一个平衡。

现状

日常排查问题的现实情况往往是,我们只需要能采集到出现问题的请求链路即可,而不需要能够采集所有请求的链路数据,在加了采样条目设置后,有一部分 trace 数据会被丢掉,当然如果正好丢掉了我们出问题的 trace 请求,那么就需要我们稳定复现请求,从而控制概率采集到该问题数据。

skywalking 里面配置采样条目

在 skwalking 的 agent 目录下的 agent.conf 文件有采样参数的设置 sample_n_per_3_secs,默认情况下该值 是 0 或者 -1 的情况下是关闭采样功能,如果大于 0,则代表agent 3 秒内采集多少条数据上报 oap

agent.sample_n_per_3_secs=${SW_AGENT_SAMPLE:40}

注意:该值的修改需要每次进行 agent 打包后生效

采样功能的原理分析

SamplingService 类里面的 handleSamplingRateChanged 方案,会启动一个线程,每隔 3 秒定时重置采样值的计数器:

void handleSamplingRateChanged() {if (getSamplingRate() > 0) {if (!on) {on = true;this.resetSamplingFactor();ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(new DefaultNamedThreadFactory("SamplingService"));scheduledFuture = service.scheduleAtFixedRate(new RunnableWithExceptionProtection(this::resetSamplingFactor, t -> LOGGER.error("unexpected exception.", t)), 0, 3, TimeUnit.SECONDS);LOGGER.debug("Agent sampling mechanism started. Sample {} traces in 3 seconds.",getSamplingRate());}} else {if (on) {if (scheduledFuture != null) {scheduledFuture.cancel(true);}on = false;}}
}

计数器采用 java 并发包下面的原子类计数,从而确保多线程环境下该值的并发更新问题:

    private void resetSamplingFactor() {samplingFactorHolder = new AtomicInteger(0);}

然后提供了一个方法,用于判断是否到达采样阈值:

    public boolean trySampling(String operationName) {if (on) {int factor = samplingFactorHolder.get();if (factor < getSamplingRate()) {return samplingFactorHolder.compareAndSet(factor, factor + 1);} else {return false;}}return true;}

在这个方法里面可以看到,如果原子类 AtomicInteger 实例的 get 方法的值小于阈值,然后就进行一次 CAS 更新操作,当 CAS 成功时代表该 trace context 数据允许上报 oap,否则就代表达到了采样阈值,该 trace context 数据丢弃。

上报还是不上报的逻辑在 ContextManagerExtendService 类的 createTraceContext 方法中可以找到:

 public AbstractTracerContext createTraceContext(String operationName, boolean forceSampling) {AbstractTracerContext context;/** Don't trace anything if the backend is not available.*/if (!Config.Agent.KEEP_TRACING && GRPCChannelStatus.DISCONNECT.equals(status)) {return new IgnoredTracerContext();}int suffixIdx = operationName.lastIndexOf(".");if (suffixIdx > -1 && Arrays.stream(ignoreSuffixArray).anyMatch(a -> a.equals(operationName.substring(suffixIdx)))) {context = new IgnoredTracerContext();} else {SamplingService samplingService = ServiceManager.INSTANCE.findService(SamplingService.class);//如果该条打上了强制采样标签 或 满足满足采样条件就可以直接上报 oapif (forceSampling || samplingService.trySampling(operationName)) {context = new TracingContext(operationName);} else {//否则就忽略该次 trace context, 不做任何处理context = new IgnoredTracerContext();}}return context;}
总结

通过合理的 skywalking 的采样机制的设置,可以大大减轻服务端 ES 的存储压力,以及减少 agent 端消耗应用的的 cpu 和内存的资源,也包括减少上报 oap 网络带宽的占用等,从而达到在资源成本和采集请求覆盖面得到一个平衡

参考

Table of Agent Configuration Properties | Apache SkyWalking

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/45350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云ECS服务器安装jdk并运行jar包,访问成功详解

安装 OpenJDK 8 使用 yum 包管理器安装 OpenJDK 8 sudo yum install -y java-1.8.0-openjdk-devel 验证安装 安装完成后&#xff0c;验证 JDK 是否安装成功&#xff1a; java -version设置 JAVA_HOME 环境变量&#xff1a; 为了确保系统中的其他应用程序可以找到 JDK&…

星火智能体创建指南,星火大模型智能体创建教程

一、什么是星火助手 星火助手是基于讯飞星火认知大模型&#xff0c;面向用户使用场景&#xff0c;打造的高效生产力工具。通过设置结构化的指令模板&#xff0c;用户即可完成助手功能设定&#xff0c;每个助手在对话的模式下能够快速满足场景需求。同时支持助手模板、数据集、…

Spring boot 2.0 升级到 3.3.1 的相关问题 (一)

文章目录 Spring boot 2.0 升级到 3.3.1 的相关问题 &#xff08;一&#xff09;拦截器Interceptor的变动问题介绍解决方案 WebMvcConfigurerAdapter 自定义Mvc配置问题介绍解决方案 Spring boot 2.0 升级到 3.3.1 的相关问题 &#xff08;一&#xff09; 拦截器Interceptor的…

单链表算法 - 链表的中间节点

. - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/middle-of-the-linked-list/description/ 思路1: 思路2: 代码: /*** …

【接口自动化_06课_Pytest+Excel+Allure完整框架集成】

一、logging在接口自动化里的应用 1、设置日志的配置&#xff0c;并收集日志文件 日志的设置需要在pytest.ini文件里设置。这个里面尽量不要有中文 2、debug日志的打印 pytest.ini文件的开关一定得是true才能在控制台打印日志 import allure import pytest from P06_PytestFr…

CUDA cuDNN和pytorch(GPU版)的完整安装教程

​ * 说明: 本教程使用wsl-ubuntu20.04, 其他发行版linux的命令可能有所区别. *实测机型: i5-13500HX | RTX 4060 Laptop 一、下载CUDA12.X版本 这里以下载CUDA12.2为例。 前往cuda-12.2下载页, 按照如图方式选择合适的选项&#xff1a; 按照官方给出的命令&#xff0c; 在b…

Trie树的应用

Trie树的应用 题目解题思路代码 题目 维护一个字符串集合&#xff0c;支持两种操作&#xff1a; I x 向集合中插入一个字符串 x x x&#xff1b;Q x 询问一个字符串在集合中出现了多少次。 共有 N N N 个操作&#xff0c;所有输入的字符串总长度不超过 1 0 5 10^5 105&am…

ArkTS学习笔记_封装复用之@builderParam装饰器

ArkTS学习笔记_封装复用之builderParam装饰器 作用&#xff1a; 在自定义组件中&#xff0c;该装饰器用于装饰函数成员变量&#xff0c;builderParam装饰的函数成员变量的值必须是经过builder装饰的方法。变量初始化后可以在自定义组件内调用。初始化&#xff1a; 可以使用自定…

移动应用性能关注分析哪些指标

移动应用常见性能指标 要对应用开展性能测试&#xff0c;首先需要了解需要重点关注哪些指标&#xff1f;指标的参考范围大致是多少&#xff1f;可采用哪些工具收集这些指标&#xff1f;如何收集&#xff1f;如果指标有异常&#xff0c;大致有哪些high level的优化思路。这篇博客…

说一下GET请求和POST请求的区别

面试官常常会问到的一个问题就是&#xff1a;GET请求和POST请求的区别。因为一个看似简单的问题就能考察出面试者对网络协议和通信的掌握程度以及对前后端开发基础知识是否了解、安全性意识是否足够强&#xff0c;以及综合分析与总结能力等。 所以答的好可以让面试官对你刮目相…

YoloV8改进策略:卷积篇|Kan行天下之GRAM,KAN遇见Gram多项式V2版本

GRAM(GRAM可能是一个新提出的模型或方法的缩写,这里我们根据上下文进行解释)受到诸如TorchKAN和ChebyKAN等Kolmogorov-Arnold网络(KAN)替代方案的启发。GRAM引入了一种简化的KAN模型,但同时利用了Gram多项式变换的简单性。它与其他替代方案的不同之处在于其独特的离散性特…

Vue3 使用emoji表情包 emoji-mart-vue-fast

文档&#xff1a;emoji-mart-vue-fast - npm (npmjs.com) 非常简单 代码直接照抄即可 1. 引入 pnpm install emoji-mart-vue-fast 2. 使用 <template><Picker:data"emojiIndex":emojiSize"18":showPreview"false":infiniteScroll&quo…

【07】分布式事务解决方案

1、事务简介 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中&#xff0c;一个事务由一组SQL语句组成。事务应该具有ACID四个特性&#xff1a;原子性、一致性、隔离性、持久性。任何事务机制在实现时&#xff0c;都应该考虑事务…

J025_斗地主游戏案例开发(简版)

一、需求描述 完成斗地主游戏的案例开发。 业务&#xff1a;总共有54张牌&#xff1b; 点数&#xff1a;3、4、5、6、7、8、9、10、J、Q、K、A、2 花色&#xff1a;黑桃、红桃、方片、梅花 大小王&#xff1a;大王、小王 点数分别要组合4种花色&#xff0c;大小王各一张。…

[激光原理与应用-114]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 18 - 产品宣传、介绍、产品价值、帮助客户解决的问题

目录 一、第一印象 1.1 我是谁&#xff1f;产品是什么&#xff1f;产品在产业链中的位置 1.2 公司在产业链中的位置&#xff1f;公司简介&#xff1f; 二、IPM工作原理 2.1 IPM系统组成 2.2 基于激光熔池光学检测原理 2.3 基于信号特征的检测原理 三、IPM产品如何与客…

2-17,18,19 -- 关于指针

指针(pointer 声明指针 int *p;定义指针 int a 4; int *p &a; //指针p是指向变量a的地址的指针指针数组 int *arr[5];数组指针 int (*arr)[5];函数指针 int (*fun)(int,int) // 声明一个指向函数的指针,这个函数的返回值是int,有两个int的参数指针的指针 int **p;…

ArkTS学习笔记_封装复用之@Styles装饰器

ArkTS学习笔记_封装复用之Styles装饰器 背景&#xff1a; 在开发中&#xff0c;如果每个组件的样式都需要单独设置&#xff0c;就会出现大量代码在进行重复样式设置&#xff0c;虽然可以复制粘贴&#xff0c;但为了代码简洁性和后续方便维护&#xff0c;给出的思路是&#xff…

jmeter分布式(四)

一、gui jmeter的gui主要用来调试脚本 1、先gui创建脚本 先做一个脚本 演示&#xff1a;如何做混合场景的脚本&#xff1f; 用211的业务比例 ①启动数据库服务 数据库服务&#xff1a;包括mysql、redis mysql端口默认3306 netstat -lntp | grep 3306处于监听状态&#xf…

深入了解MySQL中的innodb_lock_wait_timeout

引言 在数据库管理中&#xff0c;确保数据的一致性和完整性是至关重要的。MySQL的InnoDB存储引擎通过行级锁定机制来实现这一点。然而&#xff0c;当多个事务同时操作数据库时&#xff0c;可能会出现锁等待的情况。了解并合理配置innodb_lock_wait_timeout参数&#xff0c;对于…

数据库第6次作业

内容 1、创建视图v_emp_dept_id_1&#xff0c;查询销售部门的员工姓名和家庭住址 2、创建视图v_emp_dept&#xff0c;查询销售部门员工姓名和家庭住址及部门名称。 3、创建视图v_dept_emp_count(dept_name,emp_count,avg_salay)&#xff0c;统计每个部门人数并计算平均工资。 …