wei/个人文档/zabbix.md
2026-06-04 13:57:41 +08:00

5.3 KiB
Raw Blame History

目标:自动发现所有 job="node-exporter" 的实例,为每个实例创建一个 up 监控项,并在 up=0 时触发告警告警中能识别出具体的实例IP:端口)。

下面给出完整的配置步骤,每一步都明确填写内容。

前置条件 你已经有一个主监控项:

名称Prometheus: Get all up metrics

类型HTTP Agent

信息类型:文本

URLhttp://192.168.1.231:30900/api/v1/query?query=up

确保这个主监控项正常工作,且它的值是你之前贴出的 JSON 数据。

  1. 创建自动发现规则 (Discovery Rule) 在同一个模板中,进入 自动发现规则,点击 创建发现规则。

字段 值 名称 Discover node exporters 类型 依赖的监控项 键值 discovery.node_exporters可自定义 主监控项 选择 Prometheus: Get all up metrics 信息类型 文本(必须) 更新间隔 留空(依赖主监控项) 预处理 添加两个步骤:

  1. JavaScript代码见下方
  2. Discard unchanged with heartbeat周期 1h JavaScript 预处理代码 javascript var input = JSON.parse(value); var discoveries = [];

if (input.data && input.data.result) { input.data.result.forEach(function(item) { if (item.metric && item.metric.job === "node-exporter") { discoveries.push({ "{#NODE_IP}": item.metric.instance, "{#NODE_NAME}": item.metric.instance.split(':')[0], "{#JOB}": item.metric.job }); } }); } return JSON.stringify(discoveries); 这段代码会过滤出 job="node-exporter" 的指标,并为每个实例生成一个 JSON 对象,包含 {#NODE_IP}、{#NODE_NAME}、{#JOB} 三个宏。

LLD 宏 在发现规则的 LLD 宏 标签页,手动添加三个宏(或者保存后系统会自动识别,但建议手动添加确保可用):

宏 说明 {#NODE_IP} IP:端口,例如 192.168.1.231:9100 {#NODE_NAME} IP 部分,例如 192.168.1.231 {#JOB} job 名称,例如 node-exporter 保存发现规则。

  1. 创建监控项原型 (Item Prototype) 在刚才创建的发现规则下方,进入 监控项原型,点击 创建监控项原型。

字段 值 名称 Node Exporter up on {#NODE_IP} 类型 依赖的监控项 键值 node_exporter.up["{#NODE_IP}"] 主监控项 选择 Prometheus: Get all up metrics 信息类型 数字(无正负) 单位 留空 更新间隔 留空 历史记录 90d按需 趋势 365d按需 值映射 留空 预处理 添加 一个 步骤:

  • 名称JSONPath
  • 参数:$.data.result[?(@.metric.instance=="{#NODE_IP}")].value[1] 注意JSONPath 中的 {#NODE_IP} 会在运行时被自动替换为实际值(如 192.168.1.231:9100

保存监控项原型。

  1. 创建触发器原型 (Trigger Prototype) 在同一个发现规则下,进入 触发器原型,点击 创建触发器原型。

字段 值 名称 Node Exporter {#NODE_IP} is down 严重性 一般问题 或 严重(按需) 表达式 点击“添加”,在弹出框中:

  • 监控项:选择刚刚创建的监控项原型 Node Exporter up on {#NODE_IP}
  • 函数last()
  • 结果:=0 最终表达式last(/模板名称/node_exporter.up["{#NODE_IP}"])=0 恢复表达式 可以留空,或设置 last(/模板名称/node_exporter.up["{#NODE_IP}"])=1 事件成功关闭 全部问题 保存触发器原型。
  1. 验证 将模板链接到某个主机(例如你的 Zabbix Server 自己),等待 1-2 分钟。

查看发现规则是否生成主机原型 进入 数据采集 → 主机,找到你链接模板的主机,点击 自动发现。

应该能看到 Discover node exporters 规则,并且“发现的设备”列表中会出现你所有的 node-exporter 实例(每个实例一行)。

查看监控项 进入该主机的 监控项 列表,应该能看到自动创建的监控项,名称类似于 Node Exporter up on 192.168.1.231:9100值为 1。

测试告警 可以手动停止其中一个 node-exporter或者修改 Prometheus 中的 scrape 配置,让 up 变为 0。等待几分钟Zabbix 应该会触发告警,告警信息中会包含具体的 {#NODE_IP},例如 Node Exporter 192.168.1.231:9100 is down。

常见问题排查 监控项原型的状态为“不受支持” 点击红色的“不受支持”文字,查看错误详情。

常见原因JSONPath 不匹配。可以先复制主监控项的实际 JSON 数据,用在线 JSONPath 测试工具验证 $.data.result[?(@.metric.instance=="192.168.1.231:9100")].value[1] 是否能正确提取值。

如果 JSONPath 语法在 Zabbix 中不支持 filter 中的双引号,可以尝试改为单引号:$.data.result[?(@.metric.instance=='{#NODE_IP}')].value[1]。

发现规则返回空列表 检查 JavaScript 代码中 item.metric.job === "node-exporter" 是否与实际 job 名称完全一致(大小写、空格)。

可以在 JavaScript 中加入 console.log(value) 调试(不过 Zabbix 不输出 console可以临时返回原始 value 查看)。

告警未发生 检查触发器表达式是否正确,特别是监控项的键值是否一致。

检查触发器的“启用”选项是否勾选。

最终检查清单 主监控项正常工作,能返回 JSON 文本。

发现规则信息类型为“文本”,预处理 JavaScript 正确。

监控项原型使用 JSONPath 预处理,参数中正确使用了 {#NODE_IP} 宏。

触发器原型表达式使用 last(...)=0。

模板已链接到主机。