From 0a4bcffb42dd077c36b50887359768007d95d4df Mon Sep 17 00:00:00 2001 From: donghun-cho Date: Wed, 10 Aug 2022 13:36:43 +0900 Subject: [PATCH] [#9115] Improve legacyCompatibilityCheck --- .../web/calltree/span/SpanFilters.java | 1 + .../web/dao/hbase/SpanQueryBuilder.java | 3 ++ .../web/service/HeatMapServiceImpl.java | 22 ++++++++-- .../navercorp/pinpoint/web/vo/SpanHint.java | 18 ++++++++ .../web/dao/hbase/SpanQueryBuilderTest.java | 42 +++++++++++++++++++ 5 files changed, 82 insertions(+), 4 deletions(-) diff --git a/web/src/main/java/com/navercorp/pinpoint/web/calltree/span/SpanFilters.java b/web/src/main/java/com/navercorp/pinpoint/web/calltree/span/SpanFilters.java index c03b910d46e2d..7d54db1adacc8 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/calltree/span/SpanFilters.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/calltree/span/SpanFilters.java @@ -131,6 +131,7 @@ public static Predicate agentIdFilter(String agentId) { return new SpanAgentIdPredicate(agentId); } + // Also used in SpanQueryBuilder private static class SpanAgentIdPredicate implements Predicate { private final String agentId; diff --git a/web/src/main/java/com/navercorp/pinpoint/web/dao/hbase/SpanQueryBuilder.java b/web/src/main/java/com/navercorp/pinpoint/web/dao/hbase/SpanQueryBuilder.java index b7dede20417c8..ee73c3134ff8c 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/dao/hbase/SpanQueryBuilder.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/dao/hbase/SpanQueryBuilder.java @@ -39,6 +39,9 @@ Predicate newSpanFilter(TransactionId transactionId, SpanHint spanHint) if (spanHint.getApplicationName() != null) { builder.addFilter(SpanFilters.applicationIdFilter(spanHint.getApplicationName())); } + if (spanHint.getAgentId() != null) { + builder.addFilter(SpanFilters.agentIdFilter(spanHint.getAgentId())); + } return builder.build(); } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/service/HeatMapServiceImpl.java b/web/src/main/java/com/navercorp/pinpoint/web/service/HeatMapServiceImpl.java index 2280786ba31e4..2848e500bb2d4 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/service/HeatMapServiceImpl.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/service/HeatMapServiceImpl.java @@ -2,6 +2,7 @@ import com.navercorp.pinpoint.common.profiler.util.TransactionId; import com.navercorp.pinpoint.common.server.bo.SpanBo; +import com.navercorp.pinpoint.common.server.util.time.Range; import com.navercorp.pinpoint.common.util.CollectionUtils; import com.navercorp.pinpoint.web.dao.ApplicationTraceIndexDao; import com.navercorp.pinpoint.web.dao.TraceDao; @@ -11,12 +12,11 @@ import com.navercorp.pinpoint.web.util.ListListUtils; import com.navercorp.pinpoint.web.vo.GetTraceInfo; import com.navercorp.pinpoint.web.vo.LimitedScanResult; -import com.navercorp.pinpoint.common.server.util.time.Range; import com.navercorp.pinpoint.web.vo.SpanHint; import com.navercorp.pinpoint.web.vo.scatter.Dot; import com.navercorp.pinpoint.web.vo.scatter.DotMetaData; -import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -98,7 +98,8 @@ private LimitedScanResult> legacyCompatibilityCheck(String app List query = buildQuery(applicationName, dots); final List> selectedSpans = traceDao.selectSpans(query); - List spanList = ListListUtils.toList(selectedSpans, selectedSpans.size()); + //List spanList = ListListUtils.toList(selectedSpans, selectedSpans.size()); + List spanList = pickFirst(selectedSpans); spanService.populateAgentName(spanList); if (dots.size() != spanList.size()) { @@ -172,9 +173,22 @@ private GetTraceInfo dotToGetTraceInfo(String applicationName, Dot dot) { TransactionId transactionId = dot.getTransactionId(); SpanHint spanHint = new SpanHint(dot.getAcceptedTime(), - dot.getElapsedTime(), applicationName); + dot.getElapsedTime(), applicationName, dot.getAgentId()); return new GetTraceInfo(transactionId, spanHint); } + private List pickFirst(List> spanLists) { + List result = new ArrayList<>(spanLists.size()); + for (List candidates : spanLists) { + if (candidates.size() > 0) { + result.add(candidates.get(0)); + + if (candidates.size() > 1 && logger.isDebugEnabled()) { + logger.debug("heuristically avoid Legacy compatibility error, spanCandidate:{}", candidates); + } + } + } + return result; + } } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/vo/SpanHint.java b/web/src/main/java/com/navercorp/pinpoint/web/vo/SpanHint.java index 7a3e92ecb5fe2..626e5adc6b839 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/vo/SpanHint.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/vo/SpanHint.java @@ -27,6 +27,7 @@ public final class SpanHint { private final long collectorAcceptorTime; private final int responseTime; private final String applicationName; + private final String agentId; private final boolean isSet; @@ -34,6 +35,7 @@ public SpanHint() { this.collectorAcceptorTime = -1; this.responseTime = -1; this.applicationName = null; + this.agentId = null; this.isSet = false; } @@ -44,6 +46,18 @@ public SpanHint(long collectorAcceptorTime, int responseTime, String application Assert.isTrue(responseTime >= 0, "responseTime must be 'responseTime >= 0'"); this.responseTime = responseTime; this.applicationName = applicationName; + this.agentId = null; + + this.isSet = true; + } + + public SpanHint(long collectorAcceptorTime, int responseTime, String applicationName, String agentId) { + Assert.isTrue(collectorAcceptorTime > 0, "collectorAcceptorTime must be 'collectorAcceptorTime > 0'"); + this.collectorAcceptorTime = collectorAcceptorTime; + Assert.isTrue(responseTime >= 0, "responseTime must be 'responseTime >= 0'"); + this.responseTime = responseTime; + this.applicationName = applicationName; + this.agentId = agentId; this.isSet = true; } @@ -60,6 +74,10 @@ public String getApplicationName() { return applicationName; } + public String getAgentId() { + return agentId; + } + public boolean isSet() { return isSet; } diff --git a/web/src/test/java/com/navercorp/pinpoint/web/dao/hbase/SpanQueryBuilderTest.java b/web/src/test/java/com/navercorp/pinpoint/web/dao/hbase/SpanQueryBuilderTest.java index 2cee372a96dce..eb237db6f6927 100644 --- a/web/src/test/java/com/navercorp/pinpoint/web/dao/hbase/SpanQueryBuilderTest.java +++ b/web/src/test/java/com/navercorp/pinpoint/web/dao/hbase/SpanQueryBuilderTest.java @@ -33,6 +33,24 @@ public void spanFilter() { Assertions.assertTrue(filter.test(span)); } + @Test + public void spanFilterWithAgentId() { + + SpanHint spanHint = new SpanHint(COLLECTOR_ACCEPTOR_TIME, RESPONSE_TIME, "appName", "agentId"); + + SpanQueryBuilder builder = new SpanQueryBuilder(); + Predicate filter = builder.newSpanFilter(txId, spanHint); + + SpanBo span = new SpanBo(); + span.setTransactionId(txId); + span.setCollectorAcceptTime(100); + span.setElapsed(200); + span.setApplicationId("appName"); + span.setAgentId("agentId"); + + Assertions.assertTrue(filter.test(span)); + } + @Test public void spanFilter_false() { @@ -46,6 +64,19 @@ public void spanFilter_false() { Assertions.assertFalse(filter.test(span)); } + @Test + public void spanFilterWithAgentId_false() { + + SpanHint spanHint = new SpanHint(COLLECTOR_ACCEPTOR_TIME, RESPONSE_TIME, "appName", "agentId"); + + SpanQueryBuilder builder = new SpanQueryBuilder(); + Predicate filter = builder.newSpanFilter(txId, spanHint); + + SpanBo span = new SpanBo(); + + Assertions.assertFalse(filter.test(span)); + } + @Test public void spanFilter_txid() { @@ -78,4 +109,15 @@ public void spanFilter_responseTime() { Assertions.assertTrue(filter.test(span)); } + + @Test + public void spanFilter_agentId() { + + Predicate filter = SpanFilters.agentIdFilter("agentId"); + + SpanBo span = new SpanBo(); + span.setAgentId("agentId"); + + Assertions.assertTrue(filter.test(span)); + } } \ No newline at end of file