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]

Reply via email to