简介
观测云采集器,是一款开源、一体式的数据采集 Agent,它提供全平台操作系统支持,拥有全面数据采集能力,涵盖基础设施、指标、日志、应用性能、用户访问以及安全巡检等各种场景。通过 eBPF 技术的引入,观测云采集器实践了网络传输层和应用层的部分协议的可观测。
采集器架构
- 采集管理:配置加载模块用于配置动态管理与采集插件的开启关闭;监视器模块用于查看采集器资源使用、采集插件开启、数据处理器脚本工作状况、采集器外部数据接入API 的响应与延迟信息等
- 数据采集:采集器不仅可以通过内置插件进行数据采集,还能接入外部数据源,如云原生计算基金会下的可观测项目 OTEL 的链路、指标数据等
- 数据清洗:在采集插件生成数据后和数据上传之间的数据清洗层,用户可以通过编程介入,如使用可编程数据处理器的语言编写脚本修改 Point ,使用内置函数分析提取网络数据中 IP 归属的城市、省份和国家到 Point 中;脚本支持动态加载和卸载
- 数据上传:采集器对各种数据进行分类上传,类别有日志、指标、链路、网络等,所有类别的数据均使用 Point 结构封装,每一个 Point 代表一条数据,大致由四个部分:名字、 标签字典、字段字典以及时间戳构成 (其名字可以是指标名 cpu, 日志来源 nginx ,网络的 httpflow等)
eBPF 技术应用
观测云采集器使用了三种类型的 eBPF 程序:socket filter、kprobe、uprobe,能够抓取以太网帧、跟踪与 socket 和 TCP/IP 协议栈相关的内核函数以及用户共享库函数,实现网络协议可观测。下图介绍观测云采集器如何实践 eBPF 技术进行主机上的网络观测。
数据采集
观测云采集器的 eBPF 网络观测功能采集并生成了三个数据集,分别为 netflow, dnsflow 和 httpflow,其 tag 基本相同,以下是其 tag 名与描述。
Tag名 | 描述 |
src_ip | 源 IP |
dst_ip | 目标 IP |
src_port | 源端口 |
dst_port | 目标端口 |
transport | tcp 或 udp |
family | IPv4 或 IPv6 |
direction | 传输方向(incoming/outgoing) |
srciptype | 源 IP 类型 (other/private/multicast) |
dstiptype | 目标 IP 类型 (other/private/multicast) |
host | 主机名 |
source | 数据源(netflow,httpflow,dnsflow) |
pid | 进程 id,仅 netflow |
dst_domain | 仅 netflow,来自 dnsflow 抓包记录 |
srck8snamespace | 源 service 归属的 namespace |
srck8sdeployment_name | 源 serivce 归属的 deployment |
srck8sservice_name | 源 service |
srck8spod_name | 源 pod |
dstk8snamespace | 目标 service 归属的 namespace |
dstk8sdeployment_name | 目标 serivce 归属的 deployment |
dstk8sservice_name | 目标 service |
dstk8spod_name | 目标 pod |
sub_source | 子来源,默认 N/A,如若为 Kubernetes 流量则为 K8s |
传输层网络观测
- 采集器使用 kprobe 类型 eBPF 程序获取部分内核函数的输入与返回值
- 通过 inetbind(6) 函数判断 srcip + src_port 是否为服务端
- 通过协议栈 tcp\udp 以及 ip 相关的内核函数,获取服务与客户端之间的流量大小以及 TCP 协议的连接的建立与关闭次数、重传和 RTT 信息
Field名 | 描述 |
bytes_read | 接收字节数 |
bytes_written | 发送字节数 |
retransmits | 重传次数 |
rtt | rtt |
rtt_var | rtt_var |
tcp_closed | TCP 连接关闭次数 |
tcp_established | TCP 连接建立次数 |
应用层网络观测
- 采集器使用 AF_PACKET + BPF 在采集器上分析 DNS 请求,以支持 CentOS(RedHat)7.6 (其不支持 socket filter 类型 eBPF 程序),记录请求信息支持 netflow 进行域名反向解析;
- 对于 HTTP 请求使用 socket filter 和 uprobe 类型 eBPF 程序实现 HTTP(S) 请求分析。
下面的为采集 dns 协议生成的字段 和 http 协议生成字段。
Field 名(dns) | 描述 |
count | 一个采集周期内的请求总数 |
latency | DNS 平均请求响应时间间隔 |
latency_max | DNS 最大请求的响应时间间隔 |
rcode | DNS 响应码: 0 - NoError, 1 - FormErr, 2 - ServFail, 3 - NXDomain, 4 - NotImp, 5 - Refused, ... |
Field 名(http) | 描述 |
count | 一个采集周期内的请求总数 |
http_version | 1.1 / 1.0 ... |
latency | TTFB |
method | GET/POST... |
path | 请求路径 |
status_code | 状态码,如 200, 301, 404 ... |
truncated | 请求路径长度达到采集的(约 150)字节上限,存在截断可能 |
用户地理分布及 TCP 时延
通过内置数据处理器编写脚本,来解析 ip 并获取 ip 归属的省份、国家等信息作为标签追加到生成的 Point 上,并在观测云前端创建仪表板。下图通过世界地图和中国地图展示 netflow 中客户端 ip 的地理分布和服务端之间的 tcp 时延。
主机间四层网络拓扑
下图为当前工作空间内部署了观测云采集器并开启了 eBPF 网络采集器的主机间的网络拓扑图,图上我们可以看到主机间的数据发送与接受的字节数和网络波动等信息。
K8s Pod 间网络拓扑
当 eBPF 采集插件获取到 K8S 的 ip 和端口信息后将自动追加到生成的数据上,通过观测云前端构建不同的网络拓扑图,下图是构建的 Pod 网络拓扑关系图。
K8s Deployment 间网络拓扑
下图是构建的 Deployment 网络拓扑关系图,从图中可以看到 nginx deployment 上的 HTTP 协议的每秒请求数和请求错误率。