logo
logo

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 中体验:

AutoTacingAutoTacing

上图中的 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
2
3
4
5
6
7
8
9
10
11
12
13
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 调用方式为:

1
2
3
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 开发了一个交互式的查询条件编辑器:

Grafana 中的 DeepFlow 查询条件编辑器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定位关注的应用 Span

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

点击全栈分布式追踪点击全栈分布式追踪

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

SkyWalking 集成系统和网络 SpanSkyWalking 集成系统和网络 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 数据Skywalking Tracing 数据

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

SkyWalking ID 转化为 DeepFlow IDSkyWalking ID 转化为 DeepFlow ID

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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

0x3: 什么是 DeepFlow

DeepFlow 是云杉网络开发的一款可观测性产品,旨在为复杂的云基础设施及云原生应用提供深度可观测性。DeepFlow 基于 eBPF 实现了应用性能指标、分布式追踪、持续性能剖析等观测信号的零侵扰Zero Code)采集,并结合智能标签SmartEncoding)技术实现了所有观测信号的全栈Full Stack)关联和高效存取。使用 DeepFlow,可以让云原生应用自动具有深度可观测性,从而消除开发者不断插桩的沉重负担,并为 DevOps/SRE 团队提供从代码到基础设施的监控及诊断能力。

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

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