in oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBTraceQueryDAO.java [79:168]
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, List<Tag> tags) throws IOException {
final boolean isColdStage = duration != null && duration.isColdStage();
final QueryBuilder<StreamQuery> q = new QueryBuilder<StreamQuery>() {
@Override
public void apply(StreamQuery query) {
if (minDuration != 0) {
// duration >= minDuration
query.and(gte(SegmentRecord.LATENCY, minDuration));
}
if (maxDuration != 0) {
// duration <= maxDuration
query.and(lte(SegmentRecord.LATENCY, maxDuration));
}
if (StringUtil.isNotEmpty(serviceId)) {
query.and(eq(SegmentRecord.SERVICE_ID, serviceId));
}
if (StringUtil.isNotEmpty(serviceInstanceId)) {
query.and(eq(SegmentRecord.SERVICE_INSTANCE_ID, serviceInstanceId));
}
if (StringUtil.isNotEmpty(endpointId)) {
query.and(eq(SegmentRecord.ENDPOINT_ID, endpointId));
}
if (!Strings.isNullOrEmpty(traceId)) {
query.and(eq(SegmentRecord.TRACE_ID, traceId));
}
switch (traceState) {
case ERROR:
query.and(eq(SegmentRecord.IS_ERROR, BooleanUtils.TRUE));
break;
case SUCCESS:
query.and(eq(SegmentRecord.IS_ERROR, BooleanUtils.FALSE));
break;
}
switch (queryOrder) {
case BY_START_TIME:
query.setOrderBy(new StreamQuery.OrderBy(AbstractQuery.Sort.DESC));
break;
case BY_DURATION:
query.setOrderBy(new StreamQuery.OrderBy(SegmentRecord.LATENCY, AbstractQuery.Sort.DESC));
break;
}
if (CollectionUtils.isNotEmpty(tags)) {
List<String> tagsConditions = new ArrayList<>(tags.size());
for (final Tag tag : tags) {
tagsConditions.add(tag.toString());
}
query.and(having(SegmentRecord.TAGS, tagsConditions));
}
query.setLimit(limit);
query.setOffset(from);
}
};
StreamQueryResponse resp = queryDebuggable(isColdStage, SegmentRecord.INDEX_NAME,
BASIC_TAGS,
getTimestampRange(duration), q);
TraceBrief traceBrief = new TraceBrief();
if (resp.size() == 0) {
return traceBrief;
}
for (final Element row : resp.getElements()) {
BasicTrace basicTrace = new BasicTrace();
basicTrace.setSegmentId(row.getId());
basicTrace.setStart(String.valueOf((Number) row.getTagValue(SegmentRecord.START_TIME)));
basicTrace.getEndpointNames().add(IDManager.EndpointID.analysisId(
row.getTagValue(SegmentRecord.ENDPOINT_ID)
).getEndpointName());
basicTrace.setDuration(((Number) row.getTagValue(SegmentRecord.LATENCY)).intValue());
basicTrace.setError(BooleanUtils.valueToBoolean(
((Number) row.getTagValue(SegmentRecord.IS_ERROR)).intValue()
));
basicTrace.getTraceIds().add(row.getTagValue(SegmentRecord.TRACE_ID));
traceBrief.getTraces().add(basicTrace);
}
return traceBrief;
}