Grafana v6.7.3新建告警触发tsdb.HandleRequest()响应格式错误求助
问题根因
该错误是Grafana 6.x版本的通用告警问题,大量开发者在使用6.x版本配置告警时都遇到过同类报错。核心原因是Grafana 6.x的后台告警执行链路与前端页面查询链路完全独立,告警请求无法继承浏览器端的身份认证信息,请求发送到数据源前被身份网关/代理拦截,返回了登录页的HTML内容而非预期的查询JSON结果,expect { or n, but found <中的<就是HTML页面开头的标签标识符。
可参考解决方案
- 调整数据源认证配置:不要选择「使用浏览器端凭证」的访问模式,切换为默认的「服务器端访问」模式,同时在数据源配置页填写对应的认证信息,比如Basic Auth账号密码、Bearer Token,保证后台告警请求可以直接携带认证信息访问数据源。
- 排查数据源前端拦截规则:如果数据源前部署了Nginx、Oauth2代理、统一登录网关这类组件,将Grafana服务器的出口IP加入网关白名单,或者为数据源的API路径配置无需认证即可访问的规则,避免告警请求被拦截到登录页。
- 本地验证排查:登录Grafana所在的服务器,执行curl命令模拟告警查询请求,确认返回内容是否为登录页HTML:
curl '你的数据源地址/api/v1/query?query=sum by (code, app_kubernetes_io_instance)(rate(nginx_server_requests{app_kubernetes_io_instance=~"vue-frontend",code=~"4.."}[1m]))'
如果返回结果确实为HTML页面,即可确认是认证拦截问题,针对性调整网关规则即可。
- 版本升级:升级Grafana到7.0及以上版本,官方在7.x版本重构了告警模块,统一了前后端的数据源请求逻辑,从底层解决了告警请求认证不匹配的问题。
内容的提问来源于stack exchange,提问作者Stefan Mihail Cociobea
相关产品推荐
相关产品推荐

