package detective.common.trace.impl;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.elasticsearch.action.ListenableActionFuture;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.sort.SortOrder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import detective.common.DateUtil;
import detective.common.trace.TraceRecord;
import detective.common.trace.TraceRetriver;
import detective.core.services.ElasticSearchClientFactory;
public class TraceRetriverElasticSearchImpl implements TraceRetriver {
private final Logger logger = LoggerFactory.getLogger(getClass());
private final String TRACE_INDEX = "trace";
//TODO Add timezone
private final String TimeFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
public List<TraceRecord> queryTraces(String hashKey) {
List<TraceRecord> records = new ArrayList<TraceRecord>();
TransportClient client = ElasticSearchClientFactory.getTransportClient();
SearchRequestBuilder builder = client.prepareSearch(TRACE_INDEX);
TermQueryBuilder query = new TermQueryBuilder("hashKey", hashKey);
builder.setQuery(query);
builder.setSize(1000);
builder.addSort("timestamp", SortOrder.DESC);
ListenableActionFuture<SearchResponse> future = builder.execute();
SearchResponse res = future.actionGet();
SearchHits hits = res.getHits();
for (SearchHit hit : hits){
Map<String, Object> sources = hit.getSource();
Set<String> keys = new HashSet<String>();
keys.addAll(sources.keySet());
TraceRecord record = new TraceRecord();
try {
record.setTimestamp(DateUtil.parse(TimeFormat, sources.get("timestamp").toString()));
} catch (ParseException e) {
logger.error(e.getMessage(), e);
throw new RuntimeException(e.getMessage(), e);
}
record.setType(sources.get("type").toString());
record.setHashKey(sources.get("hashKey").toString());
record.setAccountId(Long.valueOf(sources.get("accountId").toString()));
record.setFundId(sources.get("fundId").toString());
record.setCaption(sources.get("caption").toString());
record.setOperator(sources.get("operator").toString());
record.setThreadName(sources.get("threadName").toString());
record.setQueue(sources.get("queue").toString());
record.setCpu(Integer.valueOf(sources.get("cpu").toString()));
record.setExtendJsonData(sources.get("extendJsonDataOriginal").toString());
keys.remove("timestamp");
keys.remove("type");
keys.remove("hashKey");
keys.remove("accountId");
keys.remove("fundId");
keys.remove("caption");
keys.remove("operator");
keys.remove("threadName");
keys.remove("queue");
keys.remove("cpu");
keys.remove("extendJsonDataOriginal");
keys.remove("extendJsonData");
for (String key : keys){
record.getExtendDatas().put(key, sources.get(key));
}
records.add(record);
}
return records;
}
}