This is an automated email from the ASF dual-hosted git repository.

gortiz 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 4c14b4589b0 Add metrics for serialized query response size in 
QueryScheduler (#17710)
4c14b4589b0 is described below

commit 4c14b4589b09bbe3cc8e560be3bbc15a93f42d1c
Author: Gonzalo Ortiz Jaureguizar <[email protected]>
AuthorDate: Wed Feb 18 11:44:54 2026 +0100

    Add metrics for serialized query response size in QueryScheduler (#17710)
    
    * Add metrics for serialized query response size in QueryScheduler
    
    * Refactor response size check in QueryScheduler to ensure max size 
validation occurs after response size calculation
    
    * Apply suggestions from code review
    
    Co-authored-by: Copilot <[email protected]>
    
    ---------
    
    Co-authored-by: Copilot <[email protected]>
---
 .../apache/pinot/common/metrics/ServerMeter.java   |  7 +++++
 .../pinot/core/query/scheduler/QueryScheduler.java | 32 ++++++++++++----------
 2 files changed, 25 insertions(+), 14 deletions(-)

diff --git 
a/pinot-common/src/main/java/org/apache/pinot/common/metrics/ServerMeter.java 
b/pinot-common/src/main/java/org/apache/pinot/common/metrics/ServerMeter.java
index 41ee737381f..03d77408b74 100644
--- 
a/pinot-common/src/main/java/org/apache/pinot/common/metrics/ServerMeter.java
+++ 
b/pinot-common/src/main/java/org/apache/pinot/common/metrics/ServerMeter.java
@@ -140,6 +140,13 @@ public enum ServerMeter implements AbstractMetrics.Meter {
   RESPONSE_SER_MEM_ALLOCATED_BYTES("bytes", false),
   TOTAL_MEM_ALLOCATED_BYTES("bytes", false),
   LARGE_QUERY_RESPONSE_SIZE_EXCEPTIONS("exceptions", false),
+  /**
+   * Size of the initially serialized query response in bytes.
+   * Note: This may differ from the final response actually sent to the broker 
if the response
+   * is later replaced (for example, when exceeding the configured max 
response size).
+   */
+  QUERY_RESPONSE_SIZE("bytes", false,
+      "Size of the initially serialized query response in bytes (may differ 
from final response sent to broker)"),
 
   GRPC_MEMORY_REJECTIONS("rejections", true, "Number of grpc requests rejected 
due to memory pressure"),
 
diff --git 
a/pinot-core/src/main/java/org/apache/pinot/core/query/scheduler/QueryScheduler.java
 
b/pinot-core/src/main/java/org/apache/pinot/core/query/scheduler/QueryScheduler.java
index 96a8da5a9ec..9d488f7ee0f 100644
--- 
a/pinot-core/src/main/java/org/apache/pinot/core/query/scheduler/QueryScheduler.java
+++ 
b/pinot-core/src/main/java/org/apache/pinot/core/query/scheduler/QueryScheduler.java
@@ -162,21 +162,25 @@ public abstract class QueryScheduler {
 
       // TODO: Perform this check sooner during the serialization of DataTable.
       Map<String, String> queryOptions = 
queryRequest.getQueryContext().getQueryOptions();
-      Long maxResponseSizeBytes = 
QueryOptionsUtils.getMaxServerResponseSizeBytes(queryOptions);
-      if (maxResponseSizeBytes != null && responseBytes != null && 
responseBytes.length > maxResponseSizeBytes) {
-        String errMsg =
-            "Serialized query response size " + responseBytes.length + " 
exceeds threshold " + maxResponseSizeBytes
-                + " for requestId " + requestId + " from broker " + 
queryRequest.getBrokerId();
-        LOGGER.error(errMsg);
-        
_serverMetrics.addMeteredTableValue(queryRequest.getTableNameWithType(),
-            ServerMeter.LARGE_QUERY_RESPONSE_SIZE_EXCEPTIONS, 1);
+      if (responseBytes != null) {
+        int responseSizeBytes = responseBytes.length;
+        String tableNameWithType = queryRequest.getTableNameWithType();
+        _serverMetrics.addMeteredTableValue(tableNameWithType, 
ServerMeter.QUERY_RESPONSE_SIZE, responseSizeBytes);
+        Long maxResponseSizeBytes = 
QueryOptionsUtils.getMaxServerResponseSizeBytes(queryOptions);
+        if (maxResponseSizeBytes != null && responseSizeBytes > 
maxResponseSizeBytes) {
+          String errMsg =
+              "Serialized query response size " + responseSizeBytes + " 
exceeds threshold " + maxResponseSizeBytes
+                  + " for requestId " + requestId + " from broker " + 
queryRequest.getBrokerId();
+          LOGGER.error(errMsg);
+          _serverMetrics.addMeteredTableValue(tableNameWithType, 
ServerMeter.LARGE_QUERY_RESPONSE_SIZE_EXCEPTIONS, 1);
 
-        instanceResponse = new InstanceResponseBlock();
-        instanceResponse.addException(QueryErrorCode.QUERY_CANCELLATION, 
errMsg);
-        instanceResponse.addMetadata(MetadataKey.REQUEST_ID.getName(), 
Long.toString(requestId));
-        instanceResponse.addMetadata(MetadataKey.QUERY_ID.getName(), queryId);
-        instanceResponse.addMetadata(MetadataKey.WORKLOAD_NAME.getName(), 
workloadName);
-        responseBytes = serializeResponse(queryRequest, instanceResponse);
+          instanceResponse = new InstanceResponseBlock();
+          instanceResponse.addException(QueryErrorCode.QUERY_CANCELLATION, 
errMsg);
+          instanceResponse.addMetadata(MetadataKey.REQUEST_ID.getName(), 
Long.toString(requestId));
+          instanceResponse.addMetadata(MetadataKey.QUERY_ID.getName(), 
queryId);
+          instanceResponse.addMetadata(MetadataKey.WORKLOAD_NAME.getName(), 
workloadName);
+          responseBytes = serializeResponse(queryRequest, instanceResponse);
+        }
       }
 
       return responseBytes;


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to