夜莺监控设计思考(四)关于机器那些事儿

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

本系列其他文章:

本篇聊聊夜莺里跟机器相关的那些事,机器的数据采集、机器的归组打标签、机器的元信息、机器的告警分派等。

前言

机器这个概念,在监控系统里具有比较特殊的场景。核心是因为两个原因:

  • 机器上面的服务有时会混部,导致机器和业务程序之间的对应关系不好搞(这就是对待机器不能像对待 Pod 的原因)
  • 采集器 agent 通常部署在机器上,对于机器的管理也会影响采集器的管理(很多新的可观测性厂商在宣传的 Fleet 机制,就是侧重在采集层面,agent 最终要部署到机器上,所以机器和采集器有很多关联)

Zabbix、Open-Falcon 等,对机器概念都有额外的抽象建模,Prometheus 生态则完全忽略机器概念的特殊性,走向了另一个极端。

夜莺监控(Nightingale)则站在二者中间,既想遵从 Prometheus 生态的玩法,又想给机器场景做一些额外的支持,稍微有点拧巴。不过产品是为业务场景服务的,场景就在那里,不是说想砍就能砍掉的。

夜莺体系里,对机器的相关支持比较零散,本文也会显得有点凌乱,望诸位看官见谅。

机器分类管理

夜莺里有个告警自愈功能,可以去机器上执行脚本,所以需要非常小心设计机器的权限。最简单的是每个机器跟人、角色绑定,但是不方便管理,所以给机器设计了一个业务组的概念。机器可以归属业务组,业务组关联的管理人员,这些人员可以对机器做操作。

业务组可能会划分的很细,比如每个 Service 作为一个业务组,比如 DBA/MySQL/Proxy 是也一个业务组,DBA/MySQL/DataNode/Mall 是另一个业务组。而同一台机器可能部署多个 Service,所以,机器要支持同时挂在多个业务组。

Prometheus 生态里,监控指标的各类维度信息都是通过标签来描述的(业务组是没法直接作为标签的,因为 Prometheus 里的标签不允许同 Key 多 Value),那夜莺要支持给机器打标签(在机器列表页面进行操作),给机器打的标签,会自动附加到机器的监控指标上。

所以,夜莺里,机器的归组提供了两个机制:

  • 业务组,通常以 Service 颗粒度划分,跟权限相关
  • 标签:如果想把某些维度信息附加到监控指标上,那就把这些维度信息做成标签

当然,这一切的前提,是你要使用 Categraf 作为采集器,并且把 Categraf 的 heartbeat 和 writer 的 url 都指向夜莺。

如果你没有使用 Categraf 采集器,机器列表里就是空的,用不了机器的归组、打标签的能力。其实也不是啥大事,不用 Categraf 也不会影响你对时序库中的数据做告警、看图。只是,使用 Categraf 会让体验更丝滑,可以获得额外一些能力。

Categraf 部署到所有待监控的目标机器上,采集机器的元信息、基础监控指标、执行脚本做告警自愈。

机器信息上报

如果使用 Categraf 作为采集器,在夜莺的机器列表里就会自动出现机器列表:

如果发现内存、CPU、时间偏移等列是 unknown,可能的原因是:

  • 你没有使用 Categraf 采集器
  • Categraf 配置文件里的 heartbeat 没有开启,或没有指向夜莺

这个表格里,机器标识是可以点击的,点击机器标识,可以打开一个侧拉板,展示机器的元信息:

多说一句:有些人会问,机器列表里可以看到机器的 CPU、内存等信息,但是仪表盘是空的,为啥?可能的原因:

  • Categraf 配置文件里 writer 部分配置的不对,没有指向夜莺
  • 如果配置是对的,那就要看 Categraf 的日志找线索了

机器告警

使用了 Categraf 之后,除了可以看到机器列表、机器元信息、给机器分组、打标签之外,还可以对机器做特殊的告警规则配置。

告警规则里,有个专门的 Host 类型,提供三种机器相关的告警规则:机器失联、机器集群失联、机器时间偏移。

注意,机器时间偏移并非是机器和 NTP Server 之间的时间偏移,而是 Categraf 所在的机器和夜莺服务端的时间偏移,如果用了 n9e-edge 边缘模块,就是 Categraf 所在的机器和 n9e-edge 所在机器的时间偏移。

机器时间偏移这个规则较为常用,另一个常用的是机器失联。因为 Categraf + Nightingale 的监控数据流向是典型的 PUSH 模型,没有 Prometheus 中的 up 指标,所以需要额外的机制来判定机器是否失联。

Question:机器挂载了业务组,我想对某些业务组做告警判定,应该怎么配置?

这个问题也很常见。在夜莺的体系里,性能最好的方式是使用变量,配置方式如下:

上图中,创建了一个 ident 变量,变量类型是 机器标识,机器范围是 Default Busi GroupDevOps 两个业务组下的机器。然后在 promql 中引用了 ident 标签作为过滤条件。

当然,如果你的监控指标里有标签可以很方便做过滤,则直接使用标签也是 OK 的。

上例用的变量模式,还有另一个好处,是用于特殊机器的阈值配置,比如 Default Busi GroupDevOps 两个业务组下的机器默认 CPU 阈值都是 80,但是其中有1台机器很特殊,平时负载就很高,CPU 阈值要设置为 88,那就可以再加一个阈值变量,同时继续配置 变量筛选 条件:

这个配置方式稍微有点复杂,不过没办法,问题场景本身就是复杂的。

老版本没有 启用变量 这个配置,只有 仅在本业务组生效 的配置,那个方式性能不好。其原理是:

拿着告警规则里的 promql 去查询时序库里的所有满足条件的数据,可能查到很多机器都告警了,然后再根据机器的归属关系做过滤,只保留自己业务组下的机器的相关告警。

仪表盘只查看业务组下的机器

既然在夜莺里维护了机器和业务组的关系,那在仪表盘里查看机器的时候,能否只查看当前业务组下的机器呢?是可以的。

我们可以导入内置的机器相关仪表盘(在 Linux 类别下),打开 机器常用指标 那个仪表盘,默认是查看所有机器,因为 ident 变量配置是 label_values(system_uptime, ident),如下:

然后,我们修改一下 ident 变量,如下:

保存仪表盘然后刷新,就会看到机器的变量下拉框里,只有当前业务组下的机器,如果仪表盘所属的业务组下面没有机器,那就看不了数据了。

其他机器相关的功能

开源版本,跟机器相关的功能主要就是上面罗列的那些。商业版会有额外的功能,比如:

  • Categraf 的采集规则中心化管理和下发
  • 专门的网络设备管理里需要采集器探针的管理,会和机器管理有联动
相关推荐
troy1288 小时前
告别 Copilot?Codex、Claude Code、DeepSeek Harness、Kimi、ChatGPT 哪个更适合本地化部署,更有性价比?
人工智能·python·开源软件
daemon.qiang19 小时前
国内虚拟机对接 Freedesktop:Fork xserver、自建 Runner 与提交 MR 实战
linux·ubuntu·centos·gitlab·开源软件
redfred1 天前
Outline 部署教程:4 万 Star 自托管知识库,免费替代 Notion(Windows 源码部署完整指南)
postgresql·开源软件·notion
jonyleek2 天前
企业级自动化落地实践:为什么JVS-Logic用确定性逻辑引擎替代AI编排?
低代码·私有化部署·流程引擎·可观测性·jvs-logic·企业自动化·确定性计算
孟郎郎2 天前
Windows 环境使用 OpenCode 配置使用大模型
人工智能·windows·ai·大模型·开源软件·opencode
猫头虎3 天前
FDE 是什么岗位?Forward Deployed Engineer 岗位标准、能力模型、交付物规范与冲突处置规则全解析
人工智能·开源·开源软件·ai编程·ai写作·gpu算力·agi
我笔记3 天前
主流的国内镜像站
开源软件
项目管理实用笔记4 天前
开源项目管理软件是什么?核心功能解析
项目管理·开源软件·开源项目管理软件
A心有千千结5 天前
GO 使用 OpenTelemetry 进行编译时插桩,实现零码注入
数据库·golang·可观测性·观测云