通过观测云 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)"
    

    参考文档:https://docs.guance.com/datakit/datakit-install/#elinker-install

    • 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

    开启 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
    

    联系我们

    加入社区

    微信扫码
    加入官方交流群

    立即体验

    在线开通,按量计费,真正的云服务!

    免费开启

    支持私有云环境部署

    代码托管平台