观测云核心技术解密:eBPF Tracing 实现原理

前言

eBPF 是一种强大的内核技术,允许在内核中安全地执行自定义代码。通过 eBPF,开发者可以在不修改内核源码的情况下,对内核功能进行扩展和监控。eBPF Tracing 利用这一技术,对系统调用、内核函数等进行跟踪,从而实现对应用行为的深入洞察。

与传统的监控方式相比,eBPF Tracing 具有以下优势:

  • 无侵入性:无需修改应用代码即可进行监控。
  • 高性能:在内核层面执行,减少了对应用性能的影响。
  • 细粒度:可以精确到单个系统调用或内核函数的监控。

eBPF(网络)链路实现

实现由三部分构成:

  1. eBPF 探针程序
  2. 解析来自 BPF Map 的网络请求数据、线程(协程)跟踪与 eBPF Span 生成
  3. 链接来自所有节点的汇总 eBPF Span (以下简称 eSpan) 生成链路

eBPF 探针程序

eBPF 探针用于获取程序读写 socket fd 的网络数据,并通过 BPF Map 发送给用户空间的程序进行协议解析。

Linux syscall 函数触发时 eBPF 探针将读取 buf 参数的内容写入 BPF Map,参考 syscall 如下:

ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
...

写入 BPF Map 的数据将记录触发的 syscall 函数及时间、TCP 连接信息、线程/协程信息以及 Linux syscall 的 buf 参数的部分 payload,以下为结构体:

struct network_data
{struct{__u64 ts;                        // 函数调用开始时间__u64 ts_tail;                   // 函数调用结束时间__u64 tid_utid;                  // 内核线程、用户线程 id__u8 comm[KERNEL_TASK_COMM_LEN]; // task commstruct{__u64 sk;      // sock addr__u32 ktime;   // kernel time__u32 prandom; // random number} uni_id;          // 该网络连接的唯一标识 idstruct{__be32 saddr[4]; // src(proc self) ip address; Use the last element to store the IPv4 address__be32 daddr[4]; // dst ip address__u16 sport;     // src(proc self) port__u16 dport;     // dst port__u32 pid;__u32 netns; // network namespace inode. (`stat -L /proc/<pid>/ns/net` or `lsns -t net`)__u32 meta;  // first byte: 0x0000|IPv4 or 0x0001|IPv6; second byte 0x0000|TCP or 0x0100|UDP; ...} conn;          // 连接信息__u32 tcp_seq;   // first byte tcp seq__u16 _pad0;   // 内存对齐填充__u16 func_id; // 函数编号__s32 fd;       // socket fd__s32 buf_len;  // 读写的网络数据字节数__s32 act_size; // 实际采集的 payload 的字节数__u32 index;    // 自增,用于标记进程对 socket fd 读写函数调用顺序} meta;                       // 网络数据 meta__u8 payload[L7_BUFFER_SIZE]; // 网络数据 payload
};

由第二部分的 Agent 实现 eBPF 探针程序的加载和卸载,工作示意图:

网络请求解析、线程跟踪与 eSpan 生成

DataKit-eBPF 程序从 BPF Map 获取网络数据,解析网络协议,根据进程和线程信息构建线程跟踪模型。

其构成主要包含:

  • 采集:
    收集来自 BPF Map 的网络数据等;加载 eBPF 探针程序,attach 到相应的 syscall 函数
  • 解析:
    • 建立进程的线程-网络请求时序模型,通过为应用内关联网络请求(IN/OUT)提供线程跟踪 ID 实现进程内跟踪;
    • 检测网络数据里的网络协议,识别到 HTTP、Redis、MySQL 等协议后进入解析模式,并进行网络协议/进程过滤等;
    • 解析网络协议,采集网络请求,生成请求数据,附加根据 TCP 序列号生成跨进程网络跟踪 ID、附加 Otel/DDTrace 等的链路传播信息(如果有);
  • 生成:
    向生成请求数据中注入线程跟踪 ID,进一步生成 eBPF Span 和生成网络请求聚合数据。
  • 发送:
    由于当前 eBPF Span 中没有建立跨进程调用的父子关系,需要将所有节点的 eSpan 发送至同一个用于 eSpan 链接的 DataKit 或 DataKit-ELinker 服务, 如图:

eSpan 链接

该部分接收来自所有节点的 eSpan 数据,用于建立这些来自多个节点的 eSpan 的跨进程应用调用关系,实现生成完整的链路。

其构成主要包含:

  • 接收 eSpan 并缓存 N 个链接周期(该周期可根据单次应用调用链路的总耗时调参)的 eSpan 数据
  • 按链接周期取数据,加工 eSpan,根据 eSpan 中的进程内跟踪 ID 和跨进程网络跟踪 ID 完成 eSpan 间的链接
  • 采样,该采样为尾部采样;同时,可根据 Otel/DDtrace 等通过网络传播的链路信息中的采样信息进行采样
  • 上传 eBPF 链路数据到观测云

实现效果

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

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

相关文章

【IPV6从入门到起飞】2-1 获取你的IPV6(手机、CPE等)

【IPV6从入门到起飞】2-1 获取你的IPV6&#xff08;手机、CPE等&#xff09; 1 IPV6就在身边2 手机IPV62.1 查看IPV62.2 IPV6 ping包测试2.3 IPV6入站测试 3 电脑通过CPE获取IPV63.1 拉不起宽带的打工人3.2 开始部署IPV6环境3.2.1 刷系统3.2.2 激活IPV63.2.3 设置防火墙入站&am…

JAVA - 关于防重复提交探讨

1、前端提交按钮做单次点击 2、后端接收判断请求的数据包&#xff0c;生成唯一key存redis&#xff0c;设置几秒的过期时间&#xff08;缺陷&#xff1a;带时间戳的数据&#xff0c;需要做些逻辑判断&#xff09; 3、后端代码逻辑redis分布式锁&#xff08;缺陷&#xff1a;re…

P01-Java何谓数组

P01-Java何谓数组 一、数组声明创建 1.1 数组声明的语法 与c有所不同 在Java中&#xff0c;数组声明语法 首选语法&#xff1a; //数据类型[] 数组名称; int[] arr;次选&#xff0c;与c类似 //数据类型 数组名称[]; int arr[];1.2 数组创建语法 与c指针有所相似&#xff0…

从源码开始:打造智能化食堂采购与供应链管理平台

随着食堂规模的扩大和供应链的复杂化&#xff0c;这些问题更加突出。智能化的食堂采购平台可以通过自动化流程、数据分析和智能推荐&#xff0c;显著提高采购效率&#xff0c;减少浪费&#xff0c;并降低运营成本。 要打造这样一个平台&#xff0c;首先需要对食堂的日常运营需…

Python基础语法(多进程开发进程建数据共享进程锁进程池)

Python基础语法文章导航&#xff1a; Python基础&#xff08;01初识数据类型&变量&#xff09;Python基础&#xff08;02条件&循环语句&#xff09;Python基础&#xff08;03字符串格式化&运算符&进制&编码&#xff09;Python基础&#xff08;04 基础练习…

【MATLAB源码-第259期】基于matlab的64QAM调制解调锁相环环载波同步仿真,对比前后星座图,输出锁相环响应曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 概述 在现代数字通信系统中&#xff0c;为了提高频谱利用率和数据传输效率&#xff0c;经常采用多阶调制技术。64QAM&#xff08;64阶正交幅度调制&#xff09;便是其中的一种&#xff0c;它通过将数据映射到64个不同的复…

入门篇 LeetCode算法之旅启程 - 从零开始的编程进阶之路

你是否曾经在技术面试中因为算法题而汗流浃背?是否在日常编码中感觉自己的解决问题能力有待提高? 目录 LeetCode: 你的算法训练场为什么选择LeetCode?LeetCode平台使用指南1. 注册与登录2. 探索题库3. 解题过程4. 提交与反馈5. 学习与讨论6. 追踪进度7. 参与竞赛 制定你的…

【专项刷题】— 哈希表

1、两数之和 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 使用哈希表&#xff0c;将每次x target - nums[i]&#xff0c;查看哈希表中是否含有这个x值代码&#xff1a; public int[] twoSum(int[] nums, int target) {int n nums.length;Map<Integer,Inte…

坐牢第三十四天(c++)

一.作业 1.栈的手写 #include <iostream> using namespace std; // 封装一个栈 class stcak { private:int *data; //int max_size; // 最大容量int top; // 下标 public:// 无参构造函数stcak();// 有参构造函数stcak(int size);// 拷贝构造函数stcak(const s…

0903作业+思维导图

一、作业 1》多态的实现 1、代码 #include <iostream>using namespace std; //父类 class Person { public:string name;int age; public:Person(){}Person(string n,int a):name(n),age(a){}~Person(){}//纯虚函数virtual void show() 0; }; //子类1 class Stu:publ…

wsl下将Ubuntu从c盘移动到其他盘

一、概述 因为自己的C盘内存不足&#xff0c;加上之后需要在Ubuntu下面下载许多的内容和东西&#xff0c;需要将其移动到d盘上面&#xff0c;这样可以拥有更大的空间。这里记载了一下自己的操作过程。 二、具体步骤 &#xff08;一&#xff09;过程 1.查看当前系统中wsl分发版…

Haskell爬虫:连接管理与HTTP请求性能

爬虫技术作为数据抓取的重要手段&#xff0c;其效率和性能直接影响到数据获取的质量与速度。Haskell&#xff0c;作为一种纯函数式编程语言&#xff0c;以其强大的类型系统和并发处理能力&#xff0c;在构建高效爬虫方面展现出独特的优势。本文将探讨在Haskell中如何通过连接管…

技术Leader在训练团队思考力中的核心职责

引言 在技术驱动的行业中&#xff0c;技术团队的创新能力与问题解决能力往往直接关联到项目的成败与企业的竞争力。而这一切的基石&#xff0c;离不开团队中每一个成员的思考力。作为技术团队的领航者&#xff0c;技术Leader在培养和提升团队思考力方面扮演着至关重要的角色。…

【Godot4.3】基于纯绘图函数自定义的线框图控件

概述 同样是来自2023年7月份的一项实验性工作&#xff0c;基于纯绘图函数扩展的一套线框图控件。初期只实现了三个组件&#xff0c;矩形、占位框和垂直滚动条。 本文中的三个控件类已经经过了继承化的修改&#xff0c;使得代码更少。它们的继承关系如下&#xff1a; 源代码 W…

AI智能分析/智慧安防EasyCVR视频汇聚平台新版本(V3.6.0)播放鉴权与播放限制时长的区别介绍

随着科技的飞速发展&#xff0c;视频技术已成为现代社会不可或缺的一部分&#xff0c;广泛应用于安防监控、娱乐传播、在线教育、电商直播等多个领域。EasyCVR视频汇聚平台作为视频技术的佼佼者&#xff0c;不断推陈出新&#xff0c;通过功能更新迭代&#xff0c;为用户提供更加…

WEB服务与虚拟主机/IIS中间件部署

WWW&#xff08;庞大的信息系统&#xff09;是基于客户机/服务器⽅式的信息发现技术和超⽂本技术的综合。网页浏览器//网页服务器 WWW的构建基于三项核⼼技术&#xff1a; HTTP&#xff1a;超文本传输协议&#xff0c;⽤于在Web服务器和客户端之间传输数据。HTML&#xff1a;⽤…

SpringCloud开发实战(三):集成Eureka注册中心

目录 SpringCloud开发实战&#xff08;一&#xff09;&#xff1a;搭建SpringCloud框架 SpringCloud开发实战&#xff08;二&#xff09;&#xff1a;通过RestTemplate实现远程调用 Eureka简介 Eureka 是一个基于 Java 的开源技术&#xff0c;最广为人知的是作为 Netflix 开发…

ElasticSearch学习笔记(六)自动补全、拼音分词器、RabbitMQ实现数据同步

文章目录 前言11 自动补全11.1 拼音分词器11.2 自定义分词器11.3 自动补全查询 12 数据同步12.1 实现方案12.1.1 同步调用12.1.2 异步通知12.1.3 监听binlog 12.2 异步通知实现数据同步12.2.1 声明交换机和队列12.2.2 发送MQ消息12.2.3 接收MQ消息并操作ES 前言 ElasticSearch…

互联网职场说 | “400w能否实现‘躺平’的生活”

近年来&#xff0c;“躺平”一词在国内职场中频频出现&#xff0c;表达了许多年轻人对工作压力和生活负担的不满与逃避心理。 近日&#xff0c;一位网友在社交平台上提出了一个引人深思的问题&#xff1a;“400万可以躺平吗&#xff1f;有房有车无贷款。” 网友们也各抒己见&a…

GB/T28181规范和JT1078交通部标差异

技术背景 好多开发者区分不太清楚GB/T28181和JT1078规范&#xff0c;实际上&#xff0c;二者在规范定义、技术特点、过检认证以及应用场景等方面均存在显著差异。两者各有其适用领域和优势&#xff0c;但在某些特定场景下也可能需要相互协作以实现更全面的监控和管理。 规范定…