Prometheus使用OAuth2采集时出现Unresolved variable: request.header.Authorization错误
问题排查步骤
- 第一步:确认Prometheus版本,OAuth2采集功能最低要求Prometheus v2.41.0及以上版本,低于该版本的实现存在参数缺失或者功能不完善的问题,先升级到最新稳定版再排查。
- 第二步:手动验证token接口兼容性
首先用curl模拟两种客户端凭证提交方式,确认你的token服务支持的认证方式:- 头认证方式(Prometheus默认行为):
curl -u CLIENT_ID:CLIENT_SECRET -d "grant_type=client_credentials" https://token-foo-generator.com/oauth/v1/token- 请求体认证方式:
如果第二种请求能正常返回token,说明你的token服务要求客户端凭证放在请求体中,需要在oauth2配置块新增curl -d "client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=client_credentials" https://token-foo-generator.com/oauth/v1/tokenclient_secret_post: true参数。 - 第三步:核对路径配置一致性
你当前配置的metrics_path为/target.foo.bar/metrics,但报错信息中实际请求的指标路径为/my-service/metrics,如果没有配置重写路径的relabel规则,需要将metrics_path修正为实际的指标端点路径。 - 第四步:排查代理拦截问题
如果Prometheus配置了HTTP/HTTPS代理,很多代理默认会过滤掉请求中的Authorization头避免敏感信息泄漏,需要在代理规则中放行token服务域名的Authorization头传递。 - 第五步:开启Debug日志验证请求内容
启动Prometheus时增加--log.level=debug参数,查看请求token接口的完整请求头和请求体,确认Authorization头是否正常发送。
参考修正配置
如果确认是token服务要求凭证放在请求体中,配置调整如下:
scrape_configs: - job_name: my-service metrics_path: /my-service/metrics oauth2: client_id: 'CLIENT_ID' client_secret: 'CLIENT_SECRET' token_url: 'https://token-foo-generator.com/oauth/v1/token' client_secret_post: true endpoint_params: grant_type: 'client_credentials' static_configs: - targets: - target.foo.bar.net:80
内容的提问来源于stack exchange,提问作者Levi Rosal
相关产品推荐
相关产品推荐

