diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/config/MapHbaseConfiguration.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/config/MapHbaseConfiguration.java index 06d1cc5bd827..ad19cb896ae8 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/config/MapHbaseConfiguration.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/config/MapHbaseConfiguration.java @@ -39,6 +39,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Import; import org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean; import java.util.Optional; @@ -47,7 +48,9 @@ @org.springframework.context.annotation.Configuration @ComponentScan({ "com.navercorp.pinpoint.web.applicationmap.dao.hbase", - "com.navercorp.pinpoint.web.applicationmap.dao.mapper" +}) +@Import({ + MapMapperConfiguration.class }) public class MapHbaseConfiguration { private final Logger logger = LogManager.getLogger(MapHbaseConfiguration.class); diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/config/MapMapperConfiguration.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/config/MapMapperConfiguration.java new file mode 100644 index 000000000000..c1f55179e7e8 --- /dev/null +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/config/MapMapperConfiguration.java @@ -0,0 +1,58 @@ +package com.navercorp.pinpoint.web.applicationmap.config; + + +import com.navercorp.pinpoint.common.hbase.RowMapper; +import com.navercorp.pinpoint.loader.service.ServiceTypeRegistryService; +import com.navercorp.pinpoint.web.applicationmap.dao.mapper.LinkFilter; +import com.navercorp.pinpoint.web.applicationmap.dao.mapper.MapStatisticsCalleeMapper; +import com.navercorp.pinpoint.web.applicationmap.dao.mapper.MapStatisticsCallerMapper; +import com.navercorp.pinpoint.web.applicationmap.dao.mapper.ResponseTimeMapper; +import com.navercorp.pinpoint.web.applicationmap.rawdata.LinkDataMap; +import com.navercorp.pinpoint.web.component.ApplicationFactory; +import com.navercorp.pinpoint.web.util.TimeWindowFunction; +import com.navercorp.pinpoint.web.vo.ResponseTime; +import com.sematext.hbase.wd.RowKeyDistributorByHashPrefix; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class MapMapperConfiguration { + + @Bean + public RowMapper mapStatisticsCallerMapper(ApplicationFactory applicationFactory, + @Qualifier("statisticsCallerRowKeyDistributor") + RowKeyDistributorByHashPrefix rowKeyDistributor) { + return new MapStatisticsCallerMapper(applicationFactory, rowKeyDistributor, LinkFilter::skip, TimeWindowFunction.identity()); + } + + @Bean + public RowMapper mapStatisticsCallerTimeAggregatedMapper(ApplicationFactory applicationFactory, + @Qualifier("statisticsCallerRowKeyDistributor") + RowKeyDistributorByHashPrefix rowKeyDistributor) { + return new MapStatisticsCallerMapper(applicationFactory, rowKeyDistributor, LinkFilter::skip, TimeWindowFunction.ALL_IN_ONE); + } + + @Bean + public RowMapper mapStatisticsCalleeMapper(ServiceTypeRegistryService registry, + ApplicationFactory applicationFactory, + @Qualifier("statisticsCalleeRowKeyDistributor") + RowKeyDistributorByHashPrefix rowKeyDistributor) { + return new MapStatisticsCalleeMapper(registry, applicationFactory, rowKeyDistributor, LinkFilter::skip, TimeWindowFunction.identity()); + } + + @Bean + public RowMapper mapStatisticsCalleeTimeAggregatedMapper(ServiceTypeRegistryService registry, + ApplicationFactory applicationFactory, + @Qualifier("statisticsCalleeRowKeyDistributor") + RowKeyDistributorByHashPrefix rowKeyDistributor) { + return new MapStatisticsCalleeMapper(registry, applicationFactory, rowKeyDistributor, LinkFilter::skip, TimeWindowFunction.ALL_IN_ONE); + } + + @Bean + public RowMapper responseTimeMapper(ServiceTypeRegistryService registry, + @Qualifier("statisticsSelfRowKeyDistributor") + RowKeyDistributorByHashPrefix rowKeyDistributor) { + return new ResponseTimeMapper(registry, rowKeyDistributor); + } +} diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/dao/mapper/MapStatisticsCalleeMapper.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/dao/mapper/MapStatisticsCalleeMapper.java index 0e4a41fad461..b5fc255d2242 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/dao/mapper/MapStatisticsCalleeMapper.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/dao/mapper/MapStatisticsCalleeMapper.java @@ -27,6 +27,7 @@ import com.navercorp.pinpoint.web.applicationmap.link.LinkDirection; import com.navercorp.pinpoint.web.applicationmap.rawdata.LinkDataMap; import com.navercorp.pinpoint.web.component.ApplicationFactory; +import com.navercorp.pinpoint.web.util.TimeWindowFunction; import com.navercorp.pinpoint.web.vo.Application; import com.sematext.hbase.wd.RowKeyDistributorByHashPrefix; import org.apache.commons.lang3.StringUtils; @@ -35,9 +36,6 @@ import org.apache.hadoop.hbase.client.Result; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Component; import java.util.Objects; @@ -47,29 +45,33 @@ * @author netspider * */ -@Component public class MapStatisticsCalleeMapper implements RowMapper { private final Logger logger = LogManager.getLogger(this.getClass()); private final LinkFilter filter; - @Autowired - private ServiceTypeRegistryService registry; + private final ServiceTypeRegistryService registry; - @Autowired - private ApplicationFactory applicationFactory; + private final ApplicationFactory applicationFactory; - @Autowired - @Qualifier("statisticsCalleeRowKeyDistributor") - private RowKeyDistributorByHashPrefix rowKeyDistributorByHashPrefix; - public MapStatisticsCalleeMapper() { - this(LinkFilter::skip); - } + private final RowKeyDistributorByHashPrefix rowKeyDistributor; + + private final TimeWindowFunction timeWindowFunction; + + + public MapStatisticsCalleeMapper(ServiceTypeRegistryService registry, + ApplicationFactory applicationFactory, + RowKeyDistributorByHashPrefix rowKeyDistributor, + LinkFilter filter, + TimeWindowFunction timeWindowFunction) { + this.registry = Objects.requireNonNull(registry, "registry"); + this.applicationFactory = Objects.requireNonNull(applicationFactory, "applicationFactory"); + this.rowKeyDistributor = Objects.requireNonNull(rowKeyDistributor, "rowKeyDistributor"); - public MapStatisticsCalleeMapper(LinkFilter filter) { this.filter = Objects.requireNonNull(filter, "filter"); + this.timeWindowFunction = Objects.requireNonNull(timeWindowFunction, "timeWindowFunction"); } @Override @@ -83,9 +85,9 @@ public LinkDataMap mapRow(Result result, int rowNum) throws Exception { final Buffer row = new FixedBuffer(rowKey); final Application calleeApplication = readCalleeApplication(row); - final long timestamp = TimeUtils.recoveryTimeMillis(row.readLong()); + final long timestamp = timeWindowFunction.refineTimestamp(TimeUtils.recoveryTimeMillis(row.readLong())); - final LinkDataMap linkDataMap = new LinkDataMap(); + final LinkDataMap linkDataMap = new LinkDataMap(timeWindowFunction); for (Cell cell : result.rawCells()) { final byte[] qualifier = CellUtil.cloneQualifier(cell); @@ -142,6 +144,6 @@ private Application readCalleeApplication(Buffer row) { } private byte[] getOriginalKey(byte[] rowKey) { - return rowKeyDistributorByHashPrefix.getOriginalKey(rowKey); + return rowKeyDistributor.getOriginalKey(rowKey); } } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/dao/mapper/MapStatisticsCalleeTimeAggregatedMapper.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/dao/mapper/MapStatisticsCalleeTimeAggregatedMapper.java deleted file mode 100644 index 68f42da0e57d..000000000000 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/dao/mapper/MapStatisticsCalleeTimeAggregatedMapper.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * 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.dao.mapper; - -import com.navercorp.pinpoint.common.buffer.Buffer; -import com.navercorp.pinpoint.common.buffer.FixedBuffer; -import com.navercorp.pinpoint.common.hbase.RowMapper; -import com.navercorp.pinpoint.common.hbase.util.CellUtils; -import com.navercorp.pinpoint.common.server.util.ApplicationMapStatisticsUtils; -import com.navercorp.pinpoint.common.trace.ServiceType; -import com.navercorp.pinpoint.loader.service.ServiceTypeRegistryService; -import com.navercorp.pinpoint.web.applicationmap.rawdata.LinkDataMap; -import com.navercorp.pinpoint.web.component.ApplicationFactory; -import com.navercorp.pinpoint.web.vo.Application; -import com.sematext.hbase.wd.RowKeyDistributorByHashPrefix; -import org.apache.commons.lang3.StringUtils; -import org.apache.hadoop.hbase.Cell; -import org.apache.hadoop.hbase.CellUtil; -import org.apache.hadoop.hbase.client.Result; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Component; - -import java.util.Objects; - -@Component -public class MapStatisticsCalleeTimeAggregatedMapper implements RowMapper { - - private final Logger logger = LogManager.getLogger(this.getClass()); - - private final LinkFilter filter; - - @Autowired - private ServiceTypeRegistryService registry; - - @Autowired - private ApplicationFactory applicationFactory; - - @Autowired - @Qualifier("statisticsCalleeRowKeyDistributor") - private RowKeyDistributorByHashPrefix rowKeyDistributorByHashPrefix; - - public MapStatisticsCalleeTimeAggregatedMapper() { - this(LinkFilter::skip); - } - - public MapStatisticsCalleeTimeAggregatedMapper(LinkFilter filter) { - this.filter = Objects.requireNonNull(filter, "filter"); - } - - @Override - public LinkDataMap mapRow(Result result, int rowNum) throws Exception { - if (result.isEmpty()) { - return new LinkDataMap(); - } - logger.debug("mapRow:{}", rowNum); - - final byte[] rowKey = getOriginalKey(result.getRow()); - - final Buffer row = new FixedBuffer(rowKey); - final Application calleeApplication = readCalleeApplication(row); - final long timestamp = 0; //aggregate timestamp - - final LinkDataMap linkDataMap = new LinkDataMap(); - for (Cell cell : result.rawCells()) { - - final byte[] qualifier = CellUtil.cloneQualifier(cell); - final Application callerApplication = readCallerApplication(qualifier, calleeApplication.getServiceType()); - if (filter.filter(callerApplication)) { - continue; - } - - long requestCount = CellUtils.valueToLong(cell); - short histogramSlot = ApplicationMapStatisticsUtils.getHistogramSlotFromColumnName(qualifier); - - String callerHost = ApplicationMapStatisticsUtils.getHost(qualifier); - // There may be no callerHost for virtual queue nodes from user-defined entry points. - // Terminal nodes, such as httpclient will not have callerHost set as well, but since they're terminal - // nodes, they would not have reached here in the first place. - if (calleeApplication.getServiceType().isQueue()) { - callerHost = StringUtils.defaultString(callerHost); - } - boolean isError = histogramSlot == (short) -1; - - if (logger.isDebugEnabled()) { - logger.debug(" Fetched Callee. {} callerHost:{} -> {} (slot:{}/{}), ", callerApplication, callerHost, calleeApplication, histogramSlot, requestCount); - } - - final short slotTime = (isError) ? (short) -1 : histogramSlot; - linkDataMap.addLinkData(callerApplication, callerApplication.getName(), calleeApplication, callerHost, timestamp, slotTime, requestCount); - - if (logger.isDebugEnabled()) { - logger.debug(" Fetched Callee. statistics:{}", linkDataMap); - } - } - - return linkDataMap; - } - - private Application readCallerApplication(byte[] qualifier, ServiceType calleeServiceType) { - short callerServiceType = ApplicationMapStatisticsUtils.getDestServiceTypeFromColumnName(qualifier); - // Caller may be a user node, and user nodes may call nodes with the same application name but different service type. - // To distinguish between these user nodes, append callee's service type to the application name. - String callerApplicationName; - if (registry.findServiceType(callerServiceType).isUser()) { - callerApplicationName = ApplicationMapStatisticsUtils.getDestApplicationNameFromColumnNameForUser(qualifier, calleeServiceType); - } else { - callerApplicationName = ApplicationMapStatisticsUtils.getDestApplicationNameFromColumnName(qualifier); - } - return this.applicationFactory.createApplication(callerApplicationName, callerServiceType); - } - - private Application readCalleeApplication(Buffer row) { - String calleeApplicationName = row.read2PrefixedString(); - short calleeServiceType = row.readShort(); - - return this.applicationFactory.createApplication(calleeApplicationName, calleeServiceType); - } - - private byte[] getOriginalKey(byte[] rowKey) { - return rowKeyDistributorByHashPrefix.getOriginalKey(rowKey); - } -} diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/dao/mapper/MapStatisticsCallerMapper.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/dao/mapper/MapStatisticsCallerMapper.java index 2e443daa24b1..f1068dd2d85c 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/dao/mapper/MapStatisticsCallerMapper.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/dao/mapper/MapStatisticsCallerMapper.java @@ -25,6 +25,7 @@ import com.navercorp.pinpoint.web.applicationmap.link.LinkDirection; import com.navercorp.pinpoint.web.applicationmap.rawdata.LinkDataMap; import com.navercorp.pinpoint.web.component.ApplicationFactory; +import com.navercorp.pinpoint.web.util.TimeWindowFunction; import com.navercorp.pinpoint.web.vo.Application; import com.sematext.hbase.wd.RowKeyDistributorByHashPrefix; import org.apache.commons.lang3.StringUtils; @@ -32,9 +33,6 @@ import org.apache.hadoop.hbase.client.Result; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Component; import java.util.Objects; @@ -43,26 +41,28 @@ * * @author netspider */ -@Component public class MapStatisticsCallerMapper implements RowMapper { private final Logger logger = LogManager.getLogger(this.getClass()); private final LinkFilter filter; - @Autowired - private ApplicationFactory applicationFactory; + private final ApplicationFactory applicationFactory; - @Autowired - @Qualifier("statisticsCallerRowKeyDistributor") - private RowKeyDistributorByHashPrefix rowKeyDistributorByHashPrefix; + private final RowKeyDistributorByHashPrefix rowKeyDistributor; - public MapStatisticsCallerMapper() { - this(LinkFilter::skip); - } + private final TimeWindowFunction timeWindowFunction; + + + public MapStatisticsCallerMapper(ApplicationFactory applicationFactory, + RowKeyDistributorByHashPrefix rowKeyDistributor, + LinkFilter filter, + TimeWindowFunction timeWindowFunction) { + this.applicationFactory = Objects.requireNonNull(applicationFactory, "applicationFactory"); + this.rowKeyDistributor = Objects.requireNonNull(rowKeyDistributor, "rowKeyDistributor"); - public MapStatisticsCallerMapper(LinkFilter filter) { this.filter = Objects.requireNonNull(filter, "filter"); + this.timeWindowFunction = Objects.requireNonNull(timeWindowFunction, "timeWindowFunction"); } @Override @@ -76,7 +76,7 @@ public LinkDataMap mapRow(Result result, int rowNum) throws Exception { final Buffer row = new FixedBuffer(rowKey); final Application out = readCallerApplication(row); - final long timestamp = TimeUtils.recoveryTimeMillis(row.readLong()); + final long timestamp = timeWindowFunction.refineTimestamp(TimeUtils.recoveryTimeMillis(row.readLong())); // key is destApplicationName. final LinkDataMap linkDataMap = new LinkDataMap(); @@ -123,6 +123,6 @@ private Application readCallerApplication(Buffer row) { } private byte[] getOriginalKey(byte[] rowKey) { - return rowKeyDistributorByHashPrefix.getOriginalKey(rowKey); + return rowKeyDistributor.getOriginalKey(rowKey); } } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/dao/mapper/MapStatisticsCallerTimeAggregatedMapper.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/dao/mapper/MapStatisticsCallerTimeAggregatedMapper.java deleted file mode 100644 index ba23717af10c..000000000000 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/dao/mapper/MapStatisticsCallerTimeAggregatedMapper.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.navercorp.pinpoint.web.applicationmap.dao.mapper; - -import com.navercorp.pinpoint.common.buffer.Buffer; -import com.navercorp.pinpoint.common.buffer.FixedBuffer; -import com.navercorp.pinpoint.common.buffer.OffsetFixedBuffer; -import com.navercorp.pinpoint.common.hbase.RowMapper; -import com.navercorp.pinpoint.common.hbase.util.CellUtils; -import com.navercorp.pinpoint.web.applicationmap.rawdata.LinkDataMap; -import com.navercorp.pinpoint.web.component.ApplicationFactory; -import com.navercorp.pinpoint.web.vo.Application; -import com.sematext.hbase.wd.RowKeyDistributorByHashPrefix; -import org.apache.commons.lang3.StringUtils; -import org.apache.hadoop.hbase.Cell; -import org.apache.hadoop.hbase.client.Result; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Component; - -import java.util.Objects; - -/** - * rowkey = caller col = callee - */ -@Component -public class MapStatisticsCallerTimeAggregatedMapper implements RowMapper { - - private final Logger logger = LogManager.getLogger(this.getClass()); - - private final LinkFilter filter; - - - @Autowired - private ApplicationFactory applicationFactory; - - @Autowired - @Qualifier("statisticsCallerRowKeyDistributor") - private RowKeyDistributorByHashPrefix rowKeyDistributorByHashPrefix; - - public MapStatisticsCallerTimeAggregatedMapper() { - this(LinkFilter::skip); - } - - public MapStatisticsCallerTimeAggregatedMapper(LinkFilter filter) { - this.filter = Objects.requireNonNull(filter, "filter"); - } - - @Override - public LinkDataMap mapRow(Result result, int rowNum) throws Exception { - if (result.isEmpty()) { - return new LinkDataMap(); - } - logger.debug("mapRow:{}", rowNum); - - final byte[] rowKey = getOriginalKey(result.getRow()); - - final Buffer row = new FixedBuffer(rowKey); - final Application caller = readCallerApplication(row); - final long timestamp = 0; //aggregate timestamp - - // key is destApplicationName. - final LinkDataMap linkDataMap = new LinkDataMap(); - for (Cell cell : result.rawCells()) { - final Buffer buffer = new OffsetFixedBuffer(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()); - final Application callee = readCalleeApplication(buffer); - if (filter.filter(callee)) { - continue; - } - - String calleeHost = buffer.readPrefixedString(); - short histogramSlot = buffer.readShort(); - - boolean isError = histogramSlot == (short) -1; - - String callerAgentId = buffer.readPrefixedString(); - - long requestCount = CellUtils.valueToLong(cell); - if (logger.isDebugEnabled()) { - logger.debug(" Fetched Caller.(New) {} {} -> {} (slot:{}/{}) calleeHost:{}", caller, callerAgentId, callee, histogramSlot, requestCount, calleeHost); - } - - final short slotTime = (isError) ? (short) -1 : histogramSlot; - if (StringUtils.isEmpty(calleeHost)) { - calleeHost = callee.getName(); - } - linkDataMap.addLinkData(caller, callerAgentId, callee, calleeHost, timestamp, slotTime, requestCount); - } - - return linkDataMap; - } - - - private Application readCalleeApplication(Buffer buffer) { - short calleeServiceType = buffer.readShort(); - String calleeApplicationName = buffer.readPrefixedString(); - return applicationFactory.createApplication(calleeApplicationName, calleeServiceType); - } - - private Application readCallerApplication(Buffer row) { - String callerApplicationName = row.read2PrefixedString(); - short callerServiceType = row.readShort(); - return this.applicationFactory.createApplication(callerApplicationName, callerServiceType); - } - - private byte[] getOriginalKey(byte[] rowKey) { - return rowKeyDistributorByHashPrefix.getOriginalKey(rowKey); - } -} diff --git a/web/src/main/java/com/navercorp/pinpoint/web/mapper/ResponseTimeMapper.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/dao/mapper/ResponseTimeMapper.java similarity index 88% rename from web/src/main/java/com/navercorp/pinpoint/web/mapper/ResponseTimeMapper.java rename to web/src/main/java/com/navercorp/pinpoint/web/applicationmap/dao/mapper/ResponseTimeMapper.java index abc1432b3a08..94c431acf958 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/mapper/ResponseTimeMapper.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/dao/mapper/ResponseTimeMapper.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.navercorp.pinpoint.web.mapper; +package com.navercorp.pinpoint.web.applicationmap.dao.mapper; import com.navercorp.pinpoint.common.buffer.Buffer; import com.navercorp.pinpoint.common.buffer.FixedBuffer; @@ -33,8 +33,6 @@ import org.apache.hadoop.hbase.util.Bytes; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Component; import java.util.Objects; @@ -42,18 +40,18 @@ /** * @author emeroad */ -@Component public class ResponseTimeMapper implements RowMapper { private final Logger logger = LogManager.getLogger(this.getClass()); private final ServiceTypeRegistryService registry; - private final RowKeyDistributorByHashPrefix rowKeyDistributorByHashPrefix; + private final RowKeyDistributorByHashPrefix rowKeyDistributor; - public ResponseTimeMapper(ServiceTypeRegistryService registry, @Qualifier("statisticsSelfRowKeyDistributor") RowKeyDistributorByHashPrefix rowKeyDistributorByHashPrefix) { + public ResponseTimeMapper(ServiceTypeRegistryService registry, + RowKeyDistributorByHashPrefix rowKeyDistributor) { this.registry = Objects.requireNonNull(registry, "registry"); - this.rowKeyDistributorByHashPrefix = Objects.requireNonNull(rowKeyDistributorByHashPrefix, "rowKeyDistributorByHashPrefix"); + this.rowKeyDistributor = Objects.requireNonNull(rowKeyDistributor, "rowKeyDistributor"); } @Override @@ -100,6 +98,6 @@ private ResponseTime createResponseTime(byte[] rowKey) { } private byte[] getOriginalKey(byte[] rowKey) { - return rowKeyDistributorByHashPrefix.getOriginalKey(rowKey); + return rowKeyDistributor.getOriginalKey(rowKey); } } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/rawdata/LinkCallData.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/rawdata/LinkCallData.java index e5d0482ec35c..882deb3835d2 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/rawdata/LinkCallData.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/rawdata/LinkCallData.java @@ -18,7 +18,7 @@ import com.navercorp.pinpoint.web.applicationmap.histogram.TimeHistogram; import com.navercorp.pinpoint.web.applicationmap.link.LinkKey; -import com.navercorp.pinpoint.web.util.TimeWindow; +import com.navercorp.pinpoint.web.util.TimeWindowFunction; import com.navercorp.pinpoint.web.vo.Application; import java.util.Collection; @@ -37,24 +37,22 @@ public class LinkCallData { private final Application target; private final Map targetHistogramTimeMap; - private final TimeWindow timeWindow; + private final TimeWindowFunction timeWindow; public LinkCallData(LinkKey linkKey) { - this(linkKey, null); + this(linkKey, TimeWindowFunction.identity()); } - public LinkCallData(LinkKey linkKey, TimeWindow timeWindow) { + + public LinkCallData(LinkKey linkKey, TimeWindowFunction timeWindow) { Objects.requireNonNull(linkKey, "linkKey"); this.source = linkKey.getFrom(); this.target = linkKey.getTo(); this.targetHistogramTimeMap = new HashMap<>(); - this.timeWindow = timeWindow; + this.timeWindow = Objects.requireNonNull(timeWindow, "timeWindow"); } - public TimeWindow getTimeWindow() { - return timeWindow; - } public Application getSource() { return source; @@ -97,12 +95,12 @@ public void addRawCallData(LinkCallData copyLinkCallData) { } } - private TimeHistogram getTimeHistogram(Long timeStamp) { - long key = timeWindow != null ? timeWindow.refineTimestamp(timeStamp) : timeStamp; - TimeHistogram histogram = targetHistogramTimeMap.get(key); + private TimeHistogram getTimeHistogram(final Long timeStamp) { + final Long refineTimestamp = timeWindow.refineTimestamp(timeStamp); + TimeHistogram histogram = targetHistogramTimeMap.get(refineTimestamp); if (histogram == null) { - histogram = new TimeHistogram(target.getServiceType(), key); - targetHistogramTimeMap.put(key, histogram); + histogram = new TimeHistogram(target.getServiceType(), refineTimestamp); + targetHistogramTimeMap.put(refineTimestamp, histogram); } return histogram; } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/rawdata/LinkCallDataMap.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/rawdata/LinkCallDataMap.java index 454ccd9d1aee..b573bf9edacf 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/rawdata/LinkCallDataMap.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/rawdata/LinkCallDataMap.java @@ -19,7 +19,7 @@ import com.navercorp.pinpoint.common.trace.ServiceType; import com.navercorp.pinpoint.web.applicationmap.histogram.TimeHistogram; import com.navercorp.pinpoint.web.applicationmap.link.LinkKey; -import com.navercorp.pinpoint.web.util.TimeWindow; +import com.navercorp.pinpoint.web.util.TimeWindowFunction; import com.navercorp.pinpoint.web.vo.Application; import java.util.Collection; @@ -35,17 +35,17 @@ public class LinkCallDataMap { // private final Logger logger = LogManager.getLogger(this.getClass()); private final Map linkDataMap = new HashMap<>(); - private final TimeWindow timeWindow; + private final TimeWindowFunction timeWindow; public LinkCallDataMap() { - this(null); + this(TimeWindowFunction.identity()); } - public LinkCallDataMap(TimeWindow timeWindow) { - this.timeWindow = timeWindow; + public LinkCallDataMap(TimeWindowFunction timeWindow) { + this.timeWindow = Objects.requireNonNull(timeWindow, "timeWindow"); } - public TimeWindow getTimeWindow() { + public TimeWindowFunction getTimeWindow() { return this.timeWindow; } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/rawdata/LinkData.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/rawdata/LinkData.java index e65e140304f9..0cac151a1a40 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/rawdata/LinkData.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/rawdata/LinkData.java @@ -18,7 +18,7 @@ import com.navercorp.pinpoint.common.trace.ServiceType; -import com.navercorp.pinpoint.web.util.TimeWindow; +import com.navercorp.pinpoint.web.util.TimeWindowFunction; import com.navercorp.pinpoint.web.vo.Application; import java.util.Objects; @@ -35,16 +35,17 @@ public class LinkData { private final Application toApplication; private LinkCallDataMap linkCallDataMap; - private final TimeWindow timeWindow; + private final TimeWindowFunction timeWindow; public LinkData(Application fromApplication, Application toApplication) { - this(fromApplication, toApplication, null); + this(fromApplication, toApplication, TimeWindowFunction.identity()); } - public LinkData(Application fromApplication, Application toApplication, TimeWindow timeWindow) { + + public LinkData(Application fromApplication, Application toApplication, TimeWindowFunction timeWindow) { this.fromApplication = Objects.requireNonNull(fromApplication, "fromApplication"); this.toApplication = Objects.requireNonNull(toApplication, "toApplication"); - this.timeWindow = timeWindow; + this.timeWindow = Objects.requireNonNull(timeWindow, "timeWindow"); this.linkCallDataMap = new LinkCallDataMap(timeWindow); } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/rawdata/LinkDataMap.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/rawdata/LinkDataMap.java index 518f74ecd95e..888da847a760 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/rawdata/LinkDataMap.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/rawdata/LinkDataMap.java @@ -17,7 +17,7 @@ package com.navercorp.pinpoint.web.applicationmap.rawdata; import com.navercorp.pinpoint.web.applicationmap.link.LinkKey; -import com.navercorp.pinpoint.web.util.TimeWindow; +import com.navercorp.pinpoint.web.util.TimeWindowFunction; import com.navercorp.pinpoint.web.vo.Application; import java.util.Collection; @@ -27,14 +27,14 @@ public class LinkDataMap { private final Map linkDataMap = new HashMap<>(); - private TimeWindow timeWindow; + private final TimeWindowFunction timeWindow; public LinkDataMap() { - this(null); + this(TimeWindowFunction.identity()); } - public LinkDataMap(TimeWindow timeWindow) { - this.timeWindow = timeWindow; + public LinkDataMap(TimeWindowFunction timeWindow) { + this.timeWindow = Objects.requireNonNull(timeWindow, "timeWindow"); } @@ -93,11 +93,8 @@ public LinkData getLinkData(LinkKey findLinkKey) { return this.linkDataMap.get(findLinkKey); } - public TimeWindow getTimeWindow() { + public TimeWindowFunction getTimeWindow() { return timeWindow; } - public void setTimeWindow(TimeWindow timeWindow) { - this.timeWindow = timeWindow; - } } \ No newline at end of file diff --git a/web/src/main/java/com/navercorp/pinpoint/web/util/TimeWindow.java b/web/src/main/java/com/navercorp/pinpoint/web/util/TimeWindow.java index 2330477bed79..6d75d7493ac5 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/util/TimeWindow.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/util/TimeWindow.java @@ -28,7 +28,7 @@ * @author netspider * */ -public class TimeWindow implements Iterable { +public class TimeWindow implements Iterable, TimeWindowFunction { private final long windowSlotSize; @@ -57,9 +57,9 @@ public Iterator iterator() { * @param timestamp * @return */ + @Override public long refineTimestamp(long timestamp) { - long time = (timestamp / windowSlotSize) * windowSlotSize; - return time; + return (timestamp / windowSlotSize) * windowSlotSize; } public Range getWindowRange() { diff --git a/web/src/main/java/com/navercorp/pinpoint/web/util/TimeWindowFunction.java b/web/src/main/java/com/navercorp/pinpoint/web/util/TimeWindowFunction.java new file mode 100644 index 000000000000..3920a6c5d32a --- /dev/null +++ b/web/src/main/java/com/navercorp/pinpoint/web/util/TimeWindowFunction.java @@ -0,0 +1,17 @@ +package com.navercorp.pinpoint.web.util; + + +@FunctionalInterface +public interface TimeWindowFunction { + + TimeWindowFunction ALL_IN_ONE = (timestamp) -> 0; + + + long refineTimestamp(long timestamp); + + + static TimeWindowFunction identity() { + return timestamp -> timestamp; + } + +} diff --git a/web/src/main/java/com/navercorp/pinpoint/web/vo/ResponseTime.java b/web/src/main/java/com/navercorp/pinpoint/web/vo/ResponseTime.java index 5aac638bcd65..5e7a5ff0f97d 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/vo/ResponseTime.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/vo/ResponseTime.java @@ -67,8 +67,7 @@ public Histogram findHistogram(String agentId) { private Histogram getHistogram(String agentId) { Objects.requireNonNull(agentId, "agentId"); - TimeHistogram histogram = responseHistogramMap.computeIfAbsent(agentId, k -> new TimeHistogram(applicationServiceType, timeStamp)); - return histogram; + return responseHistogramMap.computeIfAbsent(agentId, k -> new TimeHistogram(applicationServiceType, timeStamp)); } public void addResponseTime(String agentId, short slotNumber, long count) { @@ -105,12 +104,10 @@ public Set> getAgentHistogram() { @Override public String toString() { - final StringBuilder sb = new StringBuilder("ResponseTime{"); - sb.append("applicationName='").append(applicationName).append('\''); - sb.append(", applicationServiceType=").append(applicationServiceType); - sb.append(", timeStamp=").append(timeStamp); - sb.append(", responseHistogramMap=").append(responseHistogramMap); - sb.append('}'); - return sb.toString(); + return "ResponseTime{" + "applicationName='" + applicationName + '\'' + + ", applicationServiceType=" + applicationServiceType + + ", timeStamp=" + timeStamp + + ", responseHistogramMap=" + responseHistogramMap + + '}'; } } diff --git a/web/src/test/java/com/navercorp/pinpoint/web/mapper/ResponseTimeMapperTest.java b/web/src/test/java/com/navercorp/pinpoint/web/applicationmap/dao/mapper/ResponseTimeMapperTest.java similarity index 97% rename from web/src/test/java/com/navercorp/pinpoint/web/mapper/ResponseTimeMapperTest.java rename to web/src/test/java/com/navercorp/pinpoint/web/applicationmap/dao/mapper/ResponseTimeMapperTest.java index aa062ad316aa..0013a910c45c 100644 --- a/web/src/test/java/com/navercorp/pinpoint/web/mapper/ResponseTimeMapperTest.java +++ b/web/src/test/java/com/navercorp/pinpoint/web/applicationmap/dao/mapper/ResponseTimeMapperTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.navercorp.pinpoint.web.mapper; +package com.navercorp.pinpoint.web.applicationmap.dao.mapper; import com.navercorp.pinpoint.common.buffer.AutomaticBuffer; import com.navercorp.pinpoint.common.buffer.Buffer;