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

136 lines
5.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

目标:自动发现所有 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
保存发现规则。
2. 创建监控项原型 (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
保存监控项原型。
3. 创建触发器原型 (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
事件成功关闭 全部问题
保存触发器原型。
4. 验证
将模板链接到某个主机(例如你的 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。
模板已链接到主机。