package detective.common.trace.impl;
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
import java.io.IOException;
import java.util.Date;
import org.elasticsearch.action.ListenableActionFuture;
import org.elasticsearch.action.deletebyquery.DeleteByQueryRequestBuilder;
import org.elasticsearch.action.deletebyquery.DeleteByQueryResponse;
import org.elasticsearch.action.index.IndexRequestBuilder;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import detective.common.DateUtil;
import detective.common.trace.TraceRecord;
import detective.common.trace.TraceRecorder;
import detective.core.services.ElasticSearchClientFactory;
public class TraceRecorderElasticSearchImpl implements TraceRecorder {
private final String TRACE_INDEX = "detective-trace";
private Logger logger = LoggerFactory.getLogger(getClass());
public void record(TraceRecord trace) {
logger.info(trace.toString());
return;
// if (trace.getThreadName() == null)
// trace.setThreadName(Thread.currentThread().getName());
//
// TransportClient client = ElasticSearchClientFactory.getTransportClient();
// IndexRequestBuilder builder = client.prepareIndex(TRACE_INDEX, trace.getType());
//
// try {
// XContentBuilder source = jsonBuilder()
// .startObject()
// .field("timestamp", trace.getTimestamp())
// .field("type", trace.getType())
// .field("hashKey", trace.getHashKey())
// .field("caption", trace.getCaption())
// .field("accountId", trace.getAccountId())
// .field("fundId", trace.getFundId())
// .field("operator", trace.getOperator())
// .field("threadName", trace.getThreadName())
// .field("cpu", trace.getCpu())
// .field("queue", trace.getQueue());
//
// if (trace.getExtendDatas().size() > 0){
// for (String key : trace.getExtendDatas().keySet()){
// Object value = trace.getExtendDatas().get(key);
// if (value instanceof String || value instanceof Number || null == value){
// source.field(key, value);
// }else{
// throw new RuntimeException("We support only String and Number, if it's a Date please format as String first, the key contains error data type:" + key);
// }
// }
// }
// if (trace.getExtendJsonData() != null && trace.getExtendJsonData().length() > 0){
// source.rawField("extendJsonData", trace.getExtendJsonData().getBytes());
// source.field("extendJsonDataOriginal", trace.getExtendJsonData());
// }
// source.endObject();
//
// builder.setSource(source);
// } catch (IOException e) {
// throw new RuntimeException(e.getMessage(), e);
// }
//
// ListenableActionFuture<IndexResponse> future = builder.execute();
// future.actionGet();
}
private void buildString(TraceRecord trace) {
StringBuilder sb = new StringBuilder();
sb.append("{")
.append("\"timestamp\":").append("\"").append(DateUtil.formatFullTime(trace.getTimestamp())).append("\",") //.append(trace.getTimestamp().getTime()).append(",") //DateUtil.formatFullTime(trace.getTimestamp())
.append("\"type\":\"").append(trace.getType()).append("\",")
.append("\"hashKey\":\"").append(trace.getHashKey()).append("\",")
.append("\"caption\":\"").append(trace.getCaption()).append("\",")
.append("\"accountId\":").append(trace.getAccountId()).append(",")
.append("\"fundId\":\"").append(trace.getFundId()).append("\",")
.append("\"operator\":\"").append(trace.getOperator()).append("\",")
.append("\"threadName\":\"").append(trace.getThreadName()).append("\",")
.append("\"cpu\":").append(trace.getCpu()).append(",")
.append("\"queue\":\"").append(trace.getQueue()).append("\"");
if (trace.getExtendDatas().size() > 0){
for (String key : trace.getExtendDatas().keySet()){
Object value = trace.getExtendDatas().get(key);
if (value != null){
sb.append(",\"").append(key).append("\":");
if (value instanceof java.lang.Number)
sb.append(value.toString());
else if (value instanceof java.util.Date)
sb.append("\"").append(DateUtil.formatFullTime((Date)value)).append("\"");
else
sb.append("\"").append(value.toString()).append("\"");
}
}
}
if (trace.getExtendJsonData() != null && trace.getExtendJsonData().length() > 0){
sb.append(",\"extendJsonData\":").append(trace.getExtendJsonData()).append("");
sb.append(",\"extendJsonDataOriginal\":\"").append(trace.getExtendJsonData()).append("\"");
}
sb.append("}");
//builder.setSource(sb.toString());
}
/**
* The hidden function for test, idealy a log/trace should never been deleted as it is happened, we can't go back
*/
public void deleteByHashKey(String hashKey){
if (hashKey == null || hashKey.equals("*"))
throw new RuntimeException("Hashkey must have a value and can't be *");
TransportClient client = ElasticSearchClientFactory.getTransportClient();
DeleteByQueryRequestBuilder builder = client.prepareDeleteByQuery(this.TRACE_INDEX);
TermQueryBuilder query = new TermQueryBuilder("hashKey", hashKey);
builder.setQuery(query);
ListenableActionFuture<DeleteByQueryResponse> future = builder.execute();
future.actionGet();
}
}