diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMap.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMap.java index 0217e6170aec..2e390cef705f 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMap.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMap.java @@ -15,7 +15,9 @@ package com.navercorp.pinpoint.web.applicationmap; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.navercorp.pinpoint.common.server.util.time.Range; import com.navercorp.pinpoint.web.applicationmap.link.Link; import com.navercorp.pinpoint.web.applicationmap.nodes.Node; @@ -33,4 +35,6 @@ public interface ApplicationMap { @JsonProperty("linkDataArray") Collection getLinks(); + @JsonInclude(JsonInclude.Include.NON_NULL) + Range getRange(); } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMapBuilder.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMapBuilder.java index 4c5c3778ef58..edb196e9886c 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMapBuilder.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMapBuilder.java @@ -95,7 +95,7 @@ public ApplicationMap build(Application application, long timeoutMillis) { NodeHistogramAppender nodeHistogramAppender = nodeHistogramAppenderFactory.create(nodeHistogramFactory); nodeHistogramAppender.appendNodeHistogram(range, nodeList, emptyLinkList, timeoutMillis); - return new DefaultApplicationMap(range, nodeList, emptyLinkList); + return DefaultApplicationMap.build(nodeList, emptyLinkList, range); } public ApplicationMap build(LinkDataDuplexMap linkDataDuplexMap, long timeoutMillis) { @@ -122,7 +122,7 @@ public ApplicationMap build(LinkDataDuplexMap linkDataDuplexMap, long timeoutMil ServerInfoAppender serverInfoAppender = serverInfoAppenderFactory.create(serverGroupListFactory); serverInfoAppender.appendServerInfo(range, nodeList, linkDataDuplexMap, timeoutWatcher.remainingTimeMillis()); - return new DefaultApplicationMap(range, nodeList, linkList); + return DefaultApplicationMap.build(nodeList, linkList, range); } private static class TimeoutWatcher { diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMapWithScatterData.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMapWithScatterData.java deleted file mode 100644 index 454d4dffebae..000000000000 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMapWithScatterData.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2016 NAVER Corp. - * Licensed 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 com.navercorp.pinpoint.web.applicationmap; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonValue; -import com.navercorp.pinpoint.web.applicationmap.link.Link; -import com.navercorp.pinpoint.web.applicationmap.nodes.Node; -import com.navercorp.pinpoint.web.scatter.ScatterData; -import com.navercorp.pinpoint.web.vo.Application; - -import java.util.Collection; -import java.util.Map; - -/** - * @author Taejin Koo - */ -public class ApplicationMapWithScatterData implements ApplicationMap { - - private final ApplicationMap applicationMap; - private final Map applicationScatterDataMap; - - public ApplicationMapWithScatterData(ApplicationMap applicationMap, Map applicationScatterDataMap) { - this.applicationMap = applicationMap; - this.applicationScatterDataMap = applicationScatterDataMap; - } - - @Override - public Collection getNodes() { - return applicationMap.getNodes(); - } - - @Override - public Collection getLinks() { - return applicationMap.getLinks(); - } - - @JsonValue - public ApplicationMap getApplicationMap() { - return applicationMap; - } - - @JsonIgnore - public Map getApplicationScatterDataMap() { - return applicationScatterDataMap; - } - -} diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMapWithScatterScanResult.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMapWithScatterScanResult.java deleted file mode 100644 index d433d4786736..000000000000 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMapWithScatterScanResult.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2016 NAVER Corp. - * Licensed 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 com.navercorp.pinpoint.web.applicationmap; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonValue; -import com.navercorp.pinpoint.web.applicationmap.link.Link; -import com.navercorp.pinpoint.web.applicationmap.nodes.Node; -import com.navercorp.pinpoint.web.vo.scatter.ApplicationScatterScanResult; - -import java.util.Collection; -import java.util.List; - -/** - * @author Taejin Koo - */ -public class ApplicationMapWithScatterScanResult implements ApplicationMap { - - private final ApplicationMap applicationMap; - private final List applicationScatterScanResultList; - - public ApplicationMapWithScatterScanResult(ApplicationMap applicationMap, List applicationScatterScanResultList) { - this.applicationMap = applicationMap; - this.applicationScatterScanResultList = applicationScatterScanResultList; - } - - @Override - public Collection getNodes() { - return applicationMap.getNodes(); - } - - @Override - public Collection getLinks() { - return applicationMap.getLinks(); - } - - @JsonValue - public ApplicationMap getApplicationMap() { - return applicationMap; - } - - @JsonIgnore - public List getApplicationScatterScanResultList() { - return applicationScatterScanResultList; - } - -} diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/DefaultApplicationMap.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/DefaultApplicationMap.java index a02ba5212f7a..d37054e83013 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/DefaultApplicationMap.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/DefaultApplicationMap.java @@ -16,17 +16,14 @@ package com.navercorp.pinpoint.web.applicationmap; -import com.navercorp.pinpoint.common.util.CollectionUtils; +import com.navercorp.pinpoint.common.server.util.time.Range; import com.navercorp.pinpoint.web.applicationmap.link.Link; import com.navercorp.pinpoint.web.applicationmap.link.LinkList; import com.navercorp.pinpoint.web.applicationmap.nodes.Node; import com.navercorp.pinpoint.web.applicationmap.nodes.NodeList; -import com.navercorp.pinpoint.common.server.util.time.Range; - -import com.fasterxml.jackson.annotation.JsonProperty; import java.util.Collection; -import java.util.Objects; +import java.util.List; /** * Node map @@ -34,27 +31,12 @@ * @author netspider * @author emeroad */ -public class DefaultApplicationMap implements ApplicationMap { - - private final NodeList nodeList; - private final LinkList linkList; - - private final Range range; - -// private List applicationScatterScanResultList; - - public DefaultApplicationMap(Range range, NodeList nodeList, LinkList linkList) { - this.range = Objects.requireNonNull(range, "range"); - this.nodeList = Objects.requireNonNull(nodeList, "nodeList"); +public class DefaultApplicationMap { - Objects.requireNonNull(linkList, "linkList"); - this.linkList = createNewLinkList(linkList); - } - - private LinkList createNewLinkList(LinkList originalLinkList) { + private static Collection createNewLinkList(LinkList originalLinkList) { Collection linkList = originalLinkList.getLinkList(); - if (CollectionUtils.nullSafeSize(linkList) == 0) { - return originalLinkList; + if (linkList.isEmpty()) { + return List.of(); } LinkList newLinkList = new LinkList(); @@ -64,25 +46,17 @@ private LinkList createNewLinkList(LinkList originalLinkList) { } if (link.getHistogram().getTotalCount() == 0) { continue; - } newLinkList.addLink(link); } - return newLinkList; + return newLinkList.getLinkList(); } - @JsonProperty("nodeDataArray") - public Collection getNodes() { - return this.nodeList.getNodeList(); + public static ApplicationMap build(NodeList nodeList, LinkList linkList, Range range) { + Collection nodes = nodeList.getNodeList(); + Collection links = createNewLinkList(linkList); + return new SimpleApplicationMap(nodes, links, range); } - @JsonProperty("linkDataArray") - public Collection getLinks() { - return this.linkList.getLinkList(); - } - - public Range getRange() { - return range; - } } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/FilterMapWithScatter.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/FilterMapWithScatter.java new file mode 100644 index 000000000000..de9f5a3e3e7e --- /dev/null +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/FilterMapWithScatter.java @@ -0,0 +1,29 @@ +package com.navercorp.pinpoint.web.applicationmap; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonValue; +import com.navercorp.pinpoint.web.scatter.ScatterData; +import com.navercorp.pinpoint.web.vo.Application; + +import java.util.Map; +import java.util.Objects; + +public class FilterMapWithScatter { + private final ApplicationMap applicationMap; + private final Map applicationScatterDataMap; + + public FilterMapWithScatter(ApplicationMap applicationMap, Map applicationScatterDataMap) { + this.applicationMap = Objects.requireNonNull(applicationMap, "applicationMap"); + this.applicationScatterDataMap = Objects.requireNonNull(applicationScatterDataMap, "applicationScatterDataMap"); + } + + @JsonValue + public ApplicationMap getApplicationMap() { + return applicationMap; + } + + @JsonIgnore + public Map getScatterDataMap() { + return applicationScatterDataMap; + } +} diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/FilterMapWrap.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/FilterMapWrap.java index 6f8a25fd18d7..8a22c1a7cbd3 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/FilterMapWrap.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/FilterMapWrap.java @@ -16,30 +16,37 @@ package com.navercorp.pinpoint.web.applicationmap; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonUnwrapped; import com.navercorp.pinpoint.web.applicationmap.histogram.TimeHistogramFormat; import com.navercorp.pinpoint.web.applicationmap.link.Link; import com.navercorp.pinpoint.web.applicationmap.nodes.Node; -import com.navercorp.pinpoint.web.view.FilterMapWrapSerializer; +import com.navercorp.pinpoint.web.applicationmap.view.FilteredHistogramView; +import com.navercorp.pinpoint.web.applicationmap.view.ScatterDataMapView; +import com.navercorp.pinpoint.web.scatter.ScatterData; +import com.navercorp.pinpoint.web.vo.Application; + +import java.util.Map; +import java.util.Objects; /** * @author emeroad */ -@JsonSerialize(using = FilterMapWrapSerializer.class) public class FilterMapWrap { private final ApplicationMap applicationMap; private Long lastFetchedTimestamp; + private boolean filteredHistogram = false; + + private Map scatterDataMap; public FilterMapWrap(ApplicationMap applicationMap, TimeHistogramFormat timeHistogramFormat) { - this.applicationMap = applicationMap; - - if(timeHistogramFormat == TimeHistogramFormat.V2) { - for (Node node : applicationMap.getNodes()) { - node.setTimeHistogramFormat(timeHistogramFormat); - } - for(Link link : applicationMap.getLinks()) { - link.setTimeHistogramFormat(timeHistogramFormat); - } + this.applicationMap = Objects.requireNonNull(applicationMap, "applicationMap"); + + for (Node node : applicationMap.getNodes()) { + node.setTimeHistogramFormat(timeHistogramFormat); + } + for (Link link : applicationMap.getLinks()) { + link.setTimeHistogramFormat(timeHistogramFormat); } } @@ -47,7 +54,7 @@ public void setLastFetchedTimestamp(Long lastFetchedTimestamp) { this.lastFetchedTimestamp = lastFetchedTimestamp; } - public ApplicationMap getApplicationMap() { + public ApplicationMap getApplicationMapData() { return applicationMap; } @@ -55,4 +62,29 @@ public Long getLastFetchedTimestamp() { return lastFetchedTimestamp; } + public void setFilteredHistogram(boolean filteredHistogram) { + this.filteredHistogram = filteredHistogram; + } + + @JsonInclude(JsonInclude.Include.NON_NULL) + public Map getApplicationScatterData() { + if (scatterDataMap == null) { + return null; + } + return new ScatterDataMapView(scatterDataMap).getDataMap(); + } + + public void setScatterDataMap(Map scatterDataMap) { + this.scatterDataMap = scatterDataMap; + } + + @JsonUnwrapped + @JsonInclude(JsonInclude.Include.NON_NULL) + public FilteredHistogramView getFilteredHistogramView() { + if (filteredHistogram) { + return new FilteredHistogramView(applicationMap); + } + return null; + } + } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/MapWrap.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/MapWrap.java index dea57cd3308b..1760ffe78f85 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/MapWrap.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/MapWrap.java @@ -31,7 +31,7 @@ public class MapWrap { public MapWrap(ApplicationMap applicationMap, final TimeHistogramFormat timeHistogramFormat) { this.applicationMap = applicationMap; - if(timeHistogramFormat == TimeHistogramFormat.V2) { + if (timeHistogramFormat == TimeHistogramFormat.V2) { for(Node node : applicationMap.getNodes()) { node.setTimeHistogramFormat(timeHistogramFormat); } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/SimpleApplicationMap.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/SimpleApplicationMap.java index d57ecf1b293a..695522a2d757 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/SimpleApplicationMap.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/SimpleApplicationMap.java @@ -1,7 +1,9 @@ package com.navercorp.pinpoint.web.applicationmap; +import com.navercorp.pinpoint.common.server.util.time.Range; import com.navercorp.pinpoint.web.applicationmap.link.Link; import com.navercorp.pinpoint.web.applicationmap.nodes.Node; +import jakarta.annotation.Nullable; import java.util.Collection; import java.util.Objects; @@ -10,9 +12,19 @@ public class SimpleApplicationMap implements ApplicationMap { private final Collection nodes; private final Collection links; + @Nullable + private final Range range; + public SimpleApplicationMap(Collection nodes, Collection links) { this.nodes = Objects.requireNonNull(nodes, "nodes"); this.links = Objects.requireNonNull(links, "links"); + this.range = null; + } + + public SimpleApplicationMap(Collection nodes, Collection links, Range range) { + this.nodes = Objects.requireNonNull(nodes, "nodes"); + this.links = Objects.requireNonNull(links, "links"); + this.range = Objects.requireNonNull(range, "range"); } @Override @@ -24,4 +36,9 @@ public Collection getNodes() { public Collection getLinks() { return links; } + + @Override + public Range getRange() { + return range; + } } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/controller/FilteredMapController.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/controller/FilteredMapController.java index 649fcd0fbce4..05db95b02ac1 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/controller/FilteredMapController.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/controller/FilteredMapController.java @@ -24,6 +24,7 @@ import com.navercorp.pinpoint.common.server.util.time.Range; import com.navercorp.pinpoint.loader.service.ServiceTypeRegistryService; import com.navercorp.pinpoint.web.applicationmap.ApplicationMap; +import com.navercorp.pinpoint.web.applicationmap.FilterMapWithScatter; import com.navercorp.pinpoint.web.applicationmap.FilterMapWrap; import com.navercorp.pinpoint.web.applicationmap.histogram.TimeHistogramFormat; import com.navercorp.pinpoint.web.applicationmap.map.MapViews; @@ -146,7 +147,8 @@ public FilterMapWrap getFilteredServerMapDataMadeOfDotGroup( .Builder(limitedScanResult.scanData(), originalRange, xGroupUnit, yGroupUnit, filter, viewVersion) .setUseStatisticsAgentState(useStatisticsAgentState) .build(); - final ApplicationMap map = filteredMapService.selectApplicationMapWithScatterData(option); + final FilterMapWithScatter scatter = filteredMapService.selectApplicationMapWithScatterData(option); + ApplicationMap map = scatter.getApplicationMap(); if (logger.isDebugEnabled()) { logger.debug("getFilteredServerMapData range scan(limit:{}) range:{} lastFetchedTimestamp:{}", @@ -155,6 +157,7 @@ public FilterMapWrap getFilteredServerMapDataMadeOfDotGroup( final FilterMapWrap mapWrap = new FilterMapWrap(map, getTimeHistogramFormat(useLoadHistogramFormat)); mapWrap.setLastFetchedTimestamp(lastScanTime); + mapWrap.setScatterDataMap(scatter.getScatterDataMap()); return mapWrap; } @@ -232,15 +235,16 @@ public FilterMapWrap getFilteredServerMapDataMadeOfDotGroupV3( .Builder(limitedScanResult.scanData(), originalRange, xGroupUnit, yGroupUnit, filter, viewVersion) .setUseStatisticsAgentState(useStatisticsAgentState) .build(); - final ApplicationMap map = filteredMapService.selectApplicationMapWithScatterDataV3(option); + final FilterMapWithScatter map = filteredMapService.selectApplicationMapWithScatterData(option); if (logger.isDebugEnabled()) { logger.debug("getFilteredServerMapData range scan(limit:{}) range:{} lastFetchedTimestamp:{}", limit, range.prettyToString(), DateTimeFormatUtils.format(lastScanTime)); } - FilterMapWrap mapWrap; - mapWrap = new FilterMapWrap(map, TimeHistogramFormat.V1); + FilterMapWrap mapWrap = new FilterMapWrap(map.getApplicationMap(), TimeHistogramFormat.V1); mapWrap.setLastFetchedTimestamp(lastScanTime); + mapWrap.setFilteredHistogram(true); + mapWrap.setScatterDataMap(map.getScatterDataMap()); return mapWrap; } } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/service/FilteredMapService.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/service/FilteredMapService.java index 5835c0fa198b..6c0d4de73fe6 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/service/FilteredMapService.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/service/FilteredMapService.java @@ -20,6 +20,7 @@ import com.navercorp.pinpoint.common.profiler.util.TransactionId; import com.navercorp.pinpoint.common.server.util.time.Range; import com.navercorp.pinpoint.web.applicationmap.ApplicationMap; +import com.navercorp.pinpoint.web.applicationmap.FilterMapWithScatter; import com.navercorp.pinpoint.web.vo.LimitedScanResult; import java.util.List; @@ -37,7 +38,6 @@ public interface FilteredMapService { ApplicationMap selectApplicationMap(FilteredMapServiceOption option); - ApplicationMap selectApplicationMapWithScatterData(FilteredMapServiceOption option); + FilterMapWithScatter selectApplicationMapWithScatterData(FilteredMapServiceOption option); - ApplicationMap selectApplicationMapWithScatterDataV3(FilteredMapServiceOption option); } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/service/FilteredMapServiceImpl.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/service/FilteredMapServiceImpl.java index 080b890e77d9..0de6085f396b 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/service/FilteredMapServiceImpl.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/service/FilteredMapServiceImpl.java @@ -25,8 +25,7 @@ import com.navercorp.pinpoint.web.applicationmap.ApplicationMap; import com.navercorp.pinpoint.web.applicationmap.ApplicationMapBuilder; import com.navercorp.pinpoint.web.applicationmap.ApplicationMapBuilderFactory; -import com.navercorp.pinpoint.web.applicationmap.ApplicationMapWithScatterData; -import com.navercorp.pinpoint.web.applicationmap.ApplicationMapWithScatterDataV3; +import com.navercorp.pinpoint.web.applicationmap.FilterMapWithScatter; import com.navercorp.pinpoint.web.applicationmap.appender.histogram.DefaultNodeHistogramFactory; import com.navercorp.pinpoint.web.applicationmap.appender.histogram.datasource.ResponseHistogramsNodeHistogramDataSource; import com.navercorp.pinpoint.web.applicationmap.appender.histogram.datasource.WasNodeHistogramDataSource; @@ -137,11 +136,10 @@ public ApplicationMap selectApplicationMap(FilteredMapServiceOption option) { filteredMapBuilder.addTransactions(filterList); FilteredMap filteredMap = filteredMapBuilder.build(); - ApplicationMap map = createMap(option, filteredMap, false); - return map; + return createMap(option, filteredMap); } - public ApplicationMap selectApplicationMapWithScatterData(FilteredMapServiceOption option) { + public FilterMapWithScatter selectApplicationMapWithScatterData(FilteredMapServiceOption option) { StopWatch watch = new StopWatch(); watch.start(); @@ -151,38 +149,16 @@ public ApplicationMap selectApplicationMapWithScatterData(FilteredMapServiceOpti filteredMapBuilder.addTransactions(filterList); FilteredMap filteredMap = filteredMapBuilder.build(); - ApplicationMap map = createMap(option, filteredMap, false); + ApplicationMap map = createMap(option, filteredMap); Map applicationScatterData = filteredMap.getApplicationScatterData(option.getOriginalRange().getFrom(), option.getOriginalRange().getTo(), option.getxGroupUnit(), option.getyGroupUnit()); - ApplicationMapWithScatterData applicationMapWithScatterData = new ApplicationMapWithScatterData(map, applicationScatterData); watch.stop(); logger.debug("Select filtered application map elapsed. {}ms", watch.getTotalTimeMillis()); - return applicationMapWithScatterData; + return new FilterMapWithScatter(map, applicationScatterData); } - @Override - public ApplicationMap selectApplicationMapWithScatterDataV3(FilteredMapServiceOption option) { - StopWatch watch = new StopWatch(); - watch.start(); - - final List> filterList = selectFilteredSpan(option.getTransactionIdList(), option.getFilter(), option.getColumnGetCount()); - FilteredMapBuilder filteredMapBuilder = new FilteredMapBuilder(applicationFactory, registry, option.getOriginalRange(), option.getVersion()); - filteredMapBuilder.serverMapDataFilter(serverMapDataFilter); - filteredMapBuilder.addTransactions(filterList); - FilteredMap filteredMap = filteredMapBuilder.build(); - - ApplicationMap map = createMap(option, filteredMap, true); - - Map applicationScatterData = filteredMap.getApplicationScatterData(option.getOriginalRange().getFrom(), option.getOriginalRange().getTo(), option.getxGroupUnit(), option.getyGroupUnit()); - ApplicationMapWithScatterDataV3 applicationMapWithScatterDataV3 = new ApplicationMapWithScatterDataV3(map, applicationScatterData); - - watch.stop(); - logger.debug("Select filtered application map elapsed. {}ms", watch.getTotalTimeMillis()); - - return applicationMapWithScatterDataV3; - } private List> selectFilteredSpan(List transactionIdList, Filter> filter, ColumnGetCount columnGetCount) { // filters out recursive calls by looking at each objects @@ -195,12 +171,8 @@ private List> selectFilteredSpan(List transactionIdL return filterList2(originalList, filter); } - private ApplicationMap createMap(FilteredMapServiceOption option, FilteredMap filteredMap, boolean v3Format) { + private ApplicationMap createMap(FilteredMapServiceOption option, FilteredMap filteredMap) { final ApplicationMapBuilder applicationMapBuilder = applicationMapBuilderFactory.createApplicationMapBuilder(option.getOriginalRange()); - if (v3Format) { -// applicationMapBuilder.linkType(LinkType.SIMPLIFIED); -// applicationMapBuilder.nodeType(NodeType.SIMPLIFIED); - } final WasNodeHistogramDataSource wasNodeHistogramDataSource = new ResponseHistogramsNodeHistogramDataSource(filteredMap.getResponseHistograms()); applicationMapBuilder.includeNodeHistogram(new DefaultNodeHistogramFactory(wasNodeHistogramDataSource)); ServerGroupListDataSource serverGroupListDataSource = serverInstanceDatasourceService.getServerGroupListDataSource(); diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMapWithScatterDataV3.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/view/FilteredHistogramView.java similarity index 57% rename from web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMapWithScatterDataV3.java rename to web/src/main/java/com/navercorp/pinpoint/web/applicationmap/view/FilteredHistogramView.java index 863360241cdb..9e7d298e7bba 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMapWithScatterDataV3.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/view/FilteredHistogramView.java @@ -1,63 +1,25 @@ -/* - * Copyright 2023 NAVER Corp. - * Licensed 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 com.navercorp.pinpoint.web.applicationmap.view; -package com.navercorp.pinpoint.web.applicationmap; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonValue; +import com.navercorp.pinpoint.web.applicationmap.ApplicationMap; import com.navercorp.pinpoint.web.applicationmap.histogram.Histogram; import com.navercorp.pinpoint.web.applicationmap.histogram.NodeHistogram; import com.navercorp.pinpoint.web.applicationmap.histogram.TimeHistogram; import com.navercorp.pinpoint.web.applicationmap.link.Link; import com.navercorp.pinpoint.web.applicationmap.nodes.Node; -import com.navercorp.pinpoint.web.scatter.ScatterData; import com.navercorp.pinpoint.web.view.histogram.HistogramView; import com.navercorp.pinpoint.web.view.histogram.ServerHistogramView; -import com.navercorp.pinpoint.web.vo.Application; import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import java.util.Map; -public class ApplicationMapWithScatterDataV3 implements ApplicationMap { +public class FilteredHistogramView { private final ApplicationMap applicationMap; - private final Map applicationScatterDataMap; - public ApplicationMapWithScatterDataV3(ApplicationMap applicationMap, Map applicationScatterDataMap) { + public FilteredHistogramView(ApplicationMap applicationMap) { this.applicationMap = applicationMap; - this.applicationScatterDataMap = applicationScatterDataMap; - } - - @Override - public Collection getNodes() { - return applicationMap.getNodes(); - } - - @Override - public Collection getLinks() { - return applicationMap.getLinks(); } - @JsonValue - public ApplicationMap getApplicationMap() { - return applicationMap; - } - - @JsonIgnore public List getNodeServerHistogramData() { final List result = new ArrayList<>(); for (Node node : applicationMap.getNodes()) { @@ -66,7 +28,6 @@ public List getNodeServerHistogramData() { return result; } - @JsonIgnore public List getNodeHistogramData() { final List result = new ArrayList<>(); for (Node node : applicationMap.getNodes()) { @@ -84,7 +45,6 @@ private HistogramView getNodeHistogramView(Node node) { return new HistogramView(nodeName, histogram, histogramList); } - @JsonIgnore public List getLinkHistogramData() { final List result = new ArrayList<>(); for (Link link : applicationMap.getLinks()) { @@ -101,9 +61,4 @@ private HistogramView getLinkHistogramView(Link link) { return new HistogramView(linkName, histogram, histogramList); } - @JsonIgnore - public Map getApplicationScatterDataMap() { - return applicationScatterDataMap; - } - } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/view/ScatterDataMapView.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/view/ScatterDataMapView.java new file mode 100644 index 000000000000..f9c63a3cec08 --- /dev/null +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/view/ScatterDataMapView.java @@ -0,0 +1,35 @@ +package com.navercorp.pinpoint.web.applicationmap.view; + +import com.navercorp.pinpoint.web.applicationmap.nodes.NodeName; +import com.navercorp.pinpoint.web.scatter.ScatterData; +import com.navercorp.pinpoint.web.vo.Application; + +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +public class ScatterDataMapView { + private final Map dataMap; + + public ScatterDataMapView(Map dataMap) { + this.dataMap = Objects.requireNonNull(dataMap, "dataMap"); + } + + public Map getDataMap() { + + return dataMap.entrySet() + .stream() + .collect(Collectors.toMap(e -> nodeName(e.getKey()), e -> scatterDataView(e.getValue()))); + } + + private String nodeName(Application application) { + return NodeName.of(application).getName(); + } + + private ScatterDataView scatterDataView(ScatterData data) { + return new ScatterDataView(data.getFrom(), data.getTo(), data.getOldestAcceptedTime(), data.getLatestAcceptedTime(), data); + } + + public record ScatterDataView(long from, long to, long resultFrom, long resultTo, ScatterData scatter) { + } +} diff --git a/web/src/main/java/com/navercorp/pinpoint/web/view/FilterMapWrapSerializer.java b/web/src/main/java/com/navercorp/pinpoint/web/view/FilterMapWrapSerializer.java deleted file mode 100644 index c55653d3f079..000000000000 --- a/web/src/main/java/com/navercorp/pinpoint/web/view/FilterMapWrapSerializer.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed 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 com.navercorp.pinpoint.web.view; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.navercorp.pinpoint.web.applicationmap.ApplicationMapWithScatterData; -import com.navercorp.pinpoint.web.applicationmap.ApplicationMapWithScatterDataV3; -import com.navercorp.pinpoint.web.applicationmap.ApplicationMapWithScatterScanResult; -import com.navercorp.pinpoint.web.applicationmap.FilterMapWrap; -import com.navercorp.pinpoint.web.applicationmap.nodes.NodeName; -import com.navercorp.pinpoint.web.scatter.ScatterData; -import com.navercorp.pinpoint.web.vo.Application; -import com.navercorp.pinpoint.web.vo.scatter.ApplicationScatterScanResult; - -import java.io.IOException; -import java.util.List; -import java.util.Map; - -/** - * @author emeroad - */ -public class FilterMapWrapSerializer extends JsonSerializer { - @Override - public void serialize(FilterMapWrap wrap, JsonGenerator jgen, SerializerProvider provider) throws IOException { - jgen.writeStartObject(); - - jgen.writeObjectField("applicationMapData", wrap.getApplicationMap()); - jgen.writeNumberField("lastFetchedTimestamp", wrap.getLastFetchedTimestamp()); - - if (wrap.getApplicationMap() instanceof ApplicationMapWithScatterScanResult applicationMap) { - final List applicationScatterScanResult = applicationMap.getApplicationScatterScanResultList(); - - jgen.writeFieldName("applicationScatterScanResult"); - jgen.writeStartObject(); - for (ApplicationScatterScanResult scatterScanResult : applicationScatterScanResult) { - NodeName nodeName = NodeName.of(scatterScanResult.getApplication()); - jgen.writeObjectField(nodeName.getName(), scatterScanResult.getScatterScanResult()); - } - jgen.writeEndObject(); - } - - if (wrap.getApplicationMap() instanceof ApplicationMapWithScatterData applicationMap) { - Map applicationScatterDataMap = applicationMap.getApplicationScatterDataMap(); - - writeScatterData(jgen, applicationScatterDataMap); - } - - if (wrap.getApplicationMap() instanceof ApplicationMapWithScatterDataV3 applicationMap) { - Map applicationScatterDataMap = applicationMap.getApplicationScatterDataMap(); - - writeScatterData(jgen, applicationScatterDataMap); - jgen.writeObjectField("nodeServerHistogramData", applicationMap.getNodeServerHistogramData()); - jgen.writeObjectField("nodeHistogramData", applicationMap.getNodeHistogramData()); - jgen.writeObjectField("linkHistogramData", applicationMap.getLinkHistogramData()); - } - - jgen.writeEndObject(); - } - - private void writeScatterData(JsonGenerator jgen, Map applicationScatterDataMap) throws IOException { - jgen.writeFieldName("applicationScatterData"); - jgen.writeStartObject(); - - for (Map.Entry entry : applicationScatterDataMap.entrySet()) { - NodeName nodeName = NodeName.of(entry.getKey()); - jgen.writeFieldName(nodeName.getName()); - - ScatterData scatterData = entry.getValue(); - - jgen.writeStartObject(); - jgen.writeObjectField("from", scatterData.getFrom()); - jgen.writeObjectField("to", scatterData.getTo()); - jgen.writeObjectField("resultFrom", scatterData.getOldestAcceptedTime()); - jgen.writeObjectField("resultTo", scatterData.getLatestAcceptedTime()); - jgen.writeObjectField("scatter", scatterData); - jgen.writeEndObject(); - } - - jgen.writeEndObject(); - } -} diff --git a/web/src/test/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMapTest.java b/web/src/test/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMapTest.java index fc6eed109041..79ed4640c6e5 100644 --- a/web/src/test/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMapTest.java +++ b/web/src/test/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMapTest.java @@ -37,7 +37,7 @@ public class ApplicationMapTest { @Test public void root() throws IOException { - ApplicationMap app = new DefaultApplicationMap(Range.between(0, 1), new NodeList(), new LinkList()); + ApplicationMap app = DefaultApplicationMap.build(new NodeList(), new LinkList(), Range.between(0, 1)); String s = mapper.writeValueAsString(app); logger.debug(s); } diff --git a/web/src/test/java/com/navercorp/pinpoint/web/applicationmap/service/FilteredMapServiceImplTest.java b/web/src/test/java/com/navercorp/pinpoint/web/applicationmap/service/FilteredMapServiceImplTest.java index e7ecb431eaed..d94e52114d83 100644 --- a/web/src/test/java/com/navercorp/pinpoint/web/applicationmap/service/FilteredMapServiceImplTest.java +++ b/web/src/test/java/com/navercorp/pinpoint/web/applicationmap/service/FilteredMapServiceImplTest.java @@ -31,6 +31,7 @@ import com.navercorp.pinpoint.web.TestTraceUtils; import com.navercorp.pinpoint.web.applicationmap.ApplicationMap; import com.navercorp.pinpoint.web.applicationmap.ApplicationMapBuilderFactory; +import com.navercorp.pinpoint.web.applicationmap.FilterMapWithScatter; import com.navercorp.pinpoint.web.applicationmap.appender.histogram.NodeHistogramAppenderFactory; import com.navercorp.pinpoint.web.applicationmap.appender.server.ServerInfoAppenderFactory; import com.navercorp.pinpoint.web.applicationmap.appender.server.datasource.AgentInfoServerGroupListDataSource; @@ -210,7 +211,8 @@ public void twoTier() { // When final FilteredMapServiceOption option = new FilteredMapServiceOption.Builder(Collections.emptyList(), originalRange, 1, 1, Filter.acceptAllFilter(), 0).build(); - ApplicationMap applicationMap = filteredMapService.selectApplicationMapWithScatterData(option); + FilterMapWithScatter filterMapWithScatter = filteredMapService.selectApplicationMapWithScatterData(option); + ApplicationMap applicationMap = filterMapWithScatter.getApplicationMap(); // Then Collection nodes = applicationMap.getNodes();