This is an automated email from the ASF dual-hosted git repository.
liulijia pushed a commit to branch branch-1.2-lts
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-1.2-lts by this push:
new 61e5874a99f [Improvement](profile) add catalog info in profile (#38326)
61e5874a99f is described below
commit 61e5874a99f88de04387bf42a980660d96dd2ded
Author: Yulei-Yang <[email protected]>
AuthorDate: Fri Jul 26 10:22:02 2024 +0800
[Improvement](profile) add catalog info in profile (#38326)
bp #38283 add `Default Catalog` column in load/query profile summary
---
.../doris/analysis/ShowQueryProfileStmt.java | 1 +
.../apache/doris/common/util/ProfileManager.java | 3 +-
.../apache/doris/load/loadv2/BrokerLoadJob.java | 2 +
.../java/org/apache/doris/qe/StmtExecutor.java | 1 +
.../suites/query_profile/test_profile.groovy | 149 +++++++++++++++++++++
5 files changed, 155 insertions(+), 1 deletion(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowQueryProfileStmt.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowQueryProfileStmt.java
index f5950698257..7c5791c970d 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowQueryProfileStmt.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowQueryProfileStmt.java
@@ -37,6 +37,7 @@ public class ShowQueryProfileStmt extends ShowStmt {
.addColumn(new Column("JobId",
ScalarType.createVarchar(128)))
.addColumn(new Column("QueryId",
ScalarType.createVarchar(128)))
.addColumn(new Column("User",
ScalarType.createVarchar(128)))
+ .addColumn(new Column("DefaultCatalog",
ScalarType.createVarchar(128)))
.addColumn(new Column("DefaultDb",
ScalarType.createVarchar(128)))
.addColumn(new Column("SQL",
ScalarType.createVarchar(65535)))
.addColumn(new Column("QueryType",
ScalarType.createVarchar(128)))
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/common/util/ProfileManager.java
b/fe/fe-core/src/main/java/org/apache/doris/common/util/ProfileManager.java
index bc7a810e5e2..a7ce1efbc43 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/util/ProfileManager.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/util/ProfileManager.java
@@ -68,6 +68,7 @@ public class ProfileManager {
public static final String QUERY_STATE = "Query State";
public static final String DORIS_VERSION = "Doris Version";
public static final String USER = "User";
+ public static final String DEFAULT_CATALOG = "Default Catalog";
public static final String DEFAULT_DB = "Default Db";
public static final String SQL_STATEMENT = "Sql Statement";
public static final String IS_CACHED = "Is Cached";
@@ -84,7 +85,7 @@ public class ProfileManager {
}
public static final List<String> PROFILE_HEADERS =
Collections.unmodifiableList(
- Arrays.asList(JOB_ID, QUERY_ID, USER, DEFAULT_DB, SQL_STATEMENT,
QUERY_TYPE,
+ Arrays.asList(JOB_ID, QUERY_ID, USER, DEFAULT_CATALOG, DEFAULT_DB,
SQL_STATEMENT, QUERY_TYPE,
START_TIME, END_TIME, TOTAL_TIME, QUERY_STATE, TRACE_ID));
private class ProfileElement {
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/BrokerLoadJob.java
b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/BrokerLoadJob.java
index 01bbd795f45..dde09f77258 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/BrokerLoadJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/BrokerLoadJob.java
@@ -38,6 +38,7 @@ import org.apache.doris.common.util.MetaLockUtils;
import org.apache.doris.common.util.ProfileManager;
import org.apache.doris.common.util.RuntimeProfile;
import org.apache.doris.common.util.TimeUtils;
+import org.apache.doris.datasource.InternalCatalog;
import org.apache.doris.load.BrokerFileGroup;
import org.apache.doris.load.BrokerFileGroupAggInfo.FileGroupAggKey;
import org.apache.doris.load.EtlJobType;
@@ -327,6 +328,7 @@ public class BrokerLoadJob extends BulkLoadJob {
summaryProfile.addInfoString(ProfileManager.QUERY_STATE, "N/A");
summaryProfile.addInfoString(ProfileManager.USER,
getUserInfo() != null ? getUserInfo().getQualifiedUser() :
"N/A");
+ summaryProfile.addInfoString(ProfileManager.DEFAULT_CATALOG,
InternalCatalog.INTERNAL_CATALOG_NAME);
summaryProfile.addInfoString(ProfileManager.DEFAULT_DB,
getDefaultDb());
summaryProfile.addInfoString(ProfileManager.SQL_STATEMENT,
this.getOriginStmt().originStmt);
summaryProfile.addInfoString(ProfileManager.IS_CACHED, "N/A");
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
index 57d63b688c8..8655019c094 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
@@ -307,6 +307,7 @@ public class StmtExecutor implements ProfileWriter {
infos.put(ProfileManager.QUERY_TYPE, queryType);
infos.put(ProfileManager.DORIS_VERSION, Version.DORIS_BUILD_VERSION);
infos.put(ProfileManager.USER, context.getQualifiedUser());
+ infos.put(ProfileManager.DEFAULT_CATALOG,
context.getCurrentCatalog().getName());
infos.put(ProfileManager.DEFAULT_DB, context.getDatabase());
infos.put(ProfileManager.SQL_STATEMENT, originStmt.originStmt);
infos.put(ProfileManager.IS_CACHED, isCached ? "Yes" : "No");
diff --git a/regression-test/suites/query_profile/test_profile.groovy
b/regression-test/suites/query_profile/test_profile.groovy
new file mode 100644
index 00000000000..9f26d10fbcf
--- /dev/null
+++ b/regression-test/suites/query_profile/test_profile.groovy
@@ -0,0 +1,149 @@
+// 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.
+
+import groovy.json.JsonSlurper
+
+/**
+ * @Params url is "/xxx"
+ * @Return response body
+ */
+def http_get(url) {
+ def dst = 'http://' + context.config.feHttpAddress
+ def conn = new URL(dst + url).openConnection()
+ conn.setRequestMethod("GET")
+ //token for root
+ conn.setRequestProperty("Authorization","Basic cm9vdDo=")
+ return conn.getInputStream().getText()
+}
+
+def SUCCESS_MSG = 'success'
+def SUCCESS_CODE = 0
+def QUERY_NUM = 5
+
+random = new Random()
+
+def getRandomNumber(int num){
+ return random.nextInt(num)
+}
+
+suite('test_profile') {
+
+ // nereids not return same profile with legacy planner, fallback to legacy
planner.
+ sql """set enable_nereids_planner=false"""
+
+ def table = 'test_profile_table'
+ def id_data = [1,2,3,4,5,6,7]
+ def value_data = [1,2,3,4,5,6,7]
+ def len = id_data.size
+
+ assertEquals(id_data.size, value_data.size)
+
+ sql """ DROP TABLE IF EXISTS ${table} """
+
+ sql """
+ CREATE TABLE IF NOT EXISTS ${table}(
+ `id` INT,
+ `cost` INT
+ )
+ DISTRIBUTED BY HASH(id) BUCKETS 1
+ PROPERTIES (
+ "replication_num" = "1"
+ )
+ """
+
+ sql """ SET enable_profile = true """
+
+ //———————— test for insert stmt ——————————
+ for(int i = 0; i < len; i++){
+ sql """ INSERT INTO ${table} values (${id_data[i]},
"${value_data[i]}") """
+ }
+
+ //———————— test for insert stmt (SQL) ——————————
+ log.info("test HTTP API interface for insert profile")
+ def url = '/rest/v1/query_profile/'
+ def query_list_result = http_get(url)
+
+ def obj = new JsonSlurper().parseText(query_list_result)
+ assertEquals(obj.msg, SUCCESS_MSG)
+ assertEquals(obj.code, SUCCESS_CODE)
+
+ for(int i = 0 ; i < len ; i++){
+ def insert_order = len - i - 1
+ def stmt_query_info = obj.data.rows[i]
+
+ assertNotNull(stmt_query_info["Profile ID"])
+ assertNotEquals(stmt_query_info["Profile ID"], "N/A")
+ assertNotNull(stmt_query_info["Default Catalog"])
+
+ assertEquals(stmt_query_info['Sql Statement'].toString(),
+ """ INSERT INTO ${table} values (${id_data[insert_order]},
"${value_data[insert_order]}") """.toString())
+ }
+
+ //———————— test for select stmt ———————————
+ def op_data = ["<", ">", "=", "<=", ">="]
+
+ def ops = []
+ def nums = []
+
+ for(int i = 0 ; i < QUERY_NUM ; i++){
+ ops.add(op_data[getRandomNumber(5)])
+ nums.add(getRandomNumber(len + 1))
+ sql """ SELECT * FROM ${table} WHERE cost ${ops[i]} ${nums[i]} """
+ }
+
+
+ /* test for `show query profile` stmt
+ query profile header
+
JobID|QueryId|User|DefaultDb|SQL|QueryType|StartTime|EndTime|TotalTime|QueryState
*/
+ //———————— test for select stmt (SQL) ———————————
+ log.info("test for show query profile stmt")
+ List<List<Object>> show_query_profile_obj = sql """ show query profile "/"
"""
+ log.info("found ${show_query_profile_obj.size} profile data".toString())
+ assertTrue(show_query_profile_obj.size >= QUERY_NUM)
+
+ for(int i = 0 ; i < QUERY_NUM ; i++){
+ def insert_order = QUERY_NUM - i - 1
+ def current_obj = show_query_profile_obj[i]
+ def stmt_query_info = current_obj[8]
+ assertNotEquals(current_obj[1].toString(), "N/A".toString())
+ assertEquals(stmt_query_info.toString(), """ SELECT * FROM ${table}
WHERE cost ${ops[insert_order]} ${nums[insert_order]} """.toString())
+ }
+
+ //———————— test for select stmt (HTTP)————————
+ log.info("test HTTP API interface for query profile")
+ url = '/rest/v1/query_profile/'
+ query_list_result = http_get(url)
+
+ obj = new JsonSlurper().parseText(query_list_result)
+ assertEquals(obj.msg, SUCCESS_MSG)
+ assertEquals(obj.code, SUCCESS_CODE)
+
+ for(int i = 0 ; i < QUERY_NUM ; i++){
+ def insert_order = QUERY_NUM - i - 1
+ def stmt_query_info = obj.data.rows[i]
+
+ assertNotNull(stmt_query_info["Profile ID"])
+ assertNotEquals(stmt_query_info["Profile ID"].toString(),
"N/A".toString())
+ assertNotNull(stmt_query_info["Default Catalog"])
+ assertEquals(stmt_query_info['Sql Statement'].toString(),
+ """ SELECT * FROM ${table} WHERE cost ${ops[insert_order]}
${nums[insert_order]} """.toString())
+ }
+
+ //———————— clean table and disable profile ————————
+ sql """ SET enable_profile = false """
+ sql """ DROP TABLE IF EXISTS ${table} """
+}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]