Setting
I am trying to query an Amazon Managed Service for Prometheus endpoint to extract some metrics data via a python script. I am using the make_request method from the awscurl module in the following way (cleary this is an example snippet):
import awscurl.awscurl as aws
uri = 'https://<SERVICE>-workspaces.<REGION>.amazonaws.com/workspaces/<WORKSPACE_ID>/api/v1/query_range?query=http_request_total&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)
In this way, I am able to successfully connect to the endpoint and download the data related to the query query=http_request_total&start=1710720000.0&end=1710806400.0&step=1h.
Problem
However, as soon as I try to add a filter (as statuscode="200") in the query using the PromQL syntax (e.g. query=http_request_total{statuscode="200"}&start=1710720000.0&end=1710806400.0&step=1h), the same script as above, returns a tedious 400 status code and an annoying 'x-amzn-errortype': 'InvalidQueryStringException' error.
Question
What am I doing wrong? Is it possible to add filters to prometheus queries through awscurl python library?
Thanks in advance.
For Prometheus, the query string must be URL encoded, see Prometheus HTTP API.
The User Guide for Amazon Managed Service for Prometheus explains how to use
awscurlto query Prometheus-compatible APIs.Instead of
GET'ing which requires that the query string values already be URL-encoded; this explains why your example doesn't work, because the query string value should be:The Amazon example,
POSTs the data using the headerContent-Type: application/x-www-form-urlencodedwhich performs the URL-encoding for you.