在 AWS Prometheus 查询中使用 awscurl 添加过滤器的实用指南
2024-03-02 00:43:19
在 AWS Prometheus 查询中使用 awscurl 添加过滤器
背景
Prometheus 是一种广泛采用的开源监控和警报系统,而 Amazon Managed Service for Prometheus (AMP) 是 AWS 提供的托管服务,可简化在 AWS 中运行 Prometheus 的过程。
挑战
使用 awscurl Python 模块从 AMP 端点查询指标数据时,需要添加 PromQL 过滤器来精简结果。然而,许多开发者会遇到 400 状态代码和 'x-amzn-errortype': 'InvalidQueryStringException'
错误。
解决方法
要解决此问题,请遵循以下步骤:
1. 编码查询字符串
使用 urllib.parse.quote()
函数对 PromQL 查询字符串进行 URL 编码。
2. 使用 filter 参数
awscurl 提供 filter
参数,可让你指定 PromQL 过滤器。该参数是一个由逗号分隔的过滤器组成的字符串。
3. 构建查询 URI
将编码后的查询字符串和过滤器添加到查询 URI 中。该 URI 应遵循以下格式:
https://<SERVICE>-workspaces.<REGION>.amazonaws.com/workspaces/<WORKSPACE_ID>/api/v1/query_range?query=<ENCODED_QUERY_STRING>&filter=<FILTER_STRING>&start=<START_TIMESTAMP>&end=<END_TIMESTAMP>&step=<STEP_SIZE>
示例代码
以下 Python 代码演示了如何使用 awscurl 添加过滤器:
import awscurl.awscurl as aws
import urllib.parse
uri = 'https://<SERVICE>-workspaces.<REGION>.amazonaws.com/workspaces/<WORKSPACE_ID>/api/v1/query_range'
...
encoded_query_string = urllib.parse.quote(query_string)
query_uri = f'{uri}?query={encoded_query_string}&filter={filter_string}&start={start_timestamp}&end={end_timestamp}&step={step_size}'
...
r = aws.make_request(**awscurl_auth_params)
提示
- 确保
SERVICE
和REGION
变量包含正确的 AMP 服务和区域。 - 检查
ACCESS_KEY
和SECRET_KEY
变量是否拥有必要的 AWS 访问权限。 - 输出
r.text
以查看详细的错误信息。
结论
通过使用 filter
参数和对查询字符串进行 URL 编码,你可以使用 awscurl Python 模块在 AMP Prometheus 查询中添加过滤器。这将让你能够通过 PromQL 语法过滤指标数据,从而获得更精确的结果。
常见问题解答
1. 为什么在添加过滤器后会出现 400 错误?
确保 PromQL 过滤器语法正确,并且已对查询字符串进行 URL 编码。
2. filter
参数支持哪些类型的过滤器?
filter
参数接受使用逗号分隔的 PromQL 过滤器。
3. 如何确定正确的服务和区域?
服务和区域可以通过 AWS 管理控制台或 AWS CLI 确定。
4. 可以同时使用多个过滤器吗?
是的,可以使用逗号将多个过滤器组合到 filter
参数中。
5. 是否可以在查询 URI 中使用其他参数?
是的,query_range
端点支持其他参数,例如 start
、end
和 step
,用于指定时间范围和数据粒度。