package core.log.service;
import core.framework.api.search.BulkIndexRequest;
import core.framework.api.search.ElasticSearchType;
import core.framework.api.search.IndexRequest;
import core.framework.api.util.Maps;
import core.framework.impl.log.queue.ActionLogMessage;
import core.log.domain.ActionDocument;
import core.log.domain.TraceDocument;
import javax.inject.Inject;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
/**
* @author neo
*/
public class ActionService {
@Inject
ElasticSearchType<ActionDocument> actionType;
@Inject
ElasticSearchType<TraceDocument> traceType;
public void index(List<ActionLogMessage> messages) {
LocalDate now = LocalDate.now();
index(messages, now);
}
void index(List<ActionLogMessage> messages, LocalDate now) {
if (messages.size() <= 5) { // use single index in quiet time
for (ActionLogMessage message : messages) {
indexAction(action(message), now);
if (message.traceLog != null) {
indexTrace(trace(message), now);
}
}
} else {
Map<String, ActionDocument> actions = Maps.newHashMapWithExpectedSize(messages.size());
Map<String, TraceDocument> traces = Maps.newHashMap();
for (ActionLogMessage message : messages) {
actions.put(message.id, action(message));
if (message.traceLog != null) {
traces.put(message.id, trace(message));
}
}
indexActions(actions, now);
if (!traces.isEmpty()) {
indexTraces(traces, now);
}
}
}
private void indexAction(ActionDocument action, LocalDate now) {
IndexRequest<ActionDocument> request = new IndexRequest<>();
request.index = IndexName.name("action", now);
request.id = action.id;
request.source = action;
actionType.index(request);
}
private void indexActions(Map<String, ActionDocument> actions, LocalDate now) {
BulkIndexRequest<ActionDocument> request = new BulkIndexRequest<>();
request.index = IndexName.name("action", now);
request.sources = actions;
actionType.bulkIndex(request);
}
private void indexTrace(TraceDocument trace, LocalDate now) {
IndexRequest<TraceDocument> request = new IndexRequest<>();
request.index = IndexName.name("trace", now);
request.id = trace.id;
request.source = trace;
traceType.index(request);
}
private void indexTraces(Map<String, TraceDocument> traces, LocalDate now) {
BulkIndexRequest<TraceDocument> request = new BulkIndexRequest<>();
request.index = IndexName.name("trace", now);
request.sources = traces;
traceType.bulkIndex(request);
}
private TraceDocument trace(ActionLogMessage message) {
TraceDocument traceLog = new TraceDocument();
traceLog.date = message.date;
traceLog.id = message.id;
traceLog.app = message.app;
traceLog.action = message.action;
traceLog.result = message.result;
traceLog.content = message.traceLog;
traceLog.errorCode = message.errorCode;
return traceLog;
}
private ActionDocument action(ActionLogMessage message) {
ActionDocument actionLog = new ActionDocument();
actionLog.date = message.date;
actionLog.app = message.app;
actionLog.serverIP = message.serverIP;
actionLog.id = message.id;
actionLog.result = message.result;
actionLog.refId = message.refId;
actionLog.action = message.action;
actionLog.errorCode = message.errorCode;
actionLog.errorMessage = message.errorMessage;
actionLog.elapsed = message.elapsed;
actionLog.cpuTime = message.cpuTime;
actionLog.context = message.context;
actionLog.stats = message.stats;
actionLog.performanceStats = message.performanceStats;
return actionLog;
}
}