diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TraceQueryService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TraceQueryService.java index b32859c4d..f4ea17ebd 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TraceQueryService.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TraceQueryService.java @@ -19,22 +19,38 @@ package org.apache.skywalking.oap.server.core.query; import java.io.IOException; -import java.util.*; -import org.apache.skywalking.apm.network.language.agent.*; -import org.apache.skywalking.apm.network.language.agent.v2.*; -import org.apache.skywalking.oap.server.core.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.LinkedList; +import java.util.List; +import org.apache.skywalking.apm.network.language.agent.SpanObject; +import org.apache.skywalking.apm.network.language.agent.TraceSegmentObject; +import org.apache.skywalking.apm.network.language.agent.UniqueId; +import org.apache.skywalking.apm.network.language.agent.v2.SegmentObject; +import org.apache.skywalking.apm.network.language.agent.v2.SpanObjectV2; +import org.apache.skywalking.oap.server.core.Const; +import org.apache.skywalking.oap.server.core.CoreModule; import org.apache.skywalking.oap.server.core.analysis.manual.segment.SegmentRecord; -import org.apache.skywalking.oap.server.core.cache.*; +import org.apache.skywalking.oap.server.core.cache.EndpointInventoryCache; +import org.apache.skywalking.oap.server.core.cache.NetworkAddressInventoryCache; +import org.apache.skywalking.oap.server.core.cache.ServiceInventoryCache; import org.apache.skywalking.oap.server.core.config.IComponentLibraryCatalogService; +import org.apache.skywalking.oap.server.core.query.entity.KeyValue; +import org.apache.skywalking.oap.server.core.query.entity.LogEntity; +import org.apache.skywalking.oap.server.core.query.entity.Pagination; +import org.apache.skywalking.oap.server.core.query.entity.QueryOrder; +import org.apache.skywalking.oap.server.core.query.entity.Ref; import org.apache.skywalking.oap.server.core.query.entity.RefType; +import org.apache.skywalking.oap.server.core.query.entity.Span; import org.apache.skywalking.oap.server.core.query.entity.Trace; -import org.apache.skywalking.oap.server.core.query.entity.*; +import org.apache.skywalking.oap.server.core.query.entity.TraceBrief; +import org.apache.skywalking.oap.server.core.query.entity.TraceState; import org.apache.skywalking.oap.server.core.register.EndpointInventory; import org.apache.skywalking.oap.server.core.register.ServiceInventory; import org.apache.skywalking.oap.server.core.storage.StorageModule; import org.apache.skywalking.oap.server.core.storage.query.ITraceQueryDAO; +import org.apache.skywalking.oap.server.library.module.ModuleManager; import org.apache.skywalking.oap.server.library.module.Service; -import org.apache.skywalking.oap.server.library.module.*; import org.apache.skywalking.oap.server.library.util.CollectionUtils; import static java.util.Objects.nonNull; @@ -374,6 +390,14 @@ public class TraceQueryService implements Service { rootSpans.add(span); } }); + /** + * In some cases, there are segment fragments, which could not be linked by Ref, + * because of two kinds of reasons. + * 1. Multiple leaf segments have no particular order in the storage. + * 2. Lost in sampling, agent fail safe, segment lost, even bug. + * Sorting the segments makes the trace view more readable. + */ + rootSpans.sort(Comparator.comparing(span -> span.getStartTime())); return rootSpans; }