diff --git a/src/main/java/com/nhn/pinpoint/web/applicationmap/ApplicationMap.java b/src/main/java/com/nhn/pinpoint/web/applicationmap/ApplicationMap.java index d5b59761e..b5a11a8c4 100644 --- a/src/main/java/com/nhn/pinpoint/web/applicationmap/ApplicationMap.java +++ b/src/main/java/com/nhn/pinpoint/web/applicationmap/ApplicationMap.java @@ -82,14 +82,40 @@ public class ApplicationMap { return applicationNames.contains(applicationName); } - public void appendResponseTime(Range range, MapResponseDao mapResponseDao) { - List nodes = this.nodeList.getNodeList(); + public static interface ResponseDataSource { + ResponseHistogramSummary getResponseHistogramSummary(Application application); + } + + public void appendResponseTime(final Range range, final MapResponseDao mapResponseDao) { + appendResponseTime(new ResponseDataSource() { + @Override + public ResponseHistogramSummary getResponseHistogramSummary(Application application) { + final List responseHistogram = mapResponseDao.selectResponseTime(application, range); + return createHistogramSummary(application, responseHistogram); + } + }); + } + + public void appendResponseTime(final Map histogramSummaryMap) { + appendResponseTime(new ResponseDataSource() { + @Override + public ResponseHistogramSummary getResponseHistogramSummary(Application application) { + return histogramSummaryMap.get(application); + } + }); + } + + public void appendResponseTime(ResponseDataSource responseDataSource) { + if (responseDataSource == null) { + throw new NullPointerException("responseDataSource must not be null"); + } + + final List nodes = this.nodeList.getNodeList(); for (Node node : nodes) { if (node.getServiceType().isWas()) { // was일 경우 자신의 response 히스토그램을 조회하여 채운다. final Application application = new Application(node.getApplicationName(), node.getServiceType()); - final List responseHistogram = mapResponseDao.selectResponseTime(application, range); - ResponseHistogramSummary histogramSummary = createHistogramSummary(application, responseHistogram); + ResponseHistogramSummary histogramSummary = responseDataSource.getResponseHistogramSummary(application); node.setResponseHistogramSummary(histogramSummary); } else if(node.getServiceType().isTerminal() || node.getServiceType().isUnknown()) { // 터미널 노드인경우, 자신을 가리키는 link값을 합하여 histogram을 생성한다. diff --git a/src/main/java/com/nhn/pinpoint/web/applicationmap/rawdata/ResponseHistogram.java b/src/main/java/com/nhn/pinpoint/web/applicationmap/rawdata/ResponseHistogram.java index f50e00c12..6d40224fc 100644 --- a/src/main/java/com/nhn/pinpoint/web/applicationmap/rawdata/ResponseHistogram.java +++ b/src/main/java/com/nhn/pinpoint/web/applicationmap/rawdata/ResponseHistogram.java @@ -40,6 +40,12 @@ public class ResponseHistogram implements JsonSerializable { this.histogramSchema = serviceType.getHistogramSchema(); } + public void addElapsedTime(int elapsedTime) { + HistogramSlot histogramSlot = histogramSchema.findHistogramSlot(elapsedTime); + short slotTime = histogramSlot.getSlotTime(); + addSample(slotTime, 1); + } + public ResponseHistogram(final short serviceType) { this(ServiceType.findServiceType(serviceType)); } @@ -56,6 +62,7 @@ public class ResponseHistogram implements JsonSerializable { this.errorCount += count; return; } + // TODO slotTime 은 <= 아니고 ==으로 수정되어야함. if (slotTime <= histogramSchema.getFastSlot().getSlotTime()) { this.fastCount += count; return; diff --git a/src/main/java/com/nhn/pinpoint/web/service/FilteredApplicationMapServiceImpl.java b/src/main/java/com/nhn/pinpoint/web/service/FilteredApplicationMapServiceImpl.java index e7ac96a0d..8333d8db9 100755 --- a/src/main/java/com/nhn/pinpoint/web/service/FilteredApplicationMapServiceImpl.java +++ b/src/main/java/com/nhn/pinpoint/web/service/FilteredApplicationMapServiceImpl.java @@ -13,6 +13,7 @@ import com.nhn.pinpoint.common.HistogramSchema; import com.nhn.pinpoint.common.HistogramSlot; import com.nhn.pinpoint.web.applicationmap.ApplicationMapBuilder; import com.nhn.pinpoint.web.applicationmap.rawdata.LinkStatistics; +import com.nhn.pinpoint.web.applicationmap.rawdata.ResponseHistogram; import com.nhn.pinpoint.web.dao.*; import com.nhn.pinpoint.web.vo.*; import org.apache.commons.collections.CollectionUtils; @@ -193,6 +194,7 @@ public class FilteredApplicationMapServiceImpl implements FilteredApplicationMap final Map linkStatMap = new HashMap(); final TimeSeriesStore timeSeriesStore = new TimeSeriesStoreImpl2(range); + final Map responseHistogramSummaryMap = new HashMap(); /** * 통계정보로 변환한다. */ @@ -206,6 +208,9 @@ public class FilteredApplicationMapServiceImpl implements FilteredApplicationMap } for (SpanBo span : transaction) { + // SPAN의 respoinseTime의 통계를 저장한다. + recordSpanResponseTime(span, responseHistogramSummaryMap); + final Node srcNode = createNode(span, transactionSpanMap); final Node destNode = new Node(span.getApplicationId(), span.getServiceType()); // record해야 되거나. rpc콜은 링크이다. @@ -244,12 +249,31 @@ public class FilteredApplicationMapServiceImpl implements FilteredApplicationMap List linkStatisticsList = new ArrayList(linkStatMap.values()); ApplicationMap map = new ApplicationMapBuilder().build(linkStatisticsList); map.setTimeSeriesStore(timeSeriesStore); - map.appendResponseTime(range, this.mapResponseDao); + map.appendResponseTime(responseHistogramSummaryMap); return map; } + private void recordSpanResponseTime(SpanBo span, Map responseHistogramSummaryMap) { + ServiceType serviceType = span.getServiceType(); + String applicationId = span.getApplicationId(); + Application spanKey = new Application(applicationId, serviceType); + ResponseHistogramSummary responseHistogramSummary = responseHistogramSummaryMap.get(spanKey); + if (responseHistogramSummary == null) { + responseHistogramSummary = new ResponseHistogramSummary(spanKey); + responseHistogramSummaryMap.put(spanKey, responseHistogramSummary); + } + + ResponseHistogram histogram = new ResponseHistogram(serviceType); + if (span.getErrCode() != 0) { + histogram.addElapsedTime(HistogramSchema.ERROR_SLOT_TIME); + } else { + histogram.addElapsedTime(span.getElapsed()); + } + responseHistogramSummary.addTotal(histogram); + } + private void addNodeFromSpanEvent(SpanBo span, Map statisticsMap, TimeSeriesStore timeSeriesStore, Map transactionSpanMap) { /** diff --git a/src/main/java/com/nhn/pinpoint/web/vo/ResponseHistogramSummary.java b/src/main/java/com/nhn/pinpoint/web/vo/ResponseHistogramSummary.java index 3f25e3eeb..1eb9deb94 100644 --- a/src/main/java/com/nhn/pinpoint/web/vo/ResponseHistogramSummary.java +++ b/src/main/java/com/nhn/pinpoint/web/vo/ResponseHistogramSummary.java @@ -9,7 +9,7 @@ public class ResponseHistogramSummary { private final Application application; - private final com.nhn.pinpoint.web.applicationmap.rawdata.ResponseHistogram total; + private final ResponseHistogram total; public ResponseHistogramSummary(Application application) { if (application == null) {