diff --git a/src/main/java/com/nhn/hippo/web/controller/ApplicationMapController.java b/src/main/java/com/nhn/hippo/web/controller/ApplicationMapController.java index b4eaf2ac6..046cb06d0 100644 --- a/src/main/java/com/nhn/hippo/web/controller/ApplicationMapController.java +++ b/src/main/java/com/nhn/hippo/web/controller/ApplicationMapController.java @@ -1,5 +1,7 @@ package com.nhn.hippo.web.controller; +import java.util.Set; + import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; @@ -10,7 +12,10 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import com.nhn.hippo.web.applicationmap.ApplicationMap; +import com.nhn.hippo.web.calltree.server.ServerCallTree; import com.nhn.hippo.web.service.ApplicationMapService; +import com.nhn.hippo.web.service.FlowChartService; +import com.nhn.hippo.web.vo.TraceId; /** * @@ -18,10 +23,13 @@ import com.nhn.hippo.web.service.ApplicationMapService; */ @Controller public class ApplicationMapController extends BaseController { - + @Autowired private ApplicationMapService applicationMapService; + @Autowired + private FlowChartService flow; + @RequestMapping(value = "/getServerMapData2", method = RequestMethod.GET) public String getServerMapData2(Model model, HttpServletResponse response, @RequestParam("application") String applicationName, @RequestParam("serviceType") short serviceType, @RequestParam("from") long from, @RequestParam("to") long to) { ApplicationMap map = applicationMapService.selectApplicationMap(applicationName, serviceType, from, to); @@ -39,4 +47,19 @@ public class ApplicationMapController extends BaseController { long from = to - period; return getServerMapData2(model, response, applicationName, serviceType, from, to); } + + @RequestMapping(value = "/getFilteredServerMapData", method = RequestMethod.GET) + public String getFilteredServerMapData(Model model, HttpServletResponse response, @RequestParam("application") String applicationName, @RequestParam("serviceType") short serviceType, @RequestParam("from") long from, @RequestParam("to") long to) { + Set traceIdSet = flow.selectTraceIdsFromApplicationTraceIndex(applicationName, from, to); + + System.out.println(traceIdSet); + + ServerCallTree map = flow.selectServerCallTree(traceIdSet); + + model.addAttribute("nodes", map.getNodes()); + model.addAttribute("links", map.getLinks()); + + addResponseHeader(response); + return "applicationmap.filtered"; + } } \ No newline at end of file diff --git a/src/main/java/com/nhn/hippo/web/dao/TraceDao.java b/src/main/java/com/nhn/hippo/web/dao/TraceDao.java index 34e2a9784..f1c6647d3 100644 --- a/src/main/java/com/nhn/hippo/web/dao/TraceDao.java +++ b/src/main/java/com/nhn/hippo/web/dao/TraceDao.java @@ -18,6 +18,8 @@ public interface TraceDao { // TODO list하고 set하고 비교해서 하나 없애야 될듯 하다. List> selectSpans(List traceIdList); + + List> selectAllSpans(Set traceIdSet); List> selectSpans(Set traceIdSet); diff --git a/src/main/java/com/nhn/hippo/web/dao/hbase/HbaseTraceDao.java b/src/main/java/com/nhn/hippo/web/dao/hbase/HbaseTraceDao.java index fe2a6fc15..e696f9ab4 100644 --- a/src/main/java/com/nhn/hippo/web/dao/hbase/HbaseTraceDao.java +++ b/src/main/java/com/nhn/hippo/web/dao/hbase/HbaseTraceDao.java @@ -71,6 +71,18 @@ public class HbaseTraceDao implements TraceDao { } return template2.get(HBaseTables.TRACES, gets, spanMapper); } + + @Override + public List> selectAllSpans(Set traceIdSet) { + List gets = new ArrayList(traceIdSet.size()); + for (TraceId traceId : traceIdSet) { + Get get = new Get(traceId.getBytes()); + get.addFamily(HBaseTables.TRACES_CF_SPAN); + get.addFamily(HBaseTables.TRACES_CF_TERMINALSPAN); + gets.add(get); + } + return template2.get(HBaseTables.TRACES, gets, spanMapper); + } @Override public List selectSpans(TraceId traceId) { diff --git a/src/main/java/com/nhn/hippo/web/service/FlowChartService.java b/src/main/java/com/nhn/hippo/web/service/FlowChartService.java index 18143ad8a..2cdb08199 100755 --- a/src/main/java/com/nhn/hippo/web/service/FlowChartService.java +++ b/src/main/java/com/nhn/hippo/web/service/FlowChartService.java @@ -20,4 +20,6 @@ public interface FlowChartService { public ServerCallTree selectServerCallTree(TraceId traceId); public BusinessTransactions selectBusinessTransactions(Set traceIds, String applicationName, long from, long to); + + public ServerCallTree selectServerCallTree(Set traceIdSet); } diff --git a/src/main/java/com/nhn/hippo/web/service/FlowChartServiceImpl.java b/src/main/java/com/nhn/hippo/web/service/FlowChartServiceImpl.java index 37951372b..637cb9552 100755 --- a/src/main/java/com/nhn/hippo/web/service/FlowChartServiceImpl.java +++ b/src/main/java/com/nhn/hippo/web/service/FlowChartServiceImpl.java @@ -12,6 +12,8 @@ import org.springframework.stereotype.Service; import org.springframework.util.StopWatch; import com.nhn.hippo.web.calltree.server.AgentIdNodeSelector; +import com.nhn.hippo.web.calltree.server.ApplicationIdNodeSelector; +import com.nhn.hippo.web.calltree.server.NodeSelector; import com.nhn.hippo.web.calltree.server.ServerCallTree; import com.nhn.hippo.web.dao.ApplicationIndexDao; import com.nhn.hippo.web.dao.ApplicationTraceIndexDao; @@ -57,7 +59,7 @@ public class FlowChartServiceImpl implements FlowChartService { List transaction = this.traceDao.selectSpans(traceId); Set endPoints = createUniqueEndpoint(transaction); - ServerCallTree tree = createServerCallTree(transaction); + ServerCallTree tree = createServerCallTree(transaction, new AgentIdNodeSelector()); // subSpan에서 record할 데이터만 골라낸다. List spanEventBoList = findRecordStatisticsSpanEventData(transaction, endPoints); @@ -70,6 +72,37 @@ public class FlowChartServiceImpl implements FlowChartService { return tree; } + + /** + * filtered application map + */ + @Override + public ServerCallTree selectServerCallTree(Set traceIdSet) { + StopWatch watch = new StopWatch(); + watch.start(); + + List> transactionList = this.traceDao.selectAllSpans(traceIdSet); + List transaction = new ArrayList(); + for (List t : transactionList) { + for (SpanBo span : t) { + transaction.add(span); + } + } + + Set endPoints = createUniqueEndpoint(transaction); + ServerCallTree tree = createServerCallTree(transaction, new ApplicationIdNodeSelector()); + + // subSpan에서 record할 데이터만 골라낸다. + List spanEventBoList = findRecordStatisticsSpanEventData(transaction, endPoints); + + tree.addSpanEventList(spanEventBoList); + tree.build(); + + watch.stop(); + logger.info("Fetch single transaction serverCallTree elapsed. {}ms", watch.getLastTaskTimeMillis()); + + return tree; + } private List findRecordStatisticsSpanEventData(List transaction, Set endPoints) { List filterSpanEventBo = new ArrayList(); @@ -102,8 +135,8 @@ public class FlowChartServiceImpl implements FlowChartService { * @param transaction * @return */ - private ServerCallTree createServerCallTree(List transaction) { - ServerCallTree serverCallTree = new ServerCallTree(new AgentIdNodeSelector()); + private ServerCallTree createServerCallTree(List transaction, NodeSelector nodeSelector) { + ServerCallTree serverCallTree = new ServerCallTree(nodeSelector); serverCallTree.addSpanList(transaction); // TODO 이 메소드는 transaction하나만 조회하는 페이지에서 사용되기 때문에 이렇게 한다. diff --git a/src/main/webapp/WEB-INF/views/applicationmap.filtered.jsp b/src/main/webapp/WEB-INF/views/applicationmap.filtered.jsp new file mode 100644 index 000000000..ab9b2555d --- /dev/null +++ b/src/main/webapp/WEB-INF/views/applicationmap.filtered.jsp @@ -0,0 +1,123 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="hippo" uri="http://hippo.nhncorp.com/hippo" %> + + + + Transaction details (${traceId}) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + \ No newline at end of file