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

news2024/12/22 8:39:01

前言

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

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_DATAWAY
  value: 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 = false

  trace_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-conf
  namespace: 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 = false
        
          trace_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-datakit
  name: datakit
  namespace: datakit
spec:
  ...
  template:
    ...
    spec:
      ...
      containers:
        ...
        volumeMounts:
        ...
        - mountPath: /usr/local/datakit/conf.d/host/ebpf.conf
          name: datakit-conf
          subPath: 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.coloradmin.cn/o/2082697.html

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

相关文章

翻译_Clock Domain Crossing Design

翻译_Clock Domain Crossing Design 原文标题及连接:Clock Domain Crossing (CDC) Design & Verification Techniques Using SystemVerilog. 作者:Clifford E. Cummings Sunburst Design, Inc. cliffc@sunburst-design.com 摘要 在多时钟设计中,需要在时钟域交叉(…

SpringBoot——请求响应(简单参数、实体参数、数组集合参数、日期参数、JSON参数、路径参数、统一响应结果)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

(经验)SVN降版本,保留版本信息和用户信息。

背景&#xff1a;由于开始公司人数规模小&#xff0c;没有关心SVN最新版本免费对于用户数量限制要求不敏感&#xff0c;随着人数越来越多&#xff0c;公司来了新员工已经添加不了SVN需要注册码了&#xff0c;不利于SVN文件管理的在公司内部的推广。看了好多资料&#xff0c;都没…

Java:jdk8之后新增的时间API

文章目录 为什么要使用新增的API新增了哪些&#xff1f;Local常用方法代码一样的用法 黑马学习笔记 使用新增的 为什么要使用新增的API 新增了哪些&#xff1f; Local 常用方法 代码 package NewTime;import java.time.LocalDate;/*** Author: ggdpzhk* CreateTime: 2024-08-…

【Python入门思维概括图】

&#x1f4d6;入门思维概括图 ✅第1节 基础语法 ✅第2节 判断语句 ✅第3节 循环语句 ✅第4节 函数 ✅第5节 数据容器 ✅第6节 函数进阶 ✅第7节 文件操作 ✅第8节 异常模块和包 拓展&#xff1a;学了python能干什么&#xff0c;可以参考下面的Python使用场景思维导图介绍

慈云寺北里社区新时代文明实践站联手鼓动青春丰富青少年暑期生活

炎炎夏日的暑期&#xff0c;慈云寺北里社区新时代文明实践站携手鼓动青春&#xff0c;为社区青少年精心策划并成功举办了两场丰富多彩的暑期活动&#xff0c;不仅为孩子们的假期生活增添了浓厚的文化色彩&#xff0c;更激发了他们对中华传统文化与现代艺术的浓厚兴趣。 首场&am…

《JavaEE进阶》----4.<SpringMVC①简介、基本操作>

本篇博客讲解 MVC思想、及Spring MVC&#xff08;是对MVC思想的一种实现&#xff09;。 Spring MVC的基本操作、学习了六个注解 RestController注解 RequestMappering注解 RequestParam注解 RequestBody注解 PathVariable注解 RequestPart注解 MVC View(视图) 指在应⽤程序中…

IO复用技术

一、I/O复用的介绍 I/O复用是一种能够同时处理多个I/O操作的技术&#xff0c;适用于高并发场景。 使用场景 select/poll&#xff1a;适用于连接数较少的场景。epoll&#xff1a;适用于大规模的网络服务&#xff0c;如Web服务器。 二、实现方式 1.select select 是一种系统调…

iPhone突然黑屏?别慌,这里有你的自救指南

在日常使用iPhone的过程中&#xff0c;不少用户可能会遇到手机突然黑屏的情况&#xff0c;这往往让人措手不及。别担心&#xff0c;今天我们就来详细探讨一下iPhone突然黑屏的可能原因及解决方法&#xff0c;帮助你快速恢复手机的正常使用。 一、iPhone突然黑屏的可能原因 1. …

在做结果集封装时,若结果集表头与成员变量名不一致该如何解决?

目录 1. 通过别名映射为一致&#xff1a;as子句 2. 使用resultMap 3. 在配置文件中开启适配规则 在Score实体类中&#xff0c;我们定义了studentId、courseId、score、status&#xff0c;而在数据库中&#xff0c;我们设置如下&#xff1a; 1. 通过别名映射为一致&#xff1…

GAMES202——作业1 实时阴影(ShadowMap,PCF,PCSS)

目录 任务 ShadowMap PCF PCSS 实现 ShadowMap useShadowMap PCF findBlocker PCSS 结果 任务 ShadowMap 1.在 ShadowMaterial.js 中需要向 Shader 传递正确的 uLightMVP 矩阵&#xff0c;该矩阵参与了第一步从光源处渲染场景从而构造ShadowMap 的过程。 你需要完成 D…

4 - ZYNQ 信号、接口与引脚

文章目录 1 ZYNQ信号、接口与引脚1.1 电源引脚1.2 PS信号引脚1.3 PL信号引脚1.4 PS和PL交互接口 1 ZYNQ信号、接口与引脚 ZYNQ的信号、接口与引脚如下图所示&#xff0c;主要分为&#xff1a; PS部分PL部分PS和PL交互部分PS和PL共用部分&#xff08;如JTAG&#xff09; 1.…

Disassembly窗口信息解读

如上图程序所示&#xff0c;程序运行流程为&#xff1a; 1.跳转至main所在地址 2.加载全局变量counter地址??main_2到R0 3.将变量值存入R0 4.R0自增指令载入 5.加载counter地址到R1 6.通过R1的地址&#xff0c;R0取到counter的值 ??main_1最终结果R0存值&#xff0c…

常用工具网站之Emoji

https://www.emojiall.com/zh-hans/all-emojis 这个网站是一个收集和展示所有表情符号的网站。用户可以在这里找到各种不同类型的表情符号&#xff0c;并了解它们的含义和用法。 举例说明&#xff1a;在这个网站上&#xff0c;可以找到不同类型的奖牌表情符号&#xff0c;例如…

谈到这个痛点,写C的和不写C的码农都沉默了

声明&#xff1a;此篇为 ai123.cn 原创文章&#xff0c;转载请标明出处链接&#xff1a;https://ai123.cn/2246.html 作为一名在计算机软件行业工作的C工程师&#xff0c;我深知在高要求的内存管理环境中工作有多么艰难。内存分配与优化、避免内存泄漏&#xff0c;都是日常挑战…

Scrapy入门学习

文章目录 Scrapy一. Scrapy简介二. Scrapy的安装1. 进入项目所在目录2. 安装软件包Scrapy3. 验证是否安装成功 三. Scrapy的基础使用1. 创建项目2. 在tutorial/spiders目录下创建保存爬虫代码的项目文件3.运行爬虫4.利用css选择器Scrapy Shell提取数据例如: Scrapy 一. Scrapy…

2024谷歌开发者大会分享

前言&#xff1a; google一般会在每年的5月份在美国举行开发者大会&#xff0c;然后8-9月份会在中国也举办一次开发者大会&#xff0c;内容主题纲要是一致的&#xff0c;但是由于中国剧本的时间稍微晚一些&#xff0c;所以其内容会更新一些。 每年的开发者大会&#xff0c;会隐…

跟着B站前端面试总结回顾前端基础知识(二)

深拷贝与浅拷贝 在JavaScript中&#xff0c;深拷贝是一个常见的需求&#xff0c;特别是在处理复杂数据结构&#xff08;如对象、数组等&#xff09;时&#xff0c;需要确保原始数据不被修改。下面通过表格形式列出几种常见的深拷贝方法&#xff0c;并简要说明其优缺点。 方法…

【AI模型:追求全能还是专精?】

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《热点时事》 期待您的关注 目录 引言 ​编辑 一&#xff1a;AI模型的全面评估和比较 二&#xff1a;AI模型的专精化和可扩展性…

宝塔安装yasd 远程调试 swoole

一、服务器安装yasd 1.安装yasd 按照官方文档&#xff0c;Yasd调试器官方文档 yum install boost boost-develgit clone https://github.com/swoole/yasd.gitcd yasdphpize --clean && phpize && ./configure --with-php-config/www/server/php/74/bin/php…