diff --git a/src/servers/src/prom.rs b/src/servers/src/prom.rs index 7b9e59564c..eacdfbf1ee 100644 --- a/src/servers/src/prom.rs +++ b/src/servers/src/prom.rs @@ -351,20 +351,34 @@ impl PromJsonResponse { #[derive(Debug, Default, Serialize, Deserialize, JsonSchema)] pub struct InstantQuery { - query: String, + query: Option, time: Option, timeout: Option, + db: Option, } #[axum_macros::debug_handler] pub async fn instant_query( - State(_handler): State, - Query(_params): Query, + State(handler): State, + Query(params): Query, + Form(form_params): Form, ) -> Json { - PromJsonResponse::error( - "not implemented", - "instant query api `/query` is not implemented. Use `/query_range` instead.", - ) + let time = params.time.or(form_params.time).unwrap_or_default(); + let prom_query = PromQuery { + query: params.query.or(form_params.query).unwrap_or_default(), + start: time.clone(), + end: time, + step: "1s".to_string(), + }; + + let db = ¶ms.db.unwrap_or(DEFAULT_SCHEMA_NAME.to_string()); + let (catalog, schema) = super::parse_catalog_and_schema_from_client_database_name(db); + + let query_ctx = QueryContext::with(catalog, schema); + + let result = handler.do_query(&prom_query, Arc::new(query_ctx)).await; + let metric_name = retrieve_metric_name(&prom_query.query).unwrap_or_default(); + PromJsonResponse::from_query_result(result, metric_name).await } #[derive(Debug, Default, Serialize, Deserialize, JsonSchema)] diff --git a/tests-integration/tests/http.rs b/tests-integration/tests/http.rs index 74e417b1f1..831a9a9b16 100644 --- a/tests-integration/tests/http.rs +++ b/tests-integration/tests/http.rs @@ -290,11 +290,16 @@ pub async fn test_prom_http_api(store_type: StorageType) { let client = TestClient::new(app); // instant query - let res = client.get("/api/v1/query?query=up").send().await; + let res = client.get("/api/v1/query?query=up&time=1").send().await; assert_eq!(res.status(), StatusCode::OK); - let res = client.post("/api/v1/query?query=up").send().await; + let res = client + .post("/api/v1/query?query=up&time=1") + .header("Content-Type", "application/x-www-form-urlencoded") + .send() + .await; assert_eq!(res.status(), StatusCode::OK); + // range query let res = client .get("/api/v1/query_range?query=up&start=1&end=100&step=5") .send()