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

wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git


The following commit(s) were added to refs/heads/master by this push:
     new 85b03402e4 Support async query for the composite GraphQL query. 
(#12525)
85b03402e4 is described below

commit 85b03402e44bd2fdd9499bd20de3ddbf17e41707
Author: Wan Kai <[email protected]>
AuthorDate: Tue Aug 13 16:31:04 2024 +0800

    Support async query for the composite GraphQL query. (#12525)
---
 docs/en/changes/changes.md                         |   1 +
 .../oap/query/debug/DebuggingHTTPHandler.java      |  31 ++--
 .../oap/query/promql/handler/PromQLApiHandler.java |   8 +-
 .../query/graphql/resolver/AggregationQuery.java   |  10 +-
 .../oap/query/graphql/resolver/AlarmQuery.java     |  42 +++--
 .../query/graphql/resolver/AsyncQueryUtils.java    |  41 +++++
 .../query/graphql/resolver/BrowserLogQuery.java    |  11 +-
 .../graphql/resolver/ContinuousProfilingQuery.java |  15 +-
 .../resolver/EBPFProcessProfilingQuery.java        |  34 ++--
 .../oap/query/graphql/resolver/EventQuery.java     |   7 +-
 .../oap/query/graphql/resolver/HierarchyQuery.java |  15 +-
 .../oap/query/graphql/resolver/LogQuery.java       |  41 +++--
 .../query/graphql/resolver/MetadataQueryV2.java    |  52 +++---
 .../oap/query/graphql/resolver/MetricQuery.java    |  22 +--
 .../graphql/resolver/MetricsExpressionQuery.java   |  90 +++++-----
 .../oap/query/graphql/resolver/MetricsQuery.java   | 198 +++++++++++----------
 .../query/graphql/resolver/OndemandLogQuery.java   |   4 +-
 .../oap/query/graphql/resolver/ProfileQuery.java   |  21 +--
 .../oap/query/graphql/resolver/RecordsQuery.java   |  17 +-
 .../query/graphql/resolver/TopNRecordsQuery.java   |   2 +-
 .../oap/query/graphql/resolver/TopologyQuery.java  | 190 ++++++++++----------
 .../oap/query/graphql/resolver/TraceQuery.java     |  74 ++++----
 22 files changed, 515 insertions(+), 411 deletions(-)

diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md
index c0b22df024..a06d102a9a 100644
--- a/docs/en/changes/changes.md
+++ b/docs/en/changes/changes.md
@@ -49,6 +49,7 @@
 * Add Unknown Node when receive Kubernetes peer address is not aware in 
current cluster.
 * Fix CounterWindow concurrent increase cause NPE by PriorityQueue
 * Fix format the endpoint name with empty string.
+* Support async query for the composite GraphQL query.
 
 #### UI
 
diff --git 
a/oap-server/server-query-plugin/debugging-query-plugin/src/main/java/org/apache/skywalking/oap/query/debug/DebuggingHTTPHandler.java
 
b/oap-server/server-query-plugin/debugging-query-plugin/src/main/java/org/apache/skywalking/oap/query/debug/DebuggingHTTPHandler.java
index 50797750c2..8b52f37075 100644
--- 
a/oap-server/server-query-plugin/debugging-query-plugin/src/main/java/org/apache/skywalking/oap/query/debug/DebuggingHTTPHandler.java
+++ 
b/oap-server/server-query-plugin/debugging-query-plugin/src/main/java/org/apache/skywalking/oap/query/debug/DebuggingHTTPHandler.java
@@ -148,7 +148,7 @@ public class DebuggingHTTPHandler {
         duration.setStart(startTime);
         duration.setEnd(endTime);
         duration.setStep(Step.valueOf(step));
-        ExpressionResult expressionResult = 
mqeQuery.execExpression(expression, entity, duration, true, dumpStorageRsp);
+        ExpressionResult expressionResult = 
mqeQuery.execExpression(expression, entity, duration, true, 
dumpStorageRsp).join();
         DebuggingTrace execTrace = expressionResult.getDebuggingTrace();
         DebuggingMQERsp result = new DebuggingMQERsp(
             expressionResult.getType(), expressionResult.getResults(), 
expressionResult.getError(),
@@ -160,8 +160,8 @@ public class DebuggingHTTPHandler {
 
     @SneakyThrows
     @Get("/debugging/query/trace/queryBasicTraces")
-    public String queryBasicTraces(@Param("service") String service,
-                                   @Param("serviceLayer") String serviceLayer,
+    public String queryBasicTraces(@Param("service") Optional<String> service,
+                                   @Param("serviceLayer") Optional<String> 
serviceLayer,
                                    @Param("serviceInstance") Optional<String> 
serviceInstance,
                                    @Param("endpoint") Optional<String> 
endpoint,
                                    @Param("traceId") Optional<String> traceId,
@@ -176,10 +176,11 @@ public class DebuggingHTTPHandler {
                                    @Param("pageNum") int pageNum,
                                    @Param("pageSize") int pageSize
     ) {
-        String serviceId = IDManager.ServiceID.buildId(service, 
Layer.nameOf(serviceLayer).isNormal());
+        Optional<String> serviceId = service.map(
+            name -> IDManager.ServiceID.buildId(name, 
Layer.nameOf(serviceLayer.orElseThrow()).isNormal()));
         Optional<String> serviceInstanceId = serviceInstance.map(
-            name -> IDManager.ServiceInstanceID.buildId(serviceId, name));
-        Optional<String> endpointId = endpoint.map(name -> 
IDManager.EndpointID.buildId(serviceId, name));
+            name -> 
IDManager.ServiceInstanceID.buildId(serviceId.orElseThrow(), name));
+        Optional<String> endpointId = endpoint.map(name -> 
IDManager.EndpointID.buildId(serviceId.orElseThrow(), name));
         Duration duration = new Duration();
         duration.setStart(startTime);
         duration.setEnd(endTime);
@@ -188,7 +189,7 @@ public class DebuggingHTTPHandler {
         pagination.setPageNum(pageNum);
         pagination.setPageSize(pageSize);
         TraceQueryCondition condition = new TraceQueryCondition();
-        condition.setServiceId(serviceId);
+        condition.setServiceId(serviceId.orElse(null));
         condition.setServiceInstanceId(serviceInstanceId.orElse(null));
         condition.setEndpointId(endpointId.orElse(null));
         condition.setTraceId(traceId.orElse(null));
@@ -210,7 +211,7 @@ public class DebuggingHTTPHandler {
             condition.setTags(tagList);
         });
 
-        TraceBrief traceBrief = traceQuery.queryBasicTraces(condition, true);
+        TraceBrief traceBrief = traceQuery.queryBasicTraces(condition, 
true).join();
         DebuggingQueryTraceBriefRsp result = new DebuggingQueryTraceBriefRsp(
             traceBrief.getTraces(), 
transformTrace(traceBrief.getDebuggingTrace()));
         return transToYAMLString(result);
@@ -219,7 +220,7 @@ public class DebuggingHTTPHandler {
     @SneakyThrows
     @Get("/debugging/query/trace/queryTrace")
     public String queryTrace(@Param("traceId") String traceId) {
-        Trace trace = traceQuery.queryTrace(traceId, true);
+        Trace trace = traceQuery.queryTrace(traceId, true).join();
         DebuggingQueryTraceRsp result = new DebuggingQueryTraceRsp(
             trace.getSpans(), transformTrace(trace.getDebuggingTrace()));
         return transToYAMLString(result);
@@ -297,7 +298,7 @@ public class DebuggingHTTPHandler {
         duration.setStart(startTime);
         duration.setEnd(endTime);
         duration.setStep(Step.valueOf(step));
-        Topology topology = topologyQuery.getGlobalTopology(duration, 
serviceLayer.orElse(null), true);
+        Topology topology = topologyQuery.getGlobalTopology(duration, 
serviceLayer.orElse(null), true).join();
         DebuggingQueryServiceTopologyRsp result = new 
DebuggingQueryServiceTopologyRsp(
             topology.getNodes(), topology.getCalls(), 
transformTrace(topology.getDebuggingTrace()));
         return transToYAMLString(result);
@@ -318,7 +319,7 @@ public class DebuggingHTTPHandler {
         List<String> ids = Arrays.stream(services.split(Const.COMMA))
                                  .map(name -> 
IDManager.ServiceID.buildId(name, Layer.nameOf(serviceLayer).isNormal()))
                                  .collect(Collectors.toList());
-        Topology topology = topologyQuery.getServicesTopology(ids, duration, 
true);
+        Topology topology = topologyQuery.getServicesTopology(ids, duration, 
true).join();
         DebuggingQueryServiceTopologyRsp result = new 
DebuggingQueryServiceTopologyRsp(
             topology.getNodes(), topology.getCalls(), 
transformTrace(topology.getDebuggingTrace()));
         return transToYAMLString(result);
@@ -339,7 +340,7 @@ public class DebuggingHTTPHandler {
         duration.setStep(Step.valueOf(step));
         String clientServiceId = IDManager.ServiceID.buildId(clientService, 
Layer.nameOf(clientServiceLayer).isNormal());
         String serverServiceId = IDManager.ServiceID.buildId(serverService, 
Layer.nameOf(serverServiceLayer).isNormal());
-        ServiceInstanceTopology topology = 
topologyQuery.getServiceInstanceTopology(clientServiceId, serverServiceId, 
duration, true);
+        ServiceInstanceTopology topology = 
topologyQuery.getServiceInstanceTopology(clientServiceId, serverServiceId, 
duration, true).join();
         DebuggingQueryInstanceTopologyRsp result = new 
DebuggingQueryInstanceTopologyRsp(
             topology.getNodes(), topology.getCalls(), 
transformTrace(topology.getDebuggingTrace()));
         return transToYAMLString(result);
@@ -359,7 +360,7 @@ public class DebuggingHTTPHandler {
         duration.setStep(Step.valueOf(step));
         String endpointId = IDManager.EndpointID.buildId(
             IDManager.ServiceID.buildId(service, 
Layer.nameOf(serviceLayer).isNormal()), endpoint);
-        EndpointTopology topology = 
topologyQuery.getEndpointDependencies(endpointId, duration, true);
+        EndpointTopology topology = 
topologyQuery.getEndpointDependencies(endpointId, duration, true).join();
         DebuggingQueryEndpointTopologyRsp result = new 
DebuggingQueryEndpointTopologyRsp(
             topology.getNodes(), topology.getCalls(), 
transformTrace(topology.getDebuggingTrace()));
         return transToYAMLString(result);
@@ -379,7 +380,7 @@ public class DebuggingHTTPHandler {
         duration.setStep(Step.valueOf(step));
         String instanceId = IDManager.ServiceInstanceID.buildId(
             IDManager.ServiceID.buildId(service, 
Layer.nameOf(serviceLayer).isNormal()), process);
-        ProcessTopology topology = 
topologyQuery.getProcessTopology(instanceId, duration, true);
+        ProcessTopology topology = 
topologyQuery.getProcessTopology(instanceId, duration, true).join();
         DebuggingQueryProcessTopologyRsp result = new 
DebuggingQueryProcessTopologyRsp(
             topology.getNodes(), topology.getCalls(), 
transformTrace(topology.getDebuggingTrace()));
         return transToYAMLString(result);
@@ -447,7 +448,7 @@ public class DebuggingHTTPHandler {
         excludingKeywordsOfContent.ifPresent(e -> 
condition.setExcludingKeywordsOfContent(
             Arrays.stream(e.split(Const.COMMA)).collect(Collectors.toList())));
 
-        Logs logs = logQuery.queryLogs(condition, true);
+        Logs logs = logQuery.queryLogs(condition, true).join();
         DebuggingQueryLogsRsp result = new DebuggingQueryLogsRsp(
             logs.getLogs(), logs.getErrorReason(), 
transformTrace(logs.getDebuggingTrace()));
         return transToYAMLString(result);
diff --git 
a/oap-server/server-query-plugin/promql-plugin/src/main/java/org/apache/skywalking/oap/query/promql/handler/PromQLApiHandler.java
 
b/oap-server/server-query-plugin/promql-plugin/src/main/java/org/apache/skywalking/oap/query/promql/handler/PromQLApiHandler.java
index e47f0d20b4..9e2fd47eae 100644
--- 
a/oap-server/server-query-plugin/promql-plugin/src/main/java/org/apache/skywalking/oap/query/promql/handler/PromQLApiHandler.java
+++ 
b/oap-server/server-query-plugin/promql-plugin/src/main/java/org/apache/skywalking/oap/query/promql/handler/PromQLApiHandler.java
@@ -309,11 +309,11 @@ public class PromQLApiHandler {
         } else if (Objects.equals(metricName, ServiceTraffic.INDEX_NAME)) {
             String serviceName = 
parseResult.getLabelMap().get(LabelName.SERVICE.getLabel());
             if (StringUtil.isNotBlank(serviceName)) {
-                Service service = metadataQuery.findService(serviceName);
+                Service service = 
metadataQuery.findService(serviceName).join();
                 response.getData().add(buildMetricInfoFromTraffic(metricName, 
service));
             } else {
                 List<Service> services = metadataQuery.listServices(
-                    parseResult.getLabelMap().get(LabelName.LAYER.getLabel()));
+                    
parseResult.getLabelMap().get(LabelName.LAYER.getLabel())).join();
                 services.forEach(service -> {
                     
response.getData().add(buildMetricInfoFromTraffic(metricName, service));
                 });
@@ -322,7 +322,7 @@ public class PromQLApiHandler {
             String serviceName = 
parseResult.getLabelMap().get(LabelName.SERVICE.getLabel());
             String layer = 
parseResult.getLabelMap().get(LabelName.LAYER.getLabel());
             List<ServiceInstance> instances = metadataQuery.listInstances(
-                duration, IDManager.ServiceID.buildId(serviceName, 
Layer.valueOf(layer).isNormal()));
+                duration, IDManager.ServiceID.buildId(serviceName, 
Layer.valueOf(layer).isNormal())).join();
             instances.forEach(instance -> {
                 response.getData().add(buildMetricInfoFromTraffic(metricName, 
instance));
             });
@@ -334,7 +334,7 @@ public class PromQLApiHandler {
             List<Endpoint> endpoints = metadataQuery.findEndpoint(
                 keyword, IDManager.ServiceID.buildId(serviceName, 
Layer.valueOf(layer).isNormal()),
                 Integer.parseInt(limit)
-            );
+            ).join();
             endpoints.forEach(endpoint -> {
                 response.getData().add(buildMetricInfoFromTraffic(metricName, 
endpoint));
             });
diff --git 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AggregationQuery.java
 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AggregationQuery.java
index 8eaea9976d..ebbcedbf58 100644
--- 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AggregationQuery.java
+++ 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AggregationQuery.java
@@ -49,7 +49,7 @@ public class AggregationQuery implements GraphQLQueryResolver 
{
         condition.setOrder(order);
         condition.setTopN(topN);
         List<TopNEntity> list = new ArrayList<>();
-        query.sortMetrics(condition, duration).forEach(selectedRecord -> {
+        query.sortMetrics(condition, duration).join().forEach(selectedRecord 
-> {
             TopNEntity entity = new TopNEntity(selectedRecord);
             list.add(entity);
         });
@@ -64,7 +64,7 @@ public class AggregationQuery implements GraphQLQueryResolver 
{
         condition.setOrder(order);
         condition.setTopN(topN);
         List<TopNEntity> list = new ArrayList<>();
-        query.sortMetrics(condition, duration).forEach(selectedRecord -> {
+        query.sortMetrics(condition, duration).join().forEach(selectedRecord 
-> {
             TopNEntity entity = new TopNEntity(selectedRecord);
             list.add(entity);
         });
@@ -82,7 +82,7 @@ public class AggregationQuery implements GraphQLQueryResolver 
{
         condition.setOrder(order);
         condition.setTopN(topN);
         List<TopNEntity> list = new ArrayList<>();
-        query.sortMetrics(condition, duration).forEach(selectedRecord -> {
+        query.sortMetrics(condition, duration).join().forEach(selectedRecord 
-> {
             TopNEntity entity = new TopNEntity(selectedRecord);
             list.add(entity);
         });
@@ -97,7 +97,7 @@ public class AggregationQuery implements GraphQLQueryResolver 
{
         condition.setOrder(order);
         condition.setTopN(topN);
         List<TopNEntity> list = new ArrayList<>();
-        query.sortMetrics(condition, duration).forEach(selectedRecord -> {
+        query.sortMetrics(condition, duration).join().forEach(selectedRecord 
-> {
             TopNEntity entity = new TopNEntity(selectedRecord);
             list.add(entity);
         });
@@ -115,7 +115,7 @@ public class AggregationQuery implements 
GraphQLQueryResolver {
         condition.setOrder(order);
         condition.setTopN(topN);
         List<TopNEntity> list = new ArrayList<>();
-        query.sortMetrics(condition, duration).forEach(selectedRecord -> {
+        query.sortMetrics(condition, duration).join().forEach(selectedRecord 
-> {
             TopNEntity entity = new TopNEntity(selectedRecord);
             list.add(entity);
         });
diff --git 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AlarmQuery.java
 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AlarmQuery.java
index eca8f0f2a6..7a4bde0259 100644
--- 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AlarmQuery.java
+++ 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AlarmQuery.java
@@ -24,6 +24,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
+import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
 import org.apache.skywalking.oap.server.core.CoreModule;
@@ -48,6 +49,7 @@ import 
org.apache.skywalking.oap.server.library.util.CollectionUtils;
 import static com.google.common.base.Strings.isNullOrEmpty;
 import static java.util.Objects.isNull;
 import static java.util.Objects.nonNull;
+import static 
org.apache.skywalking.oap.query.graphql.resolver.AsyncQueryUtils.queryAsync;
 import static 
org.apache.skywalking.oap.server.library.util.CollectionUtils.isNotEmpty;
 
 public class AlarmQuery implements GraphQLQueryResolver {
@@ -79,29 +81,31 @@ public class AlarmQuery implements GraphQLQueryResolver {
         return new AlarmTrend();
     }
 
-    public Alarms getAlarm(final Duration duration, final Scope scope, final 
String keyword,
+    public CompletableFuture<Alarms> getAlarm(final Duration duration, final 
Scope scope, final String keyword,
                            final Pagination paging, final List<Tag> tags,
-                           final DataFetchingEnvironment env) throws Exception 
{
-        Integer scopeId = null;
-        if (scope != null) {
-            scopeId = scope.getScopeId();
-        }
-        final EventQueryCondition.EventQueryConditionBuilder 
conditionPrototype =
-            EventQueryCondition.builder()
-                               .paging(new Pagination(1, 
IEventQueryDAO.MAX_SIZE));
-        if (nonNull(duration)) {
-            conditionPrototype.time(duration);
-        }
-        Alarms alarms = getQueryService().getAlarm(
-            scopeId, keyword, paging, duration, tags);
+                           final DataFetchingEnvironment env) {
+        return queryAsync(() -> {
+            Integer scopeId = null;
+            if (scope != null) {
+                scopeId = scope.getScopeId();
+            }
+            final EventQueryCondition.EventQueryConditionBuilder 
conditionPrototype =
+                EventQueryCondition.builder()
+                                   .paging(new Pagination(1, 
IEventQueryDAO.MAX_SIZE));
+            if (nonNull(duration)) {
+                conditionPrototype.time(duration);
+            }
+            Alarms alarms = getQueryService().getAlarm(
+                scopeId, keyword, paging, duration, tags);
 
-        final boolean selectEvents = 
env.getSelectionSet().contains("**/events/**");
+            final boolean selectEvents = 
env.getSelectionSet().contains("**/events/**");
 
-        if (selectEvents) {
-            return findRelevantEvents(alarms, conditionPrototype);
-        }
+            if (selectEvents) {
+                return findRelevantEvents(alarms, conditionPrototype);
+            }
 
-        return alarms;
+            return alarms;
+        });
     }
 
     private Alarms findRelevantEvents(
diff --git 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AsyncQueryUtils.java
 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AsyncQueryUtils.java
new file mode 100644
index 0000000000..5a1646b7b9
--- /dev/null
+++ 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AsyncQueryUtils.java
@@ -0,0 +1,41 @@
+/*
+ * 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.skywalking.oap.query.graphql.resolver;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ForkJoinPool;
+
+import static 
java.util.concurrent.ForkJoinPool.defaultForkJoinWorkerThreadFactory;
+
+public class AsyncQueryUtils {
+    private static final Executor EXECUTOR = new ForkJoinPool(
+        Runtime.getRuntime().availableProcessors(), 
defaultForkJoinWorkerThreadFactory, null, true);
+
+    protected static <U> CompletableFuture<U> queryAsync(Callable<U> caller) {
+        return CompletableFuture.supplyAsync(() -> {
+            try {
+                return caller.call();
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }, EXECUTOR);
+    }
+}
diff --git 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/BrowserLogQuery.java
 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/BrowserLogQuery.java
index bb19870c5e..5f3cfdd621 100644
--- 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/BrowserLogQuery.java
+++ 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/BrowserLogQuery.java
@@ -18,8 +18,8 @@
 package org.apache.skywalking.oap.query.graphql.resolver;
 
 import graphql.kickstart.tools.GraphQLQueryResolver;
-import java.io.IOException;
 import java.util.Optional;
+import java.util.concurrent.CompletableFuture;
 import lombok.RequiredArgsConstructor;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.query.BrowserLogQueryService;
@@ -27,6 +27,8 @@ import 
org.apache.skywalking.oap.server.core.query.input.BrowserErrorLogQueryCon
 import org.apache.skywalking.oap.server.core.query.type.BrowserErrorLogs;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
 
+import static 
org.apache.skywalking.oap.query.graphql.resolver.AsyncQueryUtils.queryAsync;
+
 @RequiredArgsConstructor
 public class BrowserLogQuery implements GraphQLQueryResolver {
     private final ModuleManager moduleManager;
@@ -39,11 +41,10 @@ public class BrowserLogQuery implements 
GraphQLQueryResolver {
         });
     }
 
-    public BrowserErrorLogs 
queryBrowserErrorLogs(BrowserErrorLogQueryCondition condition) throws 
IOException {
-
-        return getQueryService().queryBrowserErrorLogs(
+    public CompletableFuture<BrowserErrorLogs> 
queryBrowserErrorLogs(BrowserErrorLogQueryCondition condition) {
+        return queryAsync(() -> getQueryService().queryBrowserErrorLogs(
             condition.getServiceId(), condition.getServiceVersionId(), 
condition.getPagePathId(),
             condition.getCategory(), condition.getQueryDuration(), 
condition.getPaging()
-        );
+        ));
     }
 }
diff --git 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/ContinuousProfilingQuery.java
 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/ContinuousProfilingQuery.java
index 8491ad9bf4..26b7a3c261 100644
--- 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/ContinuousProfilingQuery.java
+++ 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/ContinuousProfilingQuery.java
@@ -19,6 +19,7 @@
 package org.apache.skywalking.oap.query.graphql.resolver;
 
 import graphql.kickstart.tools.GraphQLQueryResolver;
+import java.util.concurrent.CompletableFuture;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import 
org.apache.skywalking.oap.server.core.profiling.continuous.ContinuousProfilingQueryService;
 import 
org.apache.skywalking.oap.server.core.profiling.continuous.storage.ContinuousProfilingTargetType;
@@ -26,9 +27,10 @@ import 
org.apache.skywalking.oap.server.core.query.type.ContinuousProfilingMonit
 import 
org.apache.skywalking.oap.server.core.query.type.ContinuousProfilingPolicyTarget;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
 
-import java.io.IOException;
 import java.util.List;
 
+import static 
org.apache.skywalking.oap.query.graphql.resolver.AsyncQueryUtils.queryAsync;
+
 public class ContinuousProfilingQuery implements GraphQLQueryResolver {
 
     private final ModuleManager moduleManager;
@@ -46,12 +48,11 @@ public class ContinuousProfilingQuery implements 
GraphQLQueryResolver {
         return queryService;
     }
 
-    public List<ContinuousProfilingPolicyTarget> 
queryContinuousProfilingServiceTargets(String serviceId) throws IOException {
-        return 
getQueryService().queryContinuousProfilingServiceTargets(serviceId);
+    public CompletableFuture<List<ContinuousProfilingPolicyTarget>> 
queryContinuousProfilingServiceTargets(String serviceId) {
+        return queryAsync(() -> 
getQueryService().queryContinuousProfilingServiceTargets(serviceId));
     }
 
-    public List<ContinuousProfilingMonitoringInstance> 
queryContinuousProfilingMonitoringInstances(String serviceId, 
ContinuousProfilingTargetType target) throws IOException {
-        return 
getQueryService().queryContinuousProfilingMonitoringInstances(serviceId, 
target);
+    public CompletableFuture<List<ContinuousProfilingMonitoringInstance>> 
queryContinuousProfilingMonitoringInstances(String serviceId, 
ContinuousProfilingTargetType target) {
+        return queryAsync(() -> 
getQueryService().queryContinuousProfilingMonitoringInstances(serviceId, 
target));
     }
-
-}
\ No newline at end of file
+}
diff --git 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/EBPFProcessProfilingQuery.java
 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/EBPFProcessProfilingQuery.java
index e6cbf3f916..87c5f6857d 100644
--- 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/EBPFProcessProfilingQuery.java
+++ 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/EBPFProcessProfilingQuery.java
@@ -19,6 +19,8 @@
 package org.apache.skywalking.oap.query.graphql.resolver;
 
 import graphql.kickstart.tools.GraphQLQueryResolver;
+import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import 
org.apache.skywalking.oap.server.core.profiling.ebpf.EBPFProfilingQueryService;
 import 
org.apache.skywalking.oap.server.core.profiling.ebpf.storage.EBPFProfilingTargetType;
@@ -32,10 +34,10 @@ import 
org.apache.skywalking.oap.server.core.query.type.EBPFProfilingTask;
 import 
org.apache.skywalking.oap.server.core.query.type.EBPFProfilingTaskPrepare;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
 import org.apache.skywalking.oap.server.library.util.StringUtil;
-
-import java.io.IOException;
 import java.util.List;
 
+import static 
org.apache.skywalking.oap.query.graphql.resolver.AsyncQueryUtils.queryAsync;
+
 public class EBPFProcessProfilingQuery implements GraphQLQueryResolver {
 
     private final ModuleManager moduleManager;
@@ -54,30 +56,34 @@ public class EBPFProcessProfilingQuery implements 
GraphQLQueryResolver {
         return queryService;
     }
 
-    public EBPFProfilingTaskPrepare 
queryPrepareCreateEBPFProfilingTaskData(String serviceId) throws IOException {
+    public CompletableFuture<EBPFProfilingTaskPrepare> 
queryPrepareCreateEBPFProfilingTaskData(String serviceId) {
         if (StringUtil.isEmpty(serviceId)) {
             throw new IllegalArgumentException("please provide the service 
id");
         }
-        return 
getQueryService().queryPrepareCreateEBPFProfilingTaskData(serviceId);
+        return queryAsync(() -> 
getQueryService().queryPrepareCreateEBPFProfilingTaskData(serviceId));
     }
 
-    public List<EBPFProfilingTask> queryEBPFProfilingTasks(String serviceId, 
String serviceInstanceId, List<EBPFProfilingTargetType> targets, 
EBPFProfilingTriggerType triggerType, Duration duration) throws IOException {
+    public CompletableFuture<List<EBPFProfilingTask>> 
queryEBPFProfilingTasks(String serviceId, String serviceInstanceId, 
List<EBPFProfilingTargetType> targets, EBPFProfilingTriggerType triggerType, 
Duration duration) {
         if (StringUtil.isEmpty(serviceId) && 
StringUtil.isEmpty(serviceInstanceId)) {
             throw new IllegalArgumentException("please provide the service id 
or instance id");
         }
-        if (triggerType == null) {
-            triggerType = EBPFProfilingTriggerType.FIXED_TIME;
-        }
-        return getQueryService().queryEBPFProfilingTasks(serviceId, 
serviceInstanceId, targets, triggerType, duration);
+
+        return queryAsync(() -> 
getQueryService().queryEBPFProfilingTasks(serviceId, serviceInstanceId, targets,
+                                                                          
Objects.requireNonNullElse(
+                                                                              
triggerType,
+                                                                              
EBPFProfilingTriggerType.FIXED_TIME
+                                                                          ),
+                                                                          
duration
+        ));
     }
 
-    public List<EBPFProfilingSchedule> queryEBPFProfilingSchedules(String 
taskId) throws Exception {
-        return getQueryService().queryEBPFProfilingSchedules(taskId);
+    public CompletableFuture<List<EBPFProfilingSchedule>> 
queryEBPFProfilingSchedules(String taskId) {
+        return queryAsync(() -> 
getQueryService().queryEBPFProfilingSchedules(taskId));
     }
 
-    public EBPFProfilingAnalyzation analysisEBPFProfilingResult(List<String> 
scheduleIdList,
+    public CompletableFuture<EBPFProfilingAnalyzation> 
analysisEBPFProfilingResult(List<String> scheduleIdList,
                                                                 
List<EBPFProfilingAnalyzeTimeRange> timeRanges,
-                                                                
EBPFProfilingAnalyzeAggregateType aggregateType) throws IOException {
-        return getQueryService().getEBPFProfilingAnalyzation(scheduleIdList, 
timeRanges, aggregateType);
+                                                                
EBPFProfilingAnalyzeAggregateType aggregateType) {
+        return queryAsync(() -> 
getQueryService().getEBPFProfilingAnalyzation(scheduleIdList, timeRanges, 
aggregateType));
     }
 }
diff --git 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/EventQuery.java
 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/EventQuery.java
index da314bc7ae..0ddc0eb2b3 100644
--- 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/EventQuery.java
+++ 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/EventQuery.java
@@ -19,12 +19,15 @@
 package org.apache.skywalking.oap.query.graphql.resolver;
 
 import graphql.kickstart.tools.GraphQLQueryResolver;
+import java.util.concurrent.CompletableFuture;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.query.EventQueryService;
 import 
org.apache.skywalking.oap.server.core.query.type.event.EventQueryCondition;
 import org.apache.skywalking.oap.server.core.query.type.event.Events;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
 
+import static 
org.apache.skywalking.oap.query.graphql.resolver.AsyncQueryUtils.queryAsync;
+
 public class EventQuery implements GraphQLQueryResolver {
     private EventQueryService queryService;
 
@@ -45,7 +48,7 @@ public class EventQuery implements GraphQLQueryResolver {
         return queryService;
     }
 
-    public Events queryEvents(final EventQueryCondition condition) throws 
Exception {
-        return queryService().queryEvents(condition);
+    public CompletableFuture<Events> queryEvents(final EventQueryCondition 
condition) {
+        return queryAsync(() -> queryService().queryEvents(condition));
     }
 }
diff --git 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/HierarchyQuery.java
 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/HierarchyQuery.java
index 083941ed50..e72f0c5afe 100644
--- 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/HierarchyQuery.java
+++ 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/HierarchyQuery.java
@@ -20,6 +20,7 @@ package org.apache.skywalking.oap.query.graphql.resolver;
 
 import graphql.kickstart.tools.GraphQLQueryResolver;
 import java.util.List;
+import java.util.concurrent.CompletableFuture;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.query.HierarchyQueryService;
 import org.apache.skywalking.oap.server.core.query.type.InstanceHierarchy;
@@ -27,6 +28,8 @@ import 
org.apache.skywalking.oap.server.core.query.type.LayerLevel;
 import org.apache.skywalking.oap.server.core.query.type.ServiceHierarchy;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
 
+import static 
org.apache.skywalking.oap.query.graphql.resolver.AsyncQueryUtils.queryAsync;
+
 public class HierarchyQuery implements GraphQLQueryResolver {
     private final ModuleManager moduleManager;
     private HierarchyQueryService hierarchyQueryService;
@@ -44,15 +47,15 @@ public class HierarchyQuery implements GraphQLQueryResolver 
{
         return hierarchyQueryService;
     }
 
-    public ServiceHierarchy getServiceHierarchy(String serviceId, String 
layer) throws Exception {
-        return getHierarchyQueryService().getServiceHierarchy(serviceId, 
layer);
+    public CompletableFuture<ServiceHierarchy> getServiceHierarchy(String 
serviceId, String layer) {
+        return queryAsync(() -> 
getHierarchyQueryService().getServiceHierarchy(serviceId, layer));
     }
 
-    public InstanceHierarchy getInstanceHierarchy(String instanceId, String 
layer) throws Exception {
-        return getHierarchyQueryService().getInstanceHierarchy(instanceId, 
layer);
+    public CompletableFuture<InstanceHierarchy> getInstanceHierarchy(String 
instanceId, String layer) {
+        return queryAsync(() -> 
getHierarchyQueryService().getInstanceHierarchy(instanceId, layer));
     }
 
-    public List<LayerLevel> listLayerLevels() throws Exception {
-        return getHierarchyQueryService().listLayerLevels();
+    public CompletableFuture<List<LayerLevel>> listLayerLevels() {
+        return queryAsync(() -> getHierarchyQueryService().listLayerLevels());
     }
 }
diff --git 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/LogQuery.java
 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/LogQuery.java
index a551ade7ed..4b245d003f 100644
--- 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/LogQuery.java
+++ 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/LogQuery.java
@@ -21,6 +21,7 @@ package org.apache.skywalking.oap.query.graphql.resolver;
 import graphql.kickstart.tools.GraphQLQueryResolver;
 import java.io.IOException;
 import java.util.Set;
+import java.util.concurrent.CompletableFuture;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.UnexpectedException;
 import org.apache.skywalking.oap.server.core.analysis.manual.searchtag.TagType;
@@ -37,6 +38,7 @@ import 
org.apache.skywalking.oap.server.library.util.CollectionUtils;
 import org.apache.skywalking.oap.server.library.util.StringUtil;
 
 import static java.util.Objects.isNull;
+import static 
org.apache.skywalking.oap.query.graphql.resolver.AsyncQueryUtils.queryAsync;
 import static 
org.apache.skywalking.oap.server.core.query.type.debugging.DebuggingTraceContext.TRACE_CONTEXT;
 
 public class LogQuery implements GraphQLQueryResolver {
@@ -66,21 +68,24 @@ public class LogQuery implements GraphQLQueryResolver {
         return getQueryService().supportQueryLogsByKeywords();
     }
 
-    public Logs queryLogs(LogQueryCondition condition, boolean debug) throws 
IOException {
-        DebuggingTraceContext traceContext = new 
DebuggingTraceContext("LogQueryCondition: " + condition, debug, false);
-        DebuggingTraceContext.TRACE_CONTEXT.set(traceContext);
-        DebuggingSpan span = traceContext.createSpan("Query logs");
-        try {
-            Logs logs = invokeQueryLogs(condition);
-            if (debug) {
-                logs.setDebuggingTrace(traceContext.getExecTrace());
+    public CompletableFuture<Logs> queryLogs(LogQueryCondition condition, 
boolean debug) {
+        return queryAsync(() -> {
+            DebuggingTraceContext traceContext = new DebuggingTraceContext(
+                "LogQueryCondition: " + condition, debug, false);
+            DebuggingTraceContext.TRACE_CONTEXT.set(traceContext);
+            DebuggingSpan span = traceContext.createSpan("Query logs");
+            try {
+                Logs logs = invokeQueryLogs(condition);
+                if (debug) {
+                    logs.setDebuggingTrace(traceContext.getExecTrace());
+                }
+                return logs;
+            } finally {
+                traceContext.stopSpan(span);
+                traceContext.stopTrace();
+                TRACE_CONTEXT.remove();
             }
-            return logs;
-        } finally {
-            traceContext.stopSpan(span);
-            traceContext.stopTrace();
-            TRACE_CONTEXT.remove();
-        }
+        });
     }
 
     private Logs invokeQueryLogs(LogQueryCondition condition) throws 
IOException {
@@ -115,11 +120,11 @@ public class LogQuery implements GraphQLQueryResolver {
         );
     }
 
-    public Set<String> queryLogTagAutocompleteKeys(final Duration 
queryDuration) throws IOException {
-        return getTagQueryService().queryTagAutocompleteKeys(TagType.LOG, 
queryDuration);
+    public CompletableFuture<Set<String>> queryLogTagAutocompleteKeys(final 
Duration queryDuration) {
+        return queryAsync(() -> 
getTagQueryService().queryTagAutocompleteKeys(TagType.LOG, queryDuration));
     }
 
-    public Set<String> queryLogTagAutocompleteValues(final String tagKey, 
final Duration queryDuration) throws IOException {
-        return getTagQueryService().queryTagAutocompleteValues(TagType.LOG, 
tagKey, queryDuration);
+    public CompletableFuture<Set<String>> queryLogTagAutocompleteValues(final 
String tagKey, final Duration queryDuration) {
+        return queryAsync(() -> 
getTagQueryService().queryTagAutocompleteValues(TagType.LOG, tagKey, 
queryDuration));
     }
 }
diff --git 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetadataQueryV2.java
 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetadataQueryV2.java
index 3d768d1791..cc2815df07 100644
--- 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetadataQueryV2.java
+++ 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetadataQueryV2.java
@@ -19,11 +19,11 @@
 package org.apache.skywalking.oap.query.graphql.resolver;
 
 import graphql.kickstart.tools.GraphQLQueryResolver;
-import java.io.IOException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.CompletableFuture;
 import org.apache.skywalking.oap.query.graphql.type.TimeInfo;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.analysis.IDManager;
@@ -36,6 +36,8 @@ import 
org.apache.skywalking.oap.server.core.query.type.Service;
 import org.apache.skywalking.oap.server.core.query.type.ServiceInstance;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
 
+import static 
org.apache.skywalking.oap.query.graphql.resolver.AsyncQueryUtils.queryAsync;
+
 /**
  * Metadata v2 query protocol implementation.
  *
@@ -59,50 +61,50 @@ public class MetadataQueryV2 implements 
GraphQLQueryResolver {
         return metadataQueryService;
     }
 
-    public Set<String> listLayers() throws IOException {
-        return getMetadataQueryService().listLayers();
+    public CompletableFuture<Set<String>> listLayers() {
+        return queryAsync(() -> getMetadataQueryService().listLayers());
     }
 
-    public List<Service> listServices(final String layer) throws IOException {
-        return getMetadataQueryService().listServices(layer, null);
+    public CompletableFuture<List<Service>> listServices(final String layer) {
+        return queryAsync(() -> getMetadataQueryService().listServices(layer, 
null));
     }
 
-    public Service findService(final String serviceName) throws IOException {
-        return 
getMetadataQueryService().getService(IDManager.ServiceID.buildId(serviceName, 
true));
+    public CompletableFuture<Service> findService(final String serviceName) {
+        return queryAsync(() -> 
getMetadataQueryService().getService(IDManager.ServiceID.buildId(serviceName, 
true)));
     }
 
-    public Service getService(final String serviceId) throws IOException {
-        return getMetadataQueryService().getService(serviceId);
+    public CompletableFuture<Service> getService(final String serviceId) {
+        return queryAsync(() -> 
getMetadataQueryService().getService(serviceId));
     }
 
-    public List<ServiceInstance> listInstances(final Duration duration,
-                                               final String serviceId) throws 
IOException {
-        return getMetadataQueryService().listInstances(duration, serviceId);
+    public CompletableFuture<List<ServiceInstance>> listInstances(final 
Duration duration,
+                                                                  final String 
serviceId) {
+        return queryAsync(() -> 
getMetadataQueryService().listInstances(duration, serviceId));
     }
 
-    public ServiceInstance getInstance(final String instanceId) throws 
IOException {
-        return getMetadataQueryService().getInstance(instanceId);
+    public CompletableFuture<ServiceInstance> getInstance(final String 
instanceId) {
+        return queryAsync(() -> 
getMetadataQueryService().getInstance(instanceId));
     }
 
-    public List<Endpoint> findEndpoint(final String keyword, final String 
serviceId,
-                                       final int limit) throws IOException {
-        return getMetadataQueryService().findEndpoint(keyword, serviceId, 
limit);
+    public CompletableFuture<List<Endpoint>> findEndpoint(final String 
keyword, final String serviceId,
+                                                          final int limit) {
+        return queryAsync(() -> 
getMetadataQueryService().findEndpoint(keyword, serviceId, limit));
     }
 
-    public EndpointInfo getEndpointInfo(final String endpointId) throws 
IOException {
-        return getMetadataQueryService().getEndpointInfo(endpointId);
+    public CompletableFuture<EndpointInfo> getEndpointInfo(final String 
endpointId) {
+        return queryAsync(() -> 
getMetadataQueryService().getEndpointInfo(endpointId));
     }
 
-    public List<Process> listProcesses(final Duration duration, final String 
instanceId) throws IOException {
-        return getMetadataQueryService().listProcesses(duration, instanceId);
+    public CompletableFuture<List<Process>> listProcesses(final Duration 
duration, final String instanceId) {
+        return queryAsync(() -> 
getMetadataQueryService().listProcesses(duration, instanceId));
     }
 
-    public Process getProcess(final String processId) throws IOException {
-        return getMetadataQueryService().getProcess(processId);
+    public CompletableFuture<Process> getProcess(final String processId) {
+        return queryAsync(() -> 
getMetadataQueryService().getProcess(processId));
     }
 
-    public Long estimateProcessScale(String serviceId, List<String> labels) 
throws IOException {
-        return getMetadataQueryService().estimateProcessScale(serviceId, 
labels);
+    public CompletableFuture<Long> estimateProcessScale(String serviceId, 
List<String> labels) {
+        return queryAsync(() -> 
getMetadataQueryService().estimateProcessScale(serviceId, labels));
     }
 
     public TimeInfo getTimeInfo() {
diff --git 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricQuery.java
 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricQuery.java
index d4b6f9cc34..9976d8ae41 100644
--- 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricQuery.java
+++ 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricQuery.java
@@ -59,21 +59,17 @@ public class MetricQuery implements GraphQLQueryResolver {
             condition.setName(metrics.getName());
             condition.setEntity(new MockEntity(null));
 
-            kv.setValue(query.readMetricsValue(condition, duration));
+            kv.setValue(query.readMetricsValue(condition, duration).join());
             values.addKVInt(kv);
         } else {
             List<KVInt> ints = metrics.getIds().parallelStream().map(id -> {
                 MetricsCondition condition = new MetricsCondition();
                 condition.setName(metrics.getName());
                 condition.setEntity(new MockEntity(id));
-                try {
-                    KVInt kv = new KVInt();
-                    kv.setId(id);
-                    kv.setValue(query.readMetricsValue(condition, duration));
-                    return kv;
-                } catch (IOException e) {
-                    throw new RuntimeException(e);
-                }
+                KVInt kv = new KVInt();
+                kv.setId(id);
+                kv.setValue(query.readMetricsValue(condition, 
duration).join());
+                return kv;
             }).collect(Collectors.toList());
             ints.forEach(v -> values.addKVInt(v));
 
@@ -88,7 +84,7 @@ public class MetricQuery implements GraphQLQueryResolver {
         condition.setName(metrics.getName());
         condition.setEntity(new MockEntity(metrics.getId()));
 
-        final MetricsValues metricsValues = query.readMetricsValues(condition, 
duration);
+        final MetricsValues metricsValues = query.readMetricsValues(condition, 
duration).join();
         return metricsValues.getValues();
     }
 
@@ -103,7 +99,7 @@ public class MetricQuery implements GraphQLQueryResolver {
             labels.add(String.valueOf(i));
         }
 
-        final List<MetricsValues> metricsValues = 
query.readLabeledMetricsValues(condition, labels, duration);
+        final List<MetricsValues> metricsValues = 
query.readLabeledMetricsValues(condition, labels, duration).join();
         List<IntValues> response = new ArrayList<>(metricsValues.size());
         labels.forEach(l -> metricsValues.stream()
                                          .filter(m -> m.getLabel().equals(l))
@@ -122,7 +118,7 @@ public class MetricQuery implements GraphQLQueryResolver {
         List<String> labels = new ArrayList<>(linearIndex.size());
         linearIndex.forEach(i -> labels.add(String.valueOf(i)));
 
-        final List<MetricsValues> metricsValues = 
query.readLabeledMetricsValues(condition, labels, duration);
+        final List<MetricsValues> metricsValues = 
query.readLabeledMetricsValues(condition, labels, duration).join();
         List<IntValues> response = new ArrayList<>(metricsValues.size());
         labels.forEach(l -> metricsValues.stream()
                                          .filter(m -> m.getLabel().equals(l))
@@ -137,7 +133,7 @@ public class MetricQuery implements GraphQLQueryResolver {
         condition.setName(metrics.getName());
         condition.setEntity(new MockEntity(metrics.getId()));
 
-        final HeatMap heatMap = query.readHeatMap(condition, duration);
+        final HeatMap heatMap = query.readHeatMap(condition, duration).join();
 
         Thermodynamic thermodynamic = new Thermodynamic();
         final List<Bucket> buckets = heatMap.getBuckets();
diff --git 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricsExpressionQuery.java
 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricsExpressionQuery.java
index c684d408ba..c88ef25a51 100644
--- 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricsExpressionQuery.java
+++ 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricsExpressionQuery.java
@@ -19,6 +19,7 @@
 package org.apache.skywalking.oap.query.graphql.resolver;
 
 import graphql.kickstart.tools.GraphQLQueryResolver;
+import java.util.concurrent.CompletableFuture;
 import org.antlr.v4.runtime.misc.ParseCancellationException;
 import java.text.DecimalFormat;
 import org.antlr.v4.runtime.CharStreams;
@@ -37,6 +38,7 @@ import 
org.apache.skywalking.oap.server.library.module.ModuleManager;
 import org.apache.skywalking.mqe.rt.grammar.MQELexer;
 import org.apache.skywalking.mqe.rt.grammar.MQEParser;
 
+import static 
org.apache.skywalking.oap.query.graphql.resolver.AsyncQueryUtils.queryAsync;
 import static 
org.apache.skywalking.oap.server.core.query.type.debugging.DebuggingTraceContext.TRACE_CONTEXT;
 
 public class MetricsExpressionQuery implements GraphQLQueryResolver {
@@ -48,53 +50,55 @@ public class MetricsExpressionQuery implements 
GraphQLQueryResolver {
         this.valueFormat.setGroupingUsed(false);
     }
 
-    public ExpressionResult execExpression(String expression,
-                                           Entity entity,
-                                           Duration duration,
-                                           boolean debug,
-                                           boolean dumpStorageRsp) {
-        DebuggingTraceContext traceContext = new DebuggingTraceContext(
-            "Expression: " + expression + ", Entity: " + entity + ", Duration: 
" + duration, debug, dumpStorageRsp);
-        TRACE_CONTEXT.set(traceContext);
-        DebuggingSpan span = traceContext.createSpan("MQE query");
-        try {
-            MQEVisitor visitor = new MQEVisitor(moduleManager, entity, 
duration);
-            DebuggingTrace execTrace = traceContext.getExecTrace();
-            DebuggingSpan syntaxSpan = traceContext.createSpan("MQE syntax 
analysis");
-            ParseTree tree;
+    public CompletableFuture<ExpressionResult> execExpression(String 
expression,
+                                                              Entity entity,
+                                                              Duration 
duration,
+                                                              boolean debug,
+                                                              boolean 
dumpStorageRsp) {
+        return queryAsync(() -> {
+            DebuggingTraceContext traceContext = new DebuggingTraceContext(
+                "Expression: " + expression + ", Entity: " + entity + ", 
Duration: " + duration, debug, dumpStorageRsp);
+            TRACE_CONTEXT.set(traceContext);
+            DebuggingSpan span = traceContext.createSpan("MQE query");
             try {
-                MQELexer lexer = new MQELexer(
-                    CharStreams.fromString(expression));
-                lexer.addErrorListener(new ParseErrorListener());
-                MQEParser parser = new MQEParser(new CommonTokenStream(lexer));
-                parser.addErrorListener(new ParseErrorListener());
+                MQEVisitor visitor = new MQEVisitor(moduleManager, entity, 
duration);
+                DebuggingTrace execTrace = traceContext.getExecTrace();
+                DebuggingSpan syntaxSpan = traceContext.createSpan("MQE syntax 
analysis");
+                ParseTree tree;
                 try {
-                    tree = parser.expression();
-                } catch (ParseCancellationException e) {
-                    ExpressionResult errorResult = new ExpressionResult();
-                    errorResult.setType(ExpressionResultType.UNKNOWN);
-                    errorResult.setError(e.getMessage());
-                    return errorResult;
-                }
-            } finally {
-                traceContext.stopSpan(syntaxSpan);
-            }
-            ExpressionResult parseResult = visitor.visit(tree);
-            parseResult.getResults().forEach(mqeValues -> {
-                mqeValues.getValues().forEach(mqeValue -> {
-                    if (!mqeValue.isEmptyValue()) {
-                        
mqeValue.setValue(valueFormat.format(mqeValue.getDoubleValue()));
+                    MQELexer lexer = new MQELexer(
+                        CharStreams.fromString(expression));
+                    lexer.addErrorListener(new ParseErrorListener());
+                    MQEParser parser = new MQEParser(new 
CommonTokenStream(lexer));
+                    parser.addErrorListener(new ParseErrorListener());
+                    try {
+                        tree = parser.expression();
+                    } catch (ParseCancellationException e) {
+                        ExpressionResult errorResult = new ExpressionResult();
+                        errorResult.setType(ExpressionResultType.UNKNOWN);
+                        errorResult.setError(e.getMessage());
+                        return errorResult;
                     }
+                } finally {
+                    traceContext.stopSpan(syntaxSpan);
+                }
+                ExpressionResult parseResult = visitor.visit(tree);
+                parseResult.getResults().forEach(mqeValues -> {
+                    mqeValues.getValues().forEach(mqeValue -> {
+                        if (!mqeValue.isEmptyValue()) {
+                            
mqeValue.setValue(valueFormat.format(mqeValue.getDoubleValue()));
+                        }
+                    });
                 });
-            });
-            if (debug) {
-                parseResult.setDebuggingTrace(execTrace);
+                if (debug) {
+                    parseResult.setDebuggingTrace(execTrace);
+                }
+                return parseResult;
+            } finally {
+                traceContext.stopSpan(span);
+                traceContext.stopTrace();
+                TRACE_CONTEXT.remove();
             }
-            return parseResult;
-        } finally {
-            traceContext.stopSpan(span);
-            traceContext.stopTrace();
-            TRACE_CONTEXT.remove();
-        }
+        });
     }
 }
diff --git 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricsQuery.java
 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricsQuery.java
index f9d8a4ee85..0484d9bfaa 100644
--- 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricsQuery.java
+++ 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/MetricsQuery.java
@@ -19,11 +19,11 @@
 package org.apache.skywalking.oap.query.graphql.resolver;
 
 import graphql.kickstart.tools.GraphQLQueryResolver;
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
 import org.apache.skywalking.oap.server.core.Const;
@@ -50,6 +50,8 @@ import 
org.apache.skywalking.oap.server.core.query.type.Record;
 import org.apache.skywalking.oap.server.core.query.type.SelectedRecord;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
 
+import static 
org.apache.skywalking.oap.query.graphql.resolver.AsyncQueryUtils.queryAsync;
+
 /**
  * Metrics v2 query protocol implementation.
  *
@@ -105,8 +107,8 @@ public class MetricsQuery implements GraphQLQueryResolver {
     /**
      * Metrics definition metadata query. Response the metrics type which 
determines the suitable query methods.
      */
-    public MetricsType typeOfMetrics(String name) throws IOException {
-        return MetricsMetadataQueryService.typeOfMetrics(name);
+    public CompletableFuture<MetricsType> typeOfMetrics(String name) {
+        return queryAsync(() -> 
MetricsMetadataQueryService.typeOfMetrics(name));
     }
 
     /**
@@ -115,60 +117,68 @@ public class MetricsQuery implements GraphQLQueryResolver 
{
      * @param regex to filter the metrics by name, if existing.
      * @return all available metrics.
      */
-    public List<MetricDefinition> listMetrics(String regex) {
-        return getMetricsMetadataQueryService().listMetrics(regex);
+    public CompletableFuture<List<MetricDefinition>> listMetrics(String regex) 
{
+        return queryAsync(() -> 
getMetricsMetadataQueryService().listMetrics(regex));
     }
 
     /**
      * Read metrics single value in the duration of required metrics
      */
-    public long readMetricsValue(MetricsCondition condition, Duration 
duration) throws IOException {
-        if (!condition.senseScope() || !condition.getEntity().isValid()) {
-            return 0;
-        }
-        return getMetricsQueryService().readMetricsValue(condition, 
duration).getValue();
+    public CompletableFuture<Long> readMetricsValue(MetricsCondition 
condition, Duration duration) {
+        return queryAsync(() -> {
+            if (!condition.senseScope() || !condition.getEntity().isValid()) {
+                return 0L;
+            }
+            return getMetricsQueryService().readMetricsValue(condition, 
duration).getValue();
+        });
     }
 
-    public NullableValue readNullableMetricsValue(MetricsCondition condition, 
Duration duration) throws IOException {
-        if (!condition.senseScope() || !condition.getEntity().isValid()) {
-            return new NullableValue(0, true);
-        }
-        return getMetricsQueryService().readMetricsValue(condition, duration);
+    public CompletableFuture<NullableValue> 
readNullableMetricsValue(MetricsCondition condition, Duration duration) {
+        return queryAsync(() -> {
+            if (!condition.senseScope() || !condition.getEntity().isValid()) {
+                return new NullableValue(0, true);
+            }
+            return getMetricsQueryService().readMetricsValue(condition, 
duration);
+        });
     }
 
     /**
      * Read time-series values in the duration of required metrics
      */
-    public MetricsValues readMetricsValues(MetricsCondition condition, 
Duration duration) throws IOException {
-        boolean hasScope = condition.senseScope();
-        if (!hasScope || !condition.getEntity().isValid()) {
-            final List<PointOfTime> pointOfTimes = 
duration.assembleDurationPoints();
-            String entityId = "UNKNOWN_METRIC_NAME";
-            if (hasScope) {
-                entityId = "ILLEGAL_ENTITY";
-            }
-            MetricsValues values = new MetricsValues();
-            for (PointOfTime pointOfTime : pointOfTimes) {
-                String id = pointOfTime.id(entityId);
-                final KVInt kvInt = new KVInt();
-                kvInt.setId(id);
-                kvInt.setValue(0);
-                kvInt.setEmptyValue(true);
-                values.getValues().addKVInt(kvInt);
+    public CompletableFuture<MetricsValues> readMetricsValues(MetricsCondition 
condition, Duration duration) {
+        return queryAsync(() -> {
+            boolean hasScope = condition.senseScope();
+            if (!hasScope || !condition.getEntity().isValid()) {
+                final List<PointOfTime> pointOfTimes = 
duration.assembleDurationPoints();
+                String entityId = "UNKNOWN_METRIC_NAME";
+                if (hasScope) {
+                    entityId = "ILLEGAL_ENTITY";
+                }
+                MetricsValues values = new MetricsValues();
+                for (PointOfTime pointOfTime : pointOfTimes) {
+                    String id = pointOfTime.id(entityId);
+                    final KVInt kvInt = new KVInt();
+                    kvInt.setId(id);
+                    kvInt.setValue(0);
+                    kvInt.setEmptyValue(true);
+                    values.getValues().addKVInt(kvInt);
+                }
+                return values;
             }
-            return values;
-        }
-        return getMetricsQueryService().readMetricsValues(condition, duration);
+            return getMetricsQueryService().readMetricsValues(condition, 
duration);
+        });
     }
 
     /**
      * Read entity list of required metrics and parent entity type.
      */
-    public List<SelectedRecord> sortMetrics(TopNCondition condition, Duration 
duration) throws IOException {
-        if (!condition.senseScope()) {
-            return Collections.emptyList();
-        }
-        return getQueryService().sortMetrics(condition, duration);
+    public CompletableFuture<List<SelectedRecord>> sortMetrics(TopNCondition 
condition, Duration duration) {
+        return queryAsync(() -> {
+            if (!condition.senseScope()) {
+                return Collections.emptyList();
+            }
+            return getQueryService().sortMetrics(condition, duration);
+        });
     }
 
     /**
@@ -176,36 +186,38 @@ public class MetricsQuery implements GraphQLQueryResolver 
{
      *
      * @param labels the labels you need to query.
      */
-    public List<MetricsValues> readLabeledMetricsValues(MetricsCondition 
condition,
+    public CompletableFuture<List<MetricsValues>> 
readLabeledMetricsValues(MetricsCondition condition,
                                                         List<String> labels,
-                                                        Duration duration) 
throws IOException {
-        boolean hasScope = condition.senseScope();
-        if (!hasScope || !condition.getEntity().isValid()) {
-            final List<PointOfTime> pointOfTimes = 
duration.assembleDurationPoints();
-            String entityId = "UNKNOWN_METRIC_NAME";
-            if (hasScope) {
-                entityId = "ILLEGAL_ENTITY";
-            }
-            List<MetricsValues> labeledValues = new ArrayList<>(labels.size());
-            for (String label : labels) {
-                MetricsValues values = new MetricsValues();
-                for (PointOfTime pointOfTime : pointOfTimes) {
-                    String id = pointOfTime.id(entityId);
-                    final KVInt kvInt = new KVInt();
-                    kvInt.setId(id);
-                    kvInt.setValue(0);
-                    kvInt.setEmptyValue(true);
-                    values.getValues().addKVInt(kvInt);
+                                                        Duration duration) {
+        return queryAsync(() -> {
+            boolean hasScope = condition.senseScope();
+            if (!hasScope || !condition.getEntity().isValid()) {
+                final List<PointOfTime> pointOfTimes = 
duration.assembleDurationPoints();
+                String entityId = "UNKNOWN_METRIC_NAME";
+                if (hasScope) {
+                    entityId = "ILLEGAL_ENTITY";
+                }
+                List<MetricsValues> labeledValues = new 
ArrayList<>(labels.size());
+                for (String label : labels) {
+                    MetricsValues values = new MetricsValues();
+                    for (PointOfTime pointOfTime : pointOfTimes) {
+                        String id = pointOfTime.id(entityId);
+                        final KVInt kvInt = new KVInt();
+                        kvInt.setId(id);
+                        kvInt.setValue(0);
+                        kvInt.setEmptyValue(true);
+                        values.getValues().addKVInt(kvInt);
+                    }
+                    values.setLabel(label);
+                    labeledValues.add(values);
                 }
-                values.setLabel(label);
-                labeledValues.add(values);
+                return labeledValues;
             }
-            return labeledValues;
-        }
-        List<KeyValue> labelList = new ArrayList<>();
-        String labelValue = labels.stream().reduce((a, b) -> a + Const.COMMA + 
b).orElse("");
-        labelList.add(new KeyValue(DataLabel.GENERAL_LABEL_NAME, labelValue));
-        return getMetricsQueryService().readLabeledMetricsValues(condition, 
labelList, duration);
+            List<KeyValue> labelList = new ArrayList<>();
+            String labelValue = labels.stream().reduce((a, b) -> a + 
Const.COMMA + b).orElse("");
+            labelList.add(new KeyValue(DataLabel.GENERAL_LABEL_NAME, 
labelValue));
+            return 
getMetricsQueryService().readLabeledMetricsValues(condition, labelList, 
duration);
+        });
     }
 
     /**
@@ -220,25 +232,27 @@ public class MetricsQuery implements GraphQLQueryResolver 
{
      *      key = step * maxNumOfSteps, represents [step * maxNumOfSteps, MAX)
      * </pre>
      */
-    public HeatMap readHeatMap(MetricsCondition condition, Duration duration) 
throws IOException {
-        boolean hasScope = condition.senseScope();
-        if (!hasScope || !condition.getEntity().isValid()) {
-            DataTable emptyData = new DataTable();
-            emptyData.put("0", 0L);
-            final String rawdata = emptyData.toStorageData();
-            final HeatMap heatMap = new HeatMap();
-            final List<PointOfTime> pointOfTimes = 
duration.assembleDurationPoints();
-            String entityId = "UNKNOWN_METRIC_NAME";
-            if (hasScope) {
-                entityId = "ILLEGAL_ENTITY";
-            }
-            for (PointOfTime pointOfTime : pointOfTimes) {
-                String id = pointOfTime.id(entityId);
-                heatMap.buildColumn(id, rawdata, 0);
+    public CompletableFuture<HeatMap> readHeatMap(MetricsCondition condition, 
Duration duration) {
+        return queryAsync(() -> {
+            boolean hasScope = condition.senseScope();
+            if (!hasScope || !condition.getEntity().isValid()) {
+                DataTable emptyData = new DataTable();
+                emptyData.put("0", 0L);
+                final String rawdata = emptyData.toStorageData();
+                final HeatMap heatMap = new HeatMap();
+                final List<PointOfTime> pointOfTimes = 
duration.assembleDurationPoints();
+                String entityId = "UNKNOWN_METRIC_NAME";
+                if (hasScope) {
+                    entityId = "ILLEGAL_ENTITY";
+                }
+                for (PointOfTime pointOfTime : pointOfTimes) {
+                    String id = pointOfTime.id(entityId);
+                    heatMap.buildColumn(id, rawdata, 0);
+                }
+                return heatMap;
             }
-            return heatMap;
-        }
-        return getMetricsQueryService().readHeatMap(condition, duration);
+            return getMetricsQueryService().readHeatMap(condition, duration);
+        });
     }
 
     /**
@@ -247,12 +261,14 @@ public class MetricsQuery implements GraphQLQueryResolver 
{
      * @since 9.3.0 This query is replaced by {@link 
RecordQueryService#readRecords(RecordCondition, Duration)}
      */
     @Deprecated
-    public List<SelectedRecord> readSampledRecords(TopNCondition condition, 
Duration duration) throws IOException {
-        RecordCondition recordCondition = new RecordCondition(condition);
-        if (!recordCondition.senseScope() || 
!recordCondition.getParentEntity().isValid()) {
-            return Collections.emptyList();
-        }
-        final List<Record> records = 
getRecordQueryService().readRecords(recordCondition, duration);
-        return 
records.stream().filter(Objects::nonNull).map(Record::toSelectedRecord).collect(Collectors.toList());
+    public CompletableFuture<List<SelectedRecord>> 
readSampledRecords(TopNCondition condition, Duration duration) {
+        return queryAsync(() -> {
+            RecordCondition recordCondition = new RecordCondition(condition);
+            if (!recordCondition.senseScope() || 
!recordCondition.getParentEntity().isValid()) {
+                return Collections.emptyList();
+            }
+            final List<Record> records = 
getRecordQueryService().readRecords(recordCondition, duration);
+            return 
records.stream().filter(Objects::nonNull).map(Record::toSelectedRecord).collect(Collectors.toList());
+        });
     }
 }
diff --git 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/OndemandLogQuery.java
 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/OndemandLogQuery.java
index 46710c9917..0e89f17a09 100644
--- 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/OndemandLogQuery.java
+++ 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/OndemandLogQuery.java
@@ -61,7 +61,7 @@ public class OndemandLogQuery implements GraphQLQueryResolver 
{
     public PodContainers listContainers(final OndemandContainergQueryCondition 
condition)
         throws IOException {
         final ServiceInstance instance =
-            metadataQuery.getInstance(condition.getServiceInstanceId());
+            metadataQuery.getInstance(condition.getServiceInstanceId()).join();
         final Map<String, String> attributesMap = 
convertInstancePropertiesToMap(instance);
         final String ns = attributesMap.get(PropertyUtil.NAMESPACE);
         final String pod = attributesMap.get(PropertyUtil.POD);
@@ -71,7 +71,7 @@ public class OndemandLogQuery implements GraphQLQueryResolver 
{
     public Logs ondemandPodLogs(final OndemandLogQueryCondition condition)
         throws IOException {
         final ServiceInstance instance =
-            metadataQuery.getInstance(condition.getServiceInstanceId());
+            metadataQuery.getInstance(condition.getServiceInstanceId()).join();
         final Map<String, String> attributesMap = 
convertInstancePropertiesToMap(instance);
         final String ns = attributesMap.get(PropertyUtil.NAMESPACE);
         final String pod = attributesMap.get(PropertyUtil.POD);
diff --git 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/ProfileQuery.java
 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/ProfileQuery.java
index 3811cfd1e6..66583f05db 100644
--- 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/ProfileQuery.java
+++ 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/ProfileQuery.java
@@ -19,6 +19,7 @@
 package org.apache.skywalking.oap.query.graphql.resolver;
 
 import graphql.kickstart.tools.GraphQLQueryResolver;
+import java.util.concurrent.CompletableFuture;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import 
org.apache.skywalking.oap.server.core.profiling.trace.ProfileTaskQueryService;
 import 
org.apache.skywalking.oap.server.core.query.input.SegmentProfileAnalyzeQuery;
@@ -28,9 +29,10 @@ import 
org.apache.skywalking.oap.server.core.query.type.ProfileTaskLog;
 import org.apache.skywalking.oap.server.core.query.type.ProfiledTraceSegments;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
 
-import java.io.IOException;
 import java.util.List;
 
+import static 
org.apache.skywalking.oap.query.graphql.resolver.AsyncQueryUtils.queryAsync;
+
 /**
  * profile query GraphQL resolver
  */
@@ -52,20 +54,19 @@ public class ProfileQuery implements GraphQLQueryResolver {
         return profileTaskQueryService;
     }
 
-    public List<ProfileTask> getProfileTaskList(final String serviceId, final 
String endpointName) throws IOException {
-        return getProfileTaskQueryService().getTaskList(serviceId, 
endpointName);
+    public CompletableFuture<List<ProfileTask>> getProfileTaskList(final 
String serviceId, final String endpointName) {
+        return queryAsync(() -> 
getProfileTaskQueryService().getTaskList(serviceId, endpointName));
     }
 
-    public List<ProfileTaskLog> getProfileTaskLogs(final String taskID) throws 
IOException {
-        return getProfileTaskQueryService().getProfileTaskLogs(taskID);
+    public CompletableFuture<List<ProfileTaskLog>> getProfileTaskLogs(final 
String taskID) {
+        return queryAsync(() -> 
getProfileTaskQueryService().getProfileTaskLogs(taskID));
     }
 
-    public List<ProfiledTraceSegments> getProfileTaskSegments(String taskId) 
throws IOException {
-        return getProfileTaskQueryService().getProfileTaskSegments(taskId);
+    public CompletableFuture<List<ProfiledTraceSegments>> 
getProfileTaskSegments(String taskId) {
+        return queryAsync(() -> 
getProfileTaskQueryService().getProfileTaskSegments(taskId));
     }
 
-    public ProfileAnalyzation getSegmentsProfileAnalyze(final 
List<SegmentProfileAnalyzeQuery> queries) throws IOException {
-        return getProfileTaskQueryService().getProfileAnalyze(queries);
+    public CompletableFuture<ProfileAnalyzation> 
getSegmentsProfileAnalyze(final List<SegmentProfileAnalyzeQuery> queries) {
+        return queryAsync(() -> 
getProfileTaskQueryService().getProfileAnalyze(queries));
     }
-
 }
diff --git 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/RecordsQuery.java
 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/RecordsQuery.java
index 608cc815f8..edf7788972 100644
--- 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/RecordsQuery.java
+++ 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/RecordsQuery.java
@@ -20,16 +20,17 @@ package org.apache.skywalking.oap.query.graphql.resolver;
 
 import graphql.kickstart.tools.GraphQLQueryResolver;
 import java.util.Collections;
+import java.util.concurrent.CompletableFuture;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.query.RecordQueryService;
 import org.apache.skywalking.oap.server.core.query.input.Duration;
 import org.apache.skywalking.oap.server.core.query.input.RecordCondition;
 import org.apache.skywalking.oap.server.core.query.type.Record;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
-
-import java.io.IOException;
 import java.util.List;
 
+import static 
org.apache.skywalking.oap.query.graphql.resolver.AsyncQueryUtils.queryAsync;
+
 public class RecordsQuery implements GraphQLQueryResolver {
     private ModuleManager moduleManager;
     private RecordQueryService recordQueryService;
@@ -47,10 +48,12 @@ public class RecordsQuery implements GraphQLQueryResolver {
         return recordQueryService;
     }
 
-    public List<Record> readRecords(RecordCondition condition, Duration 
duration) throws IOException {
-        if (!condition.senseScope() || !condition.getParentEntity().isValid()) 
{
-            return Collections.emptyList();
-        }
-        return getRecordQueryService().readRecords(condition, duration);
+    public CompletableFuture<List<Record>> readRecords(RecordCondition 
condition, Duration duration) {
+        return queryAsync(() -> {
+            if (!condition.senseScope() || 
!condition.getParentEntity().isValid()) {
+                return Collections.emptyList();
+            }
+            return getRecordQueryService().readRecords(condition, duration);
+        });
     }
 }
diff --git 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TopNRecordsQuery.java
 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TopNRecordsQuery.java
index 8c5945fe81..2309a51736 100644
--- 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TopNRecordsQuery.java
+++ 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TopNRecordsQuery.java
@@ -52,7 +52,7 @@ public class TopNRecordsQuery implements GraphQLQueryResolver 
{
         topNCondition.setOrder(condition.getOrder());
         topNCondition.setTopN(condition.getTopN());
 
-        final List<SelectedRecord> selectedRecords = 
query.readSampledRecords(topNCondition, condition.getDuration());
+        final List<SelectedRecord> selectedRecords = 
query.readSampledRecords(topNCondition, condition.getDuration()).join();
         List<TopNRecord> list = new ArrayList<>(selectedRecords.size());
         selectedRecords.forEach(record -> {
             TopNRecord top = new TopNRecord();
diff --git 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TopologyQuery.java
 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TopologyQuery.java
index b161b4cbb3..8950097687 100644
--- 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TopologyQuery.java
+++ 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TopologyQuery.java
@@ -19,9 +19,9 @@
 package org.apache.skywalking.oap.query.graphql.resolver;
 
 import graphql.kickstart.tools.GraphQLQueryResolver;
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.CompletableFuture;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.query.TopologyQueryService;
 import org.apache.skywalking.oap.server.core.query.input.Duration;
@@ -33,6 +33,7 @@ import 
org.apache.skywalking.oap.server.core.query.type.debugging.DebuggingSpan;
 import 
org.apache.skywalking.oap.server.core.query.type.debugging.DebuggingTraceContext;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
 
+import static 
org.apache.skywalking.oap.query.graphql.resolver.AsyncQueryUtils.queryAsync;
 import static 
org.apache.skywalking.oap.server.core.query.type.debugging.DebuggingTraceContext.TRACE_CONTEXT;
 
 public class TopologyQuery implements GraphQLQueryResolver {
@@ -51,29 +52,31 @@ public class TopologyQuery implements GraphQLQueryResolver {
         return queryService;
     }
 
-    public Topology getGlobalTopology(final Duration duration,
-                                      final String layer,
-                                      final boolean debug) throws IOException {
-        DebuggingTraceContext traceContext = new DebuggingTraceContext(
-            "Duration: " + duration + ", Layer: " + layer, debug, false);
-        DebuggingTraceContext.TRACE_CONTEXT.set(traceContext);
-        DebuggingSpan span = traceContext.createSpan("Query global topology");
-        try {
-            Topology topology = getQueryService().getGlobalTopology(duration, 
layer);
-            if (debug) {
-                topology.setDebuggingTrace(traceContext.getExecTrace());
+    public CompletableFuture<Topology> getGlobalTopology(final Duration 
duration,
+                                                         final String layer,
+                                                         final boolean debug) {
+        return queryAsync(() -> {
+            DebuggingTraceContext traceContext = new DebuggingTraceContext(
+                "Duration: " + duration + ", Layer: " + layer, debug, false);
+            DebuggingTraceContext.TRACE_CONTEXT.set(traceContext);
+            DebuggingSpan span = traceContext.createSpan("Query global 
topology");
+            try {
+                Topology topology = 
getQueryService().getGlobalTopology(duration, layer);
+                if (debug) {
+                    topology.setDebuggingTrace(traceContext.getExecTrace());
+                }
+                return topology;
+            } finally {
+                traceContext.stopSpan(span);
+                traceContext.stopTrace();
+                TRACE_CONTEXT.remove();
             }
-            return topology;
-        } finally {
-            traceContext.stopSpan(span);
-            traceContext.stopTrace();
-            TRACE_CONTEXT.remove();
-        }
+        });
     }
 
     public Topology getServiceTopology(final String serviceId,
                                        final Duration duration,
-                                       final boolean debug) throws IOException 
{
+                                       final boolean debug) {
         DebuggingTraceContext traceContext = new DebuggingTraceContext(
             "ServiceId: " + serviceId + "Duration: " + duration, debug, false);
         DebuggingTraceContext.TRACE_CONTEXT.set(traceContext);
@@ -81,108 +84,115 @@ public class TopologyQuery implements 
GraphQLQueryResolver {
         try {
             List<String> selectedServiceList = new ArrayList<>(1);
             selectedServiceList.add(serviceId);
-            Topology topology = this.getServicesTopology(selectedServiceList, 
duration, debug);
+            Topology topology = this.getServicesTopology(selectedServiceList, 
duration, debug).join();
             if (debug) {
                 topology.setDebuggingTrace(traceContext.getExecTrace());
             }
             return topology;
         } finally {
-
             traceContext.stopSpan(span);
             traceContext.stopTrace();
             TRACE_CONTEXT.remove();
         }
     }
 
-    public Topology getServicesTopology(final List<String> serviceIds,
+    public CompletableFuture<Topology> getServicesTopology(final List<String> 
serviceIds,
                                         final Duration duration,
-                                        final boolean debug) throws 
IOException {
-        DebuggingTraceContext traceContext = new DebuggingTraceContext(
-            "ServiceIds: " + serviceIds + "Duration: " + duration, debug, 
false);
-        DebuggingTraceContext.TRACE_CONTEXT.set(traceContext);
-        DebuggingSpan span = traceContext.createSpan("Query service topology");
-        try {
-            Topology topology = getQueryService().getServiceTopology(duration, 
serviceIds);
-            if (debug) {
-                topology.setDebuggingTrace(traceContext.getExecTrace());
+                                        final boolean debug) {
+        return queryAsync(() -> {
+            DebuggingTraceContext traceContext = new DebuggingTraceContext(
+                "ServiceIds: " + serviceIds + "Duration: " + duration, debug, 
false);
+            DebuggingTraceContext.TRACE_CONTEXT.set(traceContext);
+            DebuggingSpan span = traceContext.createSpan("Query service 
topology");
+            try {
+                Topology topology = 
getQueryService().getServiceTopology(duration, serviceIds);
+                if (debug) {
+                    topology.setDebuggingTrace(traceContext.getExecTrace());
+                }
+                return topology;
+            } finally {
+                traceContext.stopSpan(span);
+                traceContext.stopTrace();
+                TRACE_CONTEXT.remove();
             }
-            return topology;
-        } finally {
-            traceContext.stopSpan(span);
-            traceContext.stopTrace();
-            TRACE_CONTEXT.remove();
-        }
+        });
     }
 
-    public ServiceInstanceTopology getServiceInstanceTopology(final String 
clientServiceId,
+    public CompletableFuture<ServiceInstanceTopology> 
getServiceInstanceTopology(final String clientServiceId,
                                                               final String 
serverServiceId,
                                                               final Duration 
duration,
-                                                              final boolean 
debug) throws IOException {
-        DebuggingTraceContext traceContext = new DebuggingTraceContext(
-            "ClientServiceId: " + clientServiceId + ", ServerServiceId: " + 
serverServiceId + ", Duration: " + duration,
-            debug, false
-        );
-        DebuggingTraceContext.TRACE_CONTEXT.set(traceContext);
-        DebuggingSpan span = traceContext.createSpan("Query service instance 
topology");
-        try {
-            ServiceInstanceTopology topology = 
getQueryService().getServiceInstanceTopology(
-                clientServiceId, serverServiceId,
-                duration
+                                                              final boolean 
debug) {
+        return queryAsync(() -> {
+            DebuggingTraceContext traceContext = new DebuggingTraceContext(
+                "ClientServiceId: " + clientServiceId + ", ServerServiceId: " 
+ serverServiceId + ", Duration: " + duration,
+                debug, false
             );
-            if (debug) {
-                topology.setDebuggingTrace(traceContext.getExecTrace());
+            DebuggingTraceContext.TRACE_CONTEXT.set(traceContext);
+            DebuggingSpan span = traceContext.createSpan("Query service 
instance topology");
+            try {
+                ServiceInstanceTopology topology = 
getQueryService().getServiceInstanceTopology(
+                    clientServiceId, serverServiceId,
+                    duration
+                );
+                if (debug) {
+                    topology.setDebuggingTrace(traceContext.getExecTrace());
+                }
+                return topology;
+            } finally {
+                traceContext.stopSpan(span);
+                traceContext.stopTrace();
+                TRACE_CONTEXT.remove();
             }
-            return topology;
-        } finally {
-            traceContext.stopSpan(span);
-            traceContext.stopTrace();
-            TRACE_CONTEXT.remove();
-        }
+        });
     }
 
     /**
      * Replaced by {@link #getEndpointDependencies(String, Duration, boolean)}
      */
     @Deprecated
-    public Topology getEndpointTopology(final String endpointId, final 
Duration duration) throws IOException {
-        return getQueryService().getEndpointTopology(duration, endpointId);
+    public CompletableFuture<Topology> getEndpointTopology(final String 
endpointId, final Duration duration) {
+        return queryAsync(() -> 
getQueryService().getEndpointTopology(duration, endpointId));
     }
 
-    public EndpointTopology getEndpointDependencies(final String endpointId,
+    public CompletableFuture<EndpointTopology> getEndpointDependencies(final 
String endpointId,
                                                     final Duration duration,
-                                                    final boolean debug) 
throws IOException {
-        DebuggingTraceContext traceContext = new DebuggingTraceContext(
-            "EndpointId: " + endpointId + ", Duration: " + duration, debug, 
false);
-        DebuggingTraceContext.TRACE_CONTEXT.set(traceContext);
-        DebuggingSpan span = traceContext.createSpan("Query endpoint 
dependencies");
-        try {
-            EndpointTopology topology = 
getQueryService().getEndpointDependencies(duration, endpointId);
-            if (debug) {
-                topology.setDebuggingTrace(traceContext.getExecTrace());
+                                                    final boolean debug) {
+        return queryAsync(() -> {
+            DebuggingTraceContext traceContext = new DebuggingTraceContext(
+                "EndpointId: " + endpointId + ", Duration: " + duration, 
debug, false);
+            DebuggingTraceContext.TRACE_CONTEXT.set(traceContext);
+            DebuggingSpan span = traceContext.createSpan("Query endpoint 
dependencies");
+            try {
+                EndpointTopology topology = 
getQueryService().getEndpointDependencies(duration, endpointId);
+                if (debug) {
+                    topology.setDebuggingTrace(traceContext.getExecTrace());
+                }
+                return topology;
+            } finally {
+                traceContext.stopSpan(span);
+                traceContext.stopTrace();
+                TRACE_CONTEXT.remove();
             }
-            return topology;
-        } finally {
-            traceContext.stopSpan(span);
-            traceContext.stopTrace();
-            TRACE_CONTEXT.remove();
-        }
+        });
     }
 
-    public ProcessTopology getProcessTopology(final String instanceId, final 
Duration duration, final boolean debug) throws Exception {
-        DebuggingTraceContext traceContext = new DebuggingTraceContext(
-            "InstanceId: " + instanceId + ", Duration: " + duration, debug, 
false);
-        DebuggingTraceContext.TRACE_CONTEXT.set(traceContext);
-        DebuggingSpan span = traceContext.createSpan("Query process topology");
-        try {
-            ProcessTopology topology = 
getQueryService().getProcessTopology(instanceId, duration);
-            if (debug) {
-                topology.setDebuggingTrace(traceContext.getExecTrace());
+    public CompletableFuture<ProcessTopology> getProcessTopology(final String 
instanceId, final Duration duration, final boolean debug) {
+        return queryAsync(() -> {
+            DebuggingTraceContext traceContext = new DebuggingTraceContext(
+                "InstanceId: " + instanceId + ", Duration: " + duration, 
debug, false);
+            DebuggingTraceContext.TRACE_CONTEXT.set(traceContext);
+            DebuggingSpan span = traceContext.createSpan("Query process 
topology");
+            try {
+                ProcessTopology topology = 
getQueryService().getProcessTopology(instanceId, duration);
+                if (debug) {
+                    topology.setDebuggingTrace(traceContext.getExecTrace());
+                }
+                return topology;
+            } finally {
+                traceContext.stopSpan(span);
+                traceContext.stopTrace();
+                TRACE_CONTEXT.remove();
             }
-            return topology;
-        } finally {
-            traceContext.stopSpan(span);
-            traceContext.stopTrace();
-            TRACE_CONTEXT.remove();
-        }
+        });
     }
 }
diff --git 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TraceQuery.java
 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TraceQuery.java
index c630b0b612..7aaa1d7798 100644
--- 
a/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TraceQuery.java
+++ 
b/oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/TraceQuery.java
@@ -22,6 +22,7 @@ import graphql.kickstart.tools.GraphQLQueryResolver;
 import com.google.common.base.Strings;
 import java.io.IOException;
 import java.util.Set;
+import java.util.concurrent.CompletableFuture;
 import org.apache.skywalking.oap.server.core.Const;
 import org.apache.skywalking.oap.server.core.CoreModule;
 import org.apache.skywalking.oap.server.core.UnexpectedException;
@@ -40,6 +41,7 @@ import 
org.apache.skywalking.oap.server.core.query.type.debugging.DebuggingTrace
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
 
 import static java.util.Objects.isNull;
+import static 
org.apache.skywalking.oap.query.graphql.resolver.AsyncQueryUtils.queryAsync;
 import static 
org.apache.skywalking.oap.server.core.query.type.debugging.DebuggingTraceContext.TRACE_CONTEXT;
 
 public class TraceQuery implements GraphQLQueryResolver {
@@ -66,22 +68,24 @@ public class TraceQuery implements GraphQLQueryResolver {
         return tagQueryService;
     }
 
-    public TraceBrief queryBasicTraces(final TraceQueryCondition condition, 
boolean debug) throws IOException {
-        DebuggingTraceContext traceContext = new DebuggingTraceContext(
-            "TraceQueryCondition: " + condition, debug, false);
-        DebuggingTraceContext.TRACE_CONTEXT.set(traceContext);
-        DebuggingSpan span = traceContext.createSpan("Query basic traces");
-        try {
-            TraceBrief traceBrief = invokeQueryBasicTraces(condition);
-            if (debug) {
-                traceBrief.setDebuggingTrace(traceContext.getExecTrace());
+    public CompletableFuture<TraceBrief> queryBasicTraces(final 
TraceQueryCondition condition, boolean debug) {
+        return queryAsync(() -> {
+            DebuggingTraceContext traceContext = new DebuggingTraceContext(
+                "TraceQueryCondition: " + condition, debug, false);
+            DebuggingTraceContext.TRACE_CONTEXT.set(traceContext);
+            DebuggingSpan span = traceContext.createSpan("Query basic traces");
+            try {
+                TraceBrief traceBrief = invokeQueryBasicTraces(condition);
+                if (debug) {
+                    traceBrief.setDebuggingTrace(traceContext.getExecTrace());
+                }
+                return traceBrief;
+            } finally {
+                traceContext.stopSpan(span);
+                traceContext.stopTrace();
+                TRACE_CONTEXT.remove();
             }
-            return traceBrief;
-        } finally {
-            traceContext.stopSpan(span);
-            traceContext.stopTrace();
-            TRACE_CONTEXT.remove();
-        }
+        });
     }
 
     private TraceBrief invokeQueryBasicTraces(final TraceQueryCondition 
condition) throws IOException {
@@ -106,29 +110,31 @@ public class TraceQuery implements GraphQLQueryResolver {
         );
     }
 
-    public Trace queryTrace(final String traceId, boolean debug) throws 
IOException {
-        DebuggingTraceContext traceContext = new DebuggingTraceContext(
-            "TraceId: " + traceId, debug, false);
-        DebuggingTraceContext.TRACE_CONTEXT.set(traceContext);
-        DebuggingSpan span = traceContext.createSpan("Query trace");
-        try {
-            Trace trace = getQueryService().queryTrace(traceId);
-            if (debug) {
-                trace.setDebuggingTrace(traceContext.getExecTrace());
+    public CompletableFuture<Trace> queryTrace(final String traceId, boolean 
debug) {
+        return queryAsync(() -> {
+            DebuggingTraceContext traceContext = new DebuggingTraceContext(
+                "TraceId: " + traceId, debug, false);
+            DebuggingTraceContext.TRACE_CONTEXT.set(traceContext);
+            DebuggingSpan span = traceContext.createSpan("Query trace");
+            try {
+                Trace trace = getQueryService().queryTrace(traceId);
+                if (debug) {
+                    trace.setDebuggingTrace(traceContext.getExecTrace());
+                }
+                return trace;
+            } finally {
+                traceContext.stopSpan(span);
+                traceContext.stopTrace();
+                TRACE_CONTEXT.remove();
             }
-            return trace;
-        } finally {
-            traceContext.stopSpan(span);
-            traceContext.stopTrace();
-            TRACE_CONTEXT.remove();
-        }
+        });
     }
 
-    public Set<String> queryTraceTagAutocompleteKeys(final Duration 
queryDuration) throws IOException {
-        return getTagQueryService().queryTagAutocompleteKeys(TagType.TRACE, 
queryDuration);
+    public CompletableFuture<Set<String>> queryTraceTagAutocompleteKeys(final 
Duration queryDuration) {
+        return queryAsync(() -> 
getTagQueryService().queryTagAutocompleteKeys(TagType.TRACE, queryDuration));
     }
 
-    public Set<String> queryTraceTagAutocompleteValues(final String tagKey, 
final Duration queryDuration) throws IOException {
-        return getTagQueryService().queryTagAutocompleteValues(TagType.TRACE, 
tagKey, queryDuration);
+    public CompletableFuture<Set<String>> 
queryTraceTagAutocompleteValues(final String tagKey, final Duration 
queryDuration) {
+        return queryAsync(() -> 
getTagQueryService().queryTagAutocompleteValues(TagType.TRACE, tagKey, 
queryDuration));
     }
 }

Reply via email to