This is an automated email from the ASF dual-hosted git repository.
ankitsultana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pinot.git
The following commit(s) were added to refs/heads/master by this push:
new 4cd3296060b [timeseries][bugfix] Fixed timeseries API clashes in
Controller (#16487)
4cd3296060b is described below
commit 4cd3296060bb3cbc2131a8c72d89934506ed9b26
Author: Shaurya Chaturvedi <[email protected]>
AuthorDate: Sat Aug 2 09:36:44 2025 -0700
[timeseries][bugfix] Fixed timeseries API clashes in Controller (#16487)
Co-authored-by: Shaurya Chaturvedi <[email protected]>
---
.../PinotControllerTimeseriesResource.java | 4 +--
.../api/resources/PinotQueryResource.java | 2 +-
.../pinot/integration/tests/ClusterTest.java | 11 +++++++-
.../tests/TimeSeriesAuthIntegrationTest.java | 1 +
.../tests/TimeSeriesIntegrationTest.java | 29 ++++++++++++++++++++++
5 files changed, 43 insertions(+), 4 deletions(-)
diff --git
a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotControllerTimeseriesResource.java
b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotControllerTimeseriesResource.java
index 74c159c1733..2e2643f4ed2 100644
---
a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotControllerTimeseriesResource.java
+++
b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotControllerTimeseriesResource.java
@@ -33,7 +33,7 @@ import
org.apache.pinot.controller.api.exception.ControllerApplicationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-@Path("/timeseries")
+@Path("/")
public class PinotControllerTimeseriesResource {
public static final Logger LOGGER =
LoggerFactory.getLogger(PinotControllerTimeseriesResource.class);
@@ -42,7 +42,7 @@ public class PinotControllerTimeseriesResource {
@GET
@Produces(MediaType.APPLICATION_JSON)
- @Path("languages")
+ @Path("/timeseries/languages")
@ApiOperation(value = "Get timeseries languages from controller
configuration",
notes = "Get timeseries languages from controller configuration")
public List<String> getBrokerTimeSeriesLanguages(@Context HttpHeaders
headers) {
diff --git
a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotQueryResource.java
b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotQueryResource.java
index 6676016c13a..1e4d4f18863 100644
---
a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotQueryResource.java
+++
b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotQueryResource.java
@@ -136,7 +136,7 @@ public class PinotQueryResource {
}
@GET
- @Path("timeseries/api/v1/query_range")
+ @Path("/timeseries/api/v1/query_range")
@ManualAuthorization
@ApiOperation(value = "Prometheus Compatible API for Pinot's Time Series
Engine")
public StreamingOutput handleTimeSeriesQueryRange(@QueryParam("language")
String language,
diff --git
a/pinot-integration-test-base/src/test/java/org/apache/pinot/integration/tests/ClusterTest.java
b/pinot-integration-test-base/src/test/java/org/apache/pinot/integration/tests/ClusterTest.java
index a54011fc32c..517f3bb8e54 100644
---
a/pinot-integration-test-base/src/test/java/org/apache/pinot/integration/tests/ClusterTest.java
+++
b/pinot-integration-test-base/src/test/java/org/apache/pinot/integration/tests/ClusterTest.java
@@ -560,10 +560,19 @@ public abstract class ClusterTest extends ControllerTest {
* This is used for testing timeseries queries.
*/
public JsonNode getTimeseriesQuery(String query, long startTime, long
endTime, Map<String, String> headers) {
+ return getTimeseriesQuery(getBrokerBaseApiUrl(), query, startTime,
endTime, headers);
+ }
+
+ /**
+ * Queries the timeseries query endpoint (/timeseries/api/v1/query_range) of
the given base URL.
+ * This is used for testing timeseries queries.
+ */
+ public JsonNode getTimeseriesQuery(String baseUrl, String query, long
startTime, long endTime,
+ Map<String, String> headers) {
try {
Map<String, String> queryParams = Map.of("language", "m3ql", "query",
query, "start",
String.valueOf(startTime), "end", String.valueOf(endTime));
- String url =
buildQueryUrl(getTimeSeriesQueryApiUrl(getBrokerBaseApiUrl()), queryParams);
+ String url = buildQueryUrl(getTimeSeriesQueryApiUrl(baseUrl),
queryParams);
JsonNode responseJsonNode =
JsonUtils.stringToJsonNode(sendGetRequest(url, headers));
return sanitizeResponse(responseJsonNode);
} catch (Exception e) {
diff --git
a/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/TimeSeriesAuthIntegrationTest.java
b/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/TimeSeriesAuthIntegrationTest.java
index 057317bc200..41fa6e7ea18 100644
---
a/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/TimeSeriesAuthIntegrationTest.java
+++
b/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/TimeSeriesAuthIntegrationTest.java
@@ -49,6 +49,7 @@ public class TimeSeriesAuthIntegrationTest extends
TimeSeriesIntegrationTest {
@Override
protected void overrideControllerConf(Map<String, Object> properties) {
+ super.overrideControllerConf(properties);
BasicAuthTestUtils.addControllerConfiguration(properties);
}
diff --git
a/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/TimeSeriesIntegrationTest.java
b/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/TimeSeriesIntegrationTest.java
index ac4f69f3d82..d7490418e16 100644
---
a/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/TimeSeriesIntegrationTest.java
+++
b/pinot-integration-tests/src/test/java/org/apache/pinot/integration/tests/TimeSeriesIntegrationTest.java
@@ -178,6 +178,26 @@ public class TimeSeriesIntegrationTest extends
BaseClusterIntegrationTest {
assertEquals(series.size(), 0);
}
+ @Test
+ public void testControllerTimeseriesEndpoints()
+ throws Exception {
+ // Call /timeseries/api/v1/query_range.
+ String query = String.format(
+
"fetch{table=\"mytable_OFFLINE\",filter=\"\",ts_column=\"%s\",ts_unit=\"MILLISECONDS\",value=\"%s\"}"
+ + " | max{%s} | transformNull{0} | keepLastValue{}",
+ TS_COLUMN, TOTAL_TRIPS_COLUMN, DEVICE_OS_COLUMN
+ );
+ JsonNode result = getTimeseriesQuery(getControllerBaseApiUrl(), query,
QUERY_START_TIME_SEC, QUERY_END_TIME_SEC,
+ getHeaders());
+ assertEquals(result.get("status").asText(), "success");
+
+ // Call /timeseries/languages.
+ var statusCodeAndResponse = sendGetRequestWithStatusCode(
+ getControllerBaseApiUrl() + "/timeseries/languages", getHeaders());
+ assertEquals(statusCodeAndResponse.getLeft(), 200);
+ assertEquals(statusCodeAndResponse.getRight(), "[\"m3ql\"]");
+ }
+
protected Map<String, String> getHeaders() {
return Collections.emptyMap();
}
@@ -199,6 +219,15 @@ public class TimeSeriesIntegrationTest extends
BaseClusterIntegrationTest {
}
}
+ @Override
+ protected void overrideControllerConf(Map<String, Object> properties) {
+
properties.put(PinotTimeSeriesConfiguration.getEnabledLanguagesConfigKey(),
"m3ql");
+
properties.put(PinotTimeSeriesConfiguration.getLogicalPlannerConfigKey("m3ql"),
+ "org.apache.pinot.tsdb.m3ql.M3TimeSeriesPlanner");
+
properties.put(PinotTimeSeriesConfiguration.getSeriesBuilderFactoryConfigKey("m3ql"),
+ SimpleTimeSeriesBuilderFactory.class.getName());
+ }
+
@Override
protected void overrideBrokerConf(PinotConfiguration brokerConf) {
addTimeSeriesConfigurations(brokerConf);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]