DeepFlow 让 SkyWalking 分布式追踪无盲点
2022-09-02云原生环境下,一个应用调用会穿越业务代码、框架代码、系统函数调用、API Gateway、服务网格 Sidecar、iptables/ipvs/OvS/LinuxBridge 等容器网络组件,路径非常复杂。现有的分布式追踪通过 Javaagent、SDK 埋点插码等方式仅能覆盖业务代码、框架代码,存在很多盲点,经常会碰到客户端说慢、而服务端两手一摊~正常的呀,或者是开发说慢、而DBA说没~有~呀的窘境,导致问题排查效率低下。
DeepFlow 基于 eBPF 的追踪能力很好的解决了这个痛点。另外,通过调用简单的 SQL API,无需替换已有的追踪系统,也可快速集成 DeepFlow 的追踪能力从而轻松消除追踪盲点。接下来本文将会从三个方面介绍:
- DeepFlow 基于 eBPF 创新的无盲点追踪能力
- DeepFlow 追踪数据的 SQL API
- SkyWalking 如何集成 DeepFlow 快速解锁无盲点追踪
0x0: 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 中体验:
AutoTacing
上图中的 Span 数据包含三种,跟踪每一个请求的完整轨迹:
- A - Application,应用 Span:通过 SkyWalking 从应用内部采集的 Span,覆盖业务代码、框架代码
- S - System,系统 Span:通过 eBPF 零侵入采集的 Span,覆盖系统调用、应用函数(如 HTTPS)、API Gateway、服务网格 Sidecar
- N - Network,网络 Span:通过 BPF 从网络流量中采集的 Span,覆盖 iptables/ipvs/OvS/LinuxBridge 等容器网络组件
0x1: DeepFlow SQL API
考虑到很多社区小伙伴已经在使用一些分布式追踪系统了,我们希望在不改变现有数据流的情况下,让大家可以轻松集成 DeepFlow 采集的系统和网络 Span,最小代价解锁新技能,消除追踪盲点。
DeepFlow 的所有数据均可通过 SQL API 获取,其他追踪系统可以通过 TraceID、SpanID 作为搜索条件获取 DeepFlow 的 System 和 Network Span,例如:
1 | SELECT response_duration, |
上述 SQL 命令的 API 调用方式为:
1 | curl --location --request POST "http://${deepflow_server_node_ip}:30416/v1/query/" \ |
基于上述 SQL API 能力,DeepFlow 也为 Grafana 开发了一个交互式的查询条件编辑器:
Grafana 中的 DeepFlow 查询条件编辑器
这个编辑器除了能快速完成 SQL 命令的编辑以外,还通过调用如下命令方便使用者快速选择字段名和字段值:
- 查看
l7_flow_log
表的 Tags:show tags from l7_flow_log
- 查看
l7_flow_log
表的 Metrics:show metrics from l7_flow_log
- 查看
l7_flow_log
表中pod
字段的可选值:show tag pod values from l7_flow_log
0x2: 让 SkyWalking 追踪无盲点
我们以 SkyWalking 为例,来看下如何来集成 DeepFlow、消除追踪盲点。目前 SkyWalking 可以很好的做到应用代码层面的追踪,但还不能快速回答到底是客户端、服务端、中间件、还是基础设施的问题。
在开始工作之前,我们先来实际看看 SkyWalking 集成 DeepFlow 之后的使用体感:
第一步:定位关注的应用 Span(原始能力)
定位关注的应用 Span
第二步:点击全栈分布式追踪
(增强能力)
点击全栈分布式追踪
第三步:解锁无盲点追踪技能(增强能力)
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,通过 traceId 可以获取到一个追踪下的所有 segmentId 与 spanId:
Skywalking Tracing 数据
第二步:转换为查询 DeepFlow 的 TraceId、SpanId
SkyWalking ID 转化为 DeepFlow ID
第三步:查询 DeepFlow 获取关联的系统和网络 Span
1 | SELECT response_duration, |
0x3: 什么是 DeepFlow
DeepFlow 是云杉网络开发的一款可观测性产品,旨在为复杂的云基础设施及云原生应用提供深度可观测性。DeepFlow 基于 eBPF 实现了应用性能指标、分布式追踪、持续性能剖析等观测信号的零侵扰(Zero Code
)采集,并结合智能标签(SmartEncoding
)技术实现了所有观测信号的全栈(Full Stack
)关联和高效存取。使用 DeepFlow,可以让云原生应用自动具有深度可观测性,从而消除开发者不断插桩的沉重负担,并为 DevOps/SRE 团队提供从代码到基础设施的监控及诊断能力。
GitHub 地址:https://github.com/deepflowio/deepflow
访问 DeepFlow Demo,体验高度自动化的可观测性新时代。