136 lines
5.3 KiB
Markdown
136 lines
5.3 KiB
Markdown
目标:自动发现所有 job="node-exporter" 的实例,为每个实例创建一个 up 监控项,并在 up=0 时触发告警,告警中能识别出具体的实例(IP:端口)。
|
||
|
||
下面给出完整的配置步骤,每一步都明确填写内容。
|
||
|
||
前置条件
|
||
你已经有一个主监控项:
|
||
|
||
名称:Prometheus: Get all up metrics
|
||
|
||
类型:HTTP Agent
|
||
|
||
信息类型:文本
|
||
|
||
URL:http://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。
|
||
|
||
模板已链接到主机。 |