From 5ea0133a62a69161835c7201b564311388728be4 Mon Sep 17 00:00:00 2001 From: mrproliu <741550557@qq.com> Date: Wed, 11 Mar 2020 14:39:40 +0800 Subject: [PATCH] fix overlapping time ranges profile analyze error (#4487) Co-authored-by: Mrproliu --- .../core/profile/analyze/ProfileAnalyzer.java | 2 +- .../core/profile/analyze/ProfileStack.java | 15 +++++++++++++++ .../src/test/resources/thread-snapshot.yml | 17 +++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/profile/analyze/ProfileAnalyzer.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/profile/analyze/ProfileAnalyzer.java index 10f198d90..d008e4957 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/profile/analyze/ProfileAnalyzer.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/profile/analyze/ProfileAnalyzer.java @@ -85,7 +85,7 @@ public class ProfileAnalyzer { LOGGER.warn(e.getMessage(), e); return Collections.emptyList(); } - }).flatMap(Collection::stream).map(ProfileStack::deserialize).collect(Collectors.toList()); + }).flatMap(Collection::stream).map(ProfileStack::deserialize).distinct().collect(Collectors.toList()); // analyze analyzation.setTrees(analyze(stacks)); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/profile/analyze/ProfileStack.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/profile/analyze/ProfileStack.java index de10e5ce6..3af420438 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/profile/analyze/ProfileStack.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/profile/analyze/ProfileStack.java @@ -21,6 +21,8 @@ package org.apache.skywalking.oap.server.core.profile.analyze; import com.google.common.primitives.Ints; import com.google.protobuf.InvalidProtocolBufferException; import java.util.List; +import java.util.Objects; + import lombok.Data; import org.apache.skywalking.apm.network.language.profile.ThreadStack; import org.apache.skywalking.oap.server.core.profile.ProfileThreadSnapshotRecord; @@ -56,4 +58,17 @@ public class ProfileStack implements Comparable { public int compareTo(ProfileStack o) { return Ints.compare(sequence, o.sequence); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ProfileStack that = (ProfileStack) o; + return sequence == that.sequence; + } + + @Override + public int hashCode() { + return Objects.hash(sequence); + } } diff --git a/oap-server/server-core/src/test/resources/thread-snapshot.yml b/oap-server/server-core/src/test/resources/thread-snapshot.yml index d5f613061..6ebc0973a 100644 --- a/oap-server/server-core/src/test/resources/thread-snapshot.yml +++ b/oap-server/server-core/src/test/resources/thread-snapshot.yml @@ -244,3 +244,20 @@ list: - code: A count: 5 duration: 30:30 + + # case 9(multiple time ranges with overlapping time) + - data: + limit: 10 + timeRanges: 0-2,1-3,5-6 + snapshots: + - A + - A + - A + - A + - B + - A + - A + expected: + - code: A + count: 6 + duration: 40:40