package com.nhn.hippo.web.service; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; 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.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.nhn.hippo.web.vo.TraceId; import com.profiler.common.dto.thrift.Span; import com.profiler.common.hbase.HBaseClient; import com.profiler.common.hbase.HBaseQuery; import com.profiler.common.hbase.HBaseQuery.HbaseColumn; import com.profiler.common.hbase.HBaseTables; /** * * @author netspider * */ @Service public class FlowChartServiceImpl implements FlowChartService { @Autowired @Qualifier("hbaseClient") HBaseClient client; @Override public String[] selectAgentIds(String[] hosts) { List column = new ArrayList(); column.add(new HbaseColumn("Agents", "AgentID")); HBaseQuery query = new HBaseQuery(HBaseTables.SERVERS, null, null, column); Iterator> iterator = client.getHBaseData(query); while (iterator.hasNext()) { System.out.println("selectedAgentId=" + iterator.next()); } System.out.println("!!!==============WARNING==============!!!"); System.out.println("!!! selectAgentIds IS NOT IMPLEMENTED !!!"); System.out.println("!!!===================================!!!"); return hosts; } @Override public Set selectTraceIdsFromTraceIndex(String[] agentIds, long from, long to) { List column = new ArrayList(); column.add(new HbaseColumn("Trace", "ID")); Set set = new HashSet(); for (String agentId : agentIds) { byte[] s = ArrayUtils.addAll(Bytes.toBytes(agentId), Bytes.toBytes(from)); byte[] e = ArrayUtils.addAll(Bytes.toBytes(agentId), Bytes.toBytes(to)); HBaseQuery query = new HBaseQuery(HBaseTables.TRACE_INDEX, s, e, column); Iterator> result = client.getHBaseData(query); while (result.hasNext()) { set.add(new TraceId(result.next().get("ID"))); } } return set; } @Override public Map> selectTraces(List traceIds) { List gets = new ArrayList(traceIds.size()); for (byte[] traceId : traceIds) { gets.add(new Get(traceId)); } Result[] results = client.get(HBaseTables.TRACES, gets); // traceId, SpanList final Map> result = new HashMap>(); 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; } @Override public RPCCallTree selectRPCCallTree(Set traceIds) { List gets = new ArrayList(traceIds.size()); for (TraceId traceId : traceIds) { gets.add(new Get(traceId.getBytes())); } Result[] results = client.get(HBaseTables.TRACES, gets); 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(); } }