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

jackietien pushed a commit to branch dev/1.3
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/dev/1.3 by this push:
     new 6c75b299f6a [To dev/1.3] Sampling queries in each DN
6c75b299f6a is described below

commit 6c75b299f6a0eabb9ed09bf2bb9f9eb4bb1af029
Author: Jackie Tien <[email protected]>
AuthorDate: Fri Dec 13 11:25:20 2024 +0800

    [To dev/1.3] Sampling queries in each DN
---
 .../assembly/resources/conf/logback-datanode.xml   | 18 +++++++++
 .../org/apache/iotdb/db/conf/IoTDBDescriptor.java  | 22 +++++++++++
 .../protocol/writeback/WriteBackConnector.java     |  3 +-
 .../legacy/IoTDBLegacyPipeReceiverAgent.java       |  3 +-
 .../protocol/legacy/loader/DeletionLoader.java     |  3 +-
 .../protocol/legacy/loader/TsFileLoader.java       |  3 +-
 .../protocol/thrift/IoTDBDataNodeReceiver.java     |  3 +-
 .../iotdb/db/protocol/mqtt/MPPPublishHandler.java  |  3 +-
 .../rest/v1/impl/GrafanaApiServiceImpl.java        |  9 +++--
 .../protocol/rest/v1/impl/RestApiServiceImpl.java  |  9 +++--
 .../rest/v2/impl/GrafanaApiServiceImpl.java        |  9 +++--
 .../protocol/rest/v2/impl/RestApiServiceImpl.java  | 12 ++++--
 .../protocol/thrift/impl/ClientRPCServiceImpl.java | 45 ++++++++++++++++++----
 .../impl/DataNodeInternalRPCServiceImpl.java       |  3 +-
 .../db/queryengine/common/MPPQueryContext.java     | 10 +++++
 .../iotdb/db/queryengine/plan/Coordinator.java     | 30 +++++++++++++--
 .../plan/analyze/LoadTsFileAnalyzer.java           |  3 +-
 .../analyze/schema/AutoCreateSchemaExecutor.java   |  3 +-
 .../analyze/schema/ClusterSchemaFetchExecutor.java |  3 +-
 .../plan/execution/IQueryExecution.java            |  2 +
 .../queryengine/plan/execution/QueryExecution.java |  5 +++
 .../plan/execution/config/ConfigExecution.java     |  5 +++
 .../config/executor/ClusterConfigTaskExecutor.java |  3 +-
 .../load/active/ActiveLoadTsFileLoader.java        |  3 +-
 .../org/apache/iotdb/db/utils/CommonUtils.java     | 13 +++++--
 .../execution/operator/MergeSortOperatorTest.java  |  5 +++
 .../conf/iotdb-system.properties.template          |  7 ++++
 .../apache/iotdb/commons/conf/CommonConfig.java    | 39 +++++++++++++++++++
 .../apache/iotdb/commons/conf/IoTDBConstant.java   |  2 +
 29 files changed, 239 insertions(+), 39 deletions(-)

diff --git 
a/iotdb-core/datanode/src/assembly/resources/conf/logback-datanode.xml 
b/iotdb-core/datanode/src/assembly/resources/conf/logback-datanode.xml
index 698bdfc3a82..8902599cf8f 100644
--- a/iotdb-core/datanode/src/assembly/resources/conf/logback-datanode.xml
+++ b/iotdb-core/datanode/src/assembly/resources/conf/logback-datanode.xml
@@ -177,6 +177,21 @@
             <level>INFO</level>
         </filter>
     </appender>
+    <appender class="ch.qos.logback.core.rolling.RollingFileAppender" 
name="SAMPLED_QUERIES">
+        <file>${IOTDB_HOME}/logs/log_datanode_sampled_queries.log</file>
+        <rollingPolicy 
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            
<fileNamePattern>${IOTDB_HOME}/logs/log-datanode-sampled-queries-%d{yyyyMMdd}.log.gz</fileNamePattern>
+            <maxHistory>30</maxHistory>
+        </rollingPolicy>
+        <append>true</append>
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%d %m %n</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>INFO</level>
+        </filter>
+    </appender>
     <appender class="ch.qos.logback.core.rolling.RollingFileAppender" 
name="COMPACTION">
         <file>${IOTDB_HOME}/logs/log_datanode_compaction.log</file>
         <rollingPolicy 
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
@@ -245,6 +260,9 @@
     <logger level="info" name="SLOW_SQL">
         <appender-ref ref="SLOW_SQL"/>
     </logger>
+    <logger level="info" name="SAMPLED_QUERIES">
+        <appender-ref ref="SAMPLED_QUERIES"/>
+    </logger>
     <logger level="info" name="QUERY_FREQUENCY">
         <appender-ref ref="QUERY_FREQUENCY"/>
     </logger>
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
index 0052cc82140..930c005fc82 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
@@ -2005,6 +2005,28 @@ public class IoTDBDescriptor {
         BinaryAllocator.getInstance().close(true);
       }
 
+      // update query_sample_throughput_bytes_per_sec
+      String querySamplingRateLimitNumber =
+          Optional.ofNullable(
+                  properties.getProperty(
+                      "query_sample_throughput_bytes_per_sec",
+                      ConfigurationFileUtils.getConfigurationDefaultValue(
+                          "query_sample_throughput_bytes_per_sec")))
+              .map(String::trim)
+              .orElse(
+                  ConfigurationFileUtils.getConfigurationDefaultValue(
+                      "query_sample_throughput_bytes_per_sec"));
+      if (querySamplingRateLimitNumber != null) {
+        try {
+          int rateLimit = Integer.parseInt(querySamplingRateLimitNumber);
+          commonDescriptor.getConfig().setQuerySamplingRateLimit(rateLimit);
+        } catch (Exception e) {
+          LOGGER.warn(
+              "Failed to parse query_sample_throughput_bytes_per_sec {} to 
integer",
+              querySamplingRateLimitNumber);
+        }
+      }
+
       // update trusted_uri_pattern
       String trustedUriPattern =
           Optional.ofNullable(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/writeback/WriteBackConnector.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/writeback/WriteBackConnector.java
index 7889b778d86..7d28f8609ad 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/writeback/WriteBackConnector.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/protocol/writeback/WriteBackConnector.java
@@ -193,7 +193,8 @@ public class WriteBackConnector implements PipeConnector {
             "",
             ClusterPartitionFetcher.getInstance(),
             ClusterSchemaFetcher.getInstance(),
-            
IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold())
+            
IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold(),
+            false)
         .status;
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/IoTDBLegacyPipeReceiverAgent.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/IoTDBLegacyPipeReceiverAgent.java
index 3fb132523d8..a67d3e55815 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/IoTDBLegacyPipeReceiverAgent.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/IoTDBLegacyPipeReceiverAgent.java
@@ -143,7 +143,8 @@ public class IoTDBLegacyPipeReceiverAgent {
                   "",
                   partitionFetcher,
                   schemaFetcher,
-                  
IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold());
+                  
IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold(),
+                  false);
       if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()
           && result.status.code != 
TSStatusCode.DATABASE_ALREADY_EXISTS.getStatusCode()) {
         LOGGER.error(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/loader/DeletionLoader.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/loader/DeletionLoader.java
index 19dc268acec..24a69403457 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/loader/DeletionLoader.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/loader/DeletionLoader.java
@@ -68,7 +68,8 @@ public class DeletionLoader implements ILoader {
                   "",
                   PARTITION_FETCHER,
                   SCHEMA_FETCHER,
-                  
IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold());
+                  
IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold(),
+                  false);
       if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
         LOGGER.error("Delete {} error, statement: {}.", deletion, statement);
         LOGGER.error("Delete result status : {}.", result.status);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/loader/TsFileLoader.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/loader/TsFileLoader.java
index 9b9e0705f21..0e0612ce2ca 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/loader/TsFileLoader.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/loader/TsFileLoader.java
@@ -70,7 +70,8 @@ public class TsFileLoader implements ILoader {
                   "",
                   PARTITION_FETCHER,
                   SCHEMA_FETCHER,
-                  
IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold());
+                  
IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold(),
+                  false);
       if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
         LOGGER.error("Load TsFile {} error, statement: {}.", tsFile.getPath(), 
statement);
         LOGGER.error("Load TsFile result status : {}.", result.status);
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiver.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiver.java
index b6fea173df2..2734a808eb5 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiver.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiver.java
@@ -679,7 +679,8 @@ public class IoTDBDataNodeReceiver extends 
IoTDBFileReceiver {
             "",
             ClusterPartitionFetcher.getInstance(),
             ClusterSchemaFetcher.getInstance(),
-            
IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold())
+            
IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold(),
+            false)
         .status;
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/MPPPublishHandler.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/MPPPublishHandler.java
index 3fc50278ff7..772f3672a14 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/MPPPublishHandler.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/mqtt/MPPPublishHandler.java
@@ -169,7 +169,8 @@ public class MPPPublishHandler extends 
AbstractInterceptHandler {
                         "",
                         partitionFetcher,
                         schemaFetcher,
-                        config.getQueryTimeoutThreshold());
+                        config.getQueryTimeoutThreshold(),
+                        false);
             tsStatus = result.status;
           }
         } catch (Exception e) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v1/impl/GrafanaApiServiceImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v1/impl/GrafanaApiServiceImpl.java
index 07c735faa7f..bd955fd00da 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v1/impl/GrafanaApiServiceImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v1/impl/GrafanaApiServiceImpl.java
@@ -117,7 +117,8 @@ public class GrafanaApiServiceImpl extends 
GrafanaApiService {
               sql.getSql(),
               partitionFetcher,
               schemaFetcher,
-              config.getQueryTimeoutThreshold());
+              config.getQueryTimeoutThreshold(),
+              true);
       if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()
           && result.status.code != 
TSStatusCode.REDIRECTION_RECOMMEND.getStatusCode()) {
         return Response.ok()
@@ -184,7 +185,8 @@ public class GrafanaApiServiceImpl extends 
GrafanaApiService {
               sql,
               partitionFetcher,
               schemaFetcher,
-              config.getQueryTimeoutThreshold());
+              config.getQueryTimeoutThreshold(),
+              true);
       if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()
           && result.status.code != 
TSStatusCode.REDIRECTION_RECOMMEND.getStatusCode()) {
         return Response.ok()
@@ -246,7 +248,8 @@ public class GrafanaApiServiceImpl extends 
GrafanaApiService {
                 sql,
                 partitionFetcher,
                 schemaFetcher,
-                config.getQueryTimeoutThreshold());
+                config.getQueryTimeoutThreshold(),
+                true);
         if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()
             && result.status.code != 
TSStatusCode.REDIRECTION_RECOMMEND.getStatusCode()) {
           return Response.ok()
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v1/impl/RestApiServiceImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v1/impl/RestApiServiceImpl.java
index 638ea109c9f..084b7cc53e9 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v1/impl/RestApiServiceImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v1/impl/RestApiServiceImpl.java
@@ -115,7 +115,8 @@ public class RestApiServiceImpl extends RestApiService {
               sql.getSql(),
               partitionFetcher,
               schemaFetcher,
-              config.getQueryTimeoutThreshold());
+              config.getQueryTimeoutThreshold(),
+              false);
       finish = true;
       return Response.ok()
           .entity(
@@ -190,7 +191,8 @@ public class RestApiServiceImpl extends RestApiService {
               sql.getSql(),
               partitionFetcher,
               schemaFetcher,
-              config.getQueryTimeoutThreshold());
+              config.getQueryTimeoutThreshold(),
+              true);
       finish = true;
       if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()
           && result.status.code != 
TSStatusCode.REDIRECTION_RECOMMEND.getStatusCode()) {
@@ -266,7 +268,8 @@ public class RestApiServiceImpl extends RestApiService {
               "",
               partitionFetcher,
               schemaFetcher,
-              config.getQueryTimeoutThreshold());
+              config.getQueryTimeoutThreshold(),
+              false);
 
       return Response.ok()
           .entity(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v2/impl/GrafanaApiServiceImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v2/impl/GrafanaApiServiceImpl.java
index e3385885a01..6a5ae13a0cb 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v2/impl/GrafanaApiServiceImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v2/impl/GrafanaApiServiceImpl.java
@@ -117,7 +117,8 @@ public class GrafanaApiServiceImpl extends 
GrafanaApiService {
               sql.getSql(),
               partitionFetcher,
               schemaFetcher,
-              config.getQueryTimeoutThreshold());
+              config.getQueryTimeoutThreshold(),
+              true);
       if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()
           && result.status.code != 
TSStatusCode.REDIRECTION_RECOMMEND.getStatusCode()) {
         return Response.ok()
@@ -184,7 +185,8 @@ public class GrafanaApiServiceImpl extends 
GrafanaApiService {
               sql,
               partitionFetcher,
               schemaFetcher,
-              config.getQueryTimeoutThreshold());
+              config.getQueryTimeoutThreshold(),
+              true);
       if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()
           && result.status.code != 
TSStatusCode.REDIRECTION_RECOMMEND.getStatusCode()) {
         return Response.ok()
@@ -246,7 +248,8 @@ public class GrafanaApiServiceImpl extends 
GrafanaApiService {
                 sql,
                 partitionFetcher,
                 schemaFetcher,
-                config.getQueryTimeoutThreshold());
+                config.getQueryTimeoutThreshold(),
+                true);
         if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()
             && result.status.code != 
TSStatusCode.REDIRECTION_RECOMMEND.getStatusCode()) {
           return Response.ok()
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v2/impl/RestApiServiceImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v2/impl/RestApiServiceImpl.java
index 018a9d90763..6028d9d257e 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v2/impl/RestApiServiceImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/rest/v2/impl/RestApiServiceImpl.java
@@ -119,7 +119,8 @@ public class RestApiServiceImpl extends RestApiService {
               sql.getSql(),
               partitionFetcher,
               schemaFetcher,
-              config.getQueryTimeoutThreshold());
+              config.getQueryTimeoutThreshold(),
+              false);
       finish = true;
       return responseGenerateHelper(result);
     } catch (Exception e) {
@@ -187,7 +188,8 @@ public class RestApiServiceImpl extends RestApiService {
               sql.getSql(),
               partitionFetcher,
               schemaFetcher,
-              config.getQueryTimeoutThreshold());
+              config.getQueryTimeoutThreshold(),
+              true);
       finish = true;
       if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()
           && result.status.code != 
TSStatusCode.REDIRECTION_RECOMMEND.getStatusCode()) {
@@ -252,7 +254,8 @@ public class RestApiServiceImpl extends RestApiService {
               "",
               partitionFetcher,
               schemaFetcher,
-              config.getQueryTimeoutThreshold());
+              config.getQueryTimeoutThreshold(),
+              false);
       return responseGenerateHelper(result);
 
     } catch (Exception e) {
@@ -307,7 +310,8 @@ public class RestApiServiceImpl extends RestApiService {
               "",
               partitionFetcher,
               schemaFetcher,
-              config.getQueryTimeoutThreshold());
+              config.getQueryTimeoutThreshold(),
+              false);
       return responseGenerateHelper(result);
     } catch (Exception e) {
       return 
Response.ok().entity(ExceptionHandler.tryCatchException(e)).build();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
index 20a80ce683d..4c2c4a4e654 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/ClientRPCServiceImpl.java
@@ -208,6 +208,7 @@ import static 
org.apache.iotdb.db.queryengine.common.DataNodeEndPoints.isSameNod
 import static 
org.apache.iotdb.db.queryengine.execution.fragment.FragmentInstanceContext.createFragmentInstanceContext;
 import static 
org.apache.iotdb.db.queryengine.execution.operator.AggregationUtil.initTimeRangeIterator;
 import static org.apache.iotdb.db.utils.CommonUtils.getContentOfRequest;
+import static 
org.apache.iotdb.db.utils.CommonUtils.getContentOfTSFastLastDataQueryForOneDeviceReq;
 import static org.apache.iotdb.db.utils.ErrorHandlingUtils.onIoTDBException;
 import static 
org.apache.iotdb.db.utils.ErrorHandlingUtils.onNpeOrUnexpectedException;
 import static org.apache.iotdb.db.utils.ErrorHandlingUtils.onQueryException;
@@ -219,6 +220,11 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
 
   private static final IoTDBConfig config = 
IoTDBDescriptor.getInstance().getConfig();
 
+  private static final CommonConfig COMMON_CONFIG = 
CommonDescriptor.getInstance().getConfig();
+
+  private static final Logger SAMPLED_QUERIES_LOGGER =
+      LoggerFactory.getLogger(IoTDBConstant.SAMPLED_QUERIES_LOGGER_NAME);
+
   private static final Coordinator COORDINATOR = Coordinator.getInstance();
 
   private static final SessionManager SESSION_MANAGER = 
SessionManager.getInstance();
@@ -316,7 +322,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
               statement,
               partitionFetcher,
               schemaFetcher,
-              req.getTimeout());
+              req.getTimeout(),
+              true);
 
       if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()
           && result.status.code != 
TSStatusCode.REDIRECTION_RECOMMEND.getStatusCode()) {
@@ -410,7 +417,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
               "",
               partitionFetcher,
               schemaFetcher,
-              req.getTimeout());
+              req.getTimeout(),
+              true);
 
       if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
         finished = true;
@@ -500,7 +508,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
               "",
               partitionFetcher,
               schemaFetcher,
-              req.getTimeout());
+              req.getTimeout(),
+              true);
 
       if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
         finished = true;
@@ -589,7 +598,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
               "",
               partitionFetcher,
               schemaFetcher,
-              req.getTimeout());
+              req.getTimeout(),
+              true);
 
       if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
         finished = true;
@@ -834,6 +844,7 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
         resp.setQueryResult(Collections.emptyList());
         finished = true;
         resp.setMoreData(false);
+        sampleForCacheHitFastLastDataQueryForOneDevice(req);
         return resp;
       }
 
@@ -897,6 +908,7 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
           }
           finished = true;
           resp.setMoreData(false);
+          sampleForCacheHitFastLastDataQueryForOneDevice(req);
           return resp;
         }
       }
@@ -925,7 +937,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
               "",
               partitionFetcher,
               schemaFetcher,
-              req.getTimeout());
+              req.getTimeout(),
+              true);
 
       if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
         finished = true;
@@ -1001,6 +1014,22 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
     return tsLastDataQueryReq;
   }
 
+  private static void sampleForCacheHitFastLastDataQueryForOneDevice(
+      TSFastLastDataQueryForOneDeviceReq req) {
+    // only sample successful query
+    if (COMMON_CONFIG.isEnableQuerySampling()) { // sampling is enabled
+      String queryRequest = 
getContentOfTSFastLastDataQueryForOneDeviceReq(req);
+      if (COMMON_CONFIG.isQuerySamplingHasRateLimit()) {
+        if 
(COMMON_CONFIG.getQuerySamplingRateLimiter().tryAcquire(queryRequest.length())) 
{
+          SAMPLED_QUERIES_LOGGER.info(queryRequest);
+        }
+      } else {
+        // no limit, always sampled
+        SAMPLED_QUERIES_LOGGER.info(queryRequest);
+      }
+    }
+  }
+
   @Override
   public TSExecuteStatementResp 
executeAggregationQueryV2(TSAggregationQueryReq req) {
     return executeAggregationQueryInternal(req, SELECT_RESULT);
@@ -1556,7 +1585,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
                   statement,
                   partitionFetcher,
                   schemaFetcher,
-                  config.getQueryTimeoutThreshold());
+                  config.getQueryTimeoutThreshold(),
+                  false);
           results.add(result.status);
         } catch (Exception e) {
           LOGGER.warn("Error occurred when executing executeBatchStatement: ", 
e);
@@ -2410,7 +2440,8 @@ public class ClientRPCServiceImpl implements 
IClientRPCServiceWithHandler {
               null,
               partitionFetcher,
               schemaFetcher,
-              config.getQueryTimeoutThreshold());
+              config.getQueryTimeoutThreshold(),
+              true);
 
       if (executionResult.status.code != 
TSStatusCode.SUCCESS_STATUS.getStatusCode()
           && executionResult.status.code != 
TSStatusCode.REDIRECTION_RECOMMEND.getStatusCode()) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java
index 3850bad073c..74d68128f99 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/protocol/thrift/impl/DataNodeInternalRPCServiceImpl.java
@@ -1414,7 +1414,8 @@ public class DataNodeInternalRPCServiceImpl implements 
IDataNodeRPCService.Iface
               executedSQL,
               partitionFetcher,
               schemaFetcher,
-              req.getTimeout());
+              req.getTimeout(),
+              false);
 
       if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()
           && result.status.code != 
TSStatusCode.REDIRECTION_RECOMMEND.getStatusCode()) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
index ccd7536919f..1621327f9f7 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
@@ -81,6 +81,8 @@ public class MPPQueryContext {
   // constructing some Expression and PlanNode.
   private final MemoryReservationManager memoryReservationManager;
 
+  private boolean userQuery = false;
+
   public MPPQueryContext(QueryId queryId) {
     this.queryId = queryId;
     this.endPointBlackList = new LinkedList<>();
@@ -330,4 +332,12 @@ public class MPPQueryContext {
   }
 
   // endregion
+
+  public boolean isUserQuery() {
+    return userQuery;
+  }
+
+  public void setUserQuery(boolean userQuery) {
+    this.userQuery = userQuery;
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
index db56a6ec695..8561a6e4188 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java
@@ -26,6 +26,8 @@ import 
org.apache.iotdb.commons.client.async.AsyncDataNodeInternalServiceClient;
 import org.apache.iotdb.commons.client.sync.SyncDataNodeInternalServiceClient;
 import org.apache.iotdb.commons.concurrent.IoTDBThreadPoolFactory;
 import org.apache.iotdb.commons.concurrent.ThreadName;
+import org.apache.iotdb.commons.conf.CommonConfig;
+import org.apache.iotdb.commons.conf.CommonDescriptor;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
@@ -70,10 +72,14 @@ public class Coordinator {
   private static final Logger LOGGER = 
LoggerFactory.getLogger(Coordinator.class);
   private static final int COORDINATOR_SCHEDULED_EXECUTOR_SIZE = 10;
   private static final IoTDBConfig CONFIG = 
IoTDBDescriptor.getInstance().getConfig();
+  private static final CommonConfig COMMON_CONFIG = 
CommonDescriptor.getInstance().getConfig();
 
   private static final Logger SLOW_SQL_LOGGER =
       LoggerFactory.getLogger(IoTDBConstant.SLOW_SQL_LOGGER_NAME);
 
+  private static final Logger SAMPLED_QUERIES_LOGGER =
+      LoggerFactory.getLogger(IoTDBConstant.SAMPLED_QUERIES_LOGGER_NAME);
+
   private static final IClientManager<TEndPoint, 
SyncDataNodeInternalServiceClient>
       SYNC_INTERNAL_SERVICE_CLIENT_MANAGER =
           new IClientManager.Factory<TEndPoint, 
SyncDataNodeInternalServiceClient>()
@@ -108,6 +114,7 @@ public class Coordinator {
       long queryId,
       SessionInfo session,
       String sql,
+      boolean userQuery,
       BiFunction<MPPQueryContext, Long, IQueryExecution> 
iQueryExecutionFactory) {
     long startTime = System.currentTimeMillis();
     QueryId globalQueryId = queryIdGenerator.createNextQueryId();
@@ -124,6 +131,7 @@ public class Coordinator {
               session,
               DataNodeEndPoints.LOCAL_HOST_DATA_BLOCK_ENDPOINT,
               DataNodeEndPoints.LOCAL_HOST_INTERNAL_ENDPOINT);
+      queryContext.setUserQuery(userQuery);
       IQueryExecution execution = iQueryExecutionFactory.apply(queryContext, 
startTime);
       if (execution.isQuery()) {
         queryExecutionMap.put(queryId, execution);
@@ -155,7 +163,7 @@ public class Coordinator {
       IPartitionFetcher partitionFetcher,
       ISchemaFetcher schemaFetcher) {
     return executeForTreeModel(
-        statement, queryId, session, sql, partitionFetcher, schemaFetcher, 
Long.MAX_VALUE);
+        statement, queryId, session, sql, partitionFetcher, schemaFetcher, 
Long.MAX_VALUE, false);
   }
 
   public ExecutionResult executeForTreeModel(
@@ -165,11 +173,13 @@ public class Coordinator {
       String sql,
       IPartitionFetcher partitionFetcher,
       ISchemaFetcher schemaFetcher,
-      long timeOut) {
+      long timeOut,
+      boolean userQuery) {
     return execution(
         queryId,
         session,
         sql,
+        userQuery,
         ((queryContext, startTime) ->
             createQueryExecutionForTreeModel(
                 statement,
@@ -254,14 +264,28 @@ public class Coordinator {
         LOGGER.debug("[CleanUpQuery]]");
         queryExecution.stopAndCleanup(t);
         queryExecutionMap.remove(queryId);
-        if (queryExecution.isQuery()) {
+        if (queryExecution.isQuery() && queryExecution.isUserQuery()) {
           long costTime = queryExecution.getTotalExecutionTime();
+          // print slow query
           if (costTime / 1_000_000 >= CONFIG.getSlowQueryThreshold()) {
             SLOW_SQL_LOGGER.info(
                 "Cost: {} ms, {}",
                 costTime / 1_000_000,
                 getContentOfRequest(nativeApiRequest, queryExecution));
           }
+
+          // only sample successful query
+          if (t == null && COMMON_CONFIG.isEnableQuerySampling()) { // 
sampling is enabled
+            String queryRequest = getContentOfRequest(nativeApiRequest, 
queryExecution);
+            if (COMMON_CONFIG.isQuerySamplingHasRateLimit()) {
+              if 
(COMMON_CONFIG.getQuerySamplingRateLimiter().tryAcquire(queryRequest.length())) 
{
+                SAMPLED_QUERIES_LOGGER.info(queryRequest);
+              }
+            } else {
+              // no limit, always sampled
+              SAMPLED_QUERIES_LOGGER.info(queryRequest);
+            }
+          }
         }
       }
     }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/LoadTsFileAnalyzer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/LoadTsFileAnalyzer.java
index af8239c3104..97065145fe1 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/LoadTsFileAnalyzer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/LoadTsFileAnalyzer.java
@@ -539,7 +539,8 @@ public class LoadTsFileAnalyzer implements AutoCloseable {
                   "",
                   partitionFetcher,
                   schemaFetcher,
-                  
IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold());
+                  
IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold(),
+                  false);
       if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()
           && result.status.code != 
TSStatusCode.DATABASE_ALREADY_EXISTS.getStatusCode()) {
         LOGGER.warn(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/AutoCreateSchemaExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/AutoCreateSchemaExecutor.java
index 608b78db0e5..38d0f8942e5 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/AutoCreateSchemaExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/AutoCreateSchemaExecutor.java
@@ -93,7 +93,8 @@ class AutoCreateSchemaExecutor {
         schemaFetcher,
         context == null || context.getQueryType().equals(QueryType.WRITE)
             ? config.getQueryTimeoutThreshold()
-            : context.getTimeOut());
+            : context.getTimeOut(),
+        false);
   }
 
   // Auto create the missing measurements and merge them into given schemaTree
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetchExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetchExecutor.java
index d5b6b27f0a7..d62b5640d9d 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetchExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/schema/ClusterSchemaFetchExecutor.java
@@ -90,7 +90,8 @@ class ClusterSchemaFetchExecutor {
         sql,
         ClusterPartitionFetcher.getInstance(),
         schemaFetcher,
-        timeout);
+        timeout,
+        false);
   }
 
   /**
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/IQueryExecution.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/IQueryExecution.java
index b35123e8f70..5cb2d4b449c 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/IQueryExecution.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/IQueryExecution.java
@@ -53,6 +53,8 @@ public interface IQueryExecution {
 
   boolean isQuery();
 
+  boolean isUserQuery();
+
   String getQueryId();
 
   long getStartExecutionTime();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java
index 8cb8ea48ea8..29dbd7e3492 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java
@@ -629,6 +629,11 @@ public class QueryExecution implements IQueryExecution {
     return context.getQueryType() == QueryType.READ;
   }
 
+  @Override
+  public boolean isUserQuery() {
+    return context.isUserQuery();
+  }
+
   @Override
   public String getQueryId() {
     return context.getQueryId().getId();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/ConfigExecution.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/ConfigExecution.java
index c0886d91842..3076e87d5b4 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/ConfigExecution.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/ConfigExecution.java
@@ -219,6 +219,11 @@ public class ConfigExecution implements IQueryExecution {
     return context.getQueryType() == QueryType.READ;
   }
 
+  @Override
+  public boolean isUserQuery() {
+    return context.isUserQuery();
+  }
+
   @Override
   public String getQueryId() {
     return context.getQueryId().getId();
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
index f9e824a87b6..80e2a716b43 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java
@@ -2339,7 +2339,8 @@ public class ClusterConfigTaskExecutor implements 
IConfigTaskExecutor {
                 "",
                 ClusterPartitionFetcher.getInstance(),
                 ClusterSchemaFetcher.getInstance(),
-                
IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold());
+                
IoTDBDescriptor.getInstance().getConfig().getQueryTimeoutThreshold(),
+                false);
     if (executionResult.status.getCode() != 
TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
       future.setException(
           new IoTDBException(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/active/ActiveLoadTsFileLoader.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/active/ActiveLoadTsFileLoader.java
index 2ab0c1ae64e..605218ae0a6 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/active/ActiveLoadTsFileLoader.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/load/active/ActiveLoadTsFileLoader.java
@@ -206,7 +206,8 @@ public class ActiveLoadTsFileLoader {
             "",
             ClusterPartitionFetcher.getInstance(),
             ClusterSchemaFetcher.getInstance(),
-            IOTDB_CONFIG.getQueryTimeoutThreshold())
+            IOTDB_CONFIG.getQueryTimeoutThreshold(),
+            false)
         .status;
   }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/CommonUtils.java 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/CommonUtils.java
index e0819843cc2..261ca957492 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/CommonUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/CommonUtils.java
@@ -324,10 +324,7 @@ public class CommonUtils {
           req.getStartTime(), req.getEndTime(), req.getPathsSize(), sb);
     } else if (request instanceof TSFastLastDataQueryForOneDeviceReq) {
       TSFastLastDataQueryForOneDeviceReq req = 
(TSFastLastDataQueryForOneDeviceReq) request;
-      return String.format(
-          "Request name: TSFastLastDataQueryForOneDeviceReq, "
-              + "db: %s, deviceId: %s, sensorSize: %s, sensors: %s",
-          req.getDb(), req.getDeviceId(), req.getSensorsSize(), 
req.getSensors());
+      return getContentOfTSFastLastDataQueryForOneDeviceReq(req);
     } else if (request instanceof TSFetchResultsReq) {
       TSFetchResultsReq req = (TSFetchResultsReq) request;
       StringBuilder sb = new StringBuilder();
@@ -347,6 +344,14 @@ public class CommonUtils {
     }
   }
 
+  public static String getContentOfTSFastLastDataQueryForOneDeviceReq(
+      TSFastLastDataQueryForOneDeviceReq req) {
+    return String.format(
+        "Request name: TSFastLastDataQueryForOneDeviceReq, "
+            + "db: %s, deviceId: %s, sensorSize: %s, sensors: %s",
+        req.getDb(), req.getDeviceId(), req.getSensorsSize(), 
req.getSensors());
+  }
+
   public static int runCli(
       List<Class<? extends Runnable>> commands,
       String[] args,
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/MergeSortOperatorTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/MergeSortOperatorTest.java
index e1a6c59c9d6..604d3eb3442 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/MergeSortOperatorTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/MergeSortOperatorTest.java
@@ -1862,5 +1862,10 @@ public class MergeSortOperatorTest {
     public boolean isQuery() {
       return false;
     }
+
+    @Override
+    public boolean isUserQuery() {
+      return false;
+    }
   }
 }
diff --git 
a/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
 
b/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
index 6253e50c85c..d6ca096864f 100644
--- 
a/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
+++ 
b/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
@@ -1012,6 +1012,13 @@ sort_buffer_size_in_bytes=1048576
 # Datatype: int
 merge_threshold_of_explain_analyze=10
 
+# The limit of query sampling throughput merge can reach per second
+# 0 means no queries will be recorded
+# negative number means no limit, all queries will be recorded.
+# effectiveMode: hot_reload
+# Datatype: int, Unit: bytes
+query_sample_throughput_bytes_per_sec=160
+
 ####################
 ### TTL Configuration
 ####################
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
index 8d30d0c6d80..713fa7ca68d 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
@@ -28,6 +28,7 @@ import org.apache.iotdb.commons.utils.FileUtils;
 import org.apache.iotdb.commons.utils.KillPoint.KillPoint;
 import org.apache.iotdb.rpc.RpcUtils;
 
+import com.google.common.util.concurrent.RateLimiter;
 import org.apache.tsfile.fileSystem.FSType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -344,6 +345,14 @@ public class CommonConfig {
 
   private volatile long remoteWriteMaxRetryDurationInMs = 60000;
 
+  private final RateLimiter querySamplingRateLimiter = RateLimiter.create(160);
+  // if querySamplingRateLimiter < 0, means that there is no rate limit, we 
need to full sample all
+  // the queries
+  private volatile boolean querySamplingHasRateLimit = true;
+  // if querySamplingRateLimiter != 0, enableQuerySampling is true; 
querySamplingRateLimiter = 0,
+  // enableQuerySampling is false
+  private volatile boolean enableQuerySampling = true;
+
   private volatile Pattern trustedUriPattern = Pattern.compile("file:.*");
 
   CommonConfig() {
@@ -1533,6 +1542,36 @@ public class CommonConfig {
     this.log2SizeClassGroup = log2SizeClassGroup;
   }
 
+  /**
+   * @param querySamplingRateLimit query_sample_throughput_bytes_per_sec
+   */
+  public void setQuerySamplingRateLimit(int querySamplingRateLimit) {
+    if (querySamplingRateLimit > 0) {
+      this.querySamplingRateLimiter.setRate(querySamplingRateLimit);
+      this.enableQuerySampling = true;
+      this.querySamplingHasRateLimit = true;
+    } else if (querySamplingRateLimit == 0) {
+      // querySamplingRateLimit = 0, means that we sample no queries
+      this.enableQuerySampling = false;
+    } else {
+      // querySamplingRateLimit < 0, means that we need to full sample all 
queries
+      this.enableQuerySampling = true;
+      this.querySamplingHasRateLimit = false;
+    }
+  }
+
+  public boolean isQuerySamplingHasRateLimit() {
+    return querySamplingHasRateLimit;
+  }
+
+  public RateLimiter getQuerySamplingRateLimiter() {
+    return querySamplingRateLimiter;
+  }
+
+  public boolean isEnableQuerySampling() {
+    return enableQuerySampling;
+  }
+
   public Pattern getTrustedUriPattern() {
     return trustedUriPattern;
   }
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
index cbcedd497ad..18ac41409ba 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java
@@ -108,6 +108,8 @@ public class IoTDBConstant {
 
   public static final String AUDIT_LOGGER_NAME = "IoTDB_AUDIT_LOGGER";
   public static final String SLOW_SQL_LOGGER_NAME = "SLOW_SQL";
+  public static final String SAMPLED_QUERIES_LOGGER_NAME = "SAMPLED_QUERIES";
+
   public static final String COMPACTION_LOGGER_NAME = "COMPACTION";
   public static final String EXPLAIN_ANALYZE_LOGGER_NAME = "EXPLAIN_ANALYZE";
 


Reply via email to