云原生环境下,一个应用调用会穿越业务代码、框架代码、系统函数调用、API Gateway、服务网格 Sidecar、iptables/ipvs/OvS/LinuxBridge 等容器网络组件,路径非常复杂。

现有的分布式追踪通过 Javaagent、SDK 埋点插码等方式仅能覆盖业务代码、框架代码,存在很多盲点,经常会碰到客户端说慢、而服务端两手一摊~正常的呀,或者是开发说慢、而DBA说没-有-呀~的窘境,导致问题排查效率低下。

DeepFlow 基于 eBPF 的追踪能力很好的解决了这个痛点。另外,通过调用简单的 SQL API,无需替换已有的追踪系统,也可快速集成 DeepFlow 的追踪能力从而轻松消除追踪盲点。接下来本文将会从三个方面介绍:

01|DeepFlow 无盲点追踪

基于 eBPF,DeepFlow 创新的实现了零侵扰的分布式追踪。DeepFlow 将 eBPF Event、BPF Packet、Thread ID、Coroutine ID、Request 到达时序、TCP 发送时序进行关联,实现了高度自动化的分布式追踪(AutoTracing)。

另外,通过集成、关联 OpenTelemtry/SkyWalking 等追踪数据,DeepFlow 能绘制包含业务代码、框架代码、系统函数调用、API Gateway、服务网格 Sidecar、iptables/ipvs/OvS/LinuxBridge 等容器网络组件的无盲点追踪火焰图。这些能力都可通过 DeepFlow 在线 Demo 中体验:

自动聚焦深度学习(DeepFlow让SkyWalking)(1)

AutoTacing

上图中的 Span 数据包含三种,跟踪每一个请求的完整轨迹:

02|DeepFlow SQL API

考虑到很多社区小伙伴已经在使用一些分布式追踪系统了,我们希望在不改变现有数据流的情况下,让大家可以轻松集成 DeepFlow 采集的系统和网络 Span,最小代价解锁新技能,消除追踪盲点

DeepFlow 的所有数据均可通过 SQL API 获取,其他追踪系统可以通过 TraceID、SpanID 作为搜索条件获取 DeepFlow 的 System 和 Network Span,例如:

SELECT response_duration, start_time, end_time, resource_gl0_0, /* 客户端 */ resource_gl0_1, /* 服务端 */ tap_port_type, /* eBPF、NIC ... */ tap_port, /* NIC Name */ trace_id, span_id FROM l7_flow_log WHERE trace_id = 'c5ad367da7ed41fc97921d91a0584bd8.63.16620935428909473' AND span_id = 'e05ee7a06d674085a16dfea36ed11b98.169.16620935428971714-2' AND /* 非必须,精确搜索 */ time >= 1662093572 AND time <= 1662095372 /* 加速搜索 */

上述 SQL 命令的 API 调用方式为:

curl --location --request POST "http://${deepflow_server_node_ip}:30416/v1/query/" \ --data-urlencode "db=flow_log" \ --data-urlencode "sql=${sql_command}"

基于上述 SQL API 能力,DeepFlow 也为 Grafana 开发了一个交互式的查询条件编辑器:

自动聚焦深度学习(DeepFlow让SkyWalking)(2)

Grafana 中的 DeepFlow 查询条件编辑器

这个编辑器除了能快速完成 SQL 命令的编辑以外,还通过调用如下命令方便使用者快速选择字段名和字段值:

03|让 SkyWalking 追踪无盲点

我们以 SkyWalking 为例,来看下如何来集成 DeepFlow、消除追踪盲点。目前 SkyWalking 可以很好的做到应用代码层面的追踪,但还不能快速回答到底是客户端、服务端、中间件、还是基础设施的问题。

在开始工作之前,我们先来实际看看 SkyWalking 集成 DeepFlow 之后的使用体感:

第一步:定位关注的应用 Span(原始能力)

自动聚焦深度学习(DeepFlow让SkyWalking)(3)

定位关注的应用 Span

第二步:点击全栈分布式追踪(增强能力)

自动聚焦深度学习(DeepFlow让SkyWalking)(4)

点击全栈分布式追踪

第三步:解锁无盲点追踪技能(增强能力)

自动聚焦深度学习(DeepFlow让SkyWalking)(5)

SkyWalking 集成系统和网络 Span

上图(设计示意图)中我们可以清晰的看到一个应用 Span(第一行)经过客户端应用、客户端进程(系统调用)、Egress Sidecar(Envoy)、客户端 K8s Pod 网卡、客户端 K8s Node 网卡、服务端 K8s Node 网卡、服务端 K8s Pod 网卡、Ingress Sidecar(Envoy)、服务端进程(系统调用)的逐跳时延,以火焰图的形式呈现。

目前社区已经有小伙伴将此能力集成进来了,彻底告别了客户端说慢、而服务端两手一摊~正常的呀开发说慢、而DBA说没-有-呀~的扯皮(其中对 MySQL 全栈追踪能力的集成我们将会在后续文章中专门分享),我们也期待着小伙伴能贡献给 SkyWalking 社区。从追踪结果中可以看到,SkyWalking 已经结合了 DeepFlow 的追踪数据。通过火焰图可快速知道,当前请求在在系统和网络层面都不存在瓶颈(28%的时延消耗),悬停在火焰图的长条则可获取到 Span 的详细信息,比如网卡、服务名、实例名、Endpoint 等信息。

上面已经完整展示了集成的实际效果,接下来看看 SkyWalking 如何与 DeepFlow 集成的。DeepFlow 会给系统、网络 Span 打上和 SkyWalking 一致的 TraceID 和 SpanID,因此只需要在用户点击应用 Span 时获取到 SkyWalking 的相关 ID,并在 DeepFlow 进行查询即可。

第一步:获取 SkyWalking Span 的 traceId、segmentId、spanId

根据 SkyWalking 的 GraphQL 查询协议获取 ID[3],通过 traceId 可以获取到一个追踪下的所有 segmentId 与 spanId:

自动聚焦深度学习(DeepFlow让SkyWalking)(6)

Skywalking Tracing 数据

第二步:转换为查询 DeepFlow 的 TraceId、SpanId

自动聚焦深度学习(DeepFlow让SkyWalking)(7)

SkyWalking ID 转化为 DeepFlow ID

第三步:查询 DeepFlow 获取关联的系统和网络 Span

SELECT response_duration, start_time, end_time, resource_gl0_0, /* 客户端 */ resource_gl0_1, /* 服务端 */ tap_port_type, /* eBPF、NIC ... */ tap_port, /* NIC Name */ trace_id, span_id, l7_protocol, /* 可选,应用协议 */ request_type, /* 可选,请求类型 */ request_domain, /* 可选,请求域名 */ request_resource, /* 可选,请求资源 */ response_status, /* 可选,响应状态 */ response_code, /* 可选,响应码 */ response_exception, /* 可选,响应异常 */ server_port /* 可选,服务端口 */ FROM l7_flow_log WHERE trace_id = 'c5ad367da7ed41fc97921d91a0584bd8.63.16620935428909473' AND span_id = 'e05ee7a06d674085a16dfea36ed11b98.169.16620935428971714-2' AND time >= 1662093572 AND time <= 1662095372

04|什么是 DeepFlow

DeepFlow[4] 是一款开源的高度自动化的可观测性平台,是为云原生应用开发者建设可观测性能力而量身打造的全栈、全链路、高性能数据引擎。DeepFlow 使用 eBPF、WASM、OpenTelemetry 等新技术,创新的实现了 AutoTracing、AutoMetrics、AutoTagging、SmartEncoding 等核心机制,帮助开发者提升埋点插码的自动化水平,降低可观测性平台的运维复杂度。利用 DeepFlow 的可编程能力和开放接口,开发者可以快速将其融入到自己的可观测性技术栈中。

GitHub 地址:https://github.com/deepflowys/deepflow

访问 DeepFlow Demo[5],体验高度自动化的可观测性新时代。

参考资料

[1] 完全基于 eBPF 的零插码 AutoTracing 能力: https://deepflow.yunshan.net/docs/zh/auto-tracing/istio-bookinfo-demo/#查看分布式追踪

[2] 集成 SkyWalking 数据,实现无盲点追踪: https://deepflow.yunshan.net/docs/zh/agent-integration/tracing/opentelemetry/#查看追踪数据

[3] 根据 SkyWalking 的 GraphQL 查询协议获取 ID: https://github.com/apache/skywalking/blob/master/docs/en/protocols/query-protocol.md#trace

[4] DeepFlow: https://github.com/deepflowys/deepflow

[5] DeepFlow Demo: https://deepflow.yunshan.net/docs/zh/install/overview/

,