[유치수] [NOBTS] 불필요한 코드 제거.

git-svn-id: http://svn.bds.nhncorp.com/pe/hippo-web/trunk@2723 84d0f5b1-2673-498c-a247-62c4ff18d310
This commit is contained in:
Chisu Yu
2013-11-03 02:09:15 +00:00
parent 63a43b6d1d
commit 9a37ba4e65
11 changed files with 99 additions and 823 deletions
@@ -1,13 +1,9 @@
package com.nhn.pinpoint.web.controller;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.nhn.pinpoint.common.util.DateUtils;
import com.nhn.pinpoint.web.filter.FilterBuilder;
import com.nhn.pinpoint.web.vo.LimitedScanResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -18,11 +14,14 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import com.nhn.pinpoint.common.ServiceType;
import com.nhn.pinpoint.common.util.DateUtils;
import com.nhn.pinpoint.web.applicationmap.ApplicationMap;
import com.nhn.pinpoint.web.filter.Filter;
import com.nhn.pinpoint.web.filter.FilterBuilder;
import com.nhn.pinpoint.web.service.ApplicationMapService;
import com.nhn.pinpoint.web.service.FlowChartService;
import com.nhn.pinpoint.web.util.TimeUtils;
import com.nhn.pinpoint.web.vo.LimitedScanResult;
import com.nhn.pinpoint.web.vo.LinkStatistics;
import com.nhn.pinpoint.web.vo.TransactionId;
@@ -94,27 +93,6 @@ public class ApplicationMapController {
return getServerMapData(model, response, applicationName, serviceType, from, to);
}
@RequestMapping(value = "/filtermap", method = RequestMethod.GET)
public String filtermap(Model model,
HttpServletResponse response,
@RequestParam("application") String applicationName,
@RequestParam("serviceType") short serviceType,
@RequestParam("from") long from,
@RequestParam("to") long to,
@RequestParam(value = "filter", required = false) String filterText) {
model.addAttribute("applicationName", applicationName);
model.addAttribute("serviceType", serviceType);
model.addAttribute("from", from);
model.addAttribute("to", to);
model.addAttribute("fromDate", new Date(from));
model.addAttribute("toDate", new Date(to));
model.addAttribute("filterText", filterText);
model.addAttribute("filter", filterBuilder.build(filterText));
return "applicationmap.filtered.view";
}
/**
* 필터가 적용된 서버맵의 FROM ~ TO기간의 데이터 조회
*
@@ -153,9 +131,11 @@ public class ApplicationMapController {
model.addAttribute("nodes", map.getNodes());
model.addAttribute("links", map.getLinks());
// model.addAttribute("timeseriesResponses", map.getTimeseriesResponses());
// FIXME linkstatistics detail에 보여주는 timeseries값을 서버맵에서 제공할 예정.
// model.addAttribute("timeseriesResponses", map.getTimeseriesResponses());
return "applicationmap.filtered2";
return "applicationmap.filtered";
}
/**
@@ -6,8 +6,6 @@ import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.nhn.pinpoint.web.filter.FilterBuilder;
import com.nhn.pinpoint.web.service.SpanResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -19,11 +17,12 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.nhn.pinpoint.web.applicationmap.ApplicationMap;
import com.nhn.pinpoint.web.calltree.server.ServerCallTree;
import com.nhn.pinpoint.web.calltree.span.SpanAlign;
import com.nhn.pinpoint.web.filter.Filter;
import com.nhn.pinpoint.web.filter.FilterBuilder;
import com.nhn.pinpoint.web.service.FlowChartService;
import com.nhn.pinpoint.web.service.RecordSetService;
import com.nhn.pinpoint.web.service.SpanResult;
import com.nhn.pinpoint.web.service.SpanService;
import com.nhn.pinpoint.web.util.TimeUtils;
import com.nhn.pinpoint.web.vo.BusinessTransactions;
@@ -171,8 +170,6 @@ public class BusinessTransactionController {
mv.setViewName("transactionInfoJson");
}
}
return mv;
}
}
@@ -1,8 +1,6 @@
package com.nhn.pinpoint.web.controller;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;
import javax.servlet.http.HttpServletResponse;
@@ -13,12 +11,8 @@ import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import com.nhn.pinpoint.common.bo.AgentInfoBo;
import com.nhn.pinpoint.web.service.FlowChartService;
import com.nhn.pinpoint.web.service.MonitorService;
import com.nhn.pinpoint.web.vo.AgentStatus;
import com.nhn.pinpoint.web.vo.Application;
/**
@@ -33,9 +27,6 @@ public class MainController {
@Autowired
private FlowChartService flow;
@Autowired
private MonitorService monitor;
@RequestMapping(value = "/applications", method = RequestMethod.GET)
public String flow(Model model, HttpServletResponse response) {
List<Application> applications = flow.selectAllApplicationNames();
@@ -46,20 +37,6 @@ public class MainController {
return "applications";
}
@RequestMapping(value = "/agentStatus", method = RequestMethod.GET)
public String agentStatus(Model model, HttpServletResponse response, @RequestParam("agentId") List<String> agentIdList) {
SortedMap<String, AgentStatus> statusMap = new TreeMap<String, AgentStatus>();
for (String agentId : agentIdList) {
AgentInfoBo agentInfo = monitor.getAgentInfo(agentId);
statusMap.put(agentId, new AgentStatus(agentInfo));
}
model.addAttribute("statusMap", statusMap);
return "agentstatus";
}
@RequestMapping(value = "/serverTime", method = RequestMethod.GET)
public String getServerTime(Model model, HttpServletResponse response) {
model.addAttribute("currentServerTime", System.currentTimeMillis());
@@ -47,15 +47,15 @@ public class ScatterChartController {
@Autowired
private FilterBuilder filterBuilder;
@RequestMapping(value = "/selectedScatter", method = RequestMethod.GET)
public String selectedScatter(Model model, HttpServletResponse response) {
return "selectedScatter";
}
@RequestMapping(value = "/selectedScatterList", method = RequestMethod.GET)
public String selectedScatterList(Model model, HttpServletResponse response) {
return "selectedScatterList";
}
// @RequestMapping(value = "/selectedScatter", method = RequestMethod.GET)
// public String selectedScatter(Model model, HttpServletResponse response) {
// return "selectedScatter";
// }
//
// @RequestMapping(value = "/selectedScatterList", method = RequestMethod.GET)
// public String selectedScatterList(Model model, HttpServletResponse response) {
// return "selectedScatterList";
// }
@RequestMapping(value = "/scatterpopup", method = RequestMethod.GET)
public String scatterPopup(Model model, HttpServletResponse response, @RequestParam("application") String applicationName, @RequestParam("from") long from, @RequestParam("to") long to, @RequestParam("period") long period, @RequestParam("usePeriod") boolean usePeriod, @RequestParam(value = "filter", required = false) String filterText) {
@@ -164,43 +164,43 @@ public class ScatterChartController {
return getScatterData(model, response, applicationName, from, to, limit, filterText, jsonpCallback, version);
}
/**
* scatter 실시간 갱신에서는 to 시간을 지정하지 않는다. server time을 사용하고 조회된 시간 범위를 반환해준다.
* UI에서는 반환된 조회 범위를 참조해서 다음 쿼리를 요청한다.
*
* @param model
* @param response
* @param applicationName
* @param from
* @param limit
* @return
*/
@RequestMapping(value = "/getRealtimeScatterData", method = RequestMethod.GET)
public String getRealtimeScatterData(Model model, HttpServletResponse response, @RequestParam("application") String applicationName, @RequestParam("from") long from, @RequestParam("limit") int limit) {
StopWatch watch = new StopWatch();
watch.start("selectScatterData");
long to = TimeUtils.getDelayLastTime();
// TODO need filter??
List<Dot> scatterData = scatter.selectScatterData(applicationName, from, to, limit);
watch.stop();
logger.info("Fetch scatterData time : {}ms", watch.getLastTaskTimeMillis());
model.addAttribute("scatter", scatterData);
model.addAttribute("queryFrom", from);
if (scatterData.size() >= limit) {
model.addAttribute("queryTo", scatterData.get(scatterData.size() - 1).getTimestamp());
} else {
model.addAttribute("queryTo", to);
}
model.addAttribute("limit", limit);
return "scatterRealtime";
}
// /**
// * scatter 실시간 갱신에서는 to 시간을 지정하지 않는다. server time을 사용하고 조회된 시간 범위를 반환해준다.
// * UI에서는 반환된 조회 범위를 참조해서 다음 쿼리를 요청한다.
// *
// * @param model
// * @param response
// * @param applicationName
// * @param from
// * @param limit
// * @return
// */
// @RequestMapping(value = "/getRealtimeScatterData", method = RequestMethod.GET)
// public String getRealtimeScatterData(Model model, HttpServletResponse response, @RequestParam("application") String applicationName, @RequestParam("from") long from, @RequestParam("limit") int limit) {
// StopWatch watch = new StopWatch();
// watch.start("selectScatterData");
//
// long to = TimeUtils.getDelayLastTime();
//
// // TODO need filter??
// List<Dot> scatterData = scatter.selectScatterData(applicationName, from, to, limit);
// watch.stop();
//
// logger.info("Fetch scatterData time : {}ms", watch.getLastTaskTimeMillis());
//
// model.addAttribute("scatter", scatterData);
// model.addAttribute("queryFrom", from);
//
// if (scatterData.size() >= limit) {
// model.addAttribute("queryTo", scatterData.get(scatterData.size() - 1).getTimestamp());
// } else {
// model.addAttribute("queryTo", to);
// }
//
// model.addAttribute("limit", limit);
//
// return "scatterRealtime";
// }
/**
* scatter에서 점 여러개를 선택했을 때 점에 대한 정보를 조회한다.
@@ -1,10 +0,0 @@
package com.nhn.pinpoint.web.service;
import com.nhn.pinpoint.common.bo.AgentInfoBo;
/**
* @author netspider
*/
public interface MonitorService {
public AgentInfoBo getAgentInfo(String agentId);
}
@@ -1,28 +0,0 @@
package com.nhn.pinpoint.web.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.nhn.pinpoint.web.dao.AgentInfoDao;
import com.nhn.pinpoint.common.bo.AgentInfoBo;
/**
*
* @author netspider
*/
@Service
public class MonitorServiceImpl implements MonitorService {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private AgentInfoDao agentInfoDao;
public AgentInfoBo getAgentInfo(String agentId) {
AgentInfoBo agentInfo = agentInfoDao.findAgentInfoBeforeStartTime(agentId, System.currentTimeMillis());
logger.debug("Found agentInfo agentId={}, agentInfo={}", agentId, agentInfo);
return agentInfo;
}
}
@@ -1,18 +0,0 @@
<%@ page language="java" contentType="application/json; charset=UTF-8" 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" %>
{
<c:forEach items="${statusMap}" var="agentStatus" varStatus="status">
"${agentStatus.key}" : [ ${agentStatus.value.exists},
<c:choose>
<c:when test="${agentStatus.value.exists}">
${agentStatus.value.checkTime - agentStatus.value.agentInfo.startTime},
${agentStatus.value.agentInfo.startTime}
</c:when>
<c:otherwise>
-1, -1
</c:otherwise>
</c:choose>
]<c:if test="${!status.last}">,</c:if>
</c:forEach>
}
@@ -2,28 +2,52 @@
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
{
"lastFetchedTimestamp" : ${lastFetchedTimestamp},
"applicationMapData" : {
"nodeDataArray": [
<c:forEach items="${nodes}" var="node" varStatus="status">
{
"id" : ${status.count},
"key" : ${status.count},
"text" : "${node}",
"hosts" : [
<c:forEach items="${node.hosts}" var="host" varStatus="status2">
"${host}"
<c:if test="${!status2.last}">,</c:if>
</c:forEach>
],
"category" : "${node.serviceType.desc}",
"serviceTypeCode" : "${node.serviceType.code}",
"terminal" : "${node.serviceType.terminal}",
"agents" : [],
<c:choose>
<c:when test="${node.applicationName == 'CLIENT'}">
"text" : "USER",
</c:when>
<c:otherwise>
"text" : "${node.applicationName}",
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${node.serviceType.desc == 'CLIENT'}">
"category" : "USER",
</c:when>
<c:otherwise>
"category" : "${node.serviceType.desc}",
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${node.serviceType.desc == 'CLIENT'}">"fig" : "Ellipse"</c:when>
<c:when test="${node.serviceType.desc == 'TOMCAT'}">"fig" : "RoundedRectangle"</c:when>
<c:otherwise>"fig" : "Rectangle"</c:otherwise>
</c:choose>
</c:choose>,
"serviceTypeCode" : "${node.serviceType.code}",
"terminal" : "${node.serviceType.terminal}",
"isWas" : ${node.serviceType.was},
"serverList" : {
<c:forEach items="${node.serverInstanceList}" var="serverInstance" varStatus="status5">
"${serverInstance.key}" : {
"name" : "${serverInstance.key}",
"status" : null,
"instanceList" : {
<c:forEach items="${serverInstance.value}" var="instance" varStatus="status6">
"${instance.key}" : ${instance.value.json}
<c:if test="${!status6.last}">,</c:if>
</c:forEach>
}
}
<c:if test="${!status5.last}">,</c:if>
</c:forEach>
}
} <c:if test="${!status.last}">,</c:if>
</c:forEach>
],
@@ -38,7 +62,14 @@
"text" : ${link.histogram.totalCount},
"error" : ${link.histogram.errorCount},
"slow" : ${link.histogram.slowCount},
"histogram" : ${link.histogram},
"histogram" : ${link.histogram.json},
"targetHosts" : {
<c:forEach items="${link.hostList}" var="host" varStatus="status2">
"${host.value.host}" : {
"histogram" : ${host.value.histogram.json}
}<c:if test="${!status2.last}">,</c:if>
</c:forEach>
},
<c:choose>
<c:when test="${(link.histogram.errorCount / link.histogram.totalCount * 100) > 10}">"category" : "bad"</c:when>
<c:otherwise>"category" : "default"</c:otherwise>
@@ -1,189 +0,0 @@
<%@ 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="pinpoint" uri="http://pinpoint.nhncorp.com/pinpoint" %>
<!DOCTYPE html>
<html lang="en">
<head>
<title>PINPOINT</title>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link type="text/css" rel="stylesheet" href="/components_v1/bootstrap/css/bootstrap.css" />
<link type="text/css" rel="stylesheet" href="/components_v1/bootstrap/css/bootstrap-responsive.css" />
<link type="text/css" rel="stylesheet" href="/components_v1/pinpoint/css/pinpoint.css" />
<link type="text/css" rel="stylesheet" href="/components_v1/pinpoint-scatter/css/scatter.css" />
<link type="text/css" rel="stylesheet" href="/components_v1/bootstrap-datepicker/bootstrap-datepicker.css" />
<link type="text/css" rel="stylesheet" href="/components_v1/nvd3/nv.d3.css" />
<link type="text/css" rel="stylesheet" href="/components_v1/select2/select2.css" />
<!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<!-- commons -->
<script type="text/javascript" src="/components_v1/jquery/jquery-1.9.1.min.js"></script>
<script type="text/javascript" src="/components_v1/jquery-ui/jquery-ui-1.10.2.js"></script>
<script type="text/javascript" src="/components_v1/jquery-class/jquery.Class.js"></script>
<script type="text/javascript" src="/components_v1/jquery-template/jquery.tmpl.min.js"></script>
<script type="text/javascript" src="/components_v1/bootstrap/js/bootstrap.min.js"></script>
<script type="text/javascript" src="/components_v1/bootstrap-datepicker/bootstrap-datepicker.js"></script>
<script type="text/javascript" src="/components_v1/modernizer/modernizr-2.6.2.min.js"></script>
<script type="text/javascript" src="/components_v1/underscore/underscore-min.js"></script>
<script type="text/javascript" src="/components_v1/select2/select2.js"></script>
<script type="text/javascript" src="/components_v1/utils/date.js"></script>
<script type="text/javascript" src="/components_v1/pinpoint/pinpoint.js"></script>
<script type="text/javascript" src="/components_v1/pinpoint/navigationbar.js"></script>
<!-- scatter chart -->
<script type="text/javascript" src="/components_v1/jquery-dragtoselect/jquery.dragToSelect.js"></script>
<script type="text/javascript" src="/components_v1/pinpoint-scatter/jquery.BigScatterChart.js"></script>
<script type="text/javascript" src="/components_v1/pinpoint/chart-scatter4.js"></script>
<!-- server map -->
<script type="text/javascript" src="/components_v1/gojs/go.js"></script>
<script type="text/javascript" src="/components_v1/pinpoint-servermap/Point2D.js"></script>
<script type="text/javascript" src="/components_v1/pinpoint-servermap/intersection.js"></script>
<script type="text/javascript" src="/components_v1/pinpoint-servermap/canvas.roundRect.js"></script>
<script type="text/javascript" src="/components_v1/pinpoint-servermap/jquery.ServerMap.js"></script>
<script type="text/javascript" src="/components_v1/pinpoint/chart-servermap.js"></script>
<!-- link info chart -->
<script type="text/javascript" src="/components_v1/d3/d3.v2.min.js"></script>
<script type="text/javascript" src="/components_v1/nvd3/nv.d3.js"></script>
<!-- requests list -->
<script type="text/javascript" src="/components_v1/pinpoint/chart-transactions.js"></script>
<!-- help -->
<script type="text/javascript" src="/components_v1/pinpoint/message.js"></script>
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<img class="brand" src="/images/logo.png" width="116" height="18" />
<div class="nav-collapse collapse">
<ul class="nav">
<li class="">
<p class="navbar-text">Filtered Map</p>
</li>
<li class="divider-vertical"></li>
<li class="">
<p class="navbar-text">${applicationName}</p>
</li>
<li class="divider-vertical"></li>
<li class="">
<p class="navbar-text">
<fmt:formatDate value="${fromDate}" pattern="yyyy/MM/dd HH:mm:ss"/> ~ <fmt:formatDate value="${toDate}" pattern="yyyy/MM/dd HH:mm:ss"/>
</p>
</li>
<li class="divider-vertical"></li>
<li class="">
<p class="navbar-text">
${filter}
</p>
</li>
<li class="divider-vertical"></li>
<li class="">
<div class="btn-group">
<a class="btn btn-mini dropdown-toggle" data-toggle="dropdown" href="#">
options
<span class="caret"></span>
</a>
<ul class="dropdown-menu">
<li><a href="#" id="mergeUnknown" data-selected="true"><i class="icon-ok"></i> Merge unknowns</a></li>
</ul>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="container" id="warningMessage"></div>
<!-- BODY -->
<div class="chart-container">
<div class="chart-left">
<div class="container">
<!--
<div class="alert alert-info">
<button type="button" class="close" data-dismiss="alert">&times;</button>
Filter : ${filterText}
</div>
-->
<div id="progressbar"><img src="/images/ajaxloader.gif" /></div>
</div>
<div id="servermap" class="servermap"></div>
</div>
<div class="chart-right">
<div id="scatterChartContainer" style="display:none;">
<span onclick="" style="text-decoration:underline;cursor:pointer">Show all transactions</span>
&nbsp;&nbsp;&nbsp;
<i class="icon-fullscreen" onclick="expandScatter($(this));" onmouseover="$(this).tooltip('show');" title="Expand to new popup window." style="cursor:pointer;"></i>
&nbsp;&nbsp;&nbsp;
<a href=""><i class="icon-download-alt" onmouseover="$(this).tooltip('show');" title="Download as PNG image format file." style="cursor:pointer;"></i></a>
<div id="scatterchart"></div>
</div>
<div id="statisticsProgressbar" style="display:none;"><img src="/images/ajaxloader.gif" /></div>
<div id="nodeInfoDetails">
<div class='info'></div>
</div>
<div id="linkInfoDetails">
<div class='info'></div>
<div class='linkInfoChart' style='width:100%;display:none'>
Response histogram (UNDERCONSTRUCTION)
<svg style='height:200px' />
</div>
<div class='linkInfoBarChart' style='width:100%;display:none'>
Response histogram summary
<svg style='height:150px' />
</div>
</div>
</div>
</div>
<!-- END OF BODY -->
<script type="text/javascript">
$(document).ready(function () {
$("#mergeUnknown").bind('click', toggleMergeUnknowns);
showServerMap("${applicationName}", "${serviceType}", ${from}, ${to}, 0, false, "${filterText}", false, function() {
$("#progressbar").hide();
});
showResponseScatter("${applicationName}", ${from}, ${to}, 0, false, "${filterText}");
});
</script>
<script id="NodeInfoBox" type="text/x-jquery-tmpl">
<div class="NodeInfoBox">NodeInfoBox
</div>
</script>
<script id="LinkInfoBox" type="text/x-jquery-tmpl">
<div class="LinkInfoBox">LinkInfoBox
</div>
</script>
<script id="UnknownNodeInfoBox" type="text/x-jquery-tmpl">
<div class="UnknownNodeInfoBox">UnknownNodeInfoBox
</div>
</script>
<script id="UnknownLinkInfoBox" type="text/x-jquery-tmpl">
<div class="UnknownLinkInfoBox">UnknownLinkInfoBox
</div>
</script>
</body>
</html>
@@ -1,81 +0,0 @@
<%@ page language="java" contentType="application/json; charset=UTF-8" 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" %>
{
"lastFetchedTimestamp" : ${lastFetchedTimestamp},
"applicationMapData" : {
"nodeDataArray": [
<c:forEach items="${nodes}" var="node" varStatus="status">
{
"id" : ${status.count},
"key" : ${status.count},
<c:choose>
<c:when test="${node.applicationName == 'CLIENT'}">
"text" : "USER",
</c:when>
<c:otherwise>
"text" : "${node.applicationName}",
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${node.serviceType.desc == 'CLIENT'}">
"category" : "USER",
</c:when>
<c:otherwise>
"category" : "${node.serviceType.desc}",
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${node.serviceType.desc == 'CLIENT'}">"fig" : "Ellipse"</c:when>
<c:when test="${node.serviceType.desc == 'TOMCAT'}">"fig" : "RoundedRectangle"</c:when>
<c:otherwise>"fig" : "Rectangle"</c:otherwise>
</c:choose>,
"serviceTypeCode" : "${node.serviceType.code}",
"terminal" : "${node.serviceType.terminal}",
"isWas" : ${node.serviceType.was},
"serverList" : {
<c:forEach items="${node.serverInstanceList}" var="serverInstance" varStatus="status5">
"${serverInstance.key}" : {
"name" : "${serverInstance.key}",
"status" : null,
"instanceList" : {
<c:forEach items="${serverInstance.value}" var="instance" varStatus="status6">
"${instance.key}" : ${instance.value.json}
<c:if test="${!status6.last}">,</c:if>
</c:forEach>
}
}
<c:if test="${!status5.last}">,</c:if>
</c:forEach>
}
} <c:if test="${!status.last}">,</c:if>
</c:forEach>
],
"linkDataArray": [
<c:forEach items="${links}" var="link" varStatus="status">
{
"id" : "${link.from.sequence + 1}-${link.to.sequence + 1}",
"from" : ${link.from.sequence + 1},
"to" : ${link.to.sequence + 1},
"sourceinfo" : ${link.from.json},
"targetinfo" : ${link.to.json},
"text" : ${link.histogram.totalCount},
"error" : ${link.histogram.errorCount},
"slow" : ${link.histogram.slowCount},
"histogram" : ${link.histogram.json},
"targetHosts" : {
<c:forEach items="${link.hostList}" var="host" varStatus="status2">
"${host.value.host}" : {
"histogram" : ${host.value.histogram.json}
}<c:if test="${!status2.last}">,</c:if>
</c:forEach>
},
<c:choose>
<c:when test="${(link.histogram.errorCount / link.histogram.totalCount * 100) > 10}">"category" : "bad"</c:when>
<c:otherwise>"category" : "default"</c:otherwise>
</c:choose>
} <c:if test="${!status.last}">,</c:if>
</c:forEach>
]
}
}
-383
View File
@@ -1,383 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>PINPOINT</title>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link type="text/css" rel="stylesheet" href="/components_v1/bootstrap/css/bootstrap.css" />
<link type="text/css" rel="stylesheet" href="/components_v1/bootstrap/css/bootstrap-responsive.css" />
<link type="text/css" rel="stylesheet" href="/components_v1/pinpoint/css/pinpoint.css" />
<link type="text/css" rel="stylesheet" href="/components_v1/pinpoint-scatter/css/scatter.css" />
<link type="text/css" rel="stylesheet" href="/components_v1/bootstrap-datepicker/bootstrap-datepicker.css" />
<link type="text/css" rel="stylesheet" href="/components_v1/nvd3/nv.d3.css" />
<link type="text/css" rel="stylesheet" href="/components_v1/select2/select2.css" />
<!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<!-- commons -->
<script type="text/javascript" src="/components_v1/jquery/jquery-1.9.1.min.js"></script>
<script type="text/javascript" src="/components_v1/jquery-ui/jquery-ui-1.10.2.js"></script>
<script type="text/javascript" src="/components_v1/jquery-class/jquery.Class.js"></script>
<script type="text/javascript" src="/components_v1/jquery-template/jquery.tmpl.min.js"></script>
<script type="text/javascript" src="/components_v1/bootstrap/js/bootstrap.min.js"></script>
<script type="text/javascript" src="/components_v1/bootstrap-datepicker/bootstrap-datepicker.js"></script>
<script type="text/javascript" src="/components_v1/modernizer/modernizr-2.6.2.min.js"></script>
<script type="text/javascript" src="/components_v1/underscore/underscore-min.js"></script>
<script type="text/javascript" src="/components_v1/select2/select2.js"></script>
<script type="text/javascript" src="/components_v1/utils/date.js"></script>
<script type="text/javascript" src="/components_v1/pinpoint/pinpoint.js"></script>
<script type="text/javascript" src="/components_v1/pinpoint/navigationbar.js"></script>
<!-- scatter chart -->
<script type="text/javascript" src="/components_v1/jquery-dragtoselect/jquery.dragToSelect.js"></script>
<script type="text/javascript" src="/components_v1/pinpoint-scatter/jquery.BigScatterChart.js"></script>
<script type="text/javascript" src="/components_v1/pinpoint/chart-scatter4.js"></script>
<!-- server map -->
<script type="text/javascript" src="/components_v1/gojs/go.js"></script>
<script type="text/javascript" src="/components_v1/pinpoint-servermap/Point2D.js"></script>
<script type="text/javascript" src="/components_v1/pinpoint-servermap/intersection.js"></script>
<script type="text/javascript" src="/components_v1/pinpoint-servermap/canvas.roundRect.js"></script>
<script type="text/javascript" src="/components_v1/pinpoint-servermap/jquery.ServerMap.js"></script>
<script type="text/javascript" src="/components_v1/pinpoint/chart-servermap.js"></script>
<!-- link info chart -->
<script type="text/javascript" src="/components_v1/d3/d3.v2.min.js"></script>
<script type="text/javascript" src="/components_v1/nvd3/nv.d3.js"></script>
<!-- requests list -->
<script type="text/javascript" src="/components_v1/pinpoint/chart-transactions.js"></script>
<!-- help -->
<script type="text/javascript" src="/components_v1/pinpoint/message.js"></script>
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<img class="brand" src="/images/logo.png" width="116" height="18" />
<div class="nav-collapse collapse">
<ul class="nav">
<li class="divider-vertical"></li>
<li class="">
<form class="navbar-form pull-left">
<select id="application" disabled>
<option>Loading...</option>
</select>
<div id="period" class="btn-group" data-toggle="buttons-radio">
<button type="button" value="5" class="btn btn-mini" disabled>Last 5m</button>
<button type="button" value="20" class="btn btn-mini btn-inverse active" disabled>20m</button>
<button type="button" value="60" class="btn btn-mini" disabled>1h</button>
<button type="button" value="180" class="btn btn-mini" disabled>3h</button>
<button type="button" value="360" class="btn btn-mini" disabled>6h</button>
<button type="button" value="740" class="btn btn-mini" disabled>12h</button>
<button type="button" value="1440" class="btn btn-mini" disabled>1d</button>
<button type="button" value="2880" class="btn btn-mini" disabled>2d</button>
<button type="button" value="4320" class="btn btn-mini" disabled>3d</button>
</div>
</form>
</li>
<li class="divider-vertical"></li>
<li class="">
<div class="btn-group">
<a class="btn btn-mini dropdown-toggle" data-toggle="dropdown" href="#">
map options
<span class="caret"></span>
</a>
<ul class="dropdown-menu">
<li><a href="#" id="mergeUnknown" data-selected="true"><i class="icon-ok"></i> Merge unknowns</a></li>
<li><a href="#" id="hideIndirectAccess" data-selected="false"><i class="icon-ok icon-white"></i> Hide indirect access</a></li>
<li class="divider"></li>
<li class="dropdown-submenu">
<a tabindex="-1" href="#">Label text type</a>
<ul class="dropdown-menu">
<li><a href="#" class="labelTextType" data-type="count" data-selected="true"><i class="icon-ok"></i> Total request count</a></li>
<li><a href="#" class="labelTextType" data-type="tps" data-selected="false"><i class="icon-ok icon-white"></i> TPS</a></li>
</ul>
</li>
</ul>
</div>
</li>
<li class="divider-vertical"></li>
<li class="" id="queryTime"></li>
</ul>
</div>
</div>
</div>
</div>
<div class="container" id="warningMessage"></div>
<div class="container">
<div id="progressbar" style="display:none;"><img src="/images/ajaxloader.gif" /></div>
</div>
<!-- BODY -->
<div class="chart-container">
<div class="chart-left">
<div id="servermap" class="servermap"></div>
</div>
<div class="chart-right">
<div id="scatterChartContainer" style="display:none;">
<span onclick="" style="text-decoration:underline;cursor:pointer">Show all transaction</span>
&nbsp;&nbsp;&nbsp;
<i class="icon-fullscreen" onclick="expandScatter($(this));" onmouseover="$(this).tooltip('show');" title="Expand to new popup window." style="cursor:pointer;"></i>
&nbsp;&nbsp;&nbsp;
<a href=""><i class="icon-download-alt" onmouseover="$(this).tooltip('show');" title="Download as PNG image format file." style="cursor:pointer;"></i></a>
<div id="scatterchart"></div>
</div>
<hr/>
<div id="statisticsProgressbar" style="display:none;"><img src="/images/ajaxloader.gif" /></div>
<div id="nodeInfoDetails">
<div class='info'></div>
</div>
<div id="linkInfoDetails">
<div class='info'></div>
<div class='linkInfoChart' style='width:100%;display:none'>
Response histogram
<svg style='height:200px' />
</div>
<div class='linkInfoBarChart' style='width:100%;display:none'>
Response histogram summary
<svg style='height:150px' />
</div>
</div>
</div>
</div>
<!-- END OF BODY -->
<script type="text/javascript">
var Nav;
$(document).ready(function () {
Nav = new _PinpointNavigationBar();
$("#mergeUnknown").bind('click', toggleMergeUnknowns);
$("#hideIndirectAccess").bind('click', toggleHideIndirectAccess);
$('#date').datepicker().on('changeDate', function(ev){
updateCharts();
});
$('#time').bind('focus', function(e){
$(this).data("time", $(this).val());
}).bind('blur', function(e){
if ($(this).data("time") !== $(this).val()) {
updateCharts();
}
});
$('#until').delegate("button", "click", function(){
var $this = $(this);
$this.siblings(".btn-primary").removeClass("btn-primary");
$this.addClass("btn-primary");
if ($this.attr("id") === "now") {
$("#date").attr("disabled", "").val("");
$("#time").attr("disabled", "").val("");
updateCharts();
} else {
setQueryDateToNow();
$("#date").attr("disabled", null);
$("#time").attr("disabled", null);
}
});
$('#period').delegate("button", "click", function(){
var $this = $(this);
$this.siblings(".btn-inverse").removeClass("btn-inverse active");
$this.addClass("btn-inverse active");
updateCharts();
});
// TODO 조회 버튼을 두 번 연속 눌렀을 때 앞서 수행되던 결과는 취소시켜야 함.
// 예를 들어 1일치 조회하다가 모두 조회 되기 전에 30분 데이터 조회할 때...
function updateCharts() {
if(!Nav.isSelected()) {
alert("\n\nSelect an application, please.\n\n");
return true;
}
var f = formatDate(new Date(Nav.getQueryStartTime()), true);
var e = formatDate(new Date(Nav.getQueryEndTime()), true);
$("#queryTime").html(f + ' ~ <br/>' + e);
$("#progressbar").show();
showServerMap(Nav.getApplicationName(), Nav.getServiceType(), Nav.getQueryStartTime(), Nav.getQueryEndTime(), Nav.getQueryPeriod(), Nav.isQueryFromNow(), null, Nav.isHideIndirectAccess(), function() { $("#progressbar").hide(); });
showResponseScatter(Nav.getApplicationName(), Nav.getQueryStartTime(), Nav.getQueryEndTime(), Nav.getQueryPeriod(), Nav.isQueryFromNow());
}
$.getJSON("/applications.pinpoint", function(json) {
var target = $("#application");
if (json.length == 0) {
$("#application OPTION:first").text("Application not found.");
return;
}
target.empty();
var optionsHTML = [];
$(json).each(function(i, e) {
var opt = $(document.createElement("option"));
opt.attr("value", e.applicationName + "@" + e.code);
if (json.length == 1) {
opt.attr("selected", "selected");
}
opt.text(e.applicationName + "@" + e.serviceType);
target.append(opt);
});
target.attr("disabled", null);
var formatOptionText = function(state) {
if (!state.id) return state.text;
var chunk = state.text.split("@");
if (chunk.length > 1) {
var img = document.createElement("img");
img.src = "/images/icons/" + chunk[1] + ".png";
return img.outerHTML + chunk[0];
} else {
return state.text;
}
}
target.select2({
placeholder: "Select an application.",
formatResult: formatOptionText,
formatSelection: formatOptionText,
escapeMarkup: function(m) { return m; }
});
// 임시.
$(".select2-container").css("top", "4px");
$("#until BUTTON").attr("disabled", null);
$("#period BUTTON").attr("disabled", null);
});
$("#application").bind("change", updateCharts);
});
</script>
<script id="NodeInfoBox" type="text/x-jquery-tmpl">
<div class="NodeInfoBox">
{{if category != "UNKNOWN_GROUP" && category != "USER"}}
<img src="/images/icons/{{= category}}.png" width="20" height="10" /> {{= text}} ({{= category}})
{{if terminal == "false" && category != "UNKNOWN_CLOUD"}}
<br/><a href="#" onclick="showRequests('{{= text}}', {{= query.from}}, {{= query.to}}, {{= query.period}}, {{= query.usePeriod}});">Passing transaction list</a>
<br/><a href="#" onclick="showResponseScatter('{{= text}}', {{= query.from}}, {{= query.to}}, {{= query.period}}, {{= query.usePeriod}});">Passing transaction response scatter chart</a>
{{/if}}
<br/>
{{/if}}
{{if category == "USER"}}
<img src="/images/icons/USER.png" width="20" height="10" /> {{= category}}
{{/if}}
{{if hosts.length > 0}}
Hosts
<ul>
{{each(key, value) hosts}}
<li>
<span class="label label-success">OK</span>
{{= value.name}}
<a href="http://nsight.nhncorp.com/dashboard_server/{{= value.name.split(':')[0].replace('.nhnsystem.com','')}}" target="_blank" title="System resource monitoring site">(NSight)</a>
{{if category == 'ARCUS' }}
<a href="http://hubble.arcuscloud.nhncorp.com/" target="_blank" title="Arcus monitoring site">(Hubble)</a>
{{/if}}
</li>
{{/each}}
</ul>
{{/if}}
{{if agents.length > 0}}
Server instances
<ul>
{{each(key, value) agents}}
<li>
<span class="label label-success">OK</span>
{{= value.agentId}}
<!--
<a href="#" onclick="alert('Sorry. Not implemented.');">(Kuvasz)</a>
<a href="#" onclick="alert('Sorry. Not implemented.');">(Tools)</a>
-->
</li>
{{/each}}
</ul>
{{/if}}
</div>
</script>
<script id="LinkInfoBox" type="text/x-jquery-tmpl">
<div class="LinkInfoBox">
<img src="/images/icons/{{= sourceinfo.serviceType}}.png" width="20" height="10" /> {{= sourceinfo.applicationName}}
<i class="icon-arrow-right"></i>
<img src="/images/icons/{{= targetinfo.serviceType}}.png" width="20" height="10" /> {{= targetinfo.applicationName}}
<!--
<br/>
Total requests : ???<br/>
Failed : {{= error}}<br/>
Response statistics
<ul>
{{var lastKey=''}}
{{each(key, value) histogram}}
<li>&lt;= {{= key}}ms : {{= value}}</li>
{{eval lastKey=key}}
{{/each}}
<li>&nbsp;&nbsp;&gt; {{= lastKey}}ms : {{= slow}}</li>
</ul>
-->
<br/>
<a href="#" onclick="filterPassingTransaction('{{= sourceinfo.applicationName}}', '{{= query.serviceType}}', {{= query.from}}, {{= query.to}}, '{{= sourceinfo.serviceType}}', '{{= sourceinfo.applicationName}}', '{{= targetinfo.serviceType}}', '{{= targetinfo.applicationName}}', null);">Passing transaction map</a><br/>
{{if sourceinfo.serviceType == "CLIENT"}}
<a href="#" onclick="showRequests('{{= targetinfo.applicationName}}', {{= query.from}}, {{= query.to}}, {{= query.period}}, {{= query.usePeriod}}, '{{= sourceinfo.serviceType}}|{{= targetinfo.applicationName}}|{{= targetinfo.serviceType}}|{{= targetinfo.applicationName}}');">Passing transaction list</a>
{{/if}}
{{if sourceinfo.serviceType != "CLIENT"}}
<a href="#" onclick="showRequests('{{= sourceinfo.applicationName}}', {{= query.from}}, {{= query.to}}, {{= query.period}}, {{= query.usePeriod}}, '{{= sourceinfo.serviceType}}|{{= sourceinfo.applicationName}}|{{= targetinfo.serviceType}}|{{= targetinfo.applicationName}}');">Passing transaction list</a>
{{/if}}
</div>
</script>
<script id="UnknownNodeInfoBox" type="text/x-jquery-tmpl">
<div class="UnknownNodeInfoBox">
{{each(index, value) textArr}}
<img src="/images/icons/UNKNOWN_CLOUD.png" width="20" height="10" /> {{= value.applicationName}}<br/>
{{/each}}
</div>
</script>
<script id="UnknownLinkInfoBox" type="text/x-jquery-tmpl">
<div class="UnknownLinkInfoBox">
{{each(index, value) targetinfo}}
<img src="/images/icons/{{= sourceinfo[0].serviceType}}.png" width="20" height="10" /> {{= sourceinfo[0].applicationName}}
<i class="icon-arrow-right"></i>
<img src="/images/icons/{{= value.serviceType}}.png" width="20" height="10" /> {{= value.applicationName}}
<a href="#" onclick="SERVERMAP_METHOD_CACHE['{{= value.applicationName}}']();" title="show details" style="text-decoration:none;">
<i class="icon-search"></i>
</a>
<ul>
<li>request count : {{= rawdata[value.applicationName].count}} /
{{if rawdata[value.applicationName].error > 0}}
<font color="#FF0000">{{= rawdata[value.applicationName].error}}</font>
{{else}}
{{= rawdata[value.applicationName].error}}
{{/if}}
</li>
</ul>
<br/>
{{/each}}
</div>
</script>
</body>
</html>