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();
}
}