From f95c1d7cb61ecc76c32a142711de09c31e2bb86a Mon Sep 17 00:00:00 2001 From: bigben0204 Date: Wed, 17 May 2023 10:52:47 +0800 Subject: [PATCH] [feat](profile) Add a new rest api to query instance host and ip information for query profile action in branch master(#18668) (#19643) --- .../http-actions/fe/query-profile-action.md | 26 ++++++++++++---- .../http-actions/fe/query-profile-action.md | 26 ++++++++++++---- .../common/profile/ProfileTreeBuilder.java | 30 ++++++++++++++----- 3 files changed, 65 insertions(+), 17 deletions(-) diff --git a/docs/en/docs/admin-manual/http-actions/fe/query-profile-action.md b/docs/en/docs/admin-manual/http-actions/fe/query-profile-action.md index 6c0a050bcf..095e88e247 100644 --- a/docs/en/docs/admin-manual/http-actions/fe/query-profile-action.md +++ b/docs/en/docs/admin-manual/http-actions/fe/query-profile-action.md @@ -276,7 +276,7 @@ Admin and Root user can view all queries. Ordinary users can only view the Query ### Description -Get the fragment name, instance id and execution time for the specified query id. +Get the fragment name, instance id, host ip/port and execution time for the specified query id. ### Path parameters @@ -301,7 +301,10 @@ Get the fragment name, instance id and execution time for the specified query id "fragment_id": "", "time": "", "instance_id": { - "": "" + "": { + "host": "", + "active_time": "" + } } } ], @@ -338,21 +341,34 @@ Response: "fragment_id": "0", "time": "36.169ms", "instance_id": { - "d7c93d9275334c35-9e6ac5f295a7134e": "36.169ms" + "d7c93d9275334c35-9e6ac5f295a7134e": { + "host": "172.19.0.4:9060", + "active_time": "36.169ms" + } } }, { "fragment_id": "1", "time": "20.710ms", "instance_id": { - "d7c93d9275334c35-9e6ac5f295a7134c": "20.710ms" + "d7c93d9275334c35-9e6ac5f295a7134c": { + "host": "172.19.0.5:9060", + "active_time": "20.710ms" + } } }, { "fragment_id": "2", "time": "7.83ms", "instance_id": { - "d7c93d9275334c35-9e6ac5f295a7134d": "7.83ms" + "d7c93d9275334c35-9e6ac5f295a7134d": { + "host": "172.19.0.6:9060", + "active_time": "7.83ms" + }, + "d7c93d9275334c35-9e6ac5f295a7134f": { + "host": "172.19.0.7:9060", + "active_time": "10.873ms" + } } } ], diff --git a/docs/zh-CN/docs/admin-manual/http-actions/fe/query-profile-action.md b/docs/zh-CN/docs/admin-manual/http-actions/fe/query-profile-action.md index 2a388c534c..c88a1c57b0 100644 --- a/docs/zh-CN/docs/admin-manual/http-actions/fe/query-profile-action.md +++ b/docs/zh-CN/docs/admin-manual/http-actions/fe/query-profile-action.md @@ -276,7 +276,7 @@ Admin 和 Root 用户可以查看所有 Query。普通用户仅能查看自己 ### Description -用于获取指定query id的fragment名称,instance id和执行时长。 +用于获取指定query id的fragment名称,instance id、主机IP及端口和执行时长。 ### Path parameters @@ -301,7 +301,10 @@ Admin 和 Root 用户可以查看所有 Query。普通用户仅能查看自己 "fragment_id": "", "time": "", "instance_id": { - "": "" + "": { + "host": "", + "active_time": "" + } } } ], @@ -338,21 +341,34 @@ Response: "fragment_id": "0", "time": "36.169ms", "instance_id": { - "d7c93d9275334c35-9e6ac5f295a7134e": "36.169ms" + "d7c93d9275334c35-9e6ac5f295a7134e": { + "host": "172.19.0.4:9060", + "active_time": "36.169ms" + } } }, { "fragment_id": "1", "time": "20.710ms", "instance_id": { - "d7c93d9275334c35-9e6ac5f295a7134c": "20.710ms" + "d7c93d9275334c35-9e6ac5f295a7134c": { + "host": "172.19.0.5:9060", + "active_time": "20.710ms" + } } }, { "fragment_id": "2", "time": "7.83ms", "instance_id": { - "d7c93d9275334c35-9e6ac5f295a7134d": "7.83ms" + "d7c93d9275334c35-9e6ac5f295a7134d": { + "host": "172.19.0.6:9060", + "active_time": "7.83ms" + }, + "d7c93d9275334c35-9e6ac5f295a7134f": { + "host": "172.19.0.7:9060", + "active_time": "10.873ms" + } } } ], diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/profile/ProfileTreeBuilder.java b/fe/fe-core/src/main/java/org/apache/doris/common/profile/ProfileTreeBuilder.java index 56a14e5b7d..f412cec556 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/common/profile/ProfileTreeBuilder.java +++ b/fe/fe-core/src/main/java/org/apache/doris/common/profile/ProfileTreeBuilder.java @@ -193,19 +193,20 @@ public class ProfileTreeBuilder { // 1. Get max active time of instances in this fragment List> instanceIdAndActiveTimeList = Lists.newArrayList(); List instances = Lists.newArrayList(); - Map instanceIdToTime = Maps.newHashMap(); + Map instanceIdToInstance = Maps.newHashMap(); long maxActiveTimeNs = 0; for (Pair pair : fragmentChildren) { Triple instanceIdAndActiveTime = getInstanceIdHostAndActiveTime(pair.first); - instanceIdToTime.put(instanceIdAndActiveTime.getLeft(), - RuntimeProfile.printCounter(instanceIdAndActiveTime.getRight(), TUnit.TIME_NS)); + instanceIdToInstance.put(instanceIdAndActiveTime.getLeft(), + new Instance(instanceIdAndActiveTime.getMiddle(), + RuntimeProfile.printCounter(instanceIdAndActiveTime.getRight(), TUnit.TIME_NS))); maxActiveTimeNs = Math.max(instanceIdAndActiveTime.getRight(), maxActiveTimeNs); instanceIdAndActiveTimeList.add(instanceIdAndActiveTime); instances.add(instanceIdAndActiveTime.getLeft()); } instanceActiveTimeMap.put(fragmentId, instanceIdAndActiveTimeList); fragmentsInstances.add(new FragmentInstances(fragmentId, - RuntimeProfile.printCounter(maxActiveTimeNs, TUnit.TIME_NS), instanceIdToTime)); + RuntimeProfile.printCounter(maxActiveTimeNs, TUnit.TIME_NS), instanceIdToInstance)); // 2. Build tree for all fragments // All instance in a fragment are same, so use first instance to build the fragment tree @@ -430,12 +431,27 @@ public class ProfileTreeBuilder { @JsonProperty("time") private String maxActiveTimeNs; @JsonProperty("instance_id") - private Map instanceIdToTime; + private Map instanceIdToInstance; - public FragmentInstances(String fragmentId, String maxActiveTimeNs, Map instanceIdToTime) { + public FragmentInstances(String fragmentId, String maxActiveTimeNs, + Map instanceIdToInstance) { this.fragmentId = fragmentId; this.maxActiveTimeNs = maxActiveTimeNs; - this.instanceIdToTime = instanceIdToTime; + this.instanceIdToInstance = instanceIdToInstance; + } + } + + @Getter + @Setter + public static class Instance { + @JsonProperty("host") + private String host; + @JsonProperty("active_time") + private String activeTime; + + public Instance(String host, String activeTime) { + this.host = host; + this.activeTime = activeTime; } } }