logo
logo

使用 DeepFlow 作为 SkyWalking 的后端,消除观测盲点

李倩 2022-09-26

DeepFlow 作为一个可观测性协作平台,可作为 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 的数据集成方式对比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 的数据流DeepFlow 集成 SkyWalking 的数据流

接下来基于一个具体的 Demo (github.com/liuzhibin-cn/my-demo) 应用来展示数据接入的实际效果。此 Demo 是部署在 K8s 中的一个 WebShop 应用,包含 5 个微服务,使用了 Dubbo 作为微服务框架、Nacos 作为服务注册中心、Seata 提供了分布式事务服务、数据存储层使用的 MySQL,架构如下:

SkyWalking WebShop DemoSkyWalking 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
2
3
4
5
6
otlphttp:
traces_endpoint: "http://${HOST_IP}:38086/api/v1/otel/trace"
tls:
insecure: true
retry_on_failure:
enabled: true

同时,需要确保 deepflow-agent 需要的数据端口打开(默认关闭,减少监听端口),详细配置命令请参考我们的在线文档

1
2
vtap_group_id: <your-agent-group-id>
external_agent_http_proxy_enabled: 1

到此,仅通过修改配置已经完成了 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微服务黄金指标总览 Dashboard

查找问题根因时,基本都需要借助日志来完成,DeepFlow AutoLogging 的能力自动采集多种应用协议的调用日志和网络流日志。对于日志详细的介绍,可参考前述文章《DeepFlow AutoLogging:自动采集应用调用日志和流日志》

DeepFlow AutoLoggingDeepFlow 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,体验高度自动化的可观测性新时代。