夜莺监控设计思考(三)时序库、agent 的一些设计考量

夜莺监控设计思考系列第三篇,解释夜莺从自研时序库转向对接外部数据源的原因,以及为什么在不内置时序库的前提下仍然提供 Categraf agent 和指标转发能力。

作者 巴辉特

这将是一个系列,讲解 夜莺监控 的设计思考。你可以把它理解为:原理、最佳实践和产品设计时的折中取舍。

本系列其他文章:

本篇主要回答两个问题:

  • 夜莺和时序库对接的设计逻辑。
  • 夜莺和 agent 对接的设计逻辑。

核心要点

  • 夜莺 V5 开始放弃自研时序库,转向对接 Prometheus、VictoriaMetrics 等现成时序库,背后是项目定位从“大运维平台”收敛到“告警引擎”。
  • 作为告警引擎,夜莺不需要自研 TSDB,只需要能查询各类数据源并完成告警判定。
  • 夜莺仍然提供指标写入和转发能力,是为了让使用 PUSH 模型的采集器更容易接入,并把数据转存到后端时序库。
  • Categraf 的出现,是为了统一零散 exporter 的使用体验,并补充机器元信息、心跳、采集规则下发等能力。
  • Categraf 不是夜莺必选项;如果你已经有成熟采集和存储链路,夜莺可以只作为告警引擎使用。

夜莺和时序库对接的设计逻辑

如果是夜莺老用户,应该知道在 V4 以及之前的版本,夜莺有自研时序库。从 V5 开始,夜莺放弃自研时序库,转而对接各类数据源。这个变化背后的核心原因,是项目定位。

V4 之前的版本沿袭了很多 Open-Falcon 的设计逻辑,甚至一度想做一款运维平台。后来发现这样会遇到几个问题:

  • 运维平台范围太大,需要投入很多人力,单靠开源社区比较难。
  • 运维平台没有统一共识,各家公司或多或少都有自己的额外需求,什么都想往里塞。
  • 国内外知名开源项目通常都有清晰、专注的定位;定位越精准细分,越容易做透。
  • 社区用户来用夜莺,大多是奔着监控和告警能力来的,而不是奔着完整运维平台来的。

本质上,夜莺做了一个选择:不要做大而全的平台,而是把项目定位收敛到告警引擎。

纵观监控领域,时序库、采集器、可视化工具都有成熟开源项目。唯独统一告警引擎这一块相对缺失,所以夜莺从 V5 开始重点做告警引擎。

为什么告警引擎不需要自研时序库

作为一款告警引擎,夜莺需要的是查询数据并判断异常,不一定需要自己存储所有数据。

因此,从 V5 开始,夜莺不做自己的时序库,而是对接各类现成时序库。整个架构示意图如下:

这个设计的逻辑很清楚:

  • Prometheus、VictoriaMetrics 等系统负责指标存储和查询。
  • 各类采集器或 exporter 负责采集数据。
  • 夜莺负责配置告警规则、查询数据源、生成告警事件和发送通知。

这样做可以减少重复造轮子,也能让用户复用自己已经建设好的监控数据基座。

为什么夜莺仍然提供指标接收和转发能力

上面的架构需要用户自己搞定采集器和存储。以指标场景为例,用户需要自行搞定 Prometheus(或 VictoriaMetrics)加各类 exporter。除了 exporter,社区里还有很多其他采集器。

为了让社区用户更轻松一些,夜莺往前走了一步:虽然不做时序库,但可以接收时序数据,并把数据转存到时序库。

夜莺支持多种采集器,比如 Datadog-agent、Grafana-agent、Alloy、Telegraf,以及后来的 Categraf。不同采集器有不同协议,夜莺支持多种指标写入协议,最终把数据转存给时序库。

架构示意图如下:

夜莺配置文件 config.toml 里有 Pushgw 部分,用于配置后端时序库地址。可以配置多个 Writer,数据会同时转存到多个后端。当然,也可以不配置 Writer,不让夜莺转发数据。

PUSH 和 PULL:两种采集模型

监控数据采集领域,典型有两种模式:PULL 和 PUSH。

  • Prometheus 的方式是 PULL:Prometheus 主动抓取 exporter 暴露的指标。
  • Datadog、Categraf 的方式是 PUSH:agent 主动把指标推送到服务端。

夜莺提供数据接收 HTTP 端口,是典型的 PUSH 模式。如果你想用 PULL 模式,继续使用 Prometheus + exporter 即可。

PUSH 模式有一个天然难点:较难感知源端是否挂了,也就是 Nodata 告警。既然夜莺选择支持 PUSH 模式,也就专门提供了 Nodata 告警能力。因此,上图中各类 PUSH 类型 agent 如果数据经由夜莺转发,就可以享受 Nodata 告警能力,更方便地知道哪个 agent 挂了。

小结:夜莺和时序库的关系

夜莺的典型用法,是用户自行搞定数据采集和存储,夜莺仅作为告警引擎对接数据源,做告警判定。

如果你也想让数据流经夜莺,建议选择下文介绍的 Categraf 采集器。它和夜莺的整合最为顺滑。

夜莺和 agent 对接的设计逻辑

既然社区已经有很多采集器,为什么还要再做一个 Categraf?

社区使用最多的采集器,大概是各类 exporter。但 exporter 比较零散,体现为:

  • 不同 exporter 的设计逻辑不同,有的和监控目标是一对一关系,有的是一对多关系。
  • 不同 exporter 的日志打印方式不同。
  • 不同 exporter 的传参和配置文件格式各异。
  • 有些采集需求没有对应 exporter。

所以,夜莺团队希望做一些整合,搞一个更统一的采集器。

还有另一个重要原因:夜莺除了开源版,还有企业版。企业用户需要一致的产品体验。给企业用户一堆 exporter,不太容易形成统一体验;企业用户还会有各种定制采集需求,提到各个 exporter 项目里响应太慢;同时,企业用户还需要采集规则下发能力。这些需求都需要一个单独的 agent,于是 Categraf 诞生了。

引入 Categraf 之后,架构示意图如下:

Categraf 架构示意图

Categraf 带来的额外能力

夜莺有了自己的 agent 之后,就带来了额外能力:

  • agent 可以采集机器 metadata 信息并上报给夜莺,用户可以在页面上查看。
  • agent 和服务端周期性心跳,夜莺可以生成机器列表,类似一个资产台账。当然,自己做 Table 仪表盘也可以达到部分效果。

Categraf 配置文件里会配置两个夜莺接口地址:heartbeat 和 writer。

配置 作用
heartbeat 心跳接口,用于告诉服务端自己活着,同时上报机器 meta 信息
writer 指标推送接口,协议是 Prometheus remote write

如果 heartbeat 被 Disable,夜莺机器列表里的 CPU、内存等字段会显示 Unknown,点击机器也看不到 metadata 信息。

Categraf 也可以把 writer 直接配置为时序库的 remote write 地址,但这样数据就不经过夜莺,不太推荐。数据经过夜莺,可以更好地和机器列表、Nodata 告警等能力打通。

不想用 Categraf 行不行

可以。夜莺本来就侧重做告警引擎,你自己搞定数据采集和存储完全 OK。

不过,如果是新项目,还是建议使用 Categraf,至少用 Categraf 采集机器 CPU、内存、进程、metadata 等基础信息。这样夜莺的机器列表、心跳、机器元信息和相关体验会更完整。

至于数据库、中间件等监控数据,可以不用 Categraf,继续使用你自己习惯的采集器。

选择建议

场景 建议
已经有成熟 Prometheus + exporter 体系 夜莺只作为告警引擎即可
新建监控体系,希望快速打通机器基础指标 使用 Categraf
需要机器列表、metadata、心跳和 Nodata 告警 使用 Categraf,并让数据流经夜莺
数据库、中间件已有稳定采集器 可以继续使用原采集器
企业版需要统一采集规则下发 使用 Categraf 更合适

FAQ

夜莺放弃自研时序库,是不是能力变少了?

不是。夜莺是把项目定位收敛到告警引擎,把时序存储交给 Prometheus、VictoriaMetrics 等成熟系统。这样可以避免重复造轮子,也让夜莺更专注。

夜莺是否必须部署 Categraf?

不必须。夜莺可以直接对接已有数据源做告警判定。Categraf 的价值在于改善机器基础指标采集、心跳、metadata 和采集规则管理体验。

使用 Categraf 时,数据一定要经过夜莺吗?

不一定。Categraf 可以直接写时序库。但如果希望使用夜莺的机器列表、Nodata 告警和更完整集成体验,建议让 Categraf 的 writer 指向夜莺。

总结

在夜莺体系里,最简单的用法是只使用 n9e 进程作为告警引擎。如果有边缘机房场景,可以继续引入 n9e-edge 做边缘机房告警。

Categraf 不是必选项,但使用 Categraf 采集机器基础指标并和夜莺打通,体验会更好。夜莺不自研时序库,却提供 agent 和指标转发能力,看起来有点拧巴,但本质上是两个不同目标:不重复造存储轮子,同时给用户一条更顺滑的采集接入路径。

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云