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 a91d6af17c6 Conditionally Log MSE stats when query finish. (#16007) a91d6af17c6 is described below commit a91d6af17c651f139a4fdcc0e090de3c91eb8b8a Author: Gonzalo Ortiz Jaureguizar <gor...@users.noreply.github.com> AuthorDate: Wed Jun 18 08:52:51 2025 +0200 Conditionally Log MSE stats when query finish. (#16007) --- .../MultiStageBrokerRequestHandler.java | 41 +++++++++++++++++++++- .../apache/pinot/spi/utils/CommonConstants.java | 8 +++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/pinot-broker/src/main/java/org/apache/pinot/broker/requesthandler/MultiStageBrokerRequestHandler.java b/pinot-broker/src/main/java/org/apache/pinot/broker/requesthandler/MultiStageBrokerRequestHandler.java index e1b5f040271..374c9c1e8b9 100644 --- a/pinot-broker/src/main/java/org/apache/pinot/broker/requesthandler/MultiStageBrokerRequestHandler.java +++ b/pinot-broker/src/main/java/org/apache/pinot/broker/requesthandler/MultiStageBrokerRequestHandler.java @@ -20,12 +20,14 @@ package org.apache.pinot.broker.requesthandler; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.concurrent.Callable; @@ -93,6 +95,8 @@ import org.apache.pinot.spi.utils.CommonConstants; import org.apache.pinot.sql.parsers.SqlNodeAndOptions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.slf4j.Marker; +import org.slf4j.MarkerFactory; /** @@ -101,6 +105,19 @@ import org.slf4j.LoggerFactory; */ public class MultiStageBrokerRequestHandler extends BaseBrokerRequestHandler { private static final Logger LOGGER = LoggerFactory.getLogger(MultiStageBrokerRequestHandler.class); + /// Disabled by default, but can be enabled with + ///```xml + /// <MarkerFilter marker="MSE_STATS_MARKER" onMatch="ACCEPT" onMismatch="NEUTRAL"/> + /// ... + /// <Loggers> + /// <Logger name="org.apache.pinot" level="debug" additivity="false"> + /// <AppenderRef ref="console"> + /// <MarkerFilter marker="MSE_STATS_MARKER"/> + /// </AppenderRef> + /// </Logger> + /// </Loggers> + /// ``` + private static final Marker MSE_STATS_MARKER = MarkerFactory.getMarker("MSE_STATS_MARKER"); private static final int NUM_UNAVAILABLE_SEGMENTS_TO_LOG = 10; @@ -170,9 +187,9 @@ public class MultiStageBrokerRequestHandler extends BaseBrokerRequestHandler { requestContext, httpHeaders); if (!brokerResponse.getExceptions().isEmpty()) { // a _green_ error (see handleRequestThrowing javadoc) - LOGGER.info("Request {} failed in a controlled manner: {}", requestId, brokerResponse.getExceptions()); onFailedRequest(brokerResponse.getExceptions()); } + summarizeQuery(brokerResponse, explicitSummarizeLogRequested(sqlNodeAndOptions)); return brokerResponse; } catch (WebApplicationException e) { // a _yellow_ error (see handleRequestThrowing javadoc) @@ -200,6 +217,28 @@ public class MultiStageBrokerRequestHandler extends BaseBrokerRequestHandler { } } + private static boolean explicitSummarizeLogRequested(SqlNodeAndOptions sqlNodeAndOptions) { + return Boolean.parseBoolean( + sqlNodeAndOptions.getOptions() + .getOrDefault(CommonConstants.MultiStageQueryRunner.KEY_OF_LOG_STATS, "false") + .toLowerCase(Locale.US)); + } + + private void summarizeQuery(BrokerResponse brokerResponse, boolean explicitSummarizeLogRequested) { + ObjectNode stats = brokerResponse instanceof BrokerResponseNativeV2 + ? ((BrokerResponseNativeV2) brokerResponse).getStageStats() + : JsonNodeFactory.instance.objectNode(); + String completionStatus = brokerResponse.getExceptions().isEmpty() + ? "successfully" + : "with errors " + brokerResponse.getExceptions(); + String logTemplate = "Request finished {} in {}ms. Stats: {}"; + if (brokerResponse.getExceptions().isEmpty() && !explicitSummarizeLogRequested) { + LOGGER.debug(MSE_STATS_MARKER, logTemplate, completionStatus, brokerResponse.getTimeUsedMs(), stats); + } else { + LOGGER.info(MSE_STATS_MARKER, logTemplate, completionStatus, brokerResponse.getTimeUsedMs(), stats); + } + } + private void onFailedRequest(List<QueryProcessingException> exs) { _brokerMetrics.addMeteredGlobalValue(BrokerMeter.BROKER_RESPONSES_WITH_PROCESSING_EXCEPTIONS, 1); diff --git a/pinot-spi/src/main/java/org/apache/pinot/spi/utils/CommonConstants.java b/pinot-spi/src/main/java/org/apache/pinot/spi/utils/CommonConstants.java index 962179f999b..4c3c4876df6 100644 --- a/pinot-spi/src/main/java/org/apache/pinot/spi/utils/CommonConstants.java +++ b/pinot-spi/src/main/java/org/apache/pinot/spi/utils/CommonConstants.java @@ -1661,6 +1661,14 @@ public class CommonConstants { public static final String KEY_OF_SEND_STATS_MODE = "pinot.query.mse.stats.mode"; public static final String DEFAULT_SEND_STATS_MODE = "SAFE"; + /// Used to indicate that MSE stats should be logged at INFO level for successful queries. + /// + /// When an MSE query is executed, the stats are collected and logged. + /// By default, successful queries are logged in the DEBUG level, while errors are logged in the INFO level. + /// But if this property is set to true (upper or lower case), stats will be logged in the INFO level for both + /// successful queries and errors. + public static final String KEY_OF_LOG_STATS = "logStats"; + public enum JoinOverFlowMode { THROW, BREAK } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org For additional commands, e-mail: commits-h...@pinot.apache.org