Skip to content

Commit

Permalink
[#6821] Adds server map performance improvements as an experimental f…
Browse files Browse the repository at this point in the history
…eature
  • Loading branch information
jaehong-kim committed Jul 27, 2021
1 parent 7075a10 commit a05c598
Show file tree
Hide file tree
Showing 11 changed files with 65 additions and 261 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ collector.metric.jmx.domain=pinpoint.collector.metrics

statistics.flushPeriod=1000
# Use the statistics agent status.
collector.statistics.agent-state.enable=false
collector.statistics.agent-state.enable=true


# -------------------------------------------------------------------------------------------------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,14 @@

package com.navercorp.pinpoint.web.applicationmap.appender.server;

import com.navercorp.pinpoint.web.applicationmap.histogram.NodeHistogram;
import com.navercorp.pinpoint.web.applicationmap.nodes.Node;
import com.navercorp.pinpoint.web.applicationmap.nodes.ServerBuilder;
import com.navercorp.pinpoint.web.applicationmap.nodes.ServerInstanceList;
import com.navercorp.pinpoint.web.applicationmap.rawdata.LinkData;
import com.navercorp.pinpoint.web.applicationmap.rawdata.LinkDataDuplexMap;
import com.navercorp.pinpoint.web.vo.AgentInfo;
import com.navercorp.pinpoint.web.vo.Application;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashSet;
import java.util.Objects;
Expand All @@ -34,9 +33,6 @@
* @author jaehong.kim
*/
public class StatisticsServerInstanceListFactory implements ServerInstanceListFactory {

private final Logger logger = LoggerFactory.getLogger(this.getClass());

public StatisticsServerInstanceListFactory() {
}

Expand All @@ -49,13 +45,16 @@ public ServerInstanceList createWasNodeInstanceList(Node wasNode, long timestamp

final ServerBuilder builder = new ServerBuilder();
final Set<AgentInfo> agentInfoSet = new HashSet<>();
for(String agentId : wasNode.getNodeHistogram().getAgentHistogramMap().keySet()) {
AgentInfo agentInfo = new AgentInfo();
agentInfo.setAgentId(agentId);
agentInfo.setHostName(agentId);
agentInfo.setIp("");
agentInfo.setServiceTypeCode(wasNode.getServiceType().getCode());
agentInfoSet.add(agentInfo);
final NodeHistogram nodeHistogram = wasNode.getNodeHistogram();
if (nodeHistogram != null && nodeHistogram.getAgentHistogramMap() != null) {
for (String agentId : nodeHistogram.getAgentHistogramMap().keySet()) {
AgentInfo agentInfo = new AgentInfo();
agentInfo.setAgentId(agentId);
agentInfo.setHostName(agentId);
agentInfo.setIp("");
agentInfo.setServiceTypeCode(wasNode.getServiceType().getCode());
agentInfoSet.add(agentInfo);
}
}
builder.addAgentInfo(agentInfoSet);
return builder.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,8 @@ public TransactionInfoViewModel transactionInfo(@RequestParam("traceId") String
@RequestParam(value = "focusTimestamp", required = false, defaultValue = DEFAULT_FOCUS_TIMESTAMP) long focusTimestamp,
@RequestParam(value = "agentId", required = false) String agentId,
@RequestParam(value = "spanId", required = false, defaultValue = DEFAULT_SPANID) long spanId,
@RequestParam(value = "v", required = false, defaultValue = "0") int viewVersion) {
@RequestParam(value = "v", required = false, defaultValue = "0") int viewVersion,
@RequestParam(value = "useStatisticsAgentState", required = false, defaultValue = "false") boolean useStatisticsAgentState) {
logger.debug("GET /transactionInfo params {traceId={}, focusTimestamp={}, agentId={}, spanId={}, v={}}", traceId, focusTimestamp, agentId, spanId, viewVersion);
final TransactionId transactionId = TransactionIdUtils.parseTransactionId(traceId);
final ColumnGetCount columnGetCount = ColumnGetCountFactory.create(callstackSelectSpansLimit);
Expand All @@ -110,9 +111,7 @@ public TransactionInfoViewModel transactionInfo(@RequestParam("traceId") String

// application map
FilteredMapServiceOption.Builder optionBuilder = new FilteredMapServiceOption.Builder(transactionId, viewVersion, columnGetCount);
final FilteredMapServiceOption option = optionBuilder
.setUseStatisticsServerInstanceList(true)
.build();
final FilteredMapServiceOption option = optionBuilder.setUseStatisticsAgentState(useStatisticsAgentState).build();
ApplicationMap map = filteredMapService.selectApplicationMap(option);

RecordSet recordSet = this.transactionInfoService.createRecordSet(callTreeIterator, spanMatchFilter);
Expand Down Expand Up @@ -150,30 +149,6 @@ public TransactionTimelineInfoViewModel transactionTimelineInfo(@RequestParam("t
return result;
}

@GetMapping(value = "/transactionInfoV2")
public TransactionInfoViewModel transactionInfoV2(@RequestParam("traceId") String traceIdParam,
@RequestParam(value = "focusTimestamp", required = false, defaultValue = DEFAULT_FOCUS_TIMESTAMP) long focusTimestamp,
@RequestParam(value = "agentId", required = false) String agentId,
@RequestParam(value = "spanId", required = false, defaultValue = DEFAULT_SPANID) long spanId,
@RequestParam(value = "v", required = false, defaultValue = "0") int viewVersion) {
logger.debug("GET /transactionInfo params {traceId={}, focusTimestamp={}, agentId={}, spanId={}, v={}}",
traceIdParam, focusTimestamp, agentId, spanId, viewVersion);
final TransactionId transactionId = TransactionIdUtils.parseTransactionId(traceIdParam);
final ColumnGetCount columnGetCount = ColumnGetCountFactory.create(callstackSelectSpansLimit);

Predicate<SpanBo> spanMatchFilter = SpanFilters.spanFilter(spanId, agentId, focusTimestamp);
// select spans
final SpanResult spanResult = this.spanService.selectSpan(transactionId, spanMatchFilter);
final CallTreeIterator callTreeIterator = spanResult.getCallTree();

// application map
final FilteredMapServiceOption option = new FilteredMapServiceOption.Builder(transactionId, viewVersion, columnGetCount).setUseStatisticsServerInstanceList(true).build();
final ApplicationMap map = filteredMapService.selectApplicationMap(option);

final RecordSet recordSet = this.transactionInfoService.createRecordSet(callTreeIterator, spanMatchFilter);
final TransactionInfoViewModel result = new TransactionInfoViewModel(transactionId, spanId, map.getNodes(), map.getLinks(), recordSet, spanResult.getTraceState(), logConfiguration);
return result;
}

@PostMapping(value = "/bind")
public String metaDataBind(@RequestParam("type") String type,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,26 +70,10 @@ public FilterMapWrap getFilteredServerMapDataMadeOfDotGroup(
@RequestParam(value = "filter", required = false) String filterText,
@RequestParam(value = "hint", required = false) String filterHint,
@RequestParam(value = "limit", required = false, defaultValue = "10000") int limit,
@RequestParam(value = "v", required = false, defaultValue = "0") int viewVersion) {
@RequestParam(value = "v", required = false, defaultValue = "0") int viewVersion,
@RequestParam(value = "useStatisticsAgentState", defaultValue = "false", required = false) boolean useStatisticsAgentState) {
String serviceTypeName = registry.findServiceType(serviceTypeCode).getName();
return getFilteredServerMapDataMadeOfDotGroup(applicationName, serviceTypeName, from, to, originTo, xGroupUnit, yGroupUnit, filterText, filterHint, limit, viewVersion);
}

@GetMapping(value = "/getFilteredServerMapDataMadeOfDotGroupV2", params="serviceTypeCode")
public FilterMapWrap getFilteredServerMapDataMadeOfDotGroupV2(
@RequestParam("applicationName") String applicationName,
@RequestParam("serviceTypeCode") short serviceTypeCode,
@RequestParam("from") long from,
@RequestParam("to") long to,
@RequestParam("originTo") long originTo,
@RequestParam("xGroupUnit") int xGroupUnit,
@RequestParam("yGroupUnit") int yGroupUnit,
@RequestParam(value = "filter", required = false) String filterText,
@RequestParam(value = "hint", required = false) String filterHint,
@RequestParam(value = "limit", required = false, defaultValue = "10000") int limit,
@RequestParam(value = "v", required = false, defaultValue = "0") int viewVersion) {
String serviceTypeName = registry.findServiceType(serviceTypeCode).getName();
return getFilteredServerMapDataMadeOfDotGroupV2(applicationName, serviceTypeName, from, to, originTo, xGroupUnit, yGroupUnit, filterText, filterHint, limit, viewVersion);
return getFilteredServerMapDataMadeOfDotGroup(applicationName, serviceTypeName, from, to, originTo, xGroupUnit, yGroupUnit, filterText, filterHint, limit, viewVersion, useStatisticsAgentState);
}

@GetMapping(value = "/getFilteredServerMapDataMadeOfDotGroup", params="serviceTypeName")
Expand All @@ -104,7 +88,8 @@ public FilterMapWrap getFilteredServerMapDataMadeOfDotGroup(
@RequestParam(value = "filter", required = false) String filterText,
@RequestParam(value = "hint", required = false) String filterHint,
@RequestParam(value = "limit", required = false, defaultValue = "10000") int limit,
@RequestParam(value = "v", required = false, defaultValue = "0") int viewVersion) {
@RequestParam(value = "v", required = false, defaultValue = "0") int viewVersion,
@RequestParam(value = "useStatisticsAgentState", defaultValue = "false", required = false) boolean useStatisticsAgentState) {
if (xGroupUnit <= 0) {
throw new IllegalArgumentException("xGroupUnit(" + xGroupUnit + ") must be positive number");
}
Expand All @@ -123,7 +108,7 @@ public FilterMapWrap getFilteredServerMapDataMadeOfDotGroup(
// needed to figure out already scanned ranged
final Range scannerRange = Range.newRange(lastScanTime, to);
logger.debug("originalRange:{} scannerRange:{} ", originalRange, scannerRange);
final FilteredMapServiceOption option = new FilteredMapServiceOption.Builder(limitedScanResult.getScanData(), originalRange, scannerRange, xGroupUnit, yGroupUnit, filter, viewVersion).build();
final FilteredMapServiceOption option = new FilteredMapServiceOption.Builder(limitedScanResult.getScanData(), originalRange, scannerRange, xGroupUnit, yGroupUnit, filter, viewVersion).setUseStatisticsAgentState(useStatisticsAgentState).build();
final ApplicationMap map = filteredMapService.selectApplicationMapWithScatterData(option);

if (logger.isDebugEnabled()) {
Expand All @@ -134,46 +119,4 @@ public FilterMapWrap getFilteredServerMapDataMadeOfDotGroup(
mapWrap.setLastFetchedTimestamp(lastScanTime);
return mapWrap;
}

@GetMapping(value = "/getFilteredServerMapDataMadeOfDotGroupV2", params="serviceTypeName")
public FilterMapWrap getFilteredServerMapDataMadeOfDotGroupV2(
@RequestParam("applicationName") String applicationName,
@RequestParam("serviceTypeName") String serviceTypeName,
@RequestParam("from") long from,
@RequestParam("to") long to,
@RequestParam("originTo") long originTo,
@RequestParam("xGroupUnit") int xGroupUnit,
@RequestParam("yGroupUnit") int yGroupUnit,
@RequestParam(value = "filter", required = false) String filterText,
@RequestParam(value = "hint", required = false) String filterHint,
@RequestParam(value = "limit", required = false, defaultValue = "10000") int limit,
@RequestParam(value = "v", required = false, defaultValue = "0") int viewVersion) {
if (xGroupUnit <= 0) {
throw new IllegalArgumentException("xGroupUnit(" + xGroupUnit + ") must be positive number");
}
if (yGroupUnit <= 0) {
throw new IllegalArgumentException("yGroupUnit(" + yGroupUnit + ") must be positive number");
}

limit = LimitUtils.checkRange(limit);
final Filter<List<SpanBo>> filter = filterBuilder.build(filterText, filterHint);
final Range range = Range.newRange(from, to);
final LimitedScanResult<List<TransactionId>> limitedScanResult = filteredMapService.selectTraceIdsFromApplicationTraceIndex(applicationName, range, limit);

final long lastScanTime = limitedScanResult.getLimitedTime();
// original range: needed for visual chart data sampling
final Range originalRange = Range.newRange(from, originTo);
// needed to figure out already scanned ranged
final Range scannerRange = Range.newRange(lastScanTime, to);
logger.debug("originalRange:{} scannerRange:{} ", originalRange, scannerRange);
final FilteredMapServiceOption option = new FilteredMapServiceOption.Builder(limitedScanResult.getScanData(), originalRange, scannerRange, xGroupUnit, yGroupUnit, filter, viewVersion).setUseStatisticsServerInstanceList(true).build();
final ApplicationMap map = filteredMapService.selectApplicationMapWithScatterData(option);
if (logger.isDebugEnabled()) {
logger.debug("getFilteredServerMapData range scan(limit:{}) range:{} lastFetchedTimestamp:{}", limit, range.prettyToString(), DateTimeFormatUtils.format(lastScanTime));
}

final FilterMapWrap mapWrap = new FilterMapWrap(map);
mapWrap.setLastFetchedTimestamp(lastScanTime);
return mapWrap;
}
}
Loading

0 comments on commit a05c598

Please sign in to comment.