From 52c97fa186fa4a9535894ee65823acdcf76d8511 Mon Sep 17 00:00:00 2001 From: Chisu Yu Date: Fri, 28 Sep 2012 04:54:42 +0000 Subject: [PATCH] =?UTF-8?q?[=EC=9C=A0=EC=B9=98=EC=88=98]=20[NOBTS]=20add?= =?UTF-8?q?=20server=20calltree?= 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@720 84d0f5b1-2673-498c-a247-62c4ff18d310 --- .classpath | 41 ++++--- build.sh | 2 +- .../nhn/hippo/web/calltree/RPCCallTree.java | 6 +- .../{Request.java => RPCRequest.java} | 4 +- .../com/nhn/hippo/web/calltree/Server.java | 44 +++++++ .../hippo/web/calltree/ServerCallTree.java | 110 ++++++++++++++++++ .../nhn/hippo/web/calltree/ServerRequest.java | 46 ++++++++ .../web/controller/FlowChartController.java | 18 +-- .../hippo/web/service/FlowChartService.java | 11 +- .../web/service/FlowChartServiceImpl.java | 99 ++++++++-------- .../hippo/web/service/TracesProcessor.java | 23 +++- 11 files changed, 308 insertions(+), 96 deletions(-) rename src/main/java/com/nhn/hippo/web/calltree/{Request.java => RPCRequest.java} (91%) create mode 100644 src/main/java/com/nhn/hippo/web/calltree/Server.java create mode 100644 src/main/java/com/nhn/hippo/web/calltree/ServerCallTree.java create mode 100644 src/main/java/com/nhn/hippo/web/calltree/ServerRequest.java diff --git a/.classpath b/.classpath index 6e4d95d68..7c1e3d961 100644 --- a/.classpath +++ b/.classpath @@ -3,18 +3,18 @@ - + + - @@ -33,7 +33,6 @@ - @@ -46,8 +45,8 @@ - - + + @@ -69,29 +68,29 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/build.sh b/build.sh index 779d054ed..bd04dcf2e 100755 --- a/build.sh +++ b/build.sh @@ -1,2 +1,2 @@ # web ui -mvn clean eclipse:eclipse package dependency:copy-dependencies -Dmaven.test.skip +mvn clean eclipse:eclipse package war:exploded -Dmaven.test.skip diff --git a/src/main/java/com/nhn/hippo/web/calltree/RPCCallTree.java b/src/main/java/com/nhn/hippo/web/calltree/RPCCallTree.java index 40a36cc59..8ed9c28db 100644 --- a/src/main/java/com/nhn/hippo/web/calltree/RPCCallTree.java +++ b/src/main/java/com/nhn/hippo/web/calltree/RPCCallTree.java @@ -21,7 +21,7 @@ public class RPCCallTree { private final Map rpcs = new HashMap(); private final Map spanIdToRPCId = new HashMap(); - private final Map requests = new HashMap(); + private final Map requests = new HashMap(); private final List spans = new ArrayList(); private boolean isBuilt = false; @@ -77,7 +77,7 @@ public class RPCCallTree { fromRPC = rpcs.get(spanIdToRPCId.get(PREFIX_CLIENT + to)); } - Request request = new Request(fromRPC, toRPC); + RPCRequest request = new RPCRequest(fromRPC, toRPC); if (requests.containsKey(request.getId())) { requests.get(request.getId()).increaseCallCount(); } else { @@ -93,7 +93,7 @@ public class RPCCallTree { return this.rpcs.values(); } - public Collection getLinks() { + public Collection getLinks() { return this.requests.values(); } diff --git a/src/main/java/com/nhn/hippo/web/calltree/Request.java b/src/main/java/com/nhn/hippo/web/calltree/RPCRequest.java similarity index 91% rename from src/main/java/com/nhn/hippo/web/calltree/Request.java rename to src/main/java/com/nhn/hippo/web/calltree/RPCRequest.java index c4c0486ac..8587bdcb7 100644 --- a/src/main/java/com/nhn/hippo/web/calltree/Request.java +++ b/src/main/java/com/nhn/hippo/web/calltree/RPCRequest.java @@ -5,13 +5,13 @@ package com.nhn.hippo.web.calltree; * @author netspider * */ -public class Request { +public class RPCRequest { private final String id; private final RPC from; private final RPC to; private int callCount = 1; - public Request(RPC from, RPC to) { + public RPCRequest(RPC from, RPC to) { this.from = from; this.to = to; this.id = from.getId() + to.getId(); diff --git a/src/main/java/com/nhn/hippo/web/calltree/Server.java b/src/main/java/com/nhn/hippo/web/calltree/Server.java new file mode 100644 index 000000000..1c78fda5d --- /dev/null +++ b/src/main/java/com/nhn/hippo/web/calltree/Server.java @@ -0,0 +1,44 @@ +package com.nhn.hippo.web.calltree; + +/** + * + * + * @author netspider + * + */ +public class Server implements Comparable { + private int sequence; + private final String id; + private final String agentId; + + public Server(String agentId, String endPoint) { + this.id = agentId + ":" + endPoint; + this.agentId = agentId; + } + + public String getId() { + return this.id; + } + + public void setSequence(int sequence) { + this.sequence = sequence; + } + + public int getSequence() { + return sequence; + } + + public String getAgentId() { + return agentId; + } + + @Override + public int compareTo(Server server) { + return id.compareTo(server.id); + } + + @Override + public String toString() { + return id; + } +} diff --git a/src/main/java/com/nhn/hippo/web/calltree/ServerCallTree.java b/src/main/java/com/nhn/hippo/web/calltree/ServerCallTree.java new file mode 100644 index 000000000..25eb9f17e --- /dev/null +++ b/src/main/java/com/nhn/hippo/web/calltree/ServerCallTree.java @@ -0,0 +1,110 @@ +package com.nhn.hippo.web.calltree; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import com.profiler.common.dto.thrift.Span; + +/** + * Call Tree + * + * @author netspider + * + */ +public class ServerCallTree { + + 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 List spans = new ArrayList(); + + private boolean isBuilt = false; + + public void addSpan(Span span) { + System.out.println("Add span to calltree=" + span + "\n"); + + /** + * make Servers + */ + // TODO: 여기에서 이러지말고 수집할 때 처음부터 table에 저장해둘 수 있나?? + Server Server = new Server(span.getAgentID(), span.getEndPoint()); + + // TODO: remove this later. + if (Server.getId().contains("mysql:jdbc:") || Server.getId().contains("favicon")) { + return; + } + + if (!servers.containsKey(Server.getId())) { + servers.put(Server.getId(), Server); + } + spanIdToServerId.put(String.valueOf(span.getSpanID()), Server.getId()); + + if (span.getParentSpanId() == -1) { + Server client = new Server(PREFIX_CLIENT + span.getAgentID(), span.getEndPoint()); + servers.put(client.getId(), client); + spanIdToServerId.put(PREFIX_CLIENT + span.getSpanID(), client.getId()); + } + + /** + * Preparing makes link (ServerRequests) + */ + spans.add(span); + } + + public ServerCallTree build() { + if (isBuilt) + return this; + + int i = 0; + for (Entry entry : servers.entrySet()) { + entry.getValue().setSequence(i++); + } + + for (Span span : spans) { + String from = String.valueOf(span.getParentSpanId()); + String to = String.valueOf(span.getSpanID()); + + Server fromServer = servers.get(spanIdToServerId.get(from)); + Server toServer = servers.get(spanIdToServerId.get(to)); + + if (fromServer == null) { + fromServer = servers.get(spanIdToServerId.get(PREFIX_CLIENT + to)); + } + + ServerRequest ServerRequest = new ServerRequest(fromServer, toServer); + if (ServerRequests.containsKey(ServerRequest.getId())) { + ServerRequests.get(ServerRequest.getId()).increaseCallCount(); + } else { + ServerRequests.put(ServerRequest.getId(), ServerRequest); + } + } + + isBuilt = true; + return this; + } + + public Collection getNodes() { + return this.servers.values(); + } + + public Collection getLinks() { + return this.ServerRequests.values(); + } + + @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/calltree/ServerRequest.java b/src/main/java/com/nhn/hippo/web/calltree/ServerRequest.java new file mode 100644 index 000000000..3c0497a9e --- /dev/null +++ b/src/main/java/com/nhn/hippo/web/calltree/ServerRequest.java @@ -0,0 +1,46 @@ +package com.nhn.hippo.web.calltree; + +/** + * + * @author netspider + * + */ +public class ServerRequest { + private final String id; + private final Server from; + private final Server to; + private int callCount = 1; + + public ServerRequest(Server from, Server to) { + this.from = from; + this.to = to; + this.id = from.getId() + to.getId(); + } + + public void increaseCallCount() { + callCount++; + } + + public String getId() { + return id; + } + + public Server getFrom() { + return from; + } + + public Server getTo() { + return to; + } + + public int getCallCount() { + return callCount; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("{from=").append(from).append(", to=").append(to).append(", cc=").append(callCount).append("}"); + return sb.toString(); + } +} diff --git a/src/main/java/com/nhn/hippo/web/controller/FlowChartController.java b/src/main/java/com/nhn/hippo/web/controller/FlowChartController.java index 03d7f71fb..af61d3045 100644 --- a/src/main/java/com/nhn/hippo/web/controller/FlowChartController.java +++ b/src/main/java/com/nhn/hippo/web/controller/FlowChartController.java @@ -1,6 +1,5 @@ package com.nhn.hippo.web.controller; -import java.util.Arrays; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; @@ -38,21 +37,10 @@ public class FlowChartController { */ @RequestMapping(value = "/flow", method = RequestMethod.GET) public String arcus(Model model, @RequestParam("host") String[] hosts, @RequestParam("from") long from, @RequestParam("to") long to) { - /** - * get agentId list from 'Servers' - */ - String[] selectAgentIds = flow.selectAgentIds(hosts); - System.out.println("selectedAgentIds=" + Arrays.toString(selectAgentIds)); + String[] agentIds = flow.selectAgentIds(hosts); + List traceIds = flow.selectTraceIdsFromTraceIndex(agentIds, from, to); + RPCCallTree callTree = flow.selectRPCCallTree(traceIds); - /** - * get traceId list from 'TraceIndex' - */ - List traceIds = flow.selectTraceIdsFromTraceIndex(hosts, from, to); - - /** - * get call tree - */ - RPCCallTree callTree = flow.selectCallTree(traceIds); model.addAttribute("nodes", callTree.getNodes()); model.addAttribute("links", callTree.getLinks()); model.addAttribute("value", "hello world"); 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 b094fb0bf..29faa2013 100755 --- a/src/main/java/com/nhn/hippo/web/service/FlowChartService.java +++ b/src/main/java/com/nhn/hippo/web/service/FlowChartService.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Map; import com.nhn.hippo.web.calltree.RPCCallTree; +import com.nhn.hippo.web.calltree.ServerCallTree; import com.profiler.common.dto.thrift.Span; /** @@ -45,5 +46,13 @@ public interface FlowChartService { * @param traceIds * @return */ - public RPCCallTree selectCallTree(List traceIds); + public RPCCallTree selectRPCCallTree(List traceIds); + + /** + * select call tree + * + * @param traceIds + * @return + */ + public ServerCallTree selectServerCallTree(List traceIds); } 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 11eb0dbe5..fccab43c3 100755 --- a/src/main/java/com/nhn/hippo/web/service/FlowChartServiceImpl.java +++ b/src/main/java/com/nhn/hippo/web/service/FlowChartServiceImpl.java @@ -5,20 +5,18 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import java.util.NavigableMap; import org.apache.commons.lang.ArrayUtils; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.util.Bytes; -import org.apache.thrift.TDeserializer; -import org.apache.thrift.TException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import com.nhn.hippo.web.calltree.RPCCallTree; +import com.nhn.hippo.web.calltree.ServerCallTree; +import com.nhn.hippo.web.service.TracesProcessor.SpanHandler; import com.profiler.common.dto.thrift.Span; import com.profiler.common.hbase.HBaseClient; import com.profiler.common.hbase.HBaseQuery; @@ -49,7 +47,11 @@ public class FlowChartServiceImpl implements FlowChartService { System.out.println("selectedAgentId=" + iterator.next()); } - return null; + System.out.println("!!!==============WARNING==============!!!"); + System.out.println("!!! selectAgentIds IS NOT IMPLEMENTED !!!"); + System.out.println("!!!===================================!!!"); + + return hosts; } @Override @@ -84,53 +86,26 @@ public class FlowChartServiceImpl implements FlowChartService { Result[] results = client.get(HBaseTables.TRACES, gets); // traceId, SpanList - Map> result = new HashMap>(); + final Map> result = new HashMap>(); - for (Result r : results) { - result.put(r.getRow(), populateSpans(r)); - } - - System.out.println("result=" + result); + TracesProcessor.process(results, new SpanHandler() { + @Override + public void handleSpan(byte[] row, byte[] family, byte[] column, Span span) { + if (result.containsKey(row)) { + result.get(row).add(span); + } else { + List list = new ArrayList(); + list.add(span); + result.put(row, list); + } + } + }); return result; } - private List populateSpans(Result res) { - List list = new ArrayList(); - - TDeserializer deserializer = new TDeserializer(); - - NavigableMap>> map = res.getMap(); - - for (Entry>> entry : map.entrySet()) { -// byte[] family = entry.getKey(); -// System.out.println("family=" + Bytes.toString(family)); - - NavigableMap> values = entry.getValue(); - - for (Entry> value : values.entrySet()) { -// byte[] colname = value.getKey(); -// System.out.println("colname=" + Bytes.toString(colname)); - - NavigableMap valueSeries = value.getValue(); - - for (Entry v : valueSeries.entrySet()) { - Span span = new Span(); - try { - deserializer.deserialize(span, v.getValue()); - list.add(span); - } catch (TException e) { - e.printStackTrace(); - } - } - } - } - - return list; - } - @Override - public RPCCallTree selectCallTree(List traceIds) { + public RPCCallTree selectRPCCallTree(List traceIds) { List gets = new ArrayList(traceIds.size()); for (byte[] traceId : traceIds) { gets.add(new Get(traceId)); @@ -138,6 +113,36 @@ public class FlowChartServiceImpl implements FlowChartService { Result[] results = client.get(HBaseTables.TRACES, gets); - return TracesProcessor.process(results); + final RPCCallTree tree = new RPCCallTree(); + + TracesProcessor.process(results, new SpanHandler() { + @Override + public void handleSpan(byte[] row, byte[] family, byte[] column, Span span) { + tree.addSpan(span); + } + }); + + return tree.build(); + } + + @Override + public ServerCallTree selectServerCallTree(List traceIds) { + List gets = new ArrayList(traceIds.size()); + for (byte[] traceId : traceIds) { + gets.add(new Get(traceId)); + } + + Result[] results = client.get(HBaseTables.TRACES, gets); + + final ServerCallTree tree = new ServerCallTree(); + + TracesProcessor.process(results, new SpanHandler() { + @Override + public void handleSpan(byte[] row, byte[] family, byte[] column, Span span) { + tree.addSpan(span); + } + }); + + return tree.build(); } } diff --git a/src/main/java/com/nhn/hippo/web/service/TracesProcessor.java b/src/main/java/com/nhn/hippo/web/service/TracesProcessor.java index 996999673..99b0629b4 100644 --- a/src/main/java/com/nhn/hippo/web/service/TracesProcessor.java +++ b/src/main/java/com/nhn/hippo/web/service/TracesProcessor.java @@ -4,17 +4,24 @@ import java.util.Map.Entry; import java.util.NavigableMap; import org.apache.hadoop.hbase.client.Result; +import org.apache.hadoop.hbase.util.Bytes; import org.apache.thrift.TDeserializer; import org.apache.thrift.TException; -import com.nhn.hippo.web.calltree.RPCCallTree; import com.profiler.common.dto.thrift.Span; +/** + * + * @author netspider + * + */ public class TracesProcessor { - public static RPCCallTree process(Result[] results) { - RPCCallTree callTree = new RPCCallTree(); + public static interface SpanHandler { + void handleSpan(byte[] row, byte[] family, byte[] column, Span span); + } + public static void process(Result[] results, SpanHandler handler) { TDeserializer deserializer = new TDeserializer(); for (Result res : results) { @@ -25,12 +32,18 @@ public class TracesProcessor { NavigableMap>> map = res.getMap(); for (Entry>> entry : map.entrySet()) { + byte[] family = entry.getKey(); + System.out.println("family=" + Bytes.toString(family)); + NavigableMap> values = entry.getValue(); /** * For each column (SpanID) */ for (Entry> value : values.entrySet()) { + byte[] colname = value.getKey(); + System.out.println("colname=" + Bytes.toString(colname)); + NavigableMap valueSeries = value.getValue(); /** @@ -40,7 +53,7 @@ public class TracesProcessor { Span span = new Span(); try { deserializer.deserialize(span, v.getValue()); - callTree.addSpan(span); + handler.handleSpan(res.getRow(), family, colname, span); } catch (TException e) { e.printStackTrace(); } @@ -48,7 +61,5 @@ public class TracesProcessor { } } } - - return callTree.build(); } }