From c0f0001e8a5e83e283efa024df431bca7a5fbb8c Mon Sep 17 00:00:00 2001 From: Woonduk Kang Date: Wed, 12 Feb 2014 07:17:48 +0000 Subject: [PATCH] =?UTF-8?q?[=EA=B0=95=EC=9A=B4=EB=8D=95]=20[WEB-45]=20filt?= =?UTF-8?q?er=EB=A5=BC=20=EC=B3=A4=EC=9D=84=20=EA=B2=BD=EC=9A=B0=EB=8F=84?= =?UTF-8?q?=20node=EC=9D=98=20=EC=9D=91=EB=8B=B5=EC=86=8D=EB=8F=84?= =?UTF-8?q?=EB=A5=BC=20hbase=EA=B0=80=20=EC=95=84=EB=8B=8C=20=EB=A9=94?= =?UTF-8?q?=EB=AA=A8=EB=A6=AC=EC=9D=98=20span=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EA=B0=80=EC=A0=B8=EC=98=A4=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=ED=95=A8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://svn.bds.nhncorp.com/pe/hippo-web/trunk@3320 84d0f5b1-2673-498c-a247-62c4ff18d310 --- .../web/applicationmap/ApplicationMap.java | 34 ++++++++++++++++--- .../rawdata/ResponseHistogram.java | 7 ++++ .../FilteredApplicationMapServiceImpl.java | 26 +++++++++++++- .../web/vo/ResponseHistogramSummary.java | 2 +- 4 files changed, 63 insertions(+), 6 deletions(-) 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) {