如何从零开发一款 OneAgent

在运维和可观测行业中,已经有不少优秀的终端数据采集器,其中包括不少的开源项目,如 Datadog Agent, Elastic Beats,Telegraf 等等,它们在一些特定的需求场景中可以很出色的工作。但是,对于一家商业化的可观测工具公司来说,这些数据采集器并没有完全满足当前数据智能对采集端的要求,尤其是现在 GenAI、AgenticAI 的时代,对数据工具/技能的要求会越来越高。
因此,笔者所在公司耗费了很长时间、很多功夫,从零开始自研一款属于自己的商业化 OneAgent,作为可观测智能的数据基石。并且从规划设计之初,我们就着重关注其轻量、易用、可扩展的关键属性。经过近几年的商用打磨,OneAgent 已经成熟稳定地运行在众多客户的生产环境。
01 OneAgent 的核心设计理念
● 轻量化:降低资源占用,实现高效采集
基础数据采集时(CPU、内存、磁盘、进程、容器、网络)的资源占用情况: 内存≈50 MB, CPU < 1 % 。
● 易用性:简化操作,自动化服务识别与配置
一键安装、服务自动识别、自动打包、自动关联,最终达到 “无脑安装” 的程序。
● 可拓展性:插件机制助力自定义采集扩展
采用插件机制支持自定义的采集,插件可以使用任何开发语言实现,包括 shell 脚本、python 等。此外,插件可以随时启用和停止,不需要重新启动 OneAgent (这同时也体现了易用性)
02 OneAgent 的亮点功能
除了以上几点,OneAgent 还有以下几个亮点功能:
● 除了主动采集,还可以接收其它组件推送的数据,如 SNMP trap, statsd 指标
● 支持普通用户安装和采集,非 Root 权限也可以安装
● 支持使用 SQL 语法获取实时采集的数据(类似 osquery),可以很容易当作目前火热的 AI-Agent 的 Tools 使用
● 采集的同时完成数据治理,实现采集即治理,无感知情境富化
● 可视化统一管理,后端 Web 界面统一管理配置
下图是 OneAgent 的数据采集概览图,涵盖了目前常见的几种采集方式。
图:OneAgent 架构图
接下来,详细说明一下,我们是如何实现以上的一些主要特性。
03 如何实现 OneAgent 的主要特性
1. 实现 OneAgent 轻量化:减少资源占用的技术策略
轻量的重要指标就是在采集期间尽量少的占用资源,尤其是 CPU 资源,而采集器经常是通过遍历的方式来获取系统的相关信息。比如,在采集进程相关信息时,采集器会递归访问/proc目录,读取每个进程目录下的信息文件。这样一次采集往往会涉及成百上千个内存文件的打开、读取和关闭操作,消耗的 CPU 资源不容忽视,尤其当系统中的进程比较多时,甚至会影响业务的正常运行。
OneAgent 在采集进程信息时,首先会对进程进行分类,对于与业务无关的进程,只需要采集基本的信息即可;而对于业务进程,需要采集更多的详细信息,比如网络连接统计信息。此外,OneAgent 不会每次采集都遍历系统目录,只需要定期遍历一次系统目录(比如一小时一次),期间通过 Netlink 的 NETLINK_CONNECTOR 子系统可以实时侦听进程的创建和结束事件,从而每次采集只需要关注这些增量信息即可,极大的减少了对系统目录的访问量。
2. 提高易用性:从安装到采集、治理的全自动化
采集器的易用性指不需要过多的人为配置和操作,就能采集到用户和系统需要的数据。OneAgent 通过服务自动发现、自动配置、自动关联和打标来减少人工干预并提高准确性。
OneAgent 采集进程信息时,根据采集到的信息可以判断是否为需要关注的服务,如采集到进程名为mysqld,说明系统有 mysql 服务正在运行,同时可以获取 mysql 侦听的地址和端口,这样就可以自动生成 mysql 采集插件的配置信息,如果系统启用了该插件,就可以自动采集 mysql 服务的指标信息。同理,当 OneAgent 部署在 K8S 环境中时,OneAgent 会根据采集到的 Pod 信息,自动推断etcd, ApiServer, ControlManager, KubeProxy等组件的连接信息并自动生成配置数据。
此外,OneAgent 还会跟踪环境的网络流量并支持常见协议的解析,比如当前主机访问远程的一个 Mysql 服务器,OneAgent 通过网络流量可以识别出 Mysql 协议,发现远端的 Mysql 服务器相关信息,自动生成配置数据。同样,如果这时的 Mysql 采集插件已经启用,就可以自动采集指标信息。
除了自动发现环境中的服务和组件,OneAgent 还会自动关联属性,比如采集进程信息时,如果还启用了容器采集或是运行在 K8S 环境中,那么进程信息中还会关联上容器和 Pod 的信息。这样,当我们在定位问题时,可以很容易从进程上探至容器和 Pod。又比如,当 OneAgent 从网络流量中提取出一条 TCP 连接时,它还会根据 TCP 连接的五元组信息,关联至与该连接相关的进程,因此可以很轻易地将一条传输延迟很高的网络连接定位至某个进程。
3. 扩展性:利用插件机制赋能自定义采集
任何一个采集器都不可能预见到所有需要采集的组件,因此允许用户用自己擅长的方式去自定义采集方式对一个采集器来说是也一项至关重要的特性。OneAgent 通过插件机制实现采集扩展性,而插件的实现方式并不局限于某种开发语言,只要插件的输出格式满足 OneAgent 要求的规范即可。
我们以 shell 脚本插件举例说明,如何写一个符合规范的自定义插件:
可见,这个规范并不复杂,主要包括以下几点:
插件启动时,首先要输出采集指标的描述信息,包括指标名,指标类型
√ 输出行以 # 开头
√ 指标描述信息的格式如下:指标名:指标类型|指标描述信息
√指标类型可取值:GAUGE, COUNTER, RATE, MONITONIC, HISTORGRAM
按行输出采集的指标,指标内容与 Promepheus 格式一致,多个指标数据以","分隔,每个指标数据包含两部分:数值和标签,标签部分包含在{}。
通过以上内容,我们大致了解了 Databuff-OneAgent 的主要工作机制及设计原则。做过数据分析工作的朋友可能深有体会,高质量的数据不仅能大大减少数据预处理的时间,而且也决定着各种机器学习/AI 分析的效果。因此,一款优秀的数据采集器值得各行各业的关注。







评论