Prometheus curl请求与Chrome返回结果不一致问题排查
已配置Prometheus采集任务,prometheus.yml配置如下:
global: scrape_interval: 1s evaluation_interval: 1s rule_files: # - "first.rules" # - "second.rules" scrape_configs: - job_name: test_11000 static_configs: - targets: ['0.0.0.0:11000'] - job_name: prometheus static_configs: - targets: ['localhost:9090']
调用接口http://localhost:9090/api/v1/label/job/values时:
- 在Google Chrome中得到正确结果:
{"status":"success","data":["linera_test_11000","prometheus"]}
- 使用curl命令行查询(Firefox也得到相同错误结果)仅返回:
{"status":"success","data":["prometheus"]}
即使从Chrome开发者工具复制完整curl命令执行,问题仍未解决,请问该差异的原因是什么?
实例或缓存不一致
Chrome可能缓存了旧的API响应,或者你访问的Prometheus实例和curl/Firefox不是同一个——比如之前启动过带linera_test_11000配置的实例没关闭,又启动了新的实例,Chrome连接的是旧实例,而curl默认连的是新实例;或者Chrome的浏览器缓存没清除,显示的是历史数据。目标服务状态影响
test_11000对应的目标0.0.0.0:11000可能在curl/Firefox访问时处于不可达状态,Prometheus长期采集不到该目标的数据,就会过滤掉这个job的标签。而Chrome访问时该服务是正常运行的,所以能返回对应的job标签。Prometheus的label值只会返回有有效采集数据的目标对应的标签,无数据的目标标签会被排除。请求头或会话差异
虽然复制了Chrome的curl命令,但可能存在隐式的请求头差异——比如Prometheus配置了认证,Chrome中保存了有效的Cookie或认证信息,而curl命令没有完整带上这些内容,导致返回的是受限数据。可以用curl -v查看请求详情,对比Chrome开发者工具里的请求头,确认是否完全一致。配置未生效
修改prometheus.yml后如果没有重启Prometheus服务,新配置不会生效。但如果Chrome显示的是旧配置结果,可能是浏览器缓存了之前的响应,而curl访问的是未更新配置的实例。
内容的提问来源于stack exchange,提问作者Mathieu Dutour Sikiric

