Zabbix中如何复用同一Item的JSON输出,规避重复执行高消耗检查?
解决方案
核心思路:使用Zabbix依赖Item(Dependent Item)复用原始数据
依赖Item不会触发Agent端的UserParameter调用,而是直接从父Item的历史数据中提取并处理,完美避免重复执行性能消耗大的自定义检查。
方案一(推荐,不影响现有配置)
如果原corrupt_sessions Item已经被触发器、仪表盘等引用,优先用这个方案:
新建原始数据采集Item
- 名称:
Corrupt Sessions Raw Data - Key:
corrupt_sessions.raw(自定义唯一值即可) - 类型:保持和原Item一致(比如
Zabbix agent) - UserParameter配置:和原Item相同,即调用
corrupt_sessions对应的自定义检查 - 预处理:无(保留原始JSON列表输出,如
["abc", "def", "ghi"]) - 存储类型:设为
Text,确保原始JSON能被后续依赖Item解析
- 名称:
改造原统计Item为依赖Item
- 编辑原
corrupt_sessionsItem:- 类型改为
Dependent item - 父Item选择刚创建的
Corrupt Sessions Raw Data - 保留原有预处理步骤:添加
JSONPath,参数填$.length(),输出类型设为Numeric (unsigned)
- 类型改为
- 改造后,原Item的key、名称不变,所有引用它的触发器、图表无需修改
- 编辑原
新建会话列表生成依赖Item
- 名称:
Corrupt Sessions List - Key:
corrupt_sessions.list(自定义唯一值) - 类型:
Dependent item - 父Item选择
Corrupt Sessions Raw Data - 添加预处理步骤:选择
JavaScript,输入以下脚本将JSON数组转为指定格式字符串:value = JSON.parse(value); return "Corrupt session IDs: " + value.join(", "); - 输出类型设为
Text
- 名称:
方案二(直接调整原Item)
如果原Item尚未被大量引用,可以直接调整:
修改原Item采集原始数据
- 编辑原
corrupt_sessionsItem:移除$.length()的JSONPath预处理,保留原始JSON列表输出,存储类型设为Text
- 编辑原
新建两个依赖Item
- 统计数量的依赖Item:
- 名称:
Corrupt Sessions Count - Key:
corrupt_sessions.count - 类型:
Dependent item,父Item为corrupt_sessions - 预处理:
JSONPath参数$.length(),输出类型Numeric (unsigned)
- 名称:
- 生成列表的依赖Item:
- 名称:
Corrupt Sessions List - Key:
corrupt_sessions.list - 类型:
Dependent item,父Item为corrupt_sessions - 预处理:用上述JavaScript脚本转换格式,输出类型
Text
- 名称:
- 统计数量的依赖Item:
告警配置
设置触发器时,用统计数量的Item(原corrupt_sessions或corrupt_sessions.count)作为阈值判断条件,比如:
{Template XYZ:corrupt_sessions.last()} > 3
告警消息中直接引用会话列表Item的最新值,即可在告警时展示所有损坏会话ID:
当前损坏会话数:{ITEM.LASTVALUE} 损坏会话ID列表:{ITEM.LASTVALUE:corrupt_sessions.list}
内容的提问来源于stack exchange,提问作者hvtilborg
相关产品推荐
相关产品推荐

