logo
logo

AutoTagging - 更强大、更实时的标签自动注入能力

向阳 2024-06-17

DeepFlow 的 AutoTagging 能力为所有观测数据注入统一的属性标签,包括:云资源信息、云平台中的自定义标签、K8s 资源信息、K8s 中的 Label/Annotation/Env 等自定义标签,CMDB 中的业务标签等。为所有数据注入统一的标签,有助于用户能从全栈、全链路视角完整观测每一个 Request 的性能变化,迅速定位问题相关的资源、服务和业务信息。关于 AutoTagging 的详细介绍可参考 DeepFlow 文档

AutoTagging 在 v6.5 中进行了多方面的增强,主要包括以下 5 点:

  1. 云服务器支持使用 hostname、主 IP 作为标签,支持自动注入阿里公有云的自定义标签
  2. 减少应用、网络指标数据中 IP 地址改写(聚合)为 0.0.0.0 的场景,让指标数据更精细
  3. 自动资源标签(auto_service)标记逻辑优化,改进 K8s 服务的标记能力
  4. 流日志增加请求域名(request_domain)字段
  5. 大幅提升标签变化的实时性

0x0: 云服务器标签增强

以往,AutoTagging 注入的 chost 标签含义为云平台中的云服务器名称。但是一些用户更习惯使用主机名(hostname)来区分服务器,而另一些用户更习惯用主 IP 来进行区分。因此在 v6.5 中,我们自动增加了如下标签:

  • chost_hostname:云服务器主机名
  • chost_ip:云服务器主 IP
  • pod_node_hostname:容器节点主机名
  • pod_node_ip:容器节点主 IP
  • host_hostname:KVM/ESXi/Hyper-V 宿主机的主机名(仅企业版
  • host_ip:KVM/ESXi/Hyper-V 宿主机的管理 IP(仅企业版

除此之外,v6.5 还增加了阿里云中 ECS 自定义标签的同步和自动注入能力(仅企业版)。

值得提到的是,得益于 DeepFlow 的 SmartEncoding 特性,自动为所有观测数据注入这些标签,并不会增加任何写入压力。这是因为,这些新增的标签全部都是在查询阶段由他们的元字段(chost/pod_node/host)转换而来的,当然用户的使用感受上不会有任何差别。

0x1: 大幅减少指标数据中的零 IP

以往,为了降低应用、网络聚合指标(ClickHouse flow_metrics 数据库)的写入压力,在将调用日志、流日志聚合为指标时,如果 IP 地址没有关联到任何资源(云服务器、子网、容器等等),DeepFlow 会自动将其视为 0.0.0.0 进行聚合。这样做的好处是可以降低指标数据的写入压力和查询压力。

在 v6.5 中,考虑到指标数据整体占比很小,且 ClickHouse 性能强劲,因此我们对这项规则进行了一些调整,以下几类情况不会对 IP 地址进行改写:

  1. 内网 IP 10/8、172.16/12、169.254/16、192.168/16 不会被改写为 0.0.0.0,无论它是否关联到云资源。我们认为内网 IP 都是企业的内部资源,都值得在指标数据中区分。
  2. 服务端的公网 IP 不会被改写为 0.0.0.0。我们认为企业依赖的公网服务都是重要的、值得在指标中进行区分的。

也就是说,v6.5 中仅有「公网 IP 作为客户端、且无法关联到任何资源」的场景下,才会在指标数据中聚合为 0.0.0.0。注意此时调用日志、流日志中的 IP 并不会改写。

大幅减少指标数据中的零 IP大幅减少指标数据中的零 IP

0x2: auto_service 标记逻辑优化

自动资源标签(auto_service)是 DeepFlow 自动为所有观测数据注入的一个标签,该标签自动根据 IP 地址或进程 ID 识别出对应的服务标签。识别的优先级为:容器服务 > 工作负载 > 进程 > 容器节点 > 云资源 > IP 地址。也就是说,如果一个 IP 地址或进程 ID 能关联到某个 K8s Service,则 auto_service 将会被赋值为 K8s Service 的名称;否则,DeepFlow 会按照优先级依次检查是否能关联到某个工作负载、某个进程等等。

v6.5 的优化是:优先级序列中的容器节点更改为了容器集群。我们认为一个 K8s 集群中的容器节点不用从「服务」层面进行区分,因此不再在 auto_service 中体现它们的差异性,统一使用容器集群指代。

auto_service 不再区分容器节点auto_service 不再区分容器节点

注意:auto_instance 中仍然会体现容器节点。

0x3: 流日志增加请求域名字段

在某游戏客户处,由于内核版本过低,使得 deepflow-agent 无法使用 eBPF uprobe 采集 HTTPS 调用日志。虽然流日志中有丰富的性能指标,但如果服务端是公网 IP 的话,无法通过流日志判断服务端的域名,不便于检索,导致故障定位困难。

在 v6.5 中,DeepFlow 支持从 TLS 握手消息中提取服务端域名,并赋值到流日志的 request_domain 字段中(仅企业版),如下图所示:

流日志中的请求域名和性能指标流日志中的请求域名和性能指标

现在,在任何内核、任何操作系统下,流日志都能展现 HTTPS 服务端域名信息了。

0x4: 大幅提升标签变化的实时性

v6.5 大幅提升 K8s 标签注入的实时性,优化前代码路径涉及 5 个独立的 1min 定时器,优化后只涉及到 1 个 10s 定时器和 1 个 1min 定时器,最极端情况下(所有定时器完美错开)的时延从 5min 降低到 1m20s(agent 对 K8s 资源的 list/watch 最多可能跨越两个周期,因此最坏可能产生 20s 的时延),即极端情况下的时延降低了 72%。

0x5: 什么是 DeepFlow

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

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

访问 DeepFlow Demo,体验零侵扰、全栈的可观测性。