From 6edcbb995c952829b3c841a2b2d26e5ac8a1b869 Mon Sep 17 00:00:00 2001 From: Woonduk Kang Date: Thu, 16 Jul 2015 15:56:37 +0900 Subject: [PATCH] #732 filter wizard bug fix. incorrect agent mapping --- .../applicationmap/ApplicationMapBuilder.java | 3 +++ .../pinpoint/web/applicationmap/Node.java | 9 ++++++--- .../applicationmap/ServerInstanceList.java | 20 ++++++++++++++----- .../BusinessTransactionController.java | 1 + .../ControllerExceptionHandler.java | 12 +++++++++-- .../pinpoint/web/view/LinkSerializer.java | 18 +++++++++++++++++ 6 files changed, 53 insertions(+), 10 deletions(-) diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMapBuilder.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMapBuilder.java index ea61ae746..7a38df2f4 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMapBuilder.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ApplicationMapBuilder.java @@ -384,6 +384,9 @@ public class ApplicationMapBuilder { } else if (nodeServiceType.isWas()) { Set agentList = agentInfoService.selectAgent(node.getApplication().getName(), range); if (agentList.isEmpty()) { + logger.warn("agentInfo not found. applicationName:{}", node.getApplication()); + // avoid NPE + node.setServerInstanceList(new ServerInstanceList()); return; } logger.debug("add agentInfo. {}, {}", node.getApplication(), agentList); diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/Node.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/Node.java index 4d865b5ce..c0f39dda5 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/Node.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/Node.java @@ -43,8 +43,8 @@ public class Node { public static final String NODE_DELIMITER = "^"; private final Application application; - - private ServerInstanceList serverInstanceList; + // avoid NPE + private ServerInstanceList serverInstanceList = new ServerInstanceList(); private NodeHistogram nodeHistogram; @@ -74,8 +74,11 @@ public class Node { } } - + // TODO remove setter public void setServerInstanceList(ServerInstanceList serverInstanceList) { + if (serverInstanceList == null) { + throw new NullPointerException("serverInstanceList must not be null"); + } this.serverInstanceList = serverInstanceList; } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ServerInstanceList.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ServerInstanceList.java index c90bcc6bd..eb337295f 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ServerInstanceList.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/ServerInstanceList.java @@ -16,12 +16,9 @@ package com.navercorp.pinpoint.web.applicationmap; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; +import java.util.*; +import com.navercorp.pinpoint.common.bo.AgentInfoBo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -58,6 +55,19 @@ public class ServerInstanceList { return serverInstanceList; } + public List getAgentIdList() { + final Collection> serverInstanceValueList = this.serverInstanceList.values(); + + final List agentList = new ArrayList(); + for (List serverInstanceList : serverInstanceValueList) { + for (ServerInstance serverInstance : serverInstanceList) { + AgentInfoBo agentInfo = serverInstance.getAgentInfo(); + agentList.add(agentInfo.getAgentId()); + } + } + return agentList; + } + public int getInstanceCount() { int count = 0; for (List entry : serverInstanceList.values()) { diff --git a/web/src/main/java/com/navercorp/pinpoint/web/controller/BusinessTransactionController.java b/web/src/main/java/com/navercorp/pinpoint/web/controller/BusinessTransactionController.java index a8302b61c..0381a9025 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/controller/BusinessTransactionController.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/controller/BusinessTransactionController.java @@ -198,6 +198,7 @@ public class BusinessTransactionController { mv.addObject("disableButtonMessage", disableButtonMessage); if (viewVersion == 2) { + // TODO remove hashformat mv.setViewName("transactionInfoJsonHash"); } else { mv.setViewName("transactionInfoJson"); diff --git a/web/src/main/java/com/navercorp/pinpoint/web/controller/ControllerExceptionHandler.java b/web/src/main/java/com/navercorp/pinpoint/web/controller/ControllerExceptionHandler.java index f09a6528d..19701a42f 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/controller/ControllerExceptionHandler.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/controller/ControllerExceptionHandler.java @@ -26,6 +26,8 @@ import java.util.Map; import javax.servlet.http.HttpServletRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.servlet.ModelAndView; @@ -40,8 +42,12 @@ public class ControllerExceptionHandler { private static final String UNKNOWN = "UNKNOWN"; + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @ExceptionHandler(value = Exception.class) public ModelAndView defaultErrorHandler(HttpServletRequest request, Exception exception) throws Exception { + logger.warn("Error:{}", exception.getMessage(), exception); ModelAndView mav = new ModelAndView(); mav.addObject("exception", createExceptionResource(request, exception)); mav.setViewName(DEFAULT_ERROR_VIEW); @@ -72,10 +78,12 @@ public class ControllerExceptionHandler { } StringBuilder stackTrace = new StringBuilder(128); - stackTrace.append(throwable.toString()).append("\r\n"); + stackTrace.append(throwable.toString()); + stackTrace.append("\r\n"); for (StackTraceElement traceElement : throwable.getStackTrace()) { - stackTrace.append("\tat " + traceElement.toString()).append("\r\n"); + stackTrace.append("\tat " + traceElement.toString()); + stackTrace.append("\r\n"); } return stackTrace.toString(); diff --git a/web/src/main/java/com/navercorp/pinpoint/web/view/LinkSerializer.java b/web/src/main/java/com/navercorp/pinpoint/web/view/LinkSerializer.java index 08a704336..1aad758d5 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/view/LinkSerializer.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/view/LinkSerializer.java @@ -18,6 +18,7 @@ package com.navercorp.pinpoint.web.view; import com.navercorp.pinpoint.web.applicationmap.Link; import com.navercorp.pinpoint.web.applicationmap.Node; +import com.navercorp.pinpoint.web.applicationmap.ServerInstanceList; import com.navercorp.pinpoint.web.applicationmap.histogram.Histogram; import com.navercorp.pinpoint.web.applicationmap.rawdata.AgentHistogram; import com.navercorp.pinpoint.web.applicationmap.rawdata.AgentHistogramList; @@ -45,6 +46,9 @@ public class LinkSerializer extends JsonSerializer { jgen.writeStringField("from", link.getFrom().getNodeName()); // necessary for go.js jgen.writeStringField("to", link.getTo().getNodeName()); // necessary for go.js + // for FilterWizard. from, to agent mapping data + writeAgentId("fromAgent", link.getFrom(), jgen); + writeAgentId("toAgent", link.getTo(), jgen); writeSimpleNode("sourceInfo", link.getFrom(), jgen); writeSimpleNode("targetInfo", link.getTo(), jgen); @@ -79,6 +83,20 @@ public class LinkSerializer extends JsonSerializer { jgen.writeEndObject(); } + private void writeAgentId(String fieldName, Node node, JsonGenerator jgen) throws IOException { + if (node.getServiceType().isWas()) { + jgen.writeFieldName(fieldName); + jgen.writeStartArray(); + ServerInstanceList serverInstanceList = node.getServerInstanceList(); + if (serverInstanceList!= null) { + for (String agentId : serverInstanceList.getAgentIdList()) { + jgen.writeObject(agentId); + } + } + jgen.writeEndArray(); + } + } + private void writeWasToWasTargetRpcList(Link link, JsonGenerator jgen) throws IOException { // write additional information to be used for filtering failed WAS -> WAS call events. jgen.writeFieldName("filterTargetRpcList");