使用awscurl Python模块调用Prometheus API添加过滤器失败排查
解决方案
问题出在URL编码上。当你在PromQL里添加statuscode="200"后,查询字符串里的{、}、=、"属于URL特殊字符,未编码会被服务端判定为无效的查询参数格式,触发InvalidQueryStringException。
你需要对完整的PromQL查询语句进行URL编码,再拼接到uri中,具体有两种实现方式:
手动编码查询字符串:
将query=http_request_total{statuscode="200"}替换为编码后的query=http_request_total%7Bstatuscode%3D%22200%22%7D,直接更新uri中的对应部分。使用Python内置工具自动编码:
借助urllib.parse.quote方法对原始PromQL查询编码,避免手动编码出错,修改后的代码示例如下:
import awscurl.awscurl as aws from urllib.parse import quote # 构造原始带过滤器的PromQL查询 promql_query = 'http_request_total{statuscode="200"}' # 对查询语句进行URL编码 encoded_query = quote(promql_query) # 拼接完整的请求uri uri = f'https://<SERVICE>-workspaces.<REGION>.amazonaws.com/workspaces/<WORKSPACE_ID>/api/v1/query_range?query={encoded_query}&start=1710720000.0&end=1710806400.0&step=1h' headers = { 'Content-Type': 'application/json', } awscurl_auth_params = { 'method': 'GET', 'service': <SERVICE>, 'region': <REGION>, 'uri': uri, 'headers': headers, 'data': '', 'access_key': <ACCES_KEY>, 'secret_key': <SECRET_KEY>, 'security_token': None, 'data_binary': False} r = aws.make_request(**awscurl_auth_params)
awscurl完全支持带过滤器的PromQL查询,只要保证URL格式合法(特殊字符正确编码)即可,处理后服务端就能正常解析你的查询请求。
内容的提问来源于stack exchange,提问作者true_vices
相关产品推荐
相关产品推荐

