Skip to content

Commit eaa3532

Browse files
committed
[pinpoint-apm#12434] Optimize scanner caching
1 parent 62a208a commit eaa3532

File tree

5 files changed

+41
-12
lines changed

5 files changed

+41
-12
lines changed

commons-timeseries/src/main/java/com/navercorp/pinpoint/common/timeseries/window/DefaultTimeSlot.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
*/
2525
public class DefaultTimeSlot implements TimeSlot {
2626

27-
private static final long ONE_MIN_RESOLUTION = 60000; // 1min
27+
public static final long ONE_MIN_RESOLUTION = 60000; // 1min
2828

2929
private final long resolution;
3030

commons-timeseries/src/main/java/com/navercorp/pinpoint/common/timeseries/window/TimeWindow.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public TimeWindow(Range range, TimeWindowSampler sampler) {
4747
TimeWindow(long rangeFrom, long rangeTo, TimeWindowSampler sampler) {
4848
Objects.requireNonNull(sampler, "sampler");
4949
this.windowSlotSize = sampler.getWindowSize(duration(rangeTo, rangeFrom));
50-
this.from = refineTimestamp(rangeFrom);
50+
this.from = this.refineTimestamp(rangeFrom);
5151
this.to = this.refineTimestamp(rangeTo);
5252
this.windowRangeCount = computeWindowRangeCount(duration(to, from), windowSlotSize);
5353
}
@@ -111,4 +111,13 @@ public int getWindowIndex(long time) {
111111
return (int) index;
112112
}
113113

114+
@Override
115+
public String toString() {
116+
return "TimeWindow{" +
117+
"windowSlotSize=" + windowSlotSize +
118+
", from=" + from +
119+
", to=" + to +
120+
", windowRangeCount=" + windowRangeCount +
121+
'}';
122+
}
114123
}
Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.navercorp.pinpoint.web.applicationmap.dao.hbase;
22

3+
import com.google.common.primitives.Ints;
34
import com.navercorp.pinpoint.common.server.util.ApplicationMapStatisticsUtils;
45
import com.navercorp.pinpoint.common.timeseries.time.Range;
6+
import com.navercorp.pinpoint.common.timeseries.window.DefaultTimeSlot;
57
import com.navercorp.pinpoint.web.vo.Application;
68
import com.navercorp.pinpoint.web.vo.RangeFactory;
79
import org.apache.hadoop.hbase.client.Scan;
@@ -13,40 +15,50 @@
1315
public class MapScanFactory {
1416
private final Logger logger = LogManager.getLogger(this.getClass());
1517

16-
public static final int SCAN_CACHE_SIZE = 40;
18+
public static final int SCAN_CACHE_SIZE_MIN = 8;
19+
public static final int SCAN_CACHE_SIZE_MAX = 1024;
1720

18-
private final RangeFactory rangeFactory;
21+
private long slotSize = DefaultTimeSlot.ONE_MIN_RESOLUTION;
1922

20-
private int scanCacheSize;
23+
private final RangeFactory rangeFactory;
2124

2225
public MapScanFactory(RangeFactory rangeFactory) {
2326
this.rangeFactory = Objects.requireNonNull(rangeFactory, "rangeFactory");
24-
this.scanCacheSize = SCAN_CACHE_SIZE;
2527
}
2628

27-
public void setScanCacheSize(int scanCacheSize) {
28-
this.scanCacheSize = scanCacheSize;
29+
public void setSlotSize(long slotSize) {
30+
this.slotSize = slotSize;
2931
}
3032

3133
public Scan createScan(String id, Application application, Range range, byte[] family) {
3234
range = rangeFactory.createStatisticsRange(range);
3335
if (logger.isDebugEnabled()) {
3436
logger.debug("scan time:{} ", range.prettyToString());
3537
}
36-
3738
// start key is replaced by end key because timestamp has been reversed
3839
byte[] startKey = ApplicationMapStatisticsUtils
3940
.makeRowKey(application.getName(), (short) application.getServiceTypeCode(), range.getTo());
4041
byte[] endKey = ApplicationMapStatisticsUtils
4142
.makeRowKey(application.getName(), (short) application.getServiceTypeCode(), range.getFrom());
4243

4344
final Scan scan = new Scan();
44-
scan.setCaching(this.scanCacheSize);
45+
46+
final int scannerCaching = computeScannerCaching(range);
47+
scan.setCaching(scannerCaching);
4548
scan.withStartRow(startKey);
4649
scan.withStopRow(endKey);
4750
scan.addFamily(family);
4851
scan.setId(id);
4952

5053
return scan;
5154
}
55+
56+
private int computeScannerCaching(Range range) {
57+
int windowCount = (int)(range.durationMillis() / slotSize) + 1;
58+
int scannerCaching = Ints.constrainToRange(windowCount, SCAN_CACHE_SIZE_MIN, SCAN_CACHE_SIZE_MAX);
59+
if (logger.isDebugEnabled()) {
60+
logger.debug("ScannerCaching:{} windowCount:{}", scannerCaching, windowCount);
61+
}
62+
return scannerCaching;
63+
}
5264
}

web/src/main/java/com/navercorp/pinpoint/web/applicationmap/nodes/ServerBuilder.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@
2020
import com.navercorp.pinpoint.web.applicationmap.rawdata.AgentHistogram;
2121
import com.navercorp.pinpoint.web.applicationmap.rawdata.AgentHistogramList;
2222
import com.navercorp.pinpoint.web.vo.agent.AgentAndStatus;
23+
import com.navercorp.pinpoint.web.vo.agent.AgentInfo;
2324
import org.apache.logging.log4j.LogManager;
2425
import org.apache.logging.log4j.Logger;
2526

2627
import java.util.HashSet;
28+
import java.util.List;
2729
import java.util.Set;
2830

2931
/**
@@ -97,7 +99,13 @@ public ServerGroupList buildPhysicalServer(final Set<AgentAndStatus> agentSet) {
9799
public ServerGroupList build() {
98100
if (!agentSet.isEmpty()) {
99101
// if agent name exists (physical server exists)
100-
this.logger.debug("buildPhysicalServer:{}", agentSet);
102+
if (logger.isDebugEnabled()) {
103+
List<String> agents = agentSet.stream()
104+
.map(AgentAndStatus::getAgentInfo)
105+
.map(AgentInfo::getAgentId)
106+
.toList();
107+
this.logger.debug("buildPhysicalServer: {}", agents);
108+
}
101109
return buildPhysicalServer(agentSet);
102110
} else {
103111
// otherwise, create logical name

web/src/main/java/com/navercorp/pinpoint/web/applicationmap/service/MapServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ public ApplicationMap selectApplicationMap(MapServiceOption option) {
130130
}
131131
watch.stop();
132132
if (logger.isInfoEnabled()) {
133-
logger.info("ApplicationMap BuildTime: {}", watch.prettyPrint());
133+
logger.info("ApplicationMap BuildTime: {} {}", option.getSourceApplication(), watch.prettyPrint());
134134
}
135135
if (serverMapDataFilter != null) {
136136
map = serverMapDataFilter.dataFiltering(map);

0 commit comments

Comments
 (0)