通过观测云 eBPF Tracing 实现无埋点的全链路追踪

前言

随着微服务架构的普及和系统复杂度的增加,对应用程序的可观测性要求也越来越高。传统的监控方法通常需要在应用程序中添加代码来记录和追踪重要信息,这种方法可能会增加系统的负担,并且在复杂系统中维护难度较大。

eBPF(Extended Berkeley Packet Filter)是一种内核技术,能够在不修改应用程序代码的前提下,收集应用程序的运行时信息并进行分析。通过结合 eBPF 和 DataKit,我们可以实现对任何编程语言,任何技术栈应用程序的无埋点全链路追踪,从而提高系统的整体可观测性。

eBPF Tracing 概述

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

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

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

如何实现 eBPF 无埋点全链路追踪

部署 eBPF Trace 链接器

eBPF Trace 链接器负责接收来自采集器的 eSpan 数据,并进行链接,生成完整的 Trace。

安装方式
  • 主机安装

可以通过在安装命令中添加 DK_ELINKER 环境变量来安装用于 eBPF Span 的连接和 eBPF Trace 生成的 DataKit ELinker 版本。

DK_DATAWAY=https://openway.guance.com?token=<TOKEN> DK_ELINKER=1 bash -c "$(curl -L https://static.guance.com/datakit/install.sh)"

参考文档:主机安装 - 观测云文档

  • Kubernetes 安装
wget https://static.guance.com/datakit/datakit-elinker.yaml

修改 ENV_DATAWAY 环境变量

- name: ENV_DATAWAYvalue: https://openway.guance.com?token=<TOKEN> # Fill your real Dataway server and(or) workspace token

执行安装

kubectl apply -f datakit-elinker.yaml
开启 ebpf trace 采集器
  • 主机安装方式
cd /usr/local/datakit/conf.d/ebpftrace
cp ebpftrace.conf.sample ebpftrace.conf
datakit service -R
  • Kubernetes 安装方式

Kubernetes 方式安装的 DataKit ELinker 已默认开启 ebpf trace 采集器,可按需配置采样率,等待窗口时间等配置。

部署 eBPF 采集器

首先,需要在目标主机或集群上部署 eBPF 采集器。观测云提供的 ebpf 采集器能够收集 eSpan 数据,这些数据是构建全链路追踪的基础。

安装 DataKit
  • 主机安装
  • k8s 安装
开启 ebpf 采集器
  • 主机方式
cd /usr/local/datakit/conf.d/host
cp ebpf.conf.sample ebpf.conf

其中 trace_server 为 eBPF Trace 连接器 DataKit ELinker 地址。

[[inputs.ebpf]]enabled_plugins = ["ebpf-net","ebpf-trace",]l7net_enabled = ["httpflow",]trace_server = "x.x.x.x:9529"trace_all_process = falsetrace_env_list = ["DK_BPFTRACE_SERVICE","DD_SERVICE","OTEL_SERVICE_NAME",]trace_env_blacklist = []trace_name_list = []trace_name_blacklist = [## The following two processes are hard-coded to never be traced,## and do not need to be set:### "datakit",# "datakit-ebpf",]

重启 DataKit

datakit service -R
  • Kubernetes 方式

在 datakit.yaml 中添加如下 ConfigMap 配置文件。

apiVersion: v1
kind: ConfigMap
metadata:name: datakit-confnamespace: datakit
data:ebpf.conf: |-[[inputs.ebpf]]enabled_plugins = ["ebpf-net","ebpf-trace",]l7net_enabled = ["httpflow",]trace_server = "datakit-elinker-service.datakit-elinker:9529"trace_all_process = falsetrace_env_list = ["DK_BPFTRACE_SERVICE","DD_SERVICE","OTEL_SERVICE_NAME",]trace_env_blacklist = []trace_name_list = []trace_name_blacklist = [## The following two processes are hard-coded to never be traced,## and do not need to be set:### "datakit",# "datakit-ebpf",]

挂载 ebpf.conf 配置文件至 DataKit 中。

apiVersion: apps/v1
kind: DaemonSet
metadata:labels:app: daemonset-datakitname: datakitnamespace: datakit
spec:...template:...spec:...containers:...volumeMounts:...- mountPath: /usr/local/datakit/conf.d/host/ebpf.confname: datakit-confsubPath: ebpf.conf...

应用 datakit.yaml 至集群中。

kubectl apply -f datakit.yaml

eBPF Tracing 无埋点全链路追踪效果展示

配置完成后,eBPF 会自动采集所用应用的网络请求,以及数据库请求,Datakit 会自动生成链路数据,DataKit ELinker 链接 eSpan 后上报至观测云平台,就可以对无埋点的链路进行分布式追踪。

除此之外,观测云 eBPF Tracing 也会自动关联应用的 OpenTelmetry 和 DDTrace 的链路,作为互相补充,可以提供从应用内部函数到接口级的端到端追踪,帮助开发者获得更全面的系统视图。

总结

eBPF Tracing 能够为云原生应用提供一种高效、无侵入的监控手段,开发者可以在不修改代码的情况下灵活选择最适合的监控方案,深入了解应用的运行状态,从而快速定位和解决问题。观测云 eBPF Tracing 也会持续进步,提供对更多协议的解析,持续跟进 eBPF 在监控领域的更广泛应用。

参考文档

#demo地址:
https://github.com/GuanceDemo/guance-go-ginvueblog-demo?tab=readme-ov-file
#datakit文档:
https://docs.guance.com/datakit/datakit-daemonset-deploy/
#ebpf文档:
https://docs.guance.com/integrations/ebpf/
#ebpftrace文档:
https://docs.guance.com/integrations/ebpftrace/#ebpftrace-config

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

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

相关文章

Linux 系统调优 2

### 4. **网络调优** - **TCP/IP 参数调优**: 调整 /etc/sysctl.conf 中的网络相关参数&#xff0c;如 net.core.somaxconn、net.ipv4.tcp_tw_reuse、net.ipv4.tcp_rmem 等&#xff0c;提高网络堆栈的效率。 - **网络队列管理**: 使用 tc&#xff08;Traffic Control&…

【Yarn】Yarn的基本执行流程(二)AM Container的启动

Yarn的基本执行流程之AM Container的启动 文章目录 Yarn的基本执行流程之AM Container的启动AM Container&#xff08;第一个Container&#xff09;的启动NM RM心跳交互触发调度Container的启动流程RM中调度启动AM流程AMLauncher启动流程NM上容器的启动流程下载资源AM Containe…

告别PDF格式困扰,2024年PDF转换器推荐

PDF现在已经逐渐成为了文件传输的主流格式了&#xff0c;它有保存文件页面版式的优点&#xff0c;但是这个格式编辑对大部分人来说还是不那么方便&#xff0c;日常我们还是习惯将它们转换成我们常见的 文本格式来操作。今天我分享一下可以实现PDF格式转换的pdf转换器有哪些吧。…

SX_c语言字符串赋值 “multiple definition of .. first defined here”问题_21

字符串赋值问题&#xff1a; #include <stdio.h> #include <string.h>char* my_string_cat(int position, int slot, char* content){char* gnsst NULL;static char retvalue[50];memset(retvalue, \0, sizeof(retvalue));if(position 0){//头部if(slot 0){//卡…

探索微服务架构中的动态服务发现与调用:使用 Nacos 与 Spring Cloud OpenFeign 打造高效订单管理系统

1. 背景 在现代微服务架构中&#xff0c;服务之间的通信与协作是非常重要的。Spring Cloud Alibaba 提供了一套完整的微服务解决方案&#xff0c;其中包括 Nacos 用于服务注册与发现&#xff0c;OpenFeign 用于声明式服务调用&#xff0c;Spring Cloud LoadBalancer 用于负载均…

FAISS 索引

FAISS&#xff08;Facebook AI Similarity Search&#xff09;是一个由 Facebook 开发的开源库&#xff0c;用于高效的相似性搜索和密集向量的聚类。它非常适合处理大规模的向量搜索任务&#xff0c;例如推荐系统、图像搜索、自然语言处理中的嵌入搜索等。 FAISS 文件概述 FAI…

vite 实现包的拆分

Vite 和 Rollup 是现代前端开发中两个非常流行的工具&#xff0c;它们各自有独特的用途和特点&#xff0c;但它们之间也存在一定的联系。 Vite Vite 是一个由 Vue 团队成员开发的前端构建工具&#xff0c;它的核心特点是在开发环境下提供极快的服务器启动和热模块替换&#x…

【视频讲解】SMOTEBoost、RBBoost和RUSBoost不平衡数据集的集成分类酵母数据集、治癌候选药物|数据分享...

全文链接&#xff1a;https://tecdat.cn/?p37502 分析师&#xff1a;Zilin Wu 在当今的大数据时代&#xff0c;科研和实际应用中常常面临着海量数据的处理挑战。在本项目中&#xff0c;我们拥有上万条数据&#xff0c;这既是宝贵的资源&#xff0c;也带来了诸多难题。一方面&a…

【递归回溯之floodfill算法专题练习】

1. 图像渲染 class Solution {int dx[4] {0, 0, -1, 1};int dy[4] {1, -1, 0, 0};int m, n;int oldcolor; public:vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {oldcolor image[sr][sc]; // 保存原…

MySQL数据库MVCC机制底层原理详解

mvcc机制即多版本并发控制 当在事务中使用了写操作&#xff08;增删改&#xff09;语句时会给当前事务生成一个事务id&#xff0c;事务id是递增的 同时&#xff0c;对于被修改的行的数据会创建一个数据版本 &#xff0c;这个数据版本除了包含原有的字段还会包含一个事务id和一…

Linux驱动开发—创建总线,创建属性文件

文章目录 1.什么是BUS&#xff1f;1.1总线的主要概念1.2总线的操作1.3总线的实现 2.创建总线关键结构体解析2.1注册总线到系统2.2 struct bus_type *bus 解析 3.实验结果分析1. devices 目录2. drivers 目录3. drivers_autoprobe 文件4. drivers_probe 文件5. uevent 文件 4.在…

【Rust光年纪】深度解读:Rust语言中各类消息队列客户端库详细对比

选择最佳 Rust 消息队列客户端库&#xff1a;全面对比与分析 前言 随着现代应用程序的复杂性不断增加&#xff0c;消息队列成为构建可靠、高性能系统的重要组件。本文将介绍一些用于Rust语言的消息队列客户端库&#xff0c;包括AMQP、Apache Kafka、NSQ、Apache Pulsar和Rock…

开发新系统时,数据库字符集怎么选择对中文的支持最好?

在新开发的系统时,如果你希望确保中文按拼音顺序正确排序,同时支持更多的特殊字符与符号,下面是对 utf8mb4_zh_cn_ci、utf8mb4_unicode_ci 和 utf8mb4_unicode_520_ci 这几种字符集和校对规则的分析以及推荐方案: 校对规则分析 utf8mb4_zh_cn_ci: 特点:这是专为简体中文…

goalng http client的MaxIdleConnsPerHost,MaxIdleConns,MaxConnsPerHost参数设置总结

MaxIdleConnsPerHost&#xff1a;优先设置这个&#xff0c;决定了对于单个Host需要维持的连接池大小。该值的合理确定&#xff0c;应该根据性能测试的结果调整。MaxIdleConns&#xff1a;客户端连接单个Host&#xff0c;不少于MaxIdleConnsPerHost大小&#xff0c;不然影响MaxI…

数据压缩(2)——变长编码

【定长编码】 变长和定长是很基本的概念&#xff0c;不光是在数据压缩&#xff0c;在其他很多地方都可以见到&#xff0c;这里就不多说了。 前文说过&#xff0c;在数据压缩时&#xff0c;我们需要用某些字符A替换或修改某些字符B&#xff0c;字符A占用的存储空间更小一些。 …

【力扣】划分为k个相等的子集

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 给定一个整数数组 …

超越基础:Visual Basic在科学计算与数据分析的革新应用

标题&#xff1a;超越基础&#xff1a;Visual Basic在科学计算与数据分析的革新应用 Visual Basic&#xff08;VB&#xff09;&#xff0c;最初以其易于学习和使用而闻名&#xff0c;常被视为入门级编程语言。然而&#xff0c;VB的潜力远不止于简单的应用程序开发。在科学计算…

WHAT - 综合书单推荐

拥有一个成功的人生&#xff0c;书籍确实是一个重要的知识来源。可以将书籍分为几个主要类别&#xff0c;每个类别对应不同的知识领域和成长方向。以下是一些建议的分类及每类书籍推荐&#xff1a; 1. 个人发展与心理学 《如何赢得朋友与影响他人》 - 戴尔卡耐基《思考&#…

【qt】锁

线程安全问题. 多线程程序太复杂了. 加锁 把多个线程要访问的公共资源&#xff0c;通过锁保护起来.>把并发执行变成串行执行. Linux mutex 互斥量. C11引入std::mutex Qt 同样也提供了对应的锁&#xff0c;来针对系统提供的锁进行封装.QMutex 多个线程进行加锁的对象&…

example-apisix-1 清空日志之后启动异常处理

异常信息 2024/08/27 11:34:33 [emerg] 1#1: bind() to unix:/usr/local/apisix/conf/config_listen.sock failed (98: Address already in use) nginx: [emerg] bind() to unix:/usr/local/apisix/conf/config_listen.sock failed (98: Address already in use) 2024/08/27 1…