From 85b03402e44bd2fdd9499bd20de3ddbf17e41707 Mon Sep 17 00:00:00 2001 From: Wan Kai Date: Tue, 13 Aug 2024 16:31:04 +0800 Subject: [PATCH] Support async query for the composite GraphQL query. (#12525) --- docs/en/changes/changes.md | 1 + .../oap/query/debug/DebuggingHTTPHandler.java | 31 +-- .../promql/handler/PromQLApiHandler.java | 8 +- .../graphql/resolver/AggregationQuery.java | 10 +- .../query/graphql/resolver/AlarmQuery.java | 42 ++-- .../graphql/resolver/AsyncQueryUtils.java | 41 ++++ .../graphql/resolver/BrowserLogQuery.java | 11 +- .../resolver/ContinuousProfilingQuery.java | 15 +- .../resolver/EBPFProcessProfilingQuery.java | 34 +-- .../query/graphql/resolver/EventQuery.java | 7 +- .../graphql/resolver/HierarchyQuery.java | 15 +- .../oap/query/graphql/resolver/LogQuery.java | 41 ++-- .../graphql/resolver/MetadataQueryV2.java | 52 ++--- .../query/graphql/resolver/MetricQuery.java | 22 +- .../resolver/MetricsExpressionQuery.java | 90 ++++---- .../query/graphql/resolver/MetricsQuery.java | 210 ++++++++++-------- .../graphql/resolver/OndemandLogQuery.java | 4 +- .../query/graphql/resolver/ProfileQuery.java | 21 +- .../query/graphql/resolver/RecordsQuery.java | 17 +- .../graphql/resolver/TopNRecordsQuery.java | 2 +- .../query/graphql/resolver/TopologyQuery.java | 190 ++++++++-------- .../query/graphql/resolver/TraceQuery.java | 74 +++--- 22 files changed, 521 insertions(+), 417 deletions(-) create mode 100644 oap-server/server-query-plugin/query-graphql-plugin/src/main/java/org/apache/skywalking/oap/query/graphql/resolver/AsyncQueryUtils.java 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 service, + @Param("serviceLayer") Optional serviceLayer, @Param("serviceInstance") Optional serviceInstance, @Param("endpoint") Optional endpoint, @Param("traceId") Optional 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 serviceId = service.map( + name -> IDManager.ServiceID.buildId(name, Layer.nameOf(serviceLayer.orElseThrow()).isNormal())); Optional serviceInstanceId = serviceInstance.map( - name -> IDManager.ServiceInstanceID.buildId(serviceId, name)); - Optional endpointId = endpoint.map(name -> IDManager.EndpointID.buildId(serviceId, name)); + name -> IDManager.ServiceInstanceID.buildId(serviceId.orElseThrow(), name)); + Optional 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 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 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 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 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 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 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 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 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 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 getAlarm(final Duration duration, final Scope scope, final String keyword, final Pagination paging, final List 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 CompletableFuture queryAsync(Callable 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 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 queryContinuousProfilingServiceTargets(String serviceId) throws IOException { - return getQueryService().queryContinuousProfilingServiceTargets(serviceId); + public CompletableFuture> queryContinuousProfilingServiceTargets(String serviceId) { + return queryAsync(() -> getQueryService().queryContinuousProfilingServiceTargets(serviceId)); } - public List queryContinuousProfilingMonitoringInstances(String serviceId, ContinuousProfilingTargetType target) throws IOException { - return getQueryService().queryContinuousProfilingMonitoringInstances(serviceId, target); + public CompletableFuture> 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 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 queryEBPFProfilingTasks(String serviceId, String serviceInstanceId, List targets, EBPFProfilingTriggerType triggerType, Duration duration) throws IOException { + public CompletableFuture> queryEBPFProfilingTasks(String serviceId, String serviceInstanceId, List 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 queryEBPFProfilingSchedules(String taskId) throws Exception { - return getQueryService().queryEBPFProfilingSchedules(taskId); + public CompletableFuture> queryEBPFProfilingSchedules(String taskId) { + return queryAsync(() -> getQueryService().queryEBPFProfilingSchedules(taskId)); } - public EBPFProfilingAnalyzation analysisEBPFProfilingResult(List scheduleIdList, + public CompletableFuture analysisEBPFProfilingResult(List scheduleIdList, List 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 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 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 getInstanceHierarchy(String instanceId, String layer) { + return queryAsync(() -> getHierarchyQueryService().getInstanceHierarchy(instanceId, layer)); } - public List listLayerLevels() throws Exception { - return getHierarchyQueryService().listLayerLevels(); + public CompletableFuture> 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 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 queryLogTagAutocompleteKeys(final Duration queryDuration) throws IOException { - return getTagQueryService().queryTagAutocompleteKeys(TagType.LOG, queryDuration); + public CompletableFuture> queryLogTagAutocompleteKeys(final Duration queryDuration) { + return queryAsync(() -> getTagQueryService().queryTagAutocompleteKeys(TagType.LOG, queryDuration)); } - public Set queryLogTagAutocompleteValues(final String tagKey, final Duration queryDuration) throws IOException { - return getTagQueryService().queryTagAutocompleteValues(TagType.LOG, tagKey, queryDuration); + public CompletableFuture> 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 listLayers() throws IOException { - return getMetadataQueryService().listLayers(); + public CompletableFuture> listLayers() { + return queryAsync(() -> getMetadataQueryService().listLayers()); } - public List listServices(final String layer) throws IOException { - return getMetadataQueryService().listServices(layer, null); + public CompletableFuture> 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 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 getService(final String serviceId) { + return queryAsync(() -> getMetadataQueryService().getService(serviceId)); } - public List listInstances(final Duration duration, - final String serviceId) throws IOException { - return getMetadataQueryService().listInstances(duration, serviceId); + public CompletableFuture> 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 getInstance(final String instanceId) { + return queryAsync(() -> getMetadataQueryService().getInstance(instanceId)); } - public List findEndpoint(final String keyword, final String serviceId, - final int limit) throws IOException { - return getMetadataQueryService().findEndpoint(keyword, serviceId, limit); + public CompletableFuture> 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 getEndpointInfo(final String endpointId) { + return queryAsync(() -> getMetadataQueryService().getEndpointInfo(endpointId)); } - public List listProcesses(final Duration duration, final String instanceId) throws IOException { - return getMetadataQueryService().listProcesses(duration, instanceId); + public CompletableFuture> 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 getProcess(final String processId) { + return queryAsync(() -> getMetadataQueryService().getProcess(processId)); } - public Long estimateProcessScale(String serviceId, List labels) throws IOException { - return getMetadataQueryService().estimateProcessScale(serviceId, labels); + public CompletableFuture estimateProcessScale(String serviceId, List 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 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 = query.readLabeledMetricsValues(condition, labels, duration); + final List metricsValues = query.readLabeledMetricsValues(condition, labels, duration).join(); List 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 labels = new ArrayList<>(linearIndex.size()); linearIndex.forEach(i -> labels.add(String.valueOf(i))); - final List metricsValues = query.readLabeledMetricsValues(condition, labels, duration); + final List metricsValues = query.readLabeledMetricsValues(condition, labels, duration).join(); List 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 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 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 typeOfMetrics(String name) { + return queryAsync(() -> MetricsMetadataQueryService.typeOfMetrics(name)); } /** @@ -115,79 +117,43 @@ public class MetricsQuery implements GraphQLQueryResolver { * @param regex to filter the metrics by name, if existing. * @return all available metrics. */ - public List listMetrics(String regex) { - return getMetricsMetadataQueryService().listMetrics(regex); + public CompletableFuture> 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 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 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 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 getMetricsQueryService().readMetricsValues(condition, duration); - } - - /** - * Read entity list of required metrics and parent entity type. - */ - public List sortMetrics(TopNCondition condition, Duration duration) throws IOException { - if (!condition.senseScope()) { - return Collections.emptyList(); - } - return getQueryService().sortMetrics(condition, duration); - } - - /** - * Read value in the given time duration, usually as a linear. - * - * @param labels the labels you need to query. - */ - public List readLabeledMetricsValues(MetricsCondition condition, - List labels, - Duration duration) throws IOException { - boolean hasScope = condition.senseScope(); - if (!hasScope || !condition.getEntity().isValid()) { - final List pointOfTimes = duration.assembleDurationPoints(); - String entityId = "UNKNOWN_METRIC_NAME"; - if (hasScope) { - entityId = "ILLEGAL_ENTITY"; - } - List labeledValues = new ArrayList<>(labels.size()); - for (String label : labels) { + public CompletableFuture readMetricsValues(MetricsCondition condition, Duration duration) { + return queryAsync(() -> { + boolean hasScope = condition.senseScope(); + if (!hasScope || !condition.getEntity().isValid()) { + final List 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); @@ -197,15 +163,61 @@ public class MetricsQuery implements GraphQLQueryResolver { kvInt.setEmptyValue(true); values.getValues().addKVInt(kvInt); } - values.setLabel(label); - labeledValues.add(values); + return values; } - return labeledValues; - } - List 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); + return getMetricsQueryService().readMetricsValues(condition, duration); + }); + } + + /** + * Read entity list of required metrics and parent entity type. + */ + public CompletableFuture> sortMetrics(TopNCondition condition, Duration duration) { + return queryAsync(() -> { + if (!condition.senseScope()) { + return Collections.emptyList(); + } + return getQueryService().sortMetrics(condition, duration); + }); + } + + /** + * Read value in the given time duration, usually as a linear. + * + * @param labels the labels you need to query. + */ + public CompletableFuture> readLabeledMetricsValues(MetricsCondition condition, + List labels, + Duration duration) { + return queryAsync(() -> { + boolean hasScope = condition.senseScope(); + if (!hasScope || !condition.getEntity().isValid()) { + final List pointOfTimes = duration.assembleDurationPoints(); + String entityId = "UNKNOWN_METRIC_NAME"; + if (hasScope) { + entityId = "ILLEGAL_ENTITY"; + } + List 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); + } + return labeledValues; + } + List 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) * */ - 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 pointOfTimes = duration.assembleDurationPoints(); - String entityId = "UNKNOWN_METRIC_NAME"; - if (hasScope) { - entityId = "ILLEGAL_ENTITY"; + public CompletableFuture 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 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; } - for (PointOfTime pointOfTime : pointOfTimes) { - String id = pointOfTime.id(entityId); - heatMap.buildColumn(id, rawdata, 0); - } - 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 readSampledRecords(TopNCondition condition, Duration duration) throws IOException { - RecordCondition recordCondition = new RecordCondition(condition); - if (!recordCondition.senseScope() || !recordCondition.getParentEntity().isValid()) { - return Collections.emptyList(); - } - final List records = getRecordQueryService().readRecords(recordCondition, duration); - return records.stream().filter(Objects::nonNull).map(Record::toSelectedRecord).collect(Collectors.toList()); + public CompletableFuture> readSampledRecords(TopNCondition condition, Duration duration) { + return queryAsync(() -> { + RecordCondition recordCondition = new RecordCondition(condition); + if (!recordCondition.senseScope() || !recordCondition.getParentEntity().isValid()) { + return Collections.emptyList(); + } + final List 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 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 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 getProfileTaskList(final String serviceId, final String endpointName) throws IOException { - return getProfileTaskQueryService().getTaskList(serviceId, endpointName); + public CompletableFuture> getProfileTaskList(final String serviceId, final String endpointName) { + return queryAsync(() -> getProfileTaskQueryService().getTaskList(serviceId, endpointName)); } - public List getProfileTaskLogs(final String taskID) throws IOException { - return getProfileTaskQueryService().getProfileTaskLogs(taskID); + public CompletableFuture> getProfileTaskLogs(final String taskID) { + return queryAsync(() -> getProfileTaskQueryService().getProfileTaskLogs(taskID)); } - public List getProfileTaskSegments(String taskId) throws IOException { - return getProfileTaskQueryService().getProfileTaskSegments(taskId); + public CompletableFuture> getProfileTaskSegments(String taskId) { + return queryAsync(() -> getProfileTaskQueryService().getProfileTaskSegments(taskId)); } - public ProfileAnalyzation getSegmentsProfileAnalyze(final List queries) throws IOException { - return getProfileTaskQueryService().getProfileAnalyze(queries); + public CompletableFuture getSegmentsProfileAnalyze(final List 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 readRecords(RecordCondition condition, Duration duration) throws IOException { - if (!condition.senseScope() || !condition.getParentEntity().isValid()) { - return Collections.emptyList(); - } - return getRecordQueryService().readRecords(condition, duration); + public CompletableFuture> 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 selectedRecords = query.readSampledRecords(topNCondition, condition.getDuration()); + final List selectedRecords = query.readSampledRecords(topNCondition, condition.getDuration()).join(); List 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 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 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 serviceIds, + public CompletableFuture getServicesTopology(final List 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 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 getEndpointTopology(final String endpointId, final Duration duration) { + return queryAsync(() -> getQueryService().getEndpointTopology(duration, endpointId)); } - public EndpointTopology getEndpointDependencies(final String endpointId, + public CompletableFuture 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 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 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 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 queryTraceTagAutocompleteKeys(final Duration queryDuration) throws IOException { - return getTagQueryService().queryTagAutocompleteKeys(TagType.TRACE, queryDuration); + public CompletableFuture> queryTraceTagAutocompleteKeys(final Duration queryDuration) { + return queryAsync(() -> getTagQueryService().queryTagAutocompleteKeys(TagType.TRACE, queryDuration)); } - public Set queryTraceTagAutocompleteValues(final String tagKey, final Duration queryDuration) throws IOException { - return getTagQueryService().queryTagAutocompleteValues(TagType.TRACE, tagKey, queryDuration); + public CompletableFuture> queryTraceTagAutocompleteValues(final String tagKey, final Duration queryDuration) { + return queryAsync(() -> getTagQueryService().queryTagAutocompleteValues(TagType.TRACE, tagKey, queryDuration)); } }