云原生环境下,一个应用调用会穿越业务代码、框架代码、系统函数调用、API Gateway、服务网格 Sidecar、iptables/ipvs/OvS/LinuxBridge 等容器网络组件,路径非常复杂。
现有的分布式追踪通过 Javaagent、SDK 埋点插码等方式仅能覆盖业务代码、框架代码,存在很多盲点,经常会碰到客户端说慢、而服务端两手一摊~正常的呀,或者是开发说慢、而DBA说没-有-呀~的窘境,导致问题排查效率低下。
DeepFlow 基于 eBPF 的追踪能力很好的解决了这个痛点。另外,通过调用简单的 SQL API,无需替换已有的追踪系统,也可快速集成 DeepFlow 的追踪能力从而轻松消除追踪盲点。接下来本文将会从三个方面介绍:
- DeepFlow 基于 eBPF 创新的无盲点追踪能力
- DeepFlow 追踪数据的 SQL API
- SkyWalking 如何集成 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 中体验:
- 完全基于 eBPF 的零插码 AutoTracing 能力[1]
- 集成 SkyWalking 数据,实现无盲点追踪[2]
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 等容器网络组件
考虑到很多社区小伙伴已经在使用一些分布式追踪系统了,我们希望在不改变现有数据流的情况下,让大家可以轻松集成 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 开发了一个交互式的查询条件编辑器:
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
我们以 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[3],通过 traceId 可以获取到一个追踪下的所有 segmentId 与 spanId:
Skywalking Tracing 数据
第二步:转换为查询 DeepFlow 的 TraceId、SpanId
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
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/
,