diff --git a/src/main/java/com/nhn/hippo/web/calltree/server/ServerCallTree.java b/src/main/java/com/nhn/hippo/web/calltree/server/ServerCallTree.java index 0ac5cd37a..7e14cdcaf 100644 --- a/src/main/java/com/nhn/hippo/web/calltree/server/ServerCallTree.java +++ b/src/main/java/com/nhn/hippo/web/calltree/server/ServerCallTree.java @@ -1,107 +1,137 @@ package com.nhn.hippo.web.calltree.server; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.util.Map.Entry; import com.nhn.hippo.web.vo.BusinessTransactions; import com.profiler.common.bo.SpanBo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Call Tree - * + * * @author netspider */ public class ServerCallTree { - private Logger logger = LoggerFactory.getLogger(this.getClass()); + private Logger logger = LoggerFactory.getLogger(this.getClass()); - private final String PREFIX_CLIENT = "CLIENT:"; + private final String PREFIX_CLIENT = "CLIENT:"; - private final Map servers = new HashMap(); - private final Map spanIdToServerId = new HashMap(); - private final Map ServerRequests = new HashMap(); - private final BusinessTransactions businessTransactions = new BusinessTransactions(); + private final Map servers = new HashMap(); + private final Map spanIdToServerId = new HashMap(); + private final Map ServerRequests = new HashMap(); + private final List spans = new ArrayList(); + private final BusinessTransactions businessTransactions = new BusinessTransactions(); - public void addSpan(SpanBo span) { - Server server = new Server(span.getAgentId(), span.getApplicationName(), span.getEndPoint(), span.isTerminal()); + private boolean isBuilt = false; - if (server.getId() == null) { - return; - } + public void addSpan(SpanBo span) { + /** + * make Servers + */ + // TODO: 여기에서 이러지말고 수집할 때 처음부터 table에 저장해둘 수 있나?? + Server server = new Server(span.getAgentId(), span.getApplicationName(), span.getEndPoint(), span.isTerminal()); - if (!servers.containsKey(server.getId())) { - server.setSequence(servers.size()); - servers.put(server.getId(), server); - } - spanIdToServerId.put(String.valueOf(span.getSpanId()), server.getId()); + if (server.getId() == null) { + return; + } + + // TODO: remove this later. + if (server.getId().contains("mysql:jdbc:") || server.getId().contains("favicon")) { + return; + } - // TODO: remove client node + if (!servers.containsKey(server.getId())) { + servers.put(server.getId(), server); + } + spanIdToServerId.put(String.valueOf(span.getSpanId()), server.getId()); + + // TODO: remove client node // if (span.getParentSpanId() == -1) { -// Server client = new Server(PREFIX_CLIENT + span.getAgentId(), span.getApplicationName(), span.getEndPoint(), false); +// Server client = new Server(PREFIX_CLIENT + span.getAgentID(), span.getEndPoint(), false); // servers.put(client.getId(), client); -// spanIdToServerId.put(PREFIX_CLIENT + span.getSpanId(), client.getId()); +// spanIdToServerId.put(PREFIX_CLIENT + span.getSpanID(), client.getId()); // } - /** - * Preparing makes link (ServerRequests) - */ - if (span.getParentSpanId() == -1) { - businessTransactions.add(span); - } else { - String from = String.valueOf(span.getParentSpanId()); - String to = String.valueOf(span.getSpanId()); + /** + * Preparing makes link (ServerRequests) + */ + if (span.getParentSpanId() == -1) { + businessTransactions.add(span); + } else { + spans.add(span); + } + } - Server fromServer = servers.get(spanIdToServerId.get(from)); - Server toServer = servers.get(spanIdToServerId.get(to)); + public ServerCallTree build() { + if (isBuilt) + return this; - if (fromServer == null) { - fromServer = servers.get(spanIdToServerId.get(PREFIX_CLIENT + to)); - } + int i = 0; + for (Entry entry : servers.entrySet()) { + entry.getValue().setSequence(i++); + } - // TODO 없는 url에 대한 호출이 고려되어야 함. 일단 임시로 회피. - if (fromServer == null) { - logger.debug("invalid form server {}", from); - return; - } - ServerRequest serverRequest = new ServerRequest(fromServer, toServer); + for (SpanBo span : spans) { + String from = String.valueOf(span.getParentSpanId()); + String to = String.valueOf(span.getSpanId()); - // TODO: local call인 경우 보여주지 않음. - if (serverRequest.isSelfCalled()) { - return; - } + Server fromServer = servers.get(spanIdToServerId.get(from)); + Server toServer = servers.get(spanIdToServerId.get(to)); - if (ServerRequests.containsKey(serverRequest.getId())) { - ServerRequests.get(serverRequest.getId()).increaseCallCount(); - } else { - ServerRequests.put(serverRequest.getId(), serverRequest); - } - } - } + if (fromServer == null) { + fromServer = servers.get(spanIdToServerId.get(PREFIX_CLIENT + to)); + } - public Collection getNodes() { - return this.servers.values(); - } + // TODO 없는 url에 대한 호출이 고려되어야 함. 일단 임시로 회피. + if (fromServer == null) { + logger.debug("invalid form server {}", from); + continue; + } + ServerRequest serverRequest = new ServerRequest(fromServer, toServer); - public Collection getLinks() { - return this.ServerRequests.values(); - } + // TODO: local call인 경우 보여주지 않음. + if (serverRequest.isSelfCalled()) { + continue; + } - public BusinessTransactions getBusinessTransactions() { - return businessTransactions; - } + if (ServerRequests.containsKey(serverRequest.getId())) { + ServerRequests.get(serverRequest.getId()).increaseCallCount(); + } else { + ServerRequests.put(serverRequest.getId(), serverRequest); + } + } - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); + isBuilt = true; + return this; + } - sb.append("Server=").append(servers); - sb.append("\n"); - sb.append("ServerRequest=").append(ServerRequests.values()); + public Collection getNodes() { + return this.servers.values(); + } - return sb.toString(); - } + public Collection getLinks() { + return this.ServerRequests.values(); + } + + public BusinessTransactions getBusinessTransactions() { + return businessTransactions; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + + sb.append("Server=").append(servers); + sb.append("\n"); + sb.append("ServerRequest=").append(ServerRequests.values()); + + return sb.toString(); + } } 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 e9c7a20fc..6e98feb12 100755 --- a/src/main/java/com/nhn/hippo/web/service/FlowChartServiceImpl.java +++ b/src/main/java/com/nhn/hippo/web/service/FlowChartServiceImpl.java @@ -119,7 +119,7 @@ public class FlowChartServiceImpl implements FlowChartService { tree.addSpan(eachTransaction); } } - return tree; + return tree.build(); } @Override