Fix trace profiling segments build failure when span list not ordering (#10613)

This commit is contained in:
mrproliu 2023-03-30 18:39:28 +08:00 committed by GitHub
parent ec2ca354ea
commit 0664bcdcb4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 30 additions and 18 deletions

View File

@ -264,31 +264,43 @@ public class ProfileTaskQueryService implements Service {
// trying to find parent
final ArrayList<ProfiledTraceSegments> results = new ArrayList<>();
final Iterator<Map.Entry<String, ProfiledTraceSegments>> entryIterator = segments.entrySet().iterator();
final Set<ProfiledSpan> mergedSpans = new HashSet<>();
while (entryIterator.hasNext()) {
// keep segment if no ref
final Map.Entry<String, ProfiledTraceSegments> current = entryIterator.next();
if (CollectionUtils.isEmpty(current.getValue().getSpans().get(0).getRefs())) {
results.add(current.getValue());
continue;
}
// keep segment if ref type is not same process(analyze only match with the same process)
final Ref ref = current.getValue().getSpans().get(0).getRefs().get(0);
if (RefType.CROSS_PROCESS.equals(ref.getType())) {
results.add(current.getValue());
continue;
boolean spanBeenAdded = false;
for (ProfiledSpan span : current.getValue().getSpans()) {
if (mergedSpans.contains(span)) {
continue;
}
if (CollectionUtils.isEmpty(span.getRefs())) {
continue;
}
// keep segment if ref type is not same process(analyze only match with the same process)
final Ref ref = span.getRefs().get(0);
if (RefType.CROSS_PROCESS.equals(ref.getType())) {
results.add(current.getValue());
spanBeenAdded = true;
break;
}
// find parent segment if exist
final ProfiledTraceSegments parentSegments = segments.get(ref.getParentSegmentId());
if (parentSegments != null) {
// append merged spans
mergedSpans.addAll(current.getValue().getSpans());
// add current segments into parent
parentSegments.merge(current.getValue());
// set parent segments(combined) as current segment
current.setValue(parentSegments);
spanBeenAdded = true;
break;
}
}
// find parent segment if exist
final ProfiledTraceSegments parentSegments = segments.get(ref.getParentSegmentId());
if (parentSegments == null) {
if (!spanBeenAdded) {
results.add(current.getValue());
continue;
}
// add current segments into parent
parentSegments.merge(current.getValue());
// set parent segments(combined) as current segment
current.setValue(parentSegments);
}
return results.stream().filter(ProfiledTraceSegments::isContainsProfiled).peek(this::removeAllCrossProcessRef).collect(Collectors.toList());