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]