This is an automated email from the ASF dual-hosted git repository.
xiangweiwei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new cbd1317 [IOTDB-1607] Optimize Tracing (#4018)
cbd1317 is described below
commit cbd1317d194c81c0bc4818c7748d377d62d0a13a
Author: liuminghui233 <[email protected]>
AuthorDate: Thu Oct 14 10:54:37 2021 +0800
[IOTDB-1607] Optimize Tracing (#4018)
Co-authored-by: liuminghui233 <[email protected]>
Co-authored-by: Xiangwei Wei <[email protected]>
---
.../antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4 | 6 +-
.../java/org/apache/iotdb/cli/AbstractCli.java | 67 ++++++
.../System-Tools/Performance-Tracing-Tool.md | 56 +++--
docs/zh/UserGuide/Appendix/Config-Manual.md | 18 --
.../System-Tools/Performance-Tracing-Tool.md | 58 +++---
.../main/java/org/apache/iotdb/JDBCExample.java | 6 +-
.../org/apache/iotdb/PrepareStatementDemo.java | 2 +-
.../iotdb/jdbc/AbstractIoTDBJDBCResultSet.java | 22 ++
.../main/java/org/apache/iotdb/jdbc/Constant.java | 12 ++
.../apache/iotdb/jdbc/IoTDBDatabaseMetadata.java | 25 +++
.../org/apache/iotdb/jdbc/IoTDBJDBCResultSet.java | 11 +
.../iotdb/jdbc/IoTDBNonAlignJDBCResultSet.java | 6 +
.../java/org/apache/iotdb/jdbc/IoTDBStatement.java | 4 +
.../org/apache/iotdb/jdbc/IoTDBTracingInfo.java | 103 +++++++++
.../java/org/apache/iotdb/db/conf/IoTDBConfig.java | 11 -
.../org/apache/iotdb/db/conf/IoTDBDescriptor.java | 8 -
.../apache/iotdb/db/qp/executor/PlanExecutor.java | 17 +-
.../iotdb/db/qp/logical/crud/QueryOperator.java | 13 ++
.../iotdb/db/qp/physical/crud/QueryPlan.java | 9 +
.../apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java | 1 +
.../iotdb/db/query/context/QueryContext.java | 9 +
.../db/query/control/QueryResourceManager.java | 34 +--
.../apache/iotdb/db/query/control/TracingInfo.java | 85 --------
.../iotdb/db/query/control/TracingManager.java | 229 ---------------------
.../db/query/control/tracing/TracingConstant.java | 17 +-
.../db/query/control/tracing/TracingInfo.java | 156 ++++++++++++++
.../db/query/control/tracing/TracingManager.java | 82 ++++++++
.../db/query/dataset/AlignByDeviceDataSet.java | 4 +-
.../db/query/executor/RawDataQueryExecutor.java | 1 +
.../iotdb/db/query/reader/series/SeriesReader.java | 24 ++-
.../reader/universal/PriorityMergeReader.java | 13 +-
.../java/org/apache/iotdb/db/service/IoTDB.java | 4 -
.../org/apache/iotdb/db/service/TSServiceImpl.java | 67 ++++--
.../db/integration/IoTDBRemovePartitionIT.java | 4 +-
.../iotdb/db/integration/IoTDBTracingIT.java | 61 ++++--
.../iotdb/db/query/control/TracingManagerTest.java | 115 -----------
.../apache/iotdb/db/utils/EnvironmentUtils.java | 7 +-
thrift/rpc-changelist.md | 22 ++
thrift/src/main/thrift/rpc.thrift | 15 ++
39 files changed, 741 insertions(+), 663 deletions(-)
diff --git a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4
b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4
index 464f359..26b976f 100644
--- a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4
+++ b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4
@@ -85,8 +85,8 @@ statement
| SHOW MERGE #showMergeStatus
| SHOW QUERY PROCESSLIST #showQueryProcesslist
| KILL QUERY INT? #killQuery
- | TRACING ON #tracingOn
- | TRACING OFF #tracingOff
+ | TRACING ON #tracingOn // not support yet
+ | TRACING OFF #tracingOff // not support yet
| SET SYSTEM TO READONLY #setSystemToReadOnly
| SET SYSTEM TO WRITABLE #setSystemToWritable
| COUNT TIMESERIES prefixPath? (GROUP BY LEVEL OPERATOR_EQ INT)?
#countTimeseries
@@ -108,7 +108,7 @@ statement
| START TRIGGER triggerName=ID #startTrigger
| STOP TRIGGER triggerName=ID #stopTrigger
| SHOW TRIGGERS #showTriggers
- | selectClause intoClause? fromClause whereClause? specialClause?
#selectStatement
+ | TRACING? selectClause intoClause? fromClause whereClause? specialClause?
#selectStatement
| CREATE (CONTINUOUS QUERY | CQ) continuousQueryName=ID
resampleClause?
cqSelectIntoClause #createContinuousQueryStatement
diff --git a/cli/src/main/java/org/apache/iotdb/cli/AbstractCli.java
b/cli/src/main/java/org/apache/iotdb/cli/AbstractCli.java
index 4c286a5..b6f339a 100644
--- a/cli/src/main/java/org/apache/iotdb/cli/AbstractCli.java
+++ b/cli/src/main/java/org/apache/iotdb/cli/AbstractCli.java
@@ -19,6 +19,7 @@
package org.apache.iotdb.cli;
import org.apache.iotdb.exception.ArgsErrorException;
+import org.apache.iotdb.jdbc.AbstractIoTDBJDBCResultSet;
import org.apache.iotdb.jdbc.IoTDBConnection;
import org.apache.iotdb.jdbc.IoTDBJDBCResultSet;
import org.apache.iotdb.rpc.IoTDBConnectionException;
@@ -534,6 +535,12 @@ public abstract class AbstractCli {
e.printStackTrace();
}
}
+ // output tracing activity
+ if (((AbstractIoTDBJDBCResultSet) resultSet).isSetTracingInfo()) {
+ maxSizeList = new ArrayList<>(2);
+ lists = cacheTracingInfo(resultSet, maxSizeList);
+ outputTracingInfo(lists, maxSizeList);
+ }
}
} else {
println("Msg: " + SUCCESS_MESSAGE);
@@ -641,6 +648,54 @@ public abstract class AbstractCli {
return lists;
}
+ private static List<List<String>> cacheTracingInfo(ResultSet resultSet,
List<Integer> maxSizeList)
+ throws Exception {
+ List<List<String>> lists = new ArrayList<>(2);
+ lists.add(0, new ArrayList<>());
+ lists.add(1, new ArrayList<>());
+
+ String ACTIVITY_STR = "Activity";
+ String ELAPSED_TIME_STR = "Elapsed Time";
+ lists.get(0).add(ACTIVITY_STR);
+ lists.get(1).add(ELAPSED_TIME_STR);
+ maxSizeList.add(0, ACTIVITY_STR.length());
+ maxSizeList.add(1, ELAPSED_TIME_STR.length());
+
+ List<String> activityList = ((AbstractIoTDBJDBCResultSet)
resultSet).getActivityList();
+ List<Long> elapsedTimeList = ((AbstractIoTDBJDBCResultSet)
resultSet).getElapsedTimeList();
+ String[] statisticsInfoList = {
+ "seriesPathNum", "seqFileNum", "unSeqFileNum", "seqChunkInfo",
"unSeqChunkInfo", "pageNumInfo"
+ };
+
+ for (int i = 0; i < activityList.size(); i++) {
+
+ if (i == activityList.size() - 1) {
+ // cache Statistics
+ for (String infoName : statisticsInfoList) {
+ String info = ((AbstractIoTDBJDBCResultSet)
resultSet).getStatisticsInfoByName(infoName);
+ lists.get(0).add(info);
+ lists.get(1).add("");
+ if (info.length() > maxSizeList.get(0)) {
+ maxSizeList.set(0, info.length());
+ }
+ }
+ }
+
+ String activity = activityList.get(i);
+ String elapsedTime = elapsedTimeList.get(i).toString();
+ if (activity.length() > maxSizeList.get(0)) {
+ maxSizeList.set(0, activity.length());
+ }
+ if (elapsedTime.length() > maxSizeList.get(1)) {
+ maxSizeList.set(1, elapsedTime.length());
+ }
+ lists.get(0).add(activity);
+ lists.get(1).add(elapsedTime);
+ }
+
+ return lists;
+ }
+
private static void output(List<List<String>> lists, List<Integer>
maxSizeList) {
printBlockLine(maxSizeList);
printRow(lists, 0, maxSizeList);
@@ -657,6 +712,18 @@ public abstract class AbstractCli {
}
}
+ private static void outputTracingInfo(List<List<String>> lists,
List<Integer> maxSizeList) {
+ println();
+ println("Tracing Activties:");
+ printBlockLine(maxSizeList);
+ printRow(lists, 0, maxSizeList);
+ printBlockLine(maxSizeList);
+ for (int i = 1; i < lists.get(0).size(); i++) {
+ printRow(lists, i, maxSizeList);
+ }
+ printBlockLine(maxSizeList);
+ }
+
private static void resetArgs() {
lineCount = 0;
cursorBeforeFirst = true;
diff --git a/docs/UserGuide/System-Tools/Performance-Tracing-Tool.md
b/docs/UserGuide/System-Tools/Performance-Tracing-Tool.md
index ea3ced4..c257305 100644
--- a/docs/UserGuide/System-Tools/Performance-Tracing-Tool.md
+++ b/docs/UserGuide/System-Tools/Performance-Tracing-Tool.md
@@ -20,44 +20,34 @@
-->
## Performance Tracing Tool
-IoTDB supports the use of `TRACING` statements to enable and disable
performance tracing of query statements, which is disabled by default. Users
can use performance tracking tool to analyze potential performance problems in
some queries. By default, the log files for performance tracing are stored in
the directory `./data/tracing`.
+> Note: TRACING ON/OFF hasn't been supported yet.
-Turn on Tracing:
+IoTDB supports the use of the `TRACING` clause to enable performance tracing
of executed statements. Users can use the performance tracing tool to analyze
potential performance problems in some statements.
-`IoTDB> TRACING ON`
+Traceable statement: `SELECT` only.
-Turn off Tracing:
-
-`IoTDB> TRACING OFF`
-
-Since the cost of an IoTDB query mainly depends on the number of time series
queried, the number of tsfile files accessed, the total number of chunks to be
scanned, and the average size of each chunk (the number of data points
contained in the chunk). Therefore, the current performance analysis includes
the following contents:
-
-- Start time
-- Query statement
-- Number of series paths
-- Number of sequence files
-- Statistics of each sequence file
-- Number of unSequence files
-- Statistics of each unSequence file
-- Number of chunks
-- Average size of chunks
-- Total cost time
+The current performance analysis includes the following contents:
+1. The elapsed time of each stage of the execution process.
+2. Statistics related to performance analysis. For query statements, it
includes the number of time series queried, the number of Tsfile files
accessed, the total number of chunks to be scanned, and the average number of
data points contained in the chunk, the total number of pages read, and the
number of overlapped pages.
### Example
-For example, execute `select * from root`, the contents of the tracing log
file will include the following contents:
+For example, execute `tracing select * from root`, will display the following
contents:
```
-Query Id: 2 - Start time: 2020-06-28 10:53:54.727
-Query Id: 2 - Query Statement: select * from root
-Query Id: 2 - Number of series paths: 3
-Query Id: 2 - Number of sequence files: 1
-Query Id: 2 - SeqFile_1603336100446-1-0.tsfile root.sg.d1[1, 10000]
-Query Id: 2 - Number of unsequence files: 1
-Query Id: 2 - UnSeqFile_1603354798303-2-0.tsfile root.sg.d1[9, 1000]
-Query Id: 2 - Number of chunks: 3
-Query Id: 2 - Average size of chunks: 4113
-Query Id: 2 - Total cost time: 11ms
-```
-
-In order to avoid disordered output information caused by multiple queries
being executed at the same time, the Query ID is added before each output
information. Users can use `grep "Query ID: 2" tracing.txt` to extract all
tracing information of one query.
+Tracing Activties:
++------------------------------------------------------+------------+
+| Activity|Elapsed Time|
++------------------------------------------------------+------------+
+|Start to execute statement: tracing select * from root| 0|
+| Parse SQL to physical plan| 4|
+| Create and cache dataset| 16|
+| * Num of series paths: 3| |
+| * Num of sequence files read: 2| |
+| * Num of unsequence files read: 1| |
+| * Num of sequence chunks: 6, avg points: 100.0| |
+| * Num of unsequence chunks: 3, avg points: 100.0| |
+| * Num of Pages: 9, overlapped pages: 0 (0.0%)| |
+| Request complete| 20|
++------------------------------------------------------+------------+
+```
\ No newline at end of file
diff --git a/docs/zh/UserGuide/Appendix/Config-Manual.md
b/docs/zh/UserGuide/Appendix/Config-Manual.md
index a658072..3c2ec70 100644
--- a/docs/zh/UserGuide/Appendix/Config-Manual.md
+++ b/docs/zh/UserGuide/Appendix/Config-Manual.md
@@ -1040,24 +1040,6 @@
|默认值| 20 |
|改后生效方式|重启服务生效|
-* enable\_performance\_tracing
-
-|名字| enable\_performance\_tracing |
-|:---:|:---|
-|描述| 是否启用性能跟踪 |
-|类型| Boolean |
-|默认值| false |
-|改后生效方式|重启服务生效|
-
-* tracing\_dir
-
-|名字| tracing\_dir |
-|:---:|:---|
-|描述| 查询性能分析的日志目录 |
-|类型| String |
-|默认值| data/tracing(Windows:data\\tracing) |
-|改后生效方式|重启服务生效|
-
### 水印模块配置
* watermark\_module\_opened
diff --git a/docs/zh/UserGuide/System-Tools/Performance-Tracing-Tool.md
b/docs/zh/UserGuide/System-Tools/Performance-Tracing-Tool.md
index 81b3f75..2e046bd 100644
--- a/docs/zh/UserGuide/System-Tools/Performance-Tracing-Tool.md
+++ b/docs/zh/UserGuide/System-Tools/Performance-Tracing-Tool.md
@@ -18,46 +18,34 @@
under the License.
-->
-## 查询性能追踪
+## 性能追踪工具
-IoTDB 支持使用 `TRACING`
语句来启用/禁用对查询语句的性能追踪,默认处于禁用状态。用户可以使用性能追踪工具来分析某些查询中存在的潜在性能问题。性能分析的日志文件默认存储在
`./data/tracing` 目录下。
+> 注意:0.13及以上版本中将不再支持 `TRACING ON/OFF` 。
-启用 Tracing:
+IoTDB 支持使用 `TRACING` 关键词对执行语句进行性能追踪。用户可以使用性能追踪工具来分析语句执行中存在的潜在性能问题。目前仅支持对
`SELECT` 语句进行追踪。
-`IoTDB> TRACING ON`
-
-禁用 Tracing:
-
-`IoTDB> TRACING OFF`
-
-由于一个 IoTDB 查询时间主要取决于查询的时间序列数、涉及访问的 Tsfile 文件数、需要扫描的 chunk 总数以及平均每个 chunk
的大小(指该 chunk 中包含的数据点的个数)。因此,目前性能分析包括的内容如下:
-
-- Start time
-- Query statement
-- Number of series paths
-- Number of sequence files
-- Statistics of each sequence file
-- Number of unSequence files
-- Statistics of each unSequence file
-- Number of chunks
-- Average size of chunks
-- Total cost time
+性能追踪的结果包括:
+1. 执行过程中各个阶段的累积耗时。
+2. 与性能分析相关的统计信息。对于查询语句,包括查询的时间序列数、涉及访问的 Tsfile 文件数、需要扫描的 chunk 总数以及平均每个 chunk
包含的数据点个数、读取的 Page 总数以及其中乱序 Page 的个数。
### 示例
-例如执行 `select * from root`,则 tracing 日志文件的内容会包括以下内容:
+例如执行 `tracing select * from root`,输出结果如下:
```
-Query Id: 2 - Start time: 2020-06-28 10:53:54.727
-Query Id: 2 - Query Statement: select * from root
-Query Id: 2 - Number of series paths: 3
-Query Id: 2 - Number of sequence files: 1
-Query Id: 2 - SeqFile_1603336100446-1-0.tsfile root.sg.d1[1, 10000]
-Query Id: 2 - Number of unsequence files: 1
-Query Id: 2 - UnSeqFile_1603354798303-2-0.tsfile root.sg.d1[9, 1000]
-Query Id: 2 - Number of chunks: 3
-Query Id: 2 - Average size of chunks: 4113
-Query Id: 2 - Total cost time: 11ms
-```
-
-为了避免多个查询同时执行导致输出信息乱序,在每条输出信息前均增加了该次查询的 Query Id,用户可以使用 `grep "Query Id: 2"
tracing.txt` 来提取某次查询的所有追踪信息。
+Tracing Activties:
++------------------------------------------------------+------------+
+| Activity|Elapsed Time|
++------------------------------------------------------+------------+
+|Start to execute statement: tracing select * from root| 0|
+| Parse SQL to physical plan| 4|
+| Create and cache dataset| 16|
+| * Num of series paths: 3| |
+| * Num of sequence files read: 2| |
+| * Num of unsequence files read: 1| |
+| * Num of sequence chunks: 6, avg points: 100.0| |
+| * Num of unsequence chunks: 3, avg points: 100.0| |
+| * Num of Pages: 9, overlapped pages: 0 (0.0%)| |
+| Request complete| 20|
++------------------------------------------------------+------------+
+```
\ No newline at end of file
diff --git a/example/jdbc/src/main/java/org/apache/iotdb/JDBCExample.java
b/example/jdbc/src/main/java/org/apache/iotdb/JDBCExample.java
index 78d7da2..e8dd4e1 100644
--- a/example/jdbc/src/main/java/org/apache/iotdb/JDBCExample.java
+++ b/example/jdbc/src/main/java/org/apache/iotdb/JDBCExample.java
@@ -56,13 +56,13 @@ public class JDBCExample {
statement.executeBatch();
statement.clearBatch();
- ResultSet resultSet = statement.executeQuery("select * from root where
time <= 10");
+ ResultSet resultSet = statement.executeQuery("select ** from root where
time <= 10");
outputResult(resultSet);
- resultSet = statement.executeQuery("select count(*) from root");
+ resultSet = statement.executeQuery("select count(**) from root");
outputResult(resultSet);
resultSet =
statement.executeQuery(
- "select count(*) from root where time >= 1 and time <= 100 group
by ([0, 100), 20ms, 20ms)");
+ "select count(**) from root where time >= 1 and time <= 100
group by ([0, 100), 20ms, 20ms)");
outputResult(resultSet);
} catch (IoTDBSQLException e) {
System.out.println(e.getMessage());
diff --git
a/example/jdbc/src/main/java/org/apache/iotdb/PrepareStatementDemo.java
b/example/jdbc/src/main/java/org/apache/iotdb/PrepareStatementDemo.java
index b3c7396..d2fe4ee 100644
--- a/example/jdbc/src/main/java/org/apache/iotdb/PrepareStatementDemo.java
+++ b/example/jdbc/src/main/java/org/apache/iotdb/PrepareStatementDemo.java
@@ -60,7 +60,7 @@ public class PrepareStatementDemo {
preparedStatement.execute();
preparedStatement.clearParameters();
- try (ResultSet resultSet = preparedStatement.executeQuery("select * from
root")) {
+ try (ResultSet resultSet = preparedStatement.executeQuery("select **
from root")) {
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
while (resultSet.next()) {
StringBuilder builder = new StringBuilder();
diff --git
a/jdbc/src/main/java/org/apache/iotdb/jdbc/AbstractIoTDBJDBCResultSet.java
b/jdbc/src/main/java/org/apache/iotdb/jdbc/AbstractIoTDBJDBCResultSet.java
index 46a5472..14c4757 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/AbstractIoTDBJDBCResultSet.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/AbstractIoTDBJDBCResultSet.java
@@ -56,6 +56,7 @@ public abstract class AbstractIoTDBJDBCResultSet implements
ResultSet {
protected SQLWarning warningChain = null;
protected List<String> columnTypeList;
protected IoTDBJDBCDataSet ioTDBRpcDataSet;
+ protected IoTDBTracingInfo ioTDBRpcTracingInfo;
private boolean isRpcFetchResult = true;
private List<String> sgColumns;
private BitSet aliasColumnMap;
@@ -1183,4 +1184,25 @@ public abstract class AbstractIoTDBJDBCResultSet
implements ResultSet {
abstract String getValueByName(String columnName) throws SQLException;
abstract Object getObjectByName(String columnName) throws SQLException;
+
+ public boolean isSetTracingInfo() {
+ if (ioTDBRpcTracingInfo == null) return false;
+ return ioTDBRpcTracingInfo.isSetTracingInfo();
+ }
+
+ public List<String> getActivityList() {
+ return ioTDBRpcTracingInfo.getActivityList();
+ }
+
+ public List<Long> getElapsedTimeList() {
+ return ioTDBRpcTracingInfo.getElapsedTimeList();
+ }
+
+ public long getStatisticsByName(String name) throws Exception {
+ return ioTDBRpcTracingInfo.getStatisticsByName(name);
+ }
+
+ public String getStatisticsInfoByName(String name) throws Exception {
+ return ioTDBRpcTracingInfo.getStatisticsInfoByName(name);
+ }
}
diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/Constant.java
b/jdbc/src/main/java/org/apache/iotdb/jdbc/Constant.java
index f66a529..868583a 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/Constant.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/Constant.java
@@ -28,4 +28,16 @@ public class Constant {
static final String PARAMETER_NOT_NULL = "The parameter cannot be null";
static final String PARAMETER_SUPPORTED =
"Parameter only supports BOOLEAN,INT32,INT64,FLOAT,DOUBLE,TEXT data
type";
+
+ public static final String STATISTICS_PATHNUM = "* Num of series paths: %d";
+ public static final String STATISTICS_SEQFILENUM = "* Num of sequence files
read: %d";
+ public static final String STATISTICS_UNSEQFILENUM = "* Num of unsequence
files read: %d";
+ public static final String STATISTICS_SEQCHUNKINFO =
+ "* Num of sequence chunks: %d, avg points: %.1f";
+ public static final String STATISTICS_UNSEQCHUNKINFO =
+ "* Num of unsequence chunks: %d, avg points: %.1f";
+ public static final String STATISTICS_PAGEINFO =
+ "* Num of Pages: %d, overlapped pages: %d (%.1f%%)";
+ public static final String STATISTICS_RESULT_LINES = "* Lines of result: %d";
+ public static final String STATISTICS_PRC_INFO = "* Num of RPC: %d, avg
cost: %d ms";
}
diff --git
a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBDatabaseMetadata.java
b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBDatabaseMetadata.java
index 16fc628..3c822ec 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBDatabaseMetadata.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBDatabaseMetadata.java
@@ -402,6 +402,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
null,
+ null,
(long) 60 * 1000,
true);
}
@@ -446,6 +447,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
null,
+ null,
(long) 60 * 1000,
true);
}
@@ -502,6 +504,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
tsdataset,
+ null,
(long) 60 * 1000,
false);
}
@@ -714,6 +717,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
tsdataset,
+ null,
(long) 60 * 1000,
false);
}
@@ -817,6 +821,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
tsdataset,
+ null,
(long) 60 * 1000,
false);
}
@@ -871,6 +876,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
null,
+ null,
(long) 60 * 1000,
true);
}
@@ -984,6 +990,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
null,
+ null,
(long) 60 * 1000,
true);
}
@@ -1086,6 +1093,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
tsdataset,
+ null,
(long) 60 * 1000,
false);
}
@@ -1158,6 +1166,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
tsdataset,
+ null,
(long) 60 * 1000,
false);
}
@@ -1210,6 +1219,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
null,
+ null,
(long) 60 * 1000,
true);
}
@@ -1258,6 +1268,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
null,
+ null,
(long) 60 * 1000,
true);
}
@@ -1473,6 +1484,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
tsdataset,
+ null,
(long) 60 * 1000,
false);
}
@@ -1528,6 +1540,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
null,
+ null,
(long) 60 * 1000,
true);
}
@@ -1572,6 +1585,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
null,
+ null,
(long) 60 * 1000,
true);
}
@@ -1648,6 +1662,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
tsdataset,
+ null,
(long) 60 * 1000,
false);
}
@@ -1726,6 +1741,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
tsdataset,
+ null,
(long) 60 * 1000,
false);
}
@@ -1779,6 +1795,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
null,
+ null,
(long) 60 * 1000,
true);
}
@@ -1819,6 +1836,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
null,
+ null,
(long) 60 * 1000,
true);
}
@@ -1937,6 +1955,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
tsdataset,
+ null,
(long) 60 * 1000,
false);
}
@@ -1979,6 +1998,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
tsdataset,
+ null,
(long) 60 * 1000,
false);
}
@@ -2147,6 +2167,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
tsdataset,
+ null,
(long) 60 * 1000,
false);
}
@@ -2317,6 +2338,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
tsdataset,
+ null,
(long) 60 * 1000,
false);
}
@@ -2533,6 +2555,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
tsdataset,
+ null,
(long) 60 * 1000,
false);
}
@@ -2575,6 +2598,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
null,
+ null,
(long) 60 * 1000,
true);
}
@@ -2628,6 +2652,7 @@ public class IoTDBDatabaseMetadata implements
DatabaseMetaData {
0,
sessionId,
null,
+ null,
(long) 60 * 1000,
true);
}
diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBJDBCResultSet.java
b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBJDBCResultSet.java
index b7ea02d..27c8384 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBJDBCResultSet.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBJDBCResultSet.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.rpc.IoTDBConnectionException;
import org.apache.iotdb.rpc.StatementExecutionException;
import org.apache.iotdb.service.rpc.thrift.TSIService;
import org.apache.iotdb.service.rpc.thrift.TSQueryDataSet;
+import org.apache.iotdb.service.rpc.thrift.TSTracingInfo;
import java.sql.SQLException;
import java.sql.Statement;
@@ -46,6 +47,7 @@ public class IoTDBJDBCResultSet extends
AbstractIoTDBJDBCResultSet {
long queryId,
long sessionId,
TSQueryDataSet dataset,
+ TSTracingInfo tracingInfo,
long timeout,
String operationType,
List<String> columns,
@@ -66,6 +68,10 @@ public class IoTDBJDBCResultSet extends
AbstractIoTDBJDBCResultSet {
sgColumns,
aliasColumnMap);
ioTDBRpcDataSet.setTsQueryDataSet(dataset);
+ if (tracingInfo != null) {
+ ioTDBRpcTracingInfo = new IoTDBTracingInfo();
+ ioTDBRpcTracingInfo.setTsTracingInfo(tracingInfo);
+ }
this.operationType = operationType;
this.columns = columns;
this.sgColumns = sgColumns;
@@ -82,6 +88,7 @@ public class IoTDBJDBCResultSet extends
AbstractIoTDBJDBCResultSet {
long queryId,
long sessionId,
TSQueryDataSet dataset,
+ TSTracingInfo tracingInfo,
long timeout,
boolean isRpcFetchResult)
throws SQLException {
@@ -98,6 +105,10 @@ public class IoTDBJDBCResultSet extends
AbstractIoTDBJDBCResultSet {
timeout,
isRpcFetchResult);
ioTDBRpcDataSet.setTsQueryDataSet(dataset);
+ if (tracingInfo != null) {
+ ioTDBRpcTracingInfo = new IoTDBTracingInfo();
+ ioTDBRpcTracingInfo.setTsTracingInfo(tracingInfo);
+ }
}
@Override
diff --git
a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBNonAlignJDBCResultSet.java
b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBNonAlignJDBCResultSet.java
index b04b20d..c0e70b7 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBNonAlignJDBCResultSet.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBNonAlignJDBCResultSet.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.service.rpc.thrift.TSFetchResultsReq;
import org.apache.iotdb.service.rpc.thrift.TSFetchResultsResp;
import org.apache.iotdb.service.rpc.thrift.TSIService;
import org.apache.iotdb.service.rpc.thrift.TSQueryNonAlignDataSet;
+import org.apache.iotdb.service.rpc.thrift.TSTracingInfo;
import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.utils.BytesUtils;
@@ -65,6 +66,7 @@ public class IoTDBNonAlignJDBCResultSet extends
AbstractIoTDBJDBCResultSet {
long queryId,
long sessionId,
TSQueryNonAlignDataSet dataset,
+ TSTracingInfo tracingInfo,
long timeout,
String operationType,
List<String> sgColumns,
@@ -120,6 +122,10 @@ public class IoTDBNonAlignJDBCResultSet extends
AbstractIoTDBJDBCResultSet {
}
this.sgColumns = newSgColumns;
this.tsQueryNonAlignDataSet = dataset;
+ if (tracingInfo != null) {
+ ioTDBRpcTracingInfo = new IoTDBTracingInfo();
+ ioTDBRpcTracingInfo.setTsTracingInfo(tracingInfo);
+ }
}
@Override
diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBStatement.java
b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBStatement.java
index a73992a..cdfda4c 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBStatement.java
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBStatement.java
@@ -281,6 +281,7 @@ public class IoTDBStatement implements Statement {
queryId,
sessionId,
execResp.nonAlignQueryDataSet,
+ execResp.tracingInfo,
execReq.timeout,
execResp.operationType,
execResp.getSgColumns(),
@@ -298,6 +299,7 @@ public class IoTDBStatement implements Statement {
queryId,
sessionId,
execResp.queryDataSet,
+ execResp.tracingInfo,
execReq.timeout,
true);
}
@@ -431,6 +433,7 @@ public class IoTDBStatement implements Statement {
queryId,
sessionId,
execResp.nonAlignQueryDataSet,
+ execResp.tracingInfo,
execReq.timeout,
execResp.operationType,
execResp.sgColumns,
@@ -448,6 +451,7 @@ public class IoTDBStatement implements Statement {
queryId,
sessionId,
execResp.queryDataSet,
+ execResp.tracingInfo,
execReq.timeout,
execResp.operationType,
execResp.columns,
diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBTracingInfo.java
b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBTracingInfo.java
new file mode 100644
index 0000000..48bd828
--- /dev/null
+++ b/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBTracingInfo.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.jdbc;
+
+import org.apache.iotdb.service.rpc.thrift.TSTracingInfo;
+
+import java.util.List;
+
+public class IoTDBTracingInfo {
+
+ private TSTracingInfo tsTracingInfo;
+
+ public IoTDBTracingInfo() {}
+
+ public void setTsTracingInfo(TSTracingInfo tsTracingInfo) {
+ this.tsTracingInfo = tsTracingInfo;
+ }
+
+ public boolean isSetTracingInfo() {
+ return tsTracingInfo != null;
+ }
+
+ public List<String> getActivityList() {
+ return tsTracingInfo.getActivityList();
+ }
+
+ public List<Long> getElapsedTimeList() {
+ return tsTracingInfo.getElapsedTimeList();
+ }
+
+ public long getStatisticsByName(String name) throws Exception {
+ switch (name) {
+ case "seriesPathNum":
+ return tsTracingInfo.getSeriesPathNum();
+ case "seqFileNum":
+ return tsTracingInfo.getSeqFileNum();
+ case "unSeqFileNum":
+ return tsTracingInfo.getUnSeqFileNum();
+ case "seqChunkNum":
+ return tsTracingInfo.getSequenceChunkNum();
+ case "seqChunkPointNum":
+ return tsTracingInfo.getSequenceChunkPointNum();
+ case "unSeqChunkNum":
+ return tsTracingInfo.getUnsequenceChunkNum();
+ case "unSeqChunkPointNum":
+ return tsTracingInfo.getUnsequenceChunkPointNum();
+ case "totalPageNum":
+ return tsTracingInfo.getTotalPageNum();
+ case "overlappedPageNum":
+ return tsTracingInfo.getOverlappedPageNum();
+ default:
+ throw new Exception("Invalid statistics name!");
+ }
+ }
+
+ public String getStatisticsInfoByName(String name) throws Exception {
+ switch (name) {
+ case "seriesPathNum":
+ return String.format(Constant.STATISTICS_PATHNUM,
tsTracingInfo.getSeriesPathNum());
+ case "seqFileNum":
+ return String.format(Constant.STATISTICS_SEQFILENUM,
tsTracingInfo.getSeqFileNum());
+ case "unSeqFileNum":
+ return String.format(Constant.STATISTICS_UNSEQFILENUM,
tsTracingInfo.getUnSeqFileNum());
+ case "seqChunkInfo":
+ return String.format(
+ Constant.STATISTICS_SEQCHUNKINFO,
+ tsTracingInfo.getSequenceChunkNum(),
+ (double) tsTracingInfo.getSequenceChunkPointNum()
+ / tsTracingInfo.getSequenceChunkNum());
+ case "unSeqChunkInfo":
+ return String.format(
+ Constant.STATISTICS_UNSEQCHUNKINFO,
+ tsTracingInfo.getUnsequenceChunkNum(),
+ (double) tsTracingInfo.getUnsequenceChunkPointNum()
+ / tsTracingInfo.getUnsequenceChunkNum());
+ case "pageNumInfo":
+ return String.format(
+ Constant.STATISTICS_PAGEINFO,
+ tsTracingInfo.getTotalPageNum(),
+ tsTracingInfo.getOverlappedPageNum(),
+ (double) tsTracingInfo.getOverlappedPageNum() /
tsTracingInfo.getTotalPageNum() * 100);
+ default:
+ throw new Exception("Invalid statistics name!");
+ }
+ }
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
index cbcae55..01d150c 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
@@ -460,9 +460,6 @@ public class IoTDBConfig {
/** Is stat performance of sub-module enable. */
private boolean enablePerformanceStat = false;
- /** Is performance tracing enable. */
- private boolean enablePerformanceTracing = false;
-
/** The display of stat performance interval in ms. Unit: millisecond */
private long performanceStatDisplayInterval = 60000;
@@ -1476,14 +1473,6 @@ public class IoTDBConfig {
this.enablePerformanceStat = enablePerformanceStat;
}
- public boolean isEnablePerformanceTracing() {
- return enablePerformanceTracing;
- }
-
- public void setEnablePerformanceTracing(boolean enablePerformanceTracing) {
- this.enablePerformanceTracing = enablePerformanceTracing;
- }
-
public long getPerformanceStatDisplayInterval() {
return performanceStatDisplayInterval;
}
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
index a4eed94..1cd161f 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
@@ -542,14 +542,6 @@ public class IoTDBDescriptor {
"enable_performance_stat",
Boolean.toString(conf.isEnablePerformanceStat()))
.trim()));
- conf.setEnablePerformanceTracing(
- Boolean.parseBoolean(
- properties
- .getProperty(
- "enable_performance_tracing",
- Boolean.toString(conf.isEnablePerformanceTracing()))
- .trim()));
-
conf.setPerformanceStatDisplayInterval(
Long.parseLong(
properties
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
index 6b5a11b..2f520bc 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/executor/PlanExecutor.java
@@ -117,10 +117,8 @@ import org.apache.iotdb.db.qp.physical.sys.ShowTTLPlan;
import org.apache.iotdb.db.qp.physical.sys.ShowTimeSeriesPlan;
import org.apache.iotdb.db.qp.physical.sys.StartTriggerPlan;
import org.apache.iotdb.db.qp.physical.sys.StopTriggerPlan;
-import org.apache.iotdb.db.qp.physical.sys.TracingPlan;
import org.apache.iotdb.db.query.context.QueryContext;
import org.apache.iotdb.db.query.control.QueryTimeManager;
-import org.apache.iotdb.db.query.control.TracingManager;
import org.apache.iotdb.db.query.dataset.AlignByDeviceDataSet;
import org.apache.iotdb.db.query.dataset.ListDataSet;
import org.apache.iotdb.db.query.dataset.ShowContinuousQueriesResult;
@@ -324,8 +322,7 @@ public class PlanExecutor implements IPlanExecutor {
operateMerge((MergePlan) plan);
return true;
case TRACING:
- operateTracing((TracingPlan) plan);
- return true;
+ throw new QueryProcessException("TRACING ON/OFF hasn't been supported
yet");
case SET_SYSTEM_MODE:
operateSetSystemMode((SetSystemModePlan) plan);
return true;
@@ -478,18 +475,6 @@ public class PlanExecutor implements IPlanExecutor {
}
}
- /** when tracing off need Close the stream */
- private void operateTracing(TracingPlan plan) {
-
IoTDBDescriptor.getInstance().getConfig().setEnablePerformanceTracing(plan.isTracingOn());
- if (!plan.isTracingOn()) {
- TracingManager.getInstance().close();
- } else {
- if (!TracingManager.getInstance().getWriterStatus()) {
- TracingManager.getInstance().openTracingWriteStream();
- }
- }
- }
-
private void operateSetSystemMode(SetSystemModePlan plan) {
IoTDBDescriptor.getInstance().getConfig().setReadOnly(plan.isReadOnly());
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/QueryOperator.java
b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/QueryOperator.java
index 3f3282e..65184ae 100644
---
a/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/QueryOperator.java
+++
b/server/src/main/java/org/apache/iotdb/db/qp/logical/crud/QueryOperator.java
@@ -66,6 +66,8 @@ public class QueryOperator extends Operator {
protected Map<String, Object> props;
protected IndexType indexType;
+ protected boolean enableTracing;
+
public QueryOperator() {
super(SQLConstant.TOK_QUERY);
operatorType = Operator.OperatorType.QUERY;
@@ -79,6 +81,7 @@ public class QueryOperator extends Operator {
this.specialClauseComponent = queryOperator.getSpecialClauseComponent();
this.props = queryOperator.getProps();
this.indexType = queryOperator.getIndexType();
+ this.enableTracing = queryOperator.isEnableTracing();
}
public SelectComponent getSelectComponent() {
@@ -169,6 +172,7 @@ public class QueryOperator extends Operator {
RawDataQueryPlan rawDataQueryPlan = (RawDataQueryPlan) queryPlan;
rawDataQueryPlan.setPaths(selectComponent.getPaths());
rawDataQueryPlan.setResultColumns(selectComponent.getResultColumns());
+ rawDataQueryPlan.setEnableTracing(enableTracing);
// transform filter operator to expression
if (whereComponent != null) {
@@ -308,6 +312,7 @@ public class QueryOperator extends Operator {
alignByDevicePlan.setMeasurementInfoMap(measurementInfoMap);
alignByDevicePlan.setDevices(devices);
alignByDevicePlan.setPaths(paths);
+ alignByDevicePlan.setEnableTracing(enableTracing);
if (whereComponent != null) {
alignByDevicePlan.setDeviceToFilterMap(
@@ -478,4 +483,12 @@ public class QueryOperator extends Operator {
protected List<PartialPath> getMatchedTimeseries(PartialPath path) throws
MetadataException {
return IoTDB.metaManager.getAllTimeseriesPath(path);
}
+
+ public boolean isEnableTracing() {
+ return enableTracing;
+ }
+
+ public void setEnableTracing(boolean enableTracing) {
+ this.enableTracing = enableTracing;
+ }
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java
b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java
index 52cb0d6..30c2fcd 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/QueryPlan.java
@@ -46,6 +46,7 @@ public abstract class QueryPlan extends PhysicalPlan {
private Map<String, Integer> pathToIndex = new HashMap<>();
private boolean enableRedirect = false;
+ private boolean enableTracing = false;
// if true, we don't need the row whose any column is null
private boolean withoutAnyNull;
@@ -148,6 +149,14 @@ public abstract class QueryPlan extends PhysicalPlan {
this.enableRedirect = enableRedirect;
}
+ public boolean isEnableTracing() {
+ return enableTracing;
+ }
+
+ public void setEnableTracing(boolean enableTracing) {
+ this.enableTracing = enableTracing;
+ }
+
public List<ResultColumn> getResultColumns() {
return resultColumns;
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
b/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
index 1548164..a944007 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java
@@ -1079,6 +1079,7 @@ public class IoTDBSqlVisitor extends
SqlBaseBaseVisitor<Operator> {
queryOp.setWhereComponent(whereComponent);
}
}
+ queryOp.setEnableTracing(ctx.TRACING() != null);
// 4. Check whether it's a select-into clause
return ctx.intoClause() == null ? queryOp :
parseAndConstructSelectIntoOperator(ctx);
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/query/context/QueryContext.java
b/server/src/main/java/org/apache/iotdb/db/query/context/QueryContext.java
index a625555..92015ad 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/context/QueryContext.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/context/QueryContext.java
@@ -51,6 +51,7 @@ public class QueryContext {
private long queryTimeLowerBound = Long.MIN_VALUE;
private boolean debug;
+ private boolean enableTracing = false;
/**
* To reduce the cost of memory, we only keep the a certain size statement.
For statement whose
@@ -118,6 +119,14 @@ public class QueryContext {
return debug;
}
+ public boolean isEnableTracing() {
+ return enableTracing;
+ }
+
+ public void setEnableTracing(boolean enableTracing) {
+ this.enableTracing = enableTracing;
+ }
+
public long getQueryTimeLowerBound() {
return queryTimeLowerBound;
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/query/control/QueryResourceManager.java
b/server/src/main/java/org/apache/iotdb/db/query/control/QueryResourceManager.java
index 33f2a2f..822f73d 100644
---
a/server/src/main/java/org/apache/iotdb/db/query/control/QueryResourceManager.java
+++
b/server/src/main/java/org/apache/iotdb/db/query/control/QueryResourceManager.java
@@ -18,24 +18,18 @@
*/
package org.apache.iotdb.db.query.control;
-import org.apache.iotdb.db.conf.IoTDBConfig;
-import org.apache.iotdb.db.conf.IoTDBConstant;
-import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.engine.StorageEngine;
import org.apache.iotdb.db.engine.querycontext.QueryDataSource;
import org.apache.iotdb.db.exception.StorageEngineException;
import org.apache.iotdb.db.exception.query.QueryProcessException;
import org.apache.iotdb.db.metadata.PartialPath;
import org.apache.iotdb.db.query.context.QueryContext;
+import org.apache.iotdb.db.query.control.tracing.TracingManager;
import
org.apache.iotdb.db.query.externalsort.serialize.IExternalSortFileDeserializer;
import org.apache.iotdb.db.query.udf.service.TemporaryQueryDataFileService;
import org.apache.iotdb.tsfile.read.expression.impl.SingleSeriesExpression;
import org.apache.iotdb.tsfile.read.filter.basic.Filter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@@ -53,8 +47,6 @@ public class QueryResourceManager {
private final AtomicLong queryIdAtom = new AtomicLong();
private final QueryFileManager filePathsManager;
- private static final Logger logger =
LoggerFactory.getLogger(QueryResourceManager.class);
- private IoTDBConfig CONFIG = IoTDBDescriptor.getInstance().getConfig();
/**
* Record temporary files used for external sorting.
@@ -100,11 +92,14 @@ public class QueryResourceManager {
new SingleSeriesExpression(selectedPath, filter);
QueryDataSource queryDataSource =
StorageEngine.getInstance().query(singleSeriesExpression, context,
filePathsManager);
- // calculate the distinct number of seq and unseq tsfiles
- if (CONFIG.isEnablePerformanceTracing()) {
+
+ // for tracing: calculate the distinct number of seq and unseq tsfiles
+ if (context.isEnableTracing()) {
TracingManager.getInstance()
- .getTracingInfo(context.getQueryId())
- .addTsFileSet(queryDataSource.getSeqResources(),
queryDataSource.getUnseqResources());
+ .addTsFileSet(
+ context.getQueryId(),
+ queryDataSource.getSeqResources(),
+ queryDataSource.getUnseqResources());
}
return queryDataSource;
}
@@ -115,19 +110,6 @@ public class QueryResourceManager {
*/
@SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity
warning
public void endQuery(long queryId) throws StorageEngineException {
- try {
- if (CONFIG.isEnablePerformanceTracing()
- && TracingManager.getInstance().getTracingInfo(queryId) != null) {
- TracingManager.getInstance().writeTracingInfo(queryId);
- TracingManager.getInstance().writeEndTime(queryId);
- }
- } catch (IOException e) {
- logger.error(
- "Error while writing performance info to {}, {}",
- CONFIG.getTracingDir() + File.separator + IoTDBConstant.TRACING_LOG,
- e.getMessage());
- }
-
// close file stream of external sort files, and delete
if (externalSortFileMap.get(queryId) != null) {
for (IExternalSortFileDeserializer deserializer :
externalSortFileMap.get(queryId)) {
diff --git
a/server/src/main/java/org/apache/iotdb/db/query/control/TracingInfo.java
b/server/src/main/java/org/apache/iotdb/db/query/control/TracingInfo.java
deleted file mode 100644
index 530ac4c..0000000
--- a/server/src/main/java/org/apache/iotdb/db/query/control/TracingInfo.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.iotdb.db.query.control;
-
-import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * A distinct TracingInfo is storaged for each query id, which includes the
total number of chunks,
- * the average points number of chunk, the information of sequence files and
unSequence files this
- * query involves.
- */
-public class TracingInfo {
-
- private int totalChunkNum = 0;
- private long totalChunkPoints = 0;
- private int totalPageNum = 0;
- private int overlappedPageNum = 0;
- private Set<TsFileResource> seqFileSet = new HashSet<>();
- private Set<TsFileResource> unSeqFileSet = new HashSet<>();
-
- public TracingInfo() {}
-
- public int getTotalChunkNum() {
- return totalChunkNum;
- }
-
- public long getTotalChunkPoints() {
- return totalChunkPoints;
- }
-
- public void addChunkInfo(int totalChunkNum, long totalChunkPoints) {
- this.totalChunkNum += totalChunkNum;
- this.totalChunkPoints += totalChunkPoints;
- }
-
- public void addTotalPageNum(int totalPageNum) {
- this.totalPageNum += totalPageNum;
- }
-
- public void addOverlappedPageNum() {
- this.overlappedPageNum++;
- }
-
- public int getTotalPageNum() {
- return totalPageNum;
- }
-
- public int getOverlappedPageNum() {
- return overlappedPageNum;
- }
-
- public Set<TsFileResource> getSeqFileSet() {
- return seqFileSet;
- }
-
- public Set<TsFileResource> getUnSeqFileSet() {
- return unSeqFileSet;
- }
-
- public void addTsFileSet(List<TsFileResource> seqResources,
List<TsFileResource> unSeqResources) {
- this.seqFileSet.addAll(seqResources);
- this.unSeqFileSet.addAll(unSeqResources);
- }
-}
diff --git
a/server/src/main/java/org/apache/iotdb/db/query/control/TracingManager.java
b/server/src/main/java/org/apache/iotdb/db/query/control/TracingManager.java
deleted file mode 100644
index b2dd13a..0000000
--- a/server/src/main/java/org/apache/iotdb/db/query/control/TracingManager.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.iotdb.db.query.control;
-
-import org.apache.iotdb.db.conf.IoTDBConstant;
-import org.apache.iotdb.db.conf.IoTDBDescriptor;
-import org.apache.iotdb.db.engine.fileSystem.SystemFileFactory;
-import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-public class TracingManager {
-
- private static final Logger logger =
LoggerFactory.getLogger(TracingManager.class);
- private static final String QUERY_ID = "Query Id: %d";
- private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
- private BufferedWriter writer;
- private Map<Long, Long> queryStartTime = new ConcurrentHashMap<>();
- private Map<Long, TracingInfo> tracingInfoMap = new ConcurrentHashMap<>();
-
- public TracingManager(String dirName, String logFileName) {
- initTracingManager(dirName, logFileName);
- }
-
- public void initTracingManager(String dirName, String logFileName) {
- File tracingDir = SystemFileFactory.INSTANCE.getFile(dirName);
- if (!tracingDir.exists()) {
- if (tracingDir.mkdirs()) {
- logger.info("create performance folder {}.", tracingDir);
- } else {
- logger.info("create performance folder {} failed.", tracingDir);
- }
- }
- File logFile = SystemFileFactory.INSTANCE.getFile(dirName + File.separator
+ logFileName);
- FileWriter fileWriter = null;
- try {
- fileWriter = new FileWriter(logFile, true);
- } catch (IOException e) {
- logger.error("Meeting error while creating TracingManager: {}",
e.getMessage());
- }
- writer = new BufferedWriter(fileWriter);
- }
-
- public static TracingManager getInstance() {
- return TracingManagerHelper.INSTANCE;
- }
-
- public TracingInfo getTracingInfo(long queryId) {
- return tracingInfoMap.computeIfAbsent(queryId, k -> new TracingInfo());
- }
-
- public void writeQueryInfo(long queryId, String statement, long startTime,
int pathsNum)
- throws IOException {
- queryStartTime.put(queryId, startTime);
- StringBuilder builder = new StringBuilder();
- builder
- .append(String.format(QUERY_ID, queryId))
- .append(String.format(" - Query Statement: %s", statement))
- .append("\n")
- .append(String.format(QUERY_ID, queryId))
- .append(" - Start time: ")
- .append(new SimpleDateFormat(DATE_FORMAT).format(startTime))
- .append("\n")
- .append(String.format(QUERY_ID, queryId))
- .append(String.format(" - Number of series paths: %d", pathsNum))
- .append("\n");
- writer.write(builder.toString());
- }
-
- // for align by device query
- public void writeQueryInfo(long queryId, String statement, long startTime)
throws IOException {
- queryStartTime.put(queryId, startTime);
- StringBuilder builder = new StringBuilder();
- builder
- .append(String.format(QUERY_ID, queryId))
- .append(String.format(" - Query Statement: %s", statement))
- .append("\n")
- .append(String.format(QUERY_ID, queryId))
- .append(" - Start time: ")
- .append(new SimpleDateFormat(DATE_FORMAT).format(startTime))
- .append("\n");
- writer.write(builder.toString());
- }
-
- public void writePathsNum(long queryId, int pathsNum) throws IOException {
- StringBuilder builder =
- new StringBuilder(String.format(QUERY_ID, queryId))
- .append(String.format(" - Number of series paths: %d", pathsNum))
- .append("\n");
- writer.write(builder.toString());
- }
-
- public void writeTracingInfo(long queryId) throws IOException {
- TracingInfo tracingInfo = tracingInfoMap.get(queryId);
- writeTsFileInfo(queryId, tracingInfo.getSeqFileSet(),
tracingInfo.getUnSeqFileSet());
- writeChunksInfo(queryId, tracingInfo.getTotalChunkNum(),
tracingInfo.getTotalChunkPoints());
- writeOverlappedPageInfo(
- queryId, tracingInfo.getTotalPageNum(),
tracingInfo.getOverlappedPageNum());
- }
-
- public void writeTsFileInfo(
- long queryId, Set<TsFileResource> seqFileResources, Set<TsFileResource>
unSeqFileResources)
- throws IOException {
- // to avoid the disorder info of multi query
- // add query id as prefix of each info
- StringBuilder builder =
- new StringBuilder(String.format(QUERY_ID, queryId))
- .append(String.format(" - Number of sequence files: %d",
seqFileResources.size()));
- if (!seqFileResources.isEmpty()) {
- builder.append("\n").append(String.format(QUERY_ID, queryId)).append(" -
SeqFiles: ");
- Iterator<TsFileResource> seqFileIterator = seqFileResources.iterator();
- while (seqFileIterator.hasNext()) {
- builder.append(seqFileIterator.next().getTsFile().getName());
- if (seqFileIterator.hasNext()) {
- builder.append(", ");
- }
- }
- }
-
- builder
- .append("\n")
- .append(String.format(QUERY_ID, queryId))
- .append(String.format(" - Number of unSequence files: %d",
unSeqFileResources.size()));
- if (!unSeqFileResources.isEmpty()) {
- builder.append("\n").append(String.format(QUERY_ID, queryId)).append(" -
UnSeqFiles: ");
- Iterator<TsFileResource> unSeqFileIterator =
unSeqFileResources.iterator();
- while (unSeqFileIterator.hasNext()) {
- builder.append(unSeqFileIterator.next().getTsFile().getName());
- if (unSeqFileIterator.hasNext()) {
- builder.append(", ");
- }
- }
- }
- builder.append("\n");
- writer.write(builder.toString());
- }
-
- public void writeChunksInfo(long queryId, long totalChunkNum, long
totalChunkPoints)
- throws IOException {
- double avgChunkPoints = (double) totalChunkPoints / totalChunkNum;
- StringBuilder builder =
- new StringBuilder(String.format(QUERY_ID, queryId))
- .append(String.format(" - Number of chunks: %d", totalChunkNum))
- .append(String.format(", Average data points of chunks: %.1f",
avgChunkPoints))
- .append("\n");
- writer.write(builder.toString());
- }
-
- public void writeOverlappedPageInfo(long queryId, int totalPageNum, int
overlappedPageNum)
- throws IOException {
- StringBuilder builder =
- new StringBuilder(String.format(QUERY_ID, queryId))
- .append(" - Rate of overlapped pages: ")
- .append(String.format("%.1f%%, ", (double) overlappedPageNum /
totalPageNum * 100))
- .append(
- String.format(
- "%d overlapped pages in total %d pages.\n",
overlappedPageNum, totalPageNum));
- writer.write(builder.toString());
- }
-
- public void writeEndTime(long queryId) throws IOException {
- long endTime = System.currentTimeMillis();
- StringBuilder builder =
- new StringBuilder(String.format(QUERY_ID, queryId))
- .append(" - Total cost time: ")
- .append(endTime - queryStartTime.remove(queryId))
- .append("ms\n");
- writer.write(builder.toString());
- writer.flush();
- }
-
- public void close() {
- try {
- writer.close();
- } catch (IOException e) {
- logger.error("Meeting error while Close the tracing log stream : {}",
e.getMessage());
- }
- }
-
- public boolean getWriterStatus() {
- try {
- writer.flush();
- return true;
- } catch (IOException e) {
- return false;
- }
- }
-
- public void openTracingWriteStream() {
- initTracingManager(
- IoTDBDescriptor.getInstance().getConfig().getTracingDir(),
IoTDBConstant.TRACING_LOG);
- }
-
- private static class TracingManagerHelper {
-
- private static final TracingManager INSTANCE =
- new TracingManager(
- IoTDBDescriptor.getInstance().getConfig().getTracingDir(),
IoTDBConstant.TRACING_LOG);
-
- private TracingManagerHelper() {}
- }
-}
diff --git a/jdbc/src/main/java/org/apache/iotdb/jdbc/Constant.java
b/server/src/main/java/org/apache/iotdb/db/query/control/tracing/TracingConstant.java
similarity index 61%
copy from jdbc/src/main/java/org/apache/iotdb/jdbc/Constant.java
copy to
server/src/main/java/org/apache/iotdb/db/query/control/tracing/TracingConstant.java
index f66a529..b284ce1 100644
--- a/jdbc/src/main/java/org/apache/iotdb/jdbc/Constant.java
+++
b/server/src/main/java/org/apache/iotdb/db/query/control/tracing/TracingConstant.java
@@ -16,16 +16,15 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.iotdb.jdbc;
+package org.apache.iotdb.db.query.control.tracing;
-public class Constant {
+/** this class contains several constants used in Tracing. */
+public class TracingConstant {
- private Constant() {}
+ private TracingConstant() {}
- public static final String GLOBAL_DB_NAME = "IoTDB";
-
- static final String METHOD_NOT_SUPPORTED = "Method not supported";
- static final String PARAMETER_NOT_NULL = "The parameter cannot be null";
- static final String PARAMETER_SUPPORTED =
- "Parameter only supports BOOLEAN,INT32,INT64,FLOAT,DOUBLE,TEXT data
type";
+ public static final String ACTIVITY_START_EXECUTE = "Start to execute
statement: %s";
+ public static final String ACTIVITY_PARSE_SQL = "Parse SQL to physical plan";
+ public static final String ACTIVITY_CREATE_DATASET = "Create and cache
dataset";
+ public static final String ACTIVITY_REQUEST_COMPLETE = "Request complete";
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/query/control/tracing/TracingInfo.java
b/server/src/main/java/org/apache/iotdb/db/query/control/tracing/TracingInfo.java
new file mode 100644
index 0000000..579ed57
--- /dev/null
+++
b/server/src/main/java/org/apache/iotdb/db/query/control/tracing/TracingInfo.java
@@ -0,0 +1,156 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.query.control.tracing;
+
+import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
+import org.apache.iotdb.service.rpc.thrift.TSTracingInfo;
+import org.apache.iotdb.tsfile.utils.Pair;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * A distinct TracingInfo is storaged for each query id, which includes the
total number of chunks,
+ * the average points number of chunk, the information of sequence files and
unSequence files this
+ * query involves.
+ */
+public class TracingInfo {
+
+ private long startTime;
+
+ private int seriesPathNum = 0;
+
+ private final Set<TsFileResource> seqFileSet = new HashSet<>();
+ private final Set<TsFileResource> unSeqFileSet = new HashSet<>();
+
+ private int sequenceChunkNum = 0;
+ private long sequenceChunkPointNum = 0;
+ private int unsequenceChunkNum = 0;
+ private long unsequenceChunkPointNum = 0;
+
+ private int totalPageNum = 0;
+ private int overlappedPageNum = 0;
+
+ private final List<Pair<String, Long>> activityList = new ArrayList<>();
+
+ public TracingInfo() {}
+
+ public long getStartTime() {
+ return startTime;
+ }
+
+ public void setStartTime(long startTime) {
+ this.startTime = startTime;
+ }
+
+ public void setSeriesPathNum(int seriesPathNum) {
+ this.seriesPathNum = seriesPathNum;
+ }
+
+ public void addChunkInfo(int chunkNum, long pointNum, boolean isSeq) {
+ if (isSeq) {
+ sequenceChunkNum += chunkNum;
+ sequenceChunkPointNum += pointNum;
+ } else {
+ unsequenceChunkNum += chunkNum;
+ unsequenceChunkPointNum += pointNum;
+ }
+ }
+
+ public int getSequenceChunkNum() {
+ return sequenceChunkNum;
+ }
+
+ public long getSequenceChunkPoints() {
+ return sequenceChunkPointNum;
+ }
+
+ public int getUnsequenceChunkNum() {
+ return unsequenceChunkNum;
+ }
+
+ public long getUnsequenceChunkPoints() {
+ return unsequenceChunkPointNum;
+ }
+
+ public Set<TsFileResource> getSeqFileSet() {
+ return seqFileSet;
+ }
+
+ public Set<TsFileResource> getUnSeqFileSet() {
+ return unSeqFileSet;
+ }
+
+ public void addTsFileSet(List<TsFileResource> seqResources,
List<TsFileResource> unSeqResources) {
+ this.seqFileSet.addAll(seqResources);
+ this.unSeqFileSet.addAll(unSeqResources);
+ }
+
+ public int getTotalPageNum() {
+ return totalPageNum;
+ }
+
+ public int getOverlappedPageNum() {
+ return overlappedPageNum;
+ }
+
+ public void addTotalPageNum(int totalPageNum) {
+ this.totalPageNum += totalPageNum;
+ }
+
+ public void addOverlappedPageNum() {
+ this.overlappedPageNum++;
+ }
+
+ public void addActivity(String activity, long time) {
+ activityList.add(new Pair<>(activity, time - startTime));
+ }
+
+ public TSTracingInfo fillRpcReturnTracingInfo() {
+ TSTracingInfo tsTracingInfo = new TSTracingInfo();
+
+ List<String> activityList = new ArrayList<>();
+ List<Long> elapsedTimeList = new ArrayList<>();
+
+ for (Pair<String, Long> pair : this.activityList) {
+ String activity = pair.left;
+ long elapsedTime = pair.right;
+
+ activityList.add(activity);
+ elapsedTimeList.add(elapsedTime);
+ }
+
+ tsTracingInfo.setActivityList(activityList);
+ tsTracingInfo.setElapsedTimeList(elapsedTimeList);
+
+ tsTracingInfo.setSeriesPathNum(seriesPathNum);
+ tsTracingInfo.setSeqFileNum(seqFileSet.size());
+ tsTracingInfo.setUnSeqFileNum(unSeqFileSet.size());
+ tsTracingInfo.setSequenceChunkNum(sequenceChunkNum);
+ tsTracingInfo.setSequenceChunkPointNum(sequenceChunkPointNum);
+ tsTracingInfo.setUnsequenceChunkNum(unsequenceChunkNum);
+ tsTracingInfo.setUnsequenceChunkPointNum(unsequenceChunkPointNum);
+ tsTracingInfo.setTotalPageNum(totalPageNum);
+ tsTracingInfo.setOverlappedPageNum(overlappedPageNum);
+ return tsTracingInfo;
+ }
+}
diff --git
a/server/src/main/java/org/apache/iotdb/db/query/control/tracing/TracingManager.java
b/server/src/main/java/org/apache/iotdb/db/query/control/tracing/TracingManager.java
new file mode 100644
index 0000000..cbc76cf
--- /dev/null
+++
b/server/src/main/java/org/apache/iotdb/db/query/control/tracing/TracingManager.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.db.query.control.tracing;
+
+import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
+import org.apache.iotdb.service.rpc.thrift.TSTracingInfo;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class TracingManager {
+
+ // (queryId -> TracingInfo)
+ private final Map<Long, TracingInfo> queryIdToTracingInfo = new
ConcurrentHashMap<>();
+
+ public TracingManager() {}
+
+ public static TracingManager getInstance() {
+ return TracingManagerHelper.INSTANCE;
+ }
+
+ private TracingInfo getTracingInfo(long queryId) {
+ return queryIdToTracingInfo.computeIfAbsent(queryId, k -> new
TracingInfo());
+ }
+
+ public void setSeriesPathNum(long queryId, int pathsNum) {
+ getTracingInfo(queryId).setSeriesPathNum(pathsNum);
+ }
+
+ public void addTsFileSet(
+ long queryId, List<TsFileResource> seqResources, List<TsFileResource>
unseqResources) {
+ getTracingInfo(queryId).addTsFileSet(seqResources, unseqResources);
+ }
+
+ public void addChunkInfo(long queryId, int chunkNum, long pointsNum, boolean
seq) {
+ getTracingInfo(queryId).addChunkInfo(chunkNum, pointsNum, seq);
+ }
+
+ public void addTotalPageNum(long queryId, int pageNum) {
+ getTracingInfo(queryId).addTotalPageNum(pageNum);
+ }
+
+ public void addOverlappedPageNum(long queryId) {
+ getTracingInfo(queryId).addOverlappedPageNum();
+ }
+
+ public void setStartTime(long queryId, long startTime) {
+ getTracingInfo(queryId).setStartTime(startTime);
+ }
+
+ public void registerActivity(long queryId, String activity, long startTime) {
+ getTracingInfo(queryId).addActivity(activity, startTime);
+ }
+
+ public TSTracingInfo fillRpcReturnTracingInfo(long queryId) {
+ return queryIdToTracingInfo.remove(queryId).fillRpcReturnTracingInfo();
+ }
+
+ private static class TracingManagerHelper {
+
+ private static final TracingManager INSTANCE = new TracingManager();
+
+ private TracingManagerHelper() {}
+ }
+}
diff --git
a/server/src/main/java/org/apache/iotdb/db/query/dataset/AlignByDeviceDataSet.java
b/server/src/main/java/org/apache/iotdb/db/query/dataset/AlignByDeviceDataSet.java
index d0dac2a..89c6df9 100644
---
a/server/src/main/java/org/apache/iotdb/db/query/dataset/AlignByDeviceDataSet.java
+++
b/server/src/main/java/org/apache/iotdb/db/query/dataset/AlignByDeviceDataSet.java
@@ -18,7 +18,6 @@
*/
package org.apache.iotdb.db.query.dataset;
-import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.exception.StorageEngineException;
import org.apache.iotdb.db.exception.metadata.MetadataException;
import org.apache.iotdb.db.exception.query.QueryProcessException;
@@ -169,7 +168,8 @@ public class AlignByDeviceDataSet extends QueryDataSet {
this.expression = deviceToFilterMap.get(currentDevice.getFullPath());
}
- if
(IoTDBDescriptor.getInstance().getConfig().isEnablePerformanceTracing()) {
+ // for tracing: try to calculate the number of series paths
+ if (context.isEnableTracing()) {
pathsNum += executeColumns.size();
}
diff --git
a/server/src/main/java/org/apache/iotdb/db/query/executor/RawDataQueryExecutor.java
b/server/src/main/java/org/apache/iotdb/db/query/executor/RawDataQueryExecutor.java
index ac13c1e..c9cda5a 100644
---
a/server/src/main/java/org/apache/iotdb/db/query/executor/RawDataQueryExecutor.java
+++
b/server/src/main/java/org/apache/iotdb/db/query/executor/RawDataQueryExecutor.java
@@ -65,6 +65,7 @@ public class RawDataQueryExecutor {
return dataSet;
}
List<ManagedSeriesReader> readersOfSelectedSeries =
initManagedSeriesReader(context);
+
try {
return new RawQueryDataSetWithoutValueFilter(
context.getQueryId(),
diff --git
a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
index dde8362..c2af73e 100644
---
a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
+++
b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
@@ -25,7 +25,7 @@ import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
import org.apache.iotdb.db.metadata.PartialPath;
import org.apache.iotdb.db.query.context.QueryContext;
import org.apache.iotdb.db.query.control.QueryTimeManager;
-import org.apache.iotdb.db.query.control.TracingManager;
+import org.apache.iotdb.db.query.control.tracing.TracingManager;
import org.apache.iotdb.db.query.filter.TsFileFilter;
import org.apache.iotdb.db.query.reader.universal.DescPriorityMergeReader;
import org.apache.iotdb.db.query.reader.universal.PriorityMergeReader;
@@ -380,15 +380,18 @@ public class SeriesReader {
FileLoaderUtils.loadChunkMetadataList(timeSeriesMetadata);
chunkMetadataList.forEach(chunkMetadata ->
chunkMetadata.setSeq(timeSeriesMetadata.isSeq()));
- // try to calculate the total number of chunk and time-value points in
chunk
- if
(IoTDBDescriptor.getInstance().getConfig().isEnablePerformanceTracing()) {
+ // for tracing: try to calculate the number of chunk and time-value points
in chunk
+ if (context.isEnableTracing()) {
long totalChunkPointsNum =
chunkMetadataList.stream()
.mapToLong(chunkMetadata ->
chunkMetadata.getStatistics().getCount())
.sum();
TracingManager.getInstance()
- .getTracingInfo(context.getQueryId())
- .addChunkInfo(chunkMetadataList.size(), totalChunkPointsNum);
+ .addChunkInfo(
+ context.getQueryId(),
+ chunkMetadataList.size(),
+ totalChunkPointsNum,
+ timeSeriesMetadata.isSeq());
}
cachedChunkMetadata.addAll(chunkMetadataList);
@@ -559,9 +562,12 @@ public class SeriesReader {
private void unpackOneChunkMetaData(IChunkMetadata chunkMetaData) throws
IOException {
List<IPageReader> pageReaderList =
FileLoaderUtils.loadPageReaderList(chunkMetaData, timeFilter);
- if (CONFIG.isEnablePerformanceTracing()) {
- addTotalPageNumInTracing(pageReaderList.size());
+
+ // for tracing: try to calculate the number of pages
+ if (context.isEnableTracing()) {
+ addTotalPageNumInTracing(context.getQueryId(), pageReaderList.size());
}
+
pageReaderList.forEach(
pageReader -> {
if (chunkMetaData.isSeq()) {
@@ -593,8 +599,8 @@ public class SeriesReader {
});
}
- private void addTotalPageNumInTracing(int pageNum) {
-
TracingManager.getInstance().getTracingInfo(context.getQueryId()).addTotalPageNum(pageNum);
+ private void addTotalPageNumInTracing(long queryId, int pageNum) {
+ TracingManager.getInstance().addTotalPageNum(queryId, pageNum);
}
/**
diff --git
a/server/src/main/java/org/apache/iotdb/db/query/reader/universal/PriorityMergeReader.java
b/server/src/main/java/org/apache/iotdb/db/query/reader/universal/PriorityMergeReader.java
index 5a61c23..e4f7a49 100644
---
a/server/src/main/java/org/apache/iotdb/db/query/reader/universal/PriorityMergeReader.java
+++
b/server/src/main/java/org/apache/iotdb/db/query/reader/universal/PriorityMergeReader.java
@@ -18,9 +18,8 @@
*/
package org.apache.iotdb.db.query.reader.universal;
-import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.query.context.QueryContext;
-import org.apache.iotdb.db.query.control.TracingManager;
+import org.apache.iotdb.db.query.control.tracing.TracingManager;
import org.apache.iotdb.tsfile.read.TimeValuePair;
import org.apache.iotdb.tsfile.read.reader.IPointReader;
@@ -79,16 +78,18 @@ public class PriorityMergeReader implements IPointReader {
if (reader.hasNextTimeValuePair()) {
heap.add(new Element(reader, reader.nextTimeValuePair(), priority));
currentReadStopTime = Math.max(currentReadStopTime, endTime);
- if
(IoTDBDescriptor.getInstance().getConfig().isEnablePerformanceTracing()) {
- addOverlappedPageNum(context);
+
+ // for tracing: try to calculate the number of overlapped pages
+ if (context.isEnableTracing()) {
+ addOverlappedPageNum(context.getQueryId());
}
} else {
reader.close();
}
}
- private void addOverlappedPageNum(QueryContext context) {
-
TracingManager.getInstance().getTracingInfo(context.getQueryId()).addOverlappedPageNum();
+ private void addOverlappedPageNum(long queryId) {
+ TracingManager.getInstance().addOverlappedPageNum(queryId);
}
public long getCurrentReadStopTime() {
diff --git a/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
b/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
index f937037..8e4b708 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
@@ -33,7 +33,6 @@ import
org.apache.iotdb.db.engine.trigger.service.TriggerRegistrationService;
import org.apache.iotdb.db.exception.StartupException;
import org.apache.iotdb.db.metadata.MManager;
import org.apache.iotdb.db.monitor.StatMonitor;
-import org.apache.iotdb.db.query.control.TracingManager;
import org.apache.iotdb.db.query.udf.service.TemporaryQueryDataFileService;
import org.apache.iotdb.db.query.udf.service.UDFClassLoaderManager;
import org.apache.iotdb.db.query.udf.service.UDFRegistrationService;
@@ -186,9 +185,6 @@ public class IoTDB implements IoTDBMBean {
public void shutdown() throws Exception {
logger.info("Deactivating IoTDB...");
- if
(IoTDBDescriptor.getInstance().getConfig().isEnablePerformanceTracing()) {
- TracingManager.getInstance().close();
- }
registerManager.shutdownAll();
PrimitiveArrayManager.close();
SystemInfo.getInstance().close();
diff --git
a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
index eb49121..7d3850a 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/TSServiceImpl.java
@@ -79,7 +79,8 @@ import org.apache.iotdb.db.query.context.QueryContext;
import org.apache.iotdb.db.query.control.QueryTimeManager;
import org.apache.iotdb.db.query.control.SessionManager;
import org.apache.iotdb.db.query.control.SessionTimeoutManager;
-import org.apache.iotdb.db.query.control.TracingManager;
+import org.apache.iotdb.db.query.control.tracing.TracingConstant;
+import org.apache.iotdb.db.query.control.tracing.TracingManager;
import org.apache.iotdb.db.query.dataset.AlignByDeviceDataSet;
import org.apache.iotdb.db.query.dataset.DirectAlignByTimeDataSet;
import org.apache.iotdb.db.query.dataset.DirectNonAlignDataSet;
@@ -127,6 +128,7 @@ import
org.apache.iotdb.service.rpc.thrift.TSRawDataQueryReq;
import org.apache.iotdb.service.rpc.thrift.TSSetSchemaTemplateReq;
import org.apache.iotdb.service.rpc.thrift.TSSetTimeZoneReq;
import org.apache.iotdb.service.rpc.thrift.TSStatus;
+import org.apache.iotdb.service.rpc.thrift.TSTracingInfo;
import
org.apache.iotdb.tsfile.exception.filter.QueryFilterOptimizationException;
import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType;
@@ -193,6 +195,9 @@ public class TSServiceImpl implements TSIService.Iface {
private static final AtomicInteger queryCount = new AtomicInteger(0);
private final QueryTimeManager queryTimeManager =
QueryTimeManager.getInstance();
private final SessionManager sessionManager = SessionManager.getInstance();
+ private final TracingManager tracingManager = TracingManager.getInstance();
+
+ private long startTime = -1L;
protected Planner processor;
protected IPlanExecutor executor;
@@ -591,6 +596,8 @@ public class TSServiceImpl implements TSIService.Iface {
@Override
public TSExecuteStatementResp executeStatement(TSExecuteStatementReq req) {
String statement = req.getStatement();
+ startTime = System.currentTimeMillis();
+
try {
if (!checkLogin(req.getSessionId())) {
return RpcUtils.getTSExecuteStatementResp(getNotLoggedInStatus());
@@ -748,20 +755,25 @@ public class TSServiceImpl implements TSIService.Iface {
AUDIT_LOGGER.debug(
"Session {} execute Query: {}", sessionManager.getCurrSessionId(),
statement);
- final long startTime = System.currentTimeMillis();
+ final long queryStartTime = System.currentTimeMillis();
final long queryId = sessionManager.requestQueryId(statementId, true);
- QueryContext context = genQueryContext(queryId, plan.isDebug(), startTime,
statement, timeout);
+ QueryContext context =
+ genQueryContext(queryId, plan.isDebug(), queryStartTime, statement,
timeout);
- try {
- if (plan instanceof QueryPlan && config.isEnablePerformanceTracing()) {
- TracingManager tracingManager = TracingManager.getInstance();
- if (!(plan instanceof AlignByDevicePlan)) {
- tracingManager.writeQueryInfo(queryId, statement, startTime,
plan.getPaths().size());
- } else {
- tracingManager.writeQueryInfo(queryId, statement, startTime);
- }
+ if (plan instanceof QueryPlan && ((QueryPlan) plan).isEnableTracing()) {
+ context.setEnableTracing(true);
+ tracingManager.setStartTime(queryId, this.startTime);
+ tracingManager.registerActivity(
+ queryId,
+ String.format(TracingConstant.ACTIVITY_START_EXECUTE, statement),
+ this.startTime);
+ tracingManager.registerActivity(queryId,
TracingConstant.ACTIVITY_PARSE_SQL, queryStartTime);
+ if (!(plan instanceof AlignByDevicePlan)) {
+ tracingManager.setSeriesPathNum(queryId, plan.getPaths().size());
}
+ }
+ try {
String username = sessionManager.getUsername(sessionId);
plan.setLoginUserName(username);
@@ -775,6 +787,10 @@ public class TSServiceImpl implements TSIService.Iface {
}
// create and cache dataset
QueryDataSet newDataSet = createQueryDataSet(context, plan, fetchSize);
+ if (plan instanceof QueryPlan && ((QueryPlan) plan).isEnableTracing()) {
+ tracingManager.registerActivity(
+ queryId, TracingConstant.ACTIVITY_CREATE_DATASET,
System.currentTimeMillis());
+ }
if (newDataSet.getEndPoint() != null && enableRedirect) {
// redirect query
@@ -830,13 +846,13 @@ public class TSServiceImpl implements TSIService.Iface {
resp.setQueryId(queryId);
- if (plan instanceof AlignByDevicePlan &&
config.isEnablePerformanceTracing()) {
- TracingManager.getInstance()
- .writePathsNum(queryId, ((AlignByDeviceDataSet)
newDataSet).getPathsNum());
+ if (plan instanceof AlignByDevicePlan && ((QueryPlan)
plan).isEnableTracing()) {
+ tracingManager.setSeriesPathNum(queryId, ((AlignByDeviceDataSet)
newDataSet).getPathsNum());
}
+
if (config.isEnableMetricService()) {
long endTime = System.currentTimeMillis();
- SqlArgument sqlArgument = new SqlArgument(resp, plan, statement,
startTime, endTime);
+ SqlArgument sqlArgument = new SqlArgument(resp, plan, statement,
queryStartTime, endTime);
synchronized (sqlArgumentList) {
sqlArgumentList.add(sqlArgument);
if (sqlArgumentList.size() >= MAX_SIZE) {
@@ -846,13 +862,21 @@ public class TSServiceImpl implements TSIService.Iface {
}
queryTimeManager.unRegisterQuery(queryId, false);
+ if (plan instanceof QueryPlan && ((QueryPlan) plan).isEnableTracing()) {
+ tracingManager.registerActivity(
+ queryId, TracingConstant.ACTIVITY_REQUEST_COMPLETE,
System.currentTimeMillis());
+
+ TSTracingInfo tsTracingInfo = fillRpcReturnTracingInfo(queryId);
+ resp.setTracingInfo(tsTracingInfo);
+ }
+
return resp;
} catch (Exception e) {
sessionManager.releaseQueryResourceNoExceptions(queryId);
throw e;
} finally {
- Measurement.INSTANCE.addOperationLatency(Operation.EXECUTE_QUERY,
startTime);
- long costTime = System.currentTimeMillis() - startTime;
+ Measurement.INSTANCE.addOperationLatency(Operation.EXECUTE_QUERY,
queryStartTime);
+ long costTime = System.currentTimeMillis() - queryStartTime;
if (costTime >= config.getSlowQueryThreshold()) {
SLOW_SQL_LOGGER.info("Cost: {} ms, sql is {}", costTime, statement);
}
@@ -1046,9 +1070,8 @@ public class TSServiceImpl implements TSIService.Iface {
queryCount.incrementAndGet();
AUDIT_LOGGER.debug(
"Session {} execute select into: {}",
sessionManager.getCurrSessionId(), statement);
- if (config.isEnablePerformanceTracing()) {
- TracingManager.getInstance()
- .writeQueryInfo(queryId, statement, startTime,
queryPlan.getPaths().size());
+ if (physicalPlan instanceof QueryPlan && ((QueryPlan)
physicalPlan).isEnableTracing()) {
+ tracingManager.setSeriesPathNum(queryId, queryPlan.getPaths().size());
}
try {
@@ -1178,6 +1201,10 @@ public class TSServiceImpl implements TSIService.Iface {
return ((DirectNonAlignDataSet) queryDataSet).fillBuffer(fetchSize,
encoder);
}
+ private TSTracingInfo fillRpcReturnTracingInfo(long queryId) {
+ return tracingManager.fillRpcReturnTracingInfo(queryId);
+ }
+
private WatermarkEncoder getWatermarkEncoder(String userName) throws
TException, AuthException {
IAuthorizer authorizer;
try {
diff --git
a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBRemovePartitionIT.java
b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBRemovePartitionIT.java
index 09a2c43..fdd4900 100644
---
a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBRemovePartitionIT.java
+++
b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBRemovePartitionIT.java
@@ -84,8 +84,8 @@ public class IoTDBRemovePartitionIT {
try (ResultSet resultSet = statement.executeQuery("SELECT * FROM
root.test1")) {
int count = 0;
while (resultSet.next()) {
- assertEquals(count / 2 * 100 + count % 2 * 50, resultSet.getLong(1));
- assertEquals(count / 2 * 100 + count % 2 * 50, resultSet.getLong(2));
+ assertEquals(count / 2 * 100L + count % 2 * 50,
resultSet.getLong(1));
+ assertEquals(count / 2 * 100L + count % 2 * 50,
resultSet.getLong(2));
count++;
}
assertEquals(20, count);
diff --git
a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBTracingIT.java
b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBTracingIT.java
index 43d3f81..869635c 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBTracingIT.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBTracingIT.java
@@ -18,53 +18,70 @@
*/
package org.apache.iotdb.db.integration;
-import org.apache.iotdb.db.conf.IoTDBConfig;
-import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.utils.EnvironmentUtils;
+import org.apache.iotdb.jdbc.AbstractIoTDBJDBCResultSet;
import org.apache.iotdb.jdbc.Config;
-import org.junit.AfterClass;
+import org.junit.After;
import org.junit.Assert;
-import org.junit.BeforeClass;
+import org.junit.Before;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
-import static org.junit.Assert.fail;
-
public class IoTDBTracingIT {
-
- @BeforeClass
- public static void setUp() {
- EnvironmentUtils.closeStatMonitor();
+ @Before
+ public void setUp() throws ClassNotFoundException {
EnvironmentUtils.envSetUp();
+ Class.forName(Config.JDBC_DRIVER_NAME);
+ prepareData();
}
- @AfterClass
- public static void tearDown() throws Exception {
+ @After
+ public void tearDown() throws Exception {
EnvironmentUtils.cleanEnv();
}
- @Test
- public void tracingTest() throws ClassNotFoundException {
- Class.forName(Config.JDBC_DRIVER_NAME);
+ private static void prepareData() {
try (Connection connection =
DriverManager.getConnection(
Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
Statement statement = connection.createStatement()) {
- IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig();
- Assert.assertEquals(false, config.isEnablePerformanceTracing());
+ statement.execute("SET STORAGE GROUP TO root.tracing");
+ statement.execute("CREATE TIMESERIES root.tracing.d1.s1 WITH
DATATYPE=INT32, ENCODING=RLE");
+
+ String insertTemplate = "INSERT INTO root.tracing.d1(timestamp, s1)
VALUES(%d,%d)";
- statement.execute("tracing on");
- Assert.assertEquals(true, config.isEnablePerformanceTracing());
+ for (int i = 100; i < 200; i++) {
+ statement.execute(String.format(insertTemplate, i, i));
+ }
+ statement.execute("FLUSH root.tracing");
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
- statement.execute("tracing off");
- Assert.assertEquals(false, config.isEnablePerformanceTracing());
+ @Test
+ public void tracingTest() {
+ try (Connection connection =
+ DriverManager.getConnection(
+ Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
+ Statement statement = connection.createStatement()) {
+ statement.execute("tracing select s1 from root.tracing.d1");
+ AbstractIoTDBJDBCResultSet resultSet = (AbstractIoTDBJDBCResultSet)
statement.getResultSet();
+ Assert.assertTrue(resultSet.isSetTracingInfo());
+ Assert.assertEquals(1, resultSet.getStatisticsByName("seriesPathNum"));
+ Assert.assertEquals(1, resultSet.getStatisticsByName("seqFileNum"));
+ Assert.assertEquals(0, resultSet.getStatisticsByName("unSeqFileNum"));
+ Assert.assertEquals(1, resultSet.getStatisticsByName("seqChunkNum"));
+ Assert.assertEquals(100,
resultSet.getStatisticsByName("seqChunkPointNum"));
+ Assert.assertEquals(0, resultSet.getStatisticsByName("unSeqChunkNum"));
+ Assert.assertEquals(0,
resultSet.getStatisticsByName("unSeqChunkPointNum"));
} catch (Exception e) {
e.printStackTrace();
- fail(e.getMessage());
}
}
}
diff --git
a/server/src/test/java/org/apache/iotdb/db/query/control/TracingManagerTest.java
b/server/src/test/java/org/apache/iotdb/db/query/control/TracingManagerTest.java
deleted file mode 100644
index 3dae0d9..0000000
---
a/server/src/test/java/org/apache/iotdb/db/query/control/TracingManagerTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.iotdb.db.query.control;
-
-import org.apache.iotdb.db.conf.IoTDBConstant;
-import org.apache.iotdb.db.conf.IoTDBDescriptor;
-import org.apache.iotdb.db.constant.TestConstant;
-import org.apache.iotdb.db.engine.fileSystem.SystemFileFactory;
-import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
-import org.apache.iotdb.db.utils.EnvironmentUtils;
-
-import org.apache.commons.io.FileUtils;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-public class TracingManagerTest {
-
- private final String tracingDir =
IoTDBDescriptor.getInstance().getConfig().getTracingDir();
- private TracingManager tracingManager;
- private final String sql = "select * from root.sg.device1 where time > 10";
- private final long queryId = 10;
-
- private Set<TsFileResource> seqResources = new HashSet<>();
-
- @Before
- public void setUp() {
- tracingManager = TracingManager.getInstance();
- prepareTsFileResources();
- }
-
- @After
- public void tearDown() throws IOException {
- FileUtils.deleteDirectory(new File(tracingDir));
- EnvironmentUtils.cleanAllDir();
- }
-
- @Test
- public void tracingQueryTest() throws IOException {
- if (!tracingManager.getWriterStatus()) {
- tracingManager.openTracingWriteStream();
- }
- String[] ans = {
- "Query Id: 10 - Query Statement: " + sql,
- "Query Id: 10 - Start time: 2020-12-",
- "Query Id: 10 - Number of series paths: 3",
- "Query Id: 10 - Query Statement: " + sql,
- "Query Id: 10 - Start time: 2020-12-",
- "Query Id: 10 - Number of series paths: 3",
- "Query Id: 10 - Number of sequence files: 1",
- "Query Id: 10 - SeqFiles: 1-1-0.tsfile",
- "Query Id: 10 - Number of unSequence files: 0",
- "Query Id: 10 - Number of chunks: 3, Average data points of chunks:
1371",
- "Query Id: 10 - Rate of overlapped pages: 50.0%, 10 overlapped pages in
total 20 pages",
- "Query Id: 10 - Total cost time: "
- };
- tracingManager.writeQueryInfo(queryId, sql, 1607529600000L);
- tracingManager.writePathsNum(queryId, 3);
- tracingManager.writeQueryInfo(queryId, sql, 1607529600000L, 3);
- tracingManager.writeTsFileInfo(queryId, seqResources,
Collections.EMPTY_SET);
- tracingManager.writeChunksInfo(queryId, 3, 4113L);
- tracingManager.writeOverlappedPageInfo(queryId, 20, 10);
- tracingManager.writeEndTime(queryId);
- tracingManager.close();
-
- File tracingFile =
- SystemFileFactory.INSTANCE.getFile(tracingDir + File.separator +
IoTDBConstant.TRACING_LOG);
- BufferedReader bufferedReader = new BufferedReader(new
FileReader(tracingFile));
- String str;
- int cnt = 0;
- while ((str = bufferedReader.readLine()) != null) {
- Assert.assertTrue(str.contains(ans[cnt++]));
- }
- bufferedReader.close();
- }
-
- void prepareTsFileResources() {
- Map<String, Integer> deviceToIndex = new HashMap<>();
- deviceToIndex.put("root.sg.d1", 0);
- deviceToIndex.put("root.sg.d2", 1);
- long[] startTimes = {1, 2};
- long[] endTimes = {999, 998};
- File file1 = new File(TestConstant.OUTPUT_DATA_DIR.concat("1-1-0.tsfile"));
- TsFileResource tsFileResource1 = new TsFileResource(file1, deviceToIndex,
startTimes, endTimes);
- tsFileResource1.setClosed(true);
- seqResources.add(tsFileResource1);
- }
-}
diff --git
a/server/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java
b/server/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java
index f9c2556..e3a3d77 100644
--- a/server/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java
+++ b/server/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java
@@ -38,7 +38,6 @@ import org.apache.iotdb.db.query.context.QueryContext;
import org.apache.iotdb.db.query.control.FileReaderManager;
import org.apache.iotdb.db.query.control.QueryResourceManager;
import org.apache.iotdb.db.query.control.QueryTimeManager;
-import org.apache.iotdb.db.query.control.TracingManager;
import org.apache.iotdb.db.query.udf.service.UDFRegistrationService;
import org.apache.iotdb.db.rescon.MemTableManager;
import org.apache.iotdb.db.rescon.PrimitiveArrayManager;
@@ -149,11 +148,6 @@ public class EnvironmentUtils {
QueryTimeManager.getInstance().clear();
- // close tracing
- if (config.isEnablePerformanceTracing()) {
- TracingManager.getInstance().close();
- }
-
// close array manager
PrimitiveArrayManager.close();
@@ -272,6 +266,7 @@ public class EnvironmentUtils {
}
createAllDir();
+
TEST_QUERY_JOB_ID = QueryResourceManager.getInstance().assignQueryId(true);
TEST_QUERY_CONTEXT = new QueryContext(TEST_QUERY_JOB_ID);
}
diff --git a/thrift/rpc-changelist.md b/thrift/rpc-changelist.md
index 797c0b6..24549f0 100644
--- a/thrift/rpc-changelist.md
+++ b/thrift/rpc-changelist.md
@@ -18,6 +18,28 @@
under the License.
-->
+
+# 0.12.x(version-1) -> 0.13.x(version-SNAPSHOT)
+
+Last Updated on 2021.10.14 by Minghui Liu.
+
+## 1. Delete Old
+
+| Latest Changes | Related Committers |
+| ---------------------------------- | ------------------ |
+
+## 2. Add New
+
+| Latest Changes | Related Committers |
+| ----------------- | ---------------------- |
+| Add TSTracingInfo | Minghui Liu |
+
+## 3. Update
+
+| Latest Changes | Related
Committers |
+| ------------------------------------------------------------ |
---------------------- |
+
+
# 0.11.x(version-2) -> 0.12.x(version-1)
Last Updated on 2021.01.19 by Xiangwei Wei.
diff --git a/thrift/src/main/thrift/rpc.thrift
b/thrift/src/main/thrift/rpc.thrift
index a00514b..c9ed36b 100644
--- a/thrift/src/main/thrift/rpc.thrift
+++ b/thrift/src/main/thrift/rpc.thrift
@@ -48,6 +48,20 @@ struct TSQueryNonAlignDataSet{
2: required list<binary> valueList
}
+struct TSTracingInfo{
+ 1: required list<string> activityList
+ 2: required list<i64> elapsedTimeList
+ 3: optional i32 seriesPathNum
+ 4: optional i32 seqFileNum
+ 5: optional i32 unSeqFileNum
+ 6: optional i32 sequenceChunkNum
+ 7: optional i64 sequenceChunkPointNum
+ 8: optional i32 unsequenceChunkNum
+ 9: optional i64 unsequenceChunkPointNum
+ 10: optional i32 totalPageNum
+ 11: optional i32 overlappedPageNum
+}
+
struct TSExecuteStatementResp {
1: required TSStatus status
2: optional i64 queryId
@@ -63,6 +77,7 @@ struct TSExecuteStatementResp {
9: optional map<string, i32> columnNameIndexMap
10: optional list<string> sgColumns
11: optional list<byte> aliasColumns
+ 12: optional TSTracingInfo tracingInfo
}
enum TSProtocolVersion {