JSON-over-HTTP LLD配置失败:主机名含无效字符'{'求助
问题描述
我正在配置一个基于JSON over HTTP数据源的Zabbix主机自动发现(Host LLD),配置里包含带JSONPath的预处理步骤,以及3个JSONPath类型的LLD宏。我已经用Zabbix内置测试工具和JSONPath验证工具确认过配置的正确性,但LLD执行时一直报错:
Cannot create host "{#LOCATION_ID}": name contains invalid character '{'.
我怀疑是LLD宏的值为空导致的,但不知道具体该怎么排查和解决。
排查步骤
检查数据源返回的JSON结构
直接调用HTTP数据源接口,确认返回的JSON里有没有预期的LOCATION_ID字段,且字段值非空。可以用curl命令测试:curl -X GET "你的HTTP数据源URL"同时要确保返回的是数组类型的JSON数据(Zabbix LLD要求数据源返回数组,每个元素对应一个待创建的主机)。
验证LLD宏的JSONPath表达式
把数据源返回的JSON内容复制到JSONPath验证工具中,重新测试宏对应的表达式,确认能精准提取到非空值。注意Zabbix的JSONPath实现可能和第三方工具略有差异,比如@符号的使用规则,要以Zabbix官方文档为准。检查预处理步骤的逻辑与顺序
确认预处理步骤的顺序是否合理:比如要先做JSON解析,再执行JSONPath提取操作。同时排查是否有预处理步骤过滤或修改了数据,导致目标字段被删除或者JSON结构被破坏。查看Zabbix日志详情
打开Zabbix Server的日志文件(通常路径是/var/log/zabbix/zabbix_server.log),搜索LLD相关日志条目,看是否有更具体的错误提示,比如数据源请求失败、JSON解析错误等。
常见解决方法
修正LLD宏的JSONPath表达式
如果表达式无法正确提取值,要根据实际JSON结构调整。比如返回的JSON是[{"location_id": "LOC001"}, ...],那么{#LOCATION_ID}对应的JSONPath应该是$.[*].location_id(注意Zabbix的JSONPath对字段名大小写敏感)。确保数据源返回标准JSON数组
要求数据源返回标准的JSON数组,每个元素包含所有LLD宏需要的字段,且字段值不为空字符串或null。如果数据源返回的是单个JSON对象,要么在预处理步骤中用JSONPath提取出数组部分,要么修改数据源接口返回数组格式。检查主机名称模板配置
确认主机自动发现配置里的主机名称模板是否正确使用了LLD宏(比如正确写成{#LOCATION_ID}),同时确保宏替换后的主机名称符合Zabbix规则(不能包含{、}这类特殊字符,报错信息也侧面说明宏没被正确替换)。测试LLD执行结果
在Zabbix的LLD配置页面点击「测试」按钮,查看返回的LLD宏值列表,确认每个宏都有对应的非空值。如果测试结果里宏值为空,说明数据源或JSONPath表达式存在问题,需要重新排查。
内容的提问来源于stack exchange,提问作者viktorkho

