in oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/TraceQueryEsDAO.java [68:179]
public TraceBrief queryBasicTraces(Duration duration,
long minDuration,
long maxDuration,
String serviceId,
String serviceInstanceId,
String endpointId,
String traceId,
int limit,
int from,
TraceState traceState,
QueryOrder queryOrder,
final List<Tag> tags) throws IOException {
long startSecondTB = 0;
long endSecondTB = 0;
if (nonNull(duration)) {
startSecondTB = duration.getStartTimeBucketInSec();
endSecondTB = duration.getEndTimeBucketInSec();
}
final BoolQueryBuilder query = Query.bool();
if (IndexController.LogicIndicesRegister.isMergedTable(SegmentRecord.INDEX_NAME)) {
query.must(Query.term(IndexController.LogicIndicesRegister.RECORD_TABLE_NAME, SegmentRecord.INDEX_NAME));
}
if (startSecondTB != 0 && endSecondTB != 0) {
query.must(Query.range(SegmentRecord.TIME_BUCKET).gte(startSecondTB).lte(endSecondTB));
}
if (minDuration != 0 || maxDuration != 0) {
RangeQueryBuilder rangeQueryBuilder = Query.range(SegmentRecord.LATENCY);
if (minDuration != 0) {
rangeQueryBuilder.gte(minDuration);
}
if (maxDuration != 0) {
rangeQueryBuilder.lte(maxDuration);
}
query.must(rangeQueryBuilder);
}
if (StringUtil.isNotEmpty(serviceId)) {
query.must(Query.term(SegmentRecord.SERVICE_ID, serviceId));
}
if (StringUtil.isNotEmpty(serviceInstanceId)) {
query.must(Query.term(SegmentRecord.SERVICE_INSTANCE_ID, serviceInstanceId));
}
if (!Strings.isNullOrEmpty(endpointId)) {
query.must(Query.term(SegmentRecord.ENDPOINT_ID, endpointId));
}
if (!Strings.isNullOrEmpty(traceId)) {
query.must(Query.term(SegmentRecord.TRACE_ID, traceId));
}
switch (traceState) {
case ERROR:
query.must(Query.match(SegmentRecord.IS_ERROR, BooleanUtils.TRUE));
break;
case SUCCESS:
query.must(Query.match(SegmentRecord.IS_ERROR, BooleanUtils.FALSE));
break;
}
final SearchBuilder search =
Search.builder()
.query(query)
.source(SegmentRecord.TRACE_ID)
.source(SegmentRecord.SEGMENT_ID)
.source(SegmentRecord.ENDPOINT_ID)
.source(SegmentRecord.START_TIME)
.source(SegmentRecord.LATENCY)
.source(SegmentRecord.IS_ERROR);
switch (queryOrder) {
case BY_START_TIME:
search.sort(SegmentRecord.START_TIME, Sort.Order.DESC);
break;
case BY_DURATION:
search.sort(SegmentRecord.LATENCY, Sort.Order.DESC);
break;
}
if (CollectionUtils.isNotEmpty(tags)) {
BoolQueryBuilder tagMatchQuery = Query.bool();
tags.forEach(tag -> tagMatchQuery.must(Query.term(SegmentRecord.TAGS, tag.toString())));
query.must(tagMatchQuery);
}
search.size(limit).from(from);
final SearchResponse response = searchDebuggable(
new TimeRangeIndexNameGenerator(
IndexController.LogicIndicesRegister.getPhysicalTableName(SegmentRecord.INDEX_NAME),
startSecondTB,
endSecondTB
), search.build());
final TraceBrief traceBrief = new TraceBrief();
for (SearchHit searchHit : response.getHits().getHits()) {
BasicTrace basicTrace = new BasicTrace();
basicTrace.setSegmentId((String) searchHit.getSource().get(SegmentRecord.SEGMENT_ID));
basicTrace.setStart(String.valueOf(searchHit.getSource().get(SegmentRecord.START_TIME)));
basicTrace.getEndpointNames().add(
IDManager.EndpointID.analysisId(
(String) searchHit.getSource().get(SegmentRecord.ENDPOINT_ID)
).getEndpointName());
basicTrace.setDuration(((Number) searchHit.getSource().get(SegmentRecord.LATENCY)).intValue());
basicTrace.setError(
BooleanUtils.valueToBoolean(
((Number) searchHit.getSource().get(SegmentRecord.IS_ERROR)).intValue()
)
);
basicTrace.getTraceIds().add((String) searchHit.getSource().get(SegmentRecord.TRACE_ID));
traceBrief.getTraces().add(basicTrace);
}
return traceBrief;
}