使用 DeepFlow 作为 SkyWalking 的后端,消除观测盲点
2022-09-26DeepFlow 作为一个可观测性协作平台,可作为 SkyWalking 的后端快速接入 SkyWalking Agent 及 Instrument SDK 的数据,并利用基于 eBPF 的 AutoTracing 补齐网络和系统 Span 来消除分布式链路追踪中的盲点,真正让业务开发团队、框架开发团队、服务网格运维团队、容器运维团队、DBA 团队、云运维团队多部门在一个平台协作起来。同时,结合 DeepFlow 自动生成的应用黄金指标数据(AutoMetrics)、调用日志和流日志(AutoLogging),以及集成并标准化的 Prometheus/Telegraf 指标数据(AutoTagging),可快速建设一个统一的可观测性平台。
本篇文章是 DeepFlow + SkyWalking 系列的第三篇,简单回顾下前两篇的内容:
- 第一篇《使用 OpenTelemetry 零代码修改接收 SkyWalking 追踪数据》分析了 SkyWalking 协议与 OpenTelemetry Tracing 协议的差异,并向 OpenTelemetry 社区贡献了 skywalking-receiver,使得 SkyWalking 的数据可以接入到 OpenTelemetry。
- 第二篇《DeepFlow 让 SkyWalking 分布式追踪无盲点》介绍了 SkyWalking 如何集成 DeepFlow 的 eBPF AutoTracing 生成的网络和系统 Span 来消除分布式链路追踪的盲点。通过对 SkyWalking 进行简单的二次开发,在展示 Span 详情信息时调用 DeepFlow 的 SQL API 即可获取到与之对应的网络和系统 Span,整个数据流见下图中的方式一。
DeepFlow 与 SkyWalking 的数据集成方式对比
本文介绍的内容见上图中的方式二。从图中我们也能看到,两种方式均能消除观测盲点,但相比独立部署、局部改造的方式一,整体替代、统一平台的方式二主要优点为:
- Span 数据存储于更高性能的 ClickHouse 中
- 所有数据均可利用到 DeepFlow 的 AutoTagging 能力进行标准化、并利用 SmartEncoding 降低资源消耗
- 不需要同时维护 SkyWalking 和 DeepFlow 两个后端,也无需修改 SkyWalking 代码
本文将从以下四个方面展开,说明如何利用 DeepFlow 快速集成 SkyWalking,打造一个让多部门协作的统一可观测性平台:
- 快速集成 SkyWalking:利用 ote-collector 转化为标准的 Tracing 数据,无需修改任何代码
- 无盲点 - 分布式链路追踪:关联应用、系统、网络 Span,消除分布式追踪盲点,满满的协作感
- 全景 - 微服务调用拓扑:自动展现微服务调用拓扑,轻松知晓服务访问了谁、被谁访问
- 全栈 - 应用性能分析:自动化指标/日志,结合自动化标签能力,打破数据孤岛
0x0: 快速集成 SkyWalking
不管是 K8s 环境还是非容器环境,SkyWalking 追踪相关的数据都可通过 OpenTelemetry otel-collector 接入到 DeepFlow 中。详细原理参考《使用 OpenTelemetry 零代码修改接收 SkyWalking 追踪数据》。采用这种方式我们可以快速完成 DeepFlow 对 SkyWalking 数据的集成,下图是对数据流的总结:
DeepFlow 集成 SkyWalking 的数据流
接下来基于一个具体的 Demo (github.com/liuzhibin-cn/my-demo) 应用来展示数据接入的实际效果。此 Demo 是部署在 K8s 中的一个 WebShop 应用,包含 5 个微服务,使用了 Dubbo 作为微服务框架、Nacos 作为服务注册中心、Seata 提供了分布式事务服务、数据存储层使用的 MySQL,架构如下:
SkyWalking WebShop Demo
第一步:SkyWalking 数据发送给 otel-collector。在 skyWalking-javaagent/skywalking-sdk 中将对接的 SkyWalking OAP Service(如:oap:11800)的地址修改为 OpenTelemetry Agent Service 即可,详细配置参考此前文章《使用 OpenTelemetry 零代码修改接收 SkyWalking 追踪数据》。需要确保当前环境有 OpenTelemetry 组件,如果还没有,可以使用如下命令在 open-telemetry 命名空间中快速部署一个 otel-collector DaesmonSet:
1 | kubectl apply -n open-telemetry -f https://raw.githubusercontent.com/deepflowys/deepflow-demo/main/open-telemetry/open-telemetry.yaml |
第二步:otel-collector 将数据发送给 deepflow-agent。需要配置 otel-agent ConfigMap 中的 otel-agent-config.exporters.otlphttp
:
1 | otlphttp: |
同时,需要确保 deepflow-agent 需要的数据端口打开(默认关闭,减少监听端口),详细配置命令请参考我们的在线文档:
1 | vtap_group_id: <your-agent-group-id> |
到此,仅通过修改配置已经完成了 DeepFlow 集成 SkyWalking 的追踪数据。接下来基于 Demo 看看 DeepFlow 都能带来哪些价值。
0x1: 无盲点:分布式链路追踪
SkyWalking 的追踪数据接入 DeepFlow 后,系统和网络 Span 将穿插在 SkyWalking Span 之间,让追踪无盲点,满满的协作感。下面的火焰图,一共包含96个 Span,其中有46个 Span 是 SkyWalking 生成的,50个 Span 是 DeepFlow 增强的,20个通过 eBPF 采集的系统 Span,30个 BPF 采集的网络 Span。补齐 Span 后可让业务开发团队、框架开发团队、服务网格运维团队、容器运维团队、DBA 团队、云运维团队完全基于一个火焰图沟通,不再吵吵吵:
消除分布式链路追踪的盲点
图中标注了一些序号,根据序号顺序来深度解读下火焰图:
- 1:对 SkyWalking 未插码的未知服务(loadgenerator),通过 eBPF 自动追踪补齐的系统 Span
- 2:对 SkyWalking 无法追踪的服务(MySQL 服务端),通过 eBPF 自动追踪补齐的系统 Span
- 3:对跨 K8s Node 上两个 Pod 之间的网络路径(隧道/NAT),通过 BPF 自动追踪补齐网络 Span
- 4:对同 K8s Node 上两个 Pod 之间的网络路径(NAT),通过 BPF 自动追踪补齐网络 Span
0x2: 全景:微服务调用拓扑
常使用 SkyWalking 的用户,应该经常会借助拓扑来查看服务调用关系,快速了解整个服务的依赖快递,数据接入 DeepFlow 后,可能会担心无法查看拓扑,请完全放心!!!
DeepFlow AutoMetrics 将提供远比 SkyWalking 丰富的拓扑能力,不仅可查看微服务的调用关系,还支持区域、K8s 集群、命名空间、工作负载、POD、K8s 自定义 Label、端口等各种维度的拓扑图:
微服务全景拓扑
上图分别展示了 Demo 在不同分组下的拓扑。图中间基于微服务分组的拓扑,不仅能展示微服务之间的调用关系,也能展示客户端的访问,以及与 DNS、服务注册中心、数据库、监控组件等中间件之间的访问。右边拓扑是更细粒度对微服务 POD 的访问关系的展开。
利用拓扑也可快速切换查看某个服务调用关系,不仅直观看到我在访问谁,也能快速回答谁在访问我:
微服务全景调用关系
0x3: 全栈:应用性能分析
应用问题定位时,查看服务指标数据通常是第一步,SkyWalking 提供了查看指标数据的仪表盘。DeepFlow 指标数据则更加丰富,除自身 AutoMetrics 自动生成微服务的黄金指标,也可通过 Prometheus 接入各种丰富的指标数据,构建从基础设施到中间件到微服务应用全栈的性能分析指标体系,例如虚拟机/K8s 等基础设施的 CPU/IO/NET、中间件数据库 QPS/接口时延/慢查询,同时利用 AutoTagging 打通指标数据的孤岛,构建可协作的观测平台。这部分也可参考我们之前的文章《告别数据孤岛:DeepFlow AutoTagging 之 Prometheus 标签标准化》。
微服务黄金指标总览 Dashboard
查找问题根因时,基本都需要借助日志来完成,DeepFlow AutoLogging 的能力自动采集多种应用协议的调用日志和网络流日志。对于日志详细的介绍,可参考前述文章《DeepFlow AutoLogging:自动采集应用调用日志和流日志》。
DeepFlow AutoLogging
0x4: 后续迭代计划
DeepFlow 目前保持每两周一个版本,与本文相关的后续迭代计划包括:
- 支持将 SkyWalking Span 汇聚为指标,展示每个 Endpoint 的性能指标
- 支持集成应用代码日志:集成 Promtail/Fluentd 等日志数据源
- 支持使用 eBPF 采集 On/Off CPU 火焰图,提供零侵扰的 Continue Profile 能力
0x5: 什么是 DeepFlow
DeepFlow 是云杉网络开发的一款可观测性产品,旨在为复杂的云基础设施及云原生应用提供深度可观测性。DeepFlow 基于 eBPF 实现了应用性能指标、分布式追踪、持续性能剖析等观测信号的零侵扰(Zero Code
)采集,并结合智能标签(SmartEncoding
)技术实现了所有观测信号的全栈(Full Stack
)关联和高效存取。使用 DeepFlow,可以让云原生应用自动具有深度可观测性,从而消除开发者不断插桩的沉重负担,并为 DevOps/SRE 团队提供从代码到基础设施的监控及诊断能力。
GitHub 地址:https://github.com/deepflowio/deepflow
访问 DeepFlow Demo,体验高度自动化的可观测性新时代。