字节跳动下一代通用高性能 OneAgent
为了解决上述问题,我们开发了基于新数据模型的 2.0 pipeline。2.0 Pipeline 中流动的每一条数据定义为 PipelineEvent,Metric、Trace、Log、Bytes,Profiling 等都是派生自 PipelineEvent 的具体事件,大幅提升了灵活性:
type PipelineEvent interface { GetName() string SetName(string) GetTags() Tags GetType() EventType GetTimestamp() uint64 GetObservedTimestamp() uint64 SetObservedTimestamp(uint64)
PipelineEvent 不但可以携带更丰富的信息,也更适合做 data pipeline 内的计算模型,大大提升了通用处理能力。
目前,我们已经把这项改造贡献给社区,社区也已经接受这个新的数据模型为核心处理模型,后续新的插件都将支持新的数据模型,存量的插件也在逐渐适配支持。
全新的构建方案
社区在 v1.4.0 之前要求插件必须放在项目主仓库内,但互联网时代,代码是企业最核心的资产之一,受限于字节跳动内部的安全合规要求,一些插件必须放在公司内部的私有仓库,不能贡献到开源社区。一般面对这种情况,我们只能 fork 一个新的仓库来增加一些内部专用的插件,但这会导致我们和社区上游渐行渐远,既也不能享受开源项目的新特性,也不利于把最终用户的反馈反哺社区。
针对这个问题,我们设计了一种产物构建机制,能够合并官方仓库和私有仓库的插件,一起构建出包。在方案上,我们重点参考了 OpenTelemetry Collector 的做法,使用 YAML 文件渲染成最终的 Go 文件。我们对仓库做了如下改造:
v1.4.0 之前,插件的引入都放在 plugins/all/all.go 下:
package all import ( _ "github.com/alibaba/ilogtail/plugins/aggregator" _ "github.com/alibaba/ilogtail/plugins/aggregator/baseagg" ...
v1.4.0 之后,项目主仓库添加 plugins.yml 文件,内置插件都加到这个文件里面进行注册,默认使用 plugins.yml 来生成内置插件的 all.go 。同时编译脚本支持传递多个 *_plugins.yml , 使用 external_plugins.yml 来加载外部仓库的插件,生成 external_all.go 文件。
plugin.yml:
plugins: common: - import: "github.com/alibaba/ilogtail/plugins/aggregator" - import: "github.com/alibaba/ilogtail/plugins/aggregator/baseagg" ...
external_plugins.yml:
plugins: // 需要注册的plugins,按适用的系统分类 common: - gomod: code.private.org/private/custom_plugins v1.0.0 // 必须,插件module import: code.private.org/private/custom_plugins // 可选,代码中import的package路径 path: ../custom_plugins // 可选,replace 本地路径,用于调试 windows: linux: project: replaces: // 可选,array,用于解决多个插件module之间依赖冲突时的问题 go_envs: // 可选,map,插件的repo是私有的时候,可以添加如GOPRIVATE环境等设置 GOPRIVATE: *.code.org git_configs: // 可选,map,私有插件repo可能需要认证,可以通过设置git url insteadof调整 url.https://user:token@github.com/user/.insteadof: https://github.com/user/
有了这个能力之后,各个公司能更自由地开发自己场景的插件,大大降低了开发门槛,大幅提升了开源项目的共建体验。
字节跳动的插件配置(脱敏)
基于上述这两个特性,我们开发一系列 OneAgent 插件运用在不同场景,很好地支撑了业务的需求:
输入插件:
发表评论