(硬核中的硬核)链路追踪落地过程中的挑战与解决方案

news2024/11/26 8:52:18

🎬作者简介:大家好,我是蓝胖子🥇
☁️博客首页:CSDN主页蓝胖子的编程梦
🌄每日一句:编程中我们会遇到多少挫折?表放弃,沙漠尽头必是绿洲。

在这里插入图片描述

大家好,我是蓝胖子,关于链路追踪的demo的讲解文章其实很多,但是想把链路追踪真正融入到生产环境却不是那么容易,今天我们来聊聊链路追踪技术在实际落地过程中不得不解决的两个问题。

实际落地链路追踪时需要考虑的问题

我们来看看这两个问题:

  • 大量链路追踪数据的存储与查询
  • 研发改造成本比较大,需要对不同组件进行埋点统计

👇🏻👇🏻 下面给出我对于这两个问题的一些思考与解决方案。

采样方式的选择

首先是链路追踪数据的存储与查询问题,因为线上环境产生的链路追踪数据往往是及其庞大的,那么肯定是不能全量采集的,并且全量采集链路追踪数据也必然会导致很多没有追踪意义的数据被采集下来,增加了成本。

这就涉及到采样方式的选择,本质上减少采样的数据量,让采样的数据都有意义就能解决产生大量链路追踪数据的问题。

减少采样数据量是一个优化方向,如果减少了采样数据量以后,采样数据还是足够庞大就只能从架构上扩容来满足大量的数据采集的需求,比如如果是用es来存储trace数据,那么可以新增存储的es集群节点来满足大量trace数据存储的问题,并且将数据采集的collector,比如如果使用Opentelemetry,那么可以将Opentelemetry Collector 进行扩容来满足大量数据采集的问题。

关于采样方式的选择,一般分为两种方式,前置采样和后置采样,我们挨个来看看。

前置采样

前置采样是指在采集trace数据第一个节点的时候就判断数据是否被采集,举一个例子,如果有链路A,B,C,如果在A处决定了要对trace数据进行采样,那么这个采样策略会被B,C所继承,B,C也会被采样到。

前置采样比较好理解,也比较容易实现,但是前置采样在生产环境上的使用效果并不好,因为很多时候我们都是需要完整的链路才容易判断整条链路是不是应该被采集到,比如如果整条链路有报错,那么我们是希望整条链路是被采集下来的,但前置采样则无法在采集第一个阶段时就知道后续的span中有错误发生,这是前置采样的缺陷。为了不遗漏线上失败的(有意义的)trace数据,我们往往也会关闭点概率采样,这就导致使用前置采样时,要想确保错误发生时,trace数据一定被采集下来,那么就只有对trace数据进行全部采样了,这显然不是我们需要的。

后置采样

所以,我们来看看,关于链路追踪的另一种采样方式,后置采样,后置采样则是在等待整条链路全部被采集完毕后才会去判断整条链路是否需要被采集。

所以后置采样有个缓存trace数据的地方,拿Opentelemetry Collector的后置采样配置举例,tail_sampling 中的配置是关于后置采样的相关配置。

在接收到trace的span数据后,并不是马上决定该trace是否应该被采样,而是等待decision_wait时间后,将该trace相关的span从内存缓存中取出来判断是否应该被采集,内存不是无限增大的,num_traces限制了最大能存储的trace的条数。

注意📢,num_traces 不要设置的太小,否则容易在等待时间decision_wait内,达到num_traces的阈值从而导致未被处理的trace数据被丢弃。

processors:  
  tail_sampling:  
    decision_wait: 5s  
    num_traces: 1  
    expected_new_traces_per_sec: 1  
    policies:  
      [  
        {  
          name: test-policy-11,  
          type: boolean_attribute,  
          boolean_attribute: { key: slowsql, value: true }  
        }  
      ]

在上述配置中,设置了采样的策略,即采集到的span中如果有slowsql属性设置为true则认为该条trace应该被采集。

注意📢,只要一条trace轨迹中,有一个span被确认为需要被采集,那么整条trace都会被采集到。

可以注意到,通过后置采样,我们可以设计如下的一些有意义的采集策略,

  • 对请求链路中有错误发生的链路进行采集
  • 对有慢查询的链路进行采集
  • 对慢http请求的链路进行采集

通过这样的策略,我们最大化的减少无效数据的存储,能大大减少链路追踪的采集存储查询成本。接着来看下实施后置采样可以用哪些组件,下面我用一个业界比较常见的后置采样架构举例。

技术选型

后置采样能解决仅采集有效trace数据的问题,但不是所有链路追踪工具都具有后置采样的功能,比如jaeger就仅仅支持前置采样,在使用jaeger时, 需要配合Opentelemetry Collector,借用Opentelemetry Collector 的后置采样功能来进行trace数据的过滤,然后再由jaeger 去进行收集和展示。

整个采集架构类似于这样,

Opentelemetry Collector 将后置采样后的数据发往jaeger Collector 去进行收集,最后通过jaeger 的ui组件显示出来。这个架构也是jaeger官方推荐的一种架构模型。下面是其相关的部署模式链接。

https://www.jaegertracing.io/docs/1.52/architecture/

自动化监测的实现方案

上面通过后置采样的方案算是解决了大量trace数据采集的问题,接着我们来看看关于项目服务接入链路追踪时要做的基础组件改造问题。

目前golang 服务在接入链路追踪功能时,主要还是通过在基础框架中进行埋点处理,这涉及到一定的研发成本,和java不同,java的字节码注入技术可以实现对业务服务的零侵入接入链路追踪技术。

不过在golang这块,目前业界已经有开源项目opentelemetry-go-instrumentation ,它的目的是通过epbf技术在不修改服务代码的前提下,实现golang的自动化监控。大家可以关注下这块儿,不过目前它支持的自动化监控范围并不多,下面是该项目的访问地址。

https://github.com/keyval-dev/opentelemetry-go-instrumentation/tree/master

所以,总结下来,golang构建的服务,还是会更多的手动去改造基础框架,后续有空再介绍相关框架如何改造来支持链路追踪的吧。

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

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

相关文章

【Qt加密播放器】登录窗口功能补充

输入框小设计 目的:实现鼠标点击输入框时的聚焦效果。 首先在LoginForm构造函数中为账号和密码输入框添加事件过滤器。关于事件过滤器的具体介绍可以参考这篇博文:Qt消息机制和事件 ui->nameEdit->installEventFilter(this); ui->pwdEdit->…

uniapp+微信小程序+nodejs问题记录

一、前言 通过uniapp进行微信小程序调试。服务端使用NodeJs。 二、报错统计 1、本地调试时微信小程序报错:request:Cannot send network request to localhost 解决方法: 【微信小程序开发平台】-【本地设置】-勾选“不校验合法域名、web-view、TLS版本…

Python完善APC netbotz 250报告功能实现主动式运维。

首先介绍一下APC netbotz 250, 这是施耐德推出的一款机架式监控主机,能够对所有IT环境进行经济有效而且灵活的监控,号称APC史上性价比最高的环境监测方案,这可不是我吹的,是APC官网的介绍,可参考下面的官网截图。 我们…

Visual Studio 2022编译错误 Error MSB8041-此项目需要MFC库解决方案

Visual Studio 2022编译错误 Error MSB8041-此项目需要MFC库 错误原因: Visual Studio 2022安装的MFC库不够。 解决方案: 安装Visual Studio 2022 需要的MFC 库就可以了。 安装方法: 第一步,打开vs2022 工具 ->获取工具和功…

数据可视化Tableau

目录 一.第一次实验课内容 1、熟悉Tableau Desktop的工作环境。 2、熟悉数据导入、维度和度量的区分以及不同数据字段类型的标识符。 3、熟悉工作表的基本操作,主要包括行列功能区,标记卡,筛选器,智能推荐的使用。 4、作业--…

两个链表的第一个重合节点

法一:蛮力法 即顺序遍历第一个链表的每个节点,每遍历到一个节点,就在第二个链表中顺序遍历每个节点,比较是否有节点相同。该方法的时间复杂度是O(mn),空间复杂度是O(1)。…

Java进击框架:Spring-综合(十)

Java进击框架:Spring-综合(十) 前言Rest ClientsWebClientRestTemplateHTTP接口 JMS (Java消息服务)使用Spring JMS发送消息接收消息注释驱动的侦听器端点 JMXEmail任务执行和调度Spring TaskExecutor 抽象Spring TaskScheduler 抽象支持调度…

cuda基础教程(一)

文章目录 0. CURA Runtime API1. CUDA人工智能编程1.1. CUDA介绍1.2. 课程内容 2. 异构计算和并行计算2.1. 什么是并行计算2.2. 什么是异构计算 3. CUDA介绍3.1. GPU的性能指标3.2. 什么是CUDA3.3. 如何学习CUDA 4. 系统GPU查询5. Linux系统6. CUDA安装7. 查询GPU信息8. CUDA编…

[C#][opencvsharp]winform实现自定义卷积核锐化和USM锐化

【锐化介绍】 图像锐化(image sharpening)是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰,分为空间域处理和频域处理两类。图像锐化是为了突出图像上地物的边缘、轮廓,或某些线性目标要素的特征。这种滤波方法…

Python机器学习:一文讲透机器学习中的验证集法

验证集法又被称为“留出法”,基本思路是将样本数据集划分为两个互斥的集合:训练集和测试集。其中训练集占比一般为2/3~4/5,常用70%;测试集占比一般为1/5~1/3,常用30%。训练集用来构建机器学习模型;测试集也…

vit细粒度图像分类(八)SIM-Trans学习笔记

1.摘要 细粒度视觉分类(FGVC)旨在从相似的从属类别中识别物体,这对人类准确的自动识别需求具有挑战性和实用性。大多数FGVC方法侧重于判别区域挖掘的注意机制研究,而忽略了它们之间的相互依赖关系和组成的整体对象结构,而这些对模型的判别信…

11. UE5 RPG使用GameplayEffect修改角色属性(二)

上一篇写了一下GameplayEffect的基础操作,这一篇进阶一下,讲解一下GameplayEffect堆叠功能,以及能够基于这个堆叠能够实现一些怎样的效果。 经过几天的查看,发现新版的更新的真不错,而且最上面竟然直接显示编译的错误…

Django部署到服务器后无法获取到静态元素 The requested resource was not found on this server

问题描述 写了一个Django项目,部署到云主机后,访问发现图片无法访问,报错The requested resource was not found on this server 图片是一个词云图,根据爬虫爬取的信息生成的,根据爬取的信息会改变,所以没…

大数据信用报告应该去哪里查询比较好呢?

对于个人而言,大数据信用报告也变得越来越重要。那么,大数据信用报告应该去哪里查询呢?本文将为您详细介绍征信和大数据的区别,并推荐一个可靠的大数据平台。 首先,我们需要了解征信和大数据的区别 征信报告 依法采集、整理、保存…

Redis主从集群

一.资源分布 操作系统:Centos 7 Redis版本:6.2.14 IP端口角色192.168.157.1306379master192.168.157.1316379slave1192.168.157.1326379slave2 二.流程 1.创建三台虚拟机IP及端口如上且安装好Reids 2.修改三个redis.conf配置文件 其它说明&#xff1a…

Modbus协议学习第六篇之基于libmodbus库的示例程序(可以联合Modbus模拟仿真软件进行调试)

前置工作 学了这么多Modbus的知识,如果不进行实际的操作,总感觉懂的不透彻。基于此, 本篇博文就带各位读者来了解下如何通过编写程序来模拟与Modbus Slave仿真软件的通讯。当然了,这里有两个前提,如下: 1.请…

printf死翘翘

本来想把我的单片机玩一下,寄给在大学搞研究的一个朋友,但竟然挂在printf里面,大概知道是什么位置出问题,但是还想不清楚什么原因。 我先是在stc51单片机里面搞了串口,然后我想用串口重定向到printf做调试,…

element-ui icon 组件源码分享

今日简单分享 element-ui 源码中的 icon 组件,主要从以下两个方面来分享: 一、源码中 icon 设计思想是什么呢?主要从页面结构、数据、 icon 样式三个方面来分享。 1.1 源码中 icon 组件的页面结构,可以在 package 目录下找到 ico…

Android 高德地图切换图层

一、默认样式 Android 地图 SDK 提供了几种预置的地图图层&#xff0c;包括卫星图、白昼地图&#xff08;即最常见的黄白色地图&#xff09;、夜景地图、导航地图、路况图层。 findViewById<TextView>(R.id.normal).setOnClickListener {updateSelectedStatus(TYPE_NORMA…

LeetCode 每日一题Day 54 - 61

2859. 计算 K 置位下标对应元素的和 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 请你用整数形式返回 nums 中的特定元素之 和 &#xff0c;这些特定元素满足&#xff1a;其对应下标的二进制表示中恰存在 k 个置位。 整数的二进制表示中的 1 就是这个整数的 置位…