This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push:
new 22830ea [feature](show) add new statement show proc
'/current_query_stmts' (#7487)
22830ea is described below
commit 22830ea49899de91c7de77e37095fcf25fbf900a
Author: caiconghui <[email protected]>
AuthorDate: Fri Jan 28 22:23:13 2022 +0800
[feature](show) add new statement show proc '/current_query_stmts' (#7487)
To show the the query statement at first level.
---
.../org/apache/doris/analysis/ShowProcStmt.java | 7 +--
.../common/proc/CurrentQueryFragmentProcNode.java | 20 -------
...ir.java => CurrentQueryStatementsProcNode.java} | 67 +++++-----------------
.../common/proc/CurrentQueryStatisticsProcDir.java | 16 ++----
.../org/apache/doris/common/proc/ProcService.java | 9 ++-
5 files changed, 26 insertions(+), 93 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowProcStmt.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowProcStmt.java
index 561fbd0..fb00d8d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowProcStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowProcStmt.java
@@ -46,14 +46,9 @@ public class ShowProcStmt extends ShowStmt {
@Override
public void analyze(Analyzer analyzer) throws AnalysisException {
if
(!Catalog.getCurrentCatalog().getAuth().checkGlobalPriv(ConnectContext.get(),
PrivPredicate.ADMIN)) {
-
ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR,
- "ADMIN");
+
ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR,
"ADMIN");
}
-
node = ProcService.getInstance().open(path);
- if (node == null) {
- ErrorReport.reportAnalysisException(ErrorCode.ERR_WRONG_PROC_PATH,
path);
- }
}
@Override
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/common/proc/CurrentQueryFragmentProcNode.java
b/fe/fe-core/src/main/java/org/apache/doris/common/proc/CurrentQueryFragmentProcNode.java
index 619869e..166df29 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/common/proc/CurrentQueryFragmentProcNode.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/common/proc/CurrentQueryFragmentProcNode.java
@@ -19,11 +19,8 @@ package org.apache.doris.common.proc;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
-import org.apache.doris.catalog.Catalog;
import org.apache.doris.common.AnalysisException;
import org.apache.doris.qe.QueryStatisticsItem;
-import org.apache.doris.system.Backend;
-import org.apache.doris.thrift.TNetworkAddress;
import org.apache.doris.common.util.QueryStatisticsFormatter;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -52,23 +49,6 @@ public class CurrentQueryFragmentProcNode implements
ProcNodeInterface {
return requestFragmentExecInfos();
}
- private TNetworkAddress toBrpcHost(TNetworkAddress host) throws
AnalysisException {
- final Backend backend =
Catalog.getCurrentSystemInfo().getBackendWithBePort(
- host.getHostname(), host.getPort());
- if (backend == null) {
- throw new AnalysisException(new StringBuilder("Backend ")
- .append(host.getHostname())
- .append(":")
- .append(host.getPort())
- .append(" does not exist")
- .toString());
- }
- if (backend.getBrpcPort() < 0) {
- throw new AnalysisException("BRPC port isn't exist.");
- }
- return new TNetworkAddress(backend.getHost(), backend.getBrpcPort());
- }
-
private ProcResult requestFragmentExecInfos() throws AnalysisException {
final CurrentQueryInfoProvider provider = new
CurrentQueryInfoProvider();
final Collection<CurrentQueryInfoProvider.InstanceStatistics>
instanceStatisticsCollection
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/common/proc/CurrentQueryStatisticsProcDir.java
b/fe/fe-core/src/main/java/org/apache/doris/common/proc/CurrentQueryStatementsProcNode.java
similarity index 51%
copy from
fe/fe-core/src/main/java/org/apache/doris/common/proc/CurrentQueryStatisticsProcDir.java
copy to
fe/fe-core/src/main/java/org/apache/doris/common/proc/CurrentQueryStatementsProcNode.java
index af42797..3b0474d 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/common/proc/CurrentQueryStatisticsProcDir.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/common/proc/CurrentQueryStatementsProcNode.java
@@ -17,56 +17,30 @@
package org.apache.doris.common.proc;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import org.apache.commons.codec.digest.DigestUtils;
import org.apache.doris.common.AnalysisException;
-import org.apache.doris.common.util.QueryStatisticsFormatter;
import org.apache.doris.qe.QeProcessorImpl;
import org.apache.doris.qe.QueryStatisticsItem;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-
-import java.util.Comparator;
import java.util.List;
import java.util.Map;
/*
- * show proc "/current_queries"
- * only set variable "set is_report_success = true" to enable "ScanBytes" and
"ProcessRows".
+ * show proc "/current_query_stmts"
*/
-public class CurrentQueryStatisticsProcDir implements ProcDirInterface {
- private static final Logger LOG =
LogManager.getLogger(CurrentQueryStatisticsProcDir.class);
+public class CurrentQueryStatementsProcNode implements ProcNodeInterface {
public static final ImmutableList<String> TITLE_NAMES = new
ImmutableList.Builder<String>()
.add("QueryId").add("ConnectionId").add("Database").add("User")
- .add("ScanBytes").add("ProcessRows").add("ExecTime").build();
+ .add("ExecTime").add("SqlHash").add("Statement").build();
- private static final int EXEC_TIME_INDEX = 6;
-
- @Override
- public boolean register(String name, ProcNodeInterface node) {
- return false;
- }
-
- @Override
- public ProcNodeInterface lookup(String name) throws AnalysisException {
- if (Strings.isNullOrEmpty(name)) {
- return null;
- }
- final Map<String, QueryStatisticsItem> statistic =
QeProcessorImpl.INSTANCE.getQueryStatistics();
- final QueryStatisticsItem item = statistic.get(name);
- if (item == null) {
- throw new AnalysisException(name + " doesn't exist.");
- }
- return new CurrentQuerySqlProcDir(item);
- }
+ private static final int EXEC_TIME_INDEX = 5;
@Override
public ProcResult fetchResult() throws AnalysisException {
final BaseProcResult result = new BaseProcResult();
- final Map<String, QueryStatisticsItem> statistic =
+ final Map<String, QueryStatisticsItem> statistic =
QeProcessorImpl.INSTANCE.getQueryStatistics();
result.setNames(TITLE_NAMES.asList());
final List<List<String>> sortedRowData = Lists.newArrayList();
@@ -80,28 +54,17 @@ public class CurrentQueryStatisticsProcDir implements
ProcDirInterface {
values.add(item.getConnId());
values.add(item.getDb());
values.add(item.getUser());
- if (item.getIsReportSucc()) {
- final CurrentQueryInfoProvider.QueryStatistics statistics
- = statisticsMap.get(item.getQueryId());
- values.add(QueryStatisticsFormatter.getScanBytes(
- statistics.getScanBytes()));
- values.add(QueryStatisticsFormatter.getRowsReturned(
- statistics.getRowsReturned()));
- } else {
- values.add("N/A");
- values.add("N/A");
- }
values.add(item.getQueryExecTime());
+ values.add(DigestUtils.md5Hex(item.getSql()));
+ values.add(item.getSql());
sortedRowData.add(values);
}
+
// sort according to ExecTime
- sortedRowData.sort(new Comparator<List<String>>() {
- @Override
- public int compare(List<String> l1, List<String> l2) {
- final int execTime1 = Integer.valueOf(l1.get(EXEC_TIME_INDEX));
- final int execTime2 = Integer.valueOf(l2.get(EXEC_TIME_INDEX));
- return execTime1 <= execTime2 ? 1 : -1;
- }
+ sortedRowData.sort((l1, l2) -> {
+ final int execTime1 = Integer.parseInt(l1.get(EXEC_TIME_INDEX));
+ final int execTime2 = Integer.parseInt(l2.get(EXEC_TIME_INDEX));
+ return execTime2 - execTime1;
});
result.setRows(sortedRowData);
return result;
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/common/proc/CurrentQueryStatisticsProcDir.java
b/fe/fe-core/src/main/java/org/apache/doris/common/proc/CurrentQueryStatisticsProcDir.java
index af42797..a2c1818 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/common/proc/CurrentQueryStatisticsProcDir.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/common/proc/CurrentQueryStatisticsProcDir.java
@@ -26,10 +26,6 @@ import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-
-import java.util.Comparator;
import java.util.List;
import java.util.Map;
@@ -38,7 +34,6 @@ import java.util.Map;
* only set variable "set is_report_success = true" to enable "ScanBytes" and
"ProcessRows".
*/
public class CurrentQueryStatisticsProcDir implements ProcDirInterface {
- private static final Logger LOG =
LogManager.getLogger(CurrentQueryStatisticsProcDir.class);
public static final ImmutableList<String> TITLE_NAMES = new
ImmutableList.Builder<String>()
.add("QueryId").add("ConnectionId").add("Database").add("User")
.add("ScanBytes").add("ProcessRows").add("ExecTime").build();
@@ -95,13 +90,10 @@ public class CurrentQueryStatisticsProcDir implements
ProcDirInterface {
sortedRowData.add(values);
}
// sort according to ExecTime
- sortedRowData.sort(new Comparator<List<String>>() {
- @Override
- public int compare(List<String> l1, List<String> l2) {
- final int execTime1 = Integer.valueOf(l1.get(EXEC_TIME_INDEX));
- final int execTime2 = Integer.valueOf(l2.get(EXEC_TIME_INDEX));
- return execTime1 <= execTime2 ? 1 : -1;
- }
+ sortedRowData.sort((l1, l2) -> {
+ final int execTime1 = Integer.parseInt(l1.get(EXEC_TIME_INDEX));
+ final int execTime2 = Integer.parseInt(l2.get(EXEC_TIME_INDEX));
+ return execTime2 - execTime1;
});
result.setRows(sortedRowData);
return result;
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/common/proc/ProcService.java
b/fe/fe-core/src/main/java/org/apache/doris/common/proc/ProcService.java
index bd10b7b..b0c4a79 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/proc/ProcService.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/proc/ProcService.java
@@ -22,6 +22,8 @@ import org.apache.doris.common.AnalysisException;
import com.google.common.base.Strings;
+import org.apache.doris.common.ErrorCode;
+import org.apache.doris.common.ErrorReport;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -48,6 +50,7 @@ public final class ProcService {
root.register("trash", new TrashProcDir());
root.register("monitor", new MonitorProcDir());
root.register("current_queries", new CurrentQueryStatisticsProcDir());
+ root.register("current_query_stmts", new
CurrentQueryStatementsProcNode());
root.register("current_backend_instances", new
CurrentQueryBackendInstanceProcDir());
root.register("cluster_balance", new ClusterBalanceProcDir());
root.register("routine_loads", new RoutineLoadsProcDir());
@@ -120,7 +123,7 @@ public final class ProcService {
// the last character of path is '/', the current is must a directory
if (pos == last) {
// now pos == path.length()
- if (curNode == null || !(curNode instanceof ProcDirInterface)) {
+ if (!(curNode instanceof ProcDirInterface)) {
String errMsg = path + " is not a directory";
LOG.warn(errMsg);
throw new AnalysisException(errMsg);
@@ -137,7 +140,7 @@ public final class ProcService {
// 这里使用pos,因为有可能path后面会有space字段被提前截断
curNode = ((ProcDirInterface) curNode).lookup(path.substring(last,
pos));
if (curNode == null) {
- throw new AnalysisException("Cannot find path: " + path);
+ ErrorReport.reportAnalysisException(ErrorCode.ERR_WRONG_PROC_PATH,
path);
}
return curNode;
}
@@ -145,7 +148,7 @@ public final class ProcService {
// 将node注册到根节点下的name下
public synchronized boolean register(String name, ProcNodeInterface node) {
if (Strings.isNullOrEmpty(name) || node == null) {
- LOG.warn("register porc service invalid input.");
+ LOG.warn("register proc service invalid input.");
return false;
}
if (root.lookup(name) != null) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]