Skip to content

Commit 8894b95

Browse files
committed
Support span name trace attribute filters
1 parent b21e29f commit 8894b95

2 files changed

Lines changed: 46 additions & 1 deletion

File tree

hertzbeat-observability/src/main/java/org/apache/hertzbeat/observability/traces/service/impl/EntityTraceQueryServiceImpl.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1206,7 +1206,24 @@ private boolean matchesSpanAttributeFilters(TraceAggregate trace, ResourceFilter
12061206
return false;
12071207
}
12081208
return trace.spans.stream()
1209-
.anyMatch(span -> matchesFilterMap(span.getSpanAttributes(), attributeFilters));
1209+
.anyMatch(span -> matchesFilterMap(spanAttributeFilterValues(span), attributeFilters));
1210+
}
1211+
1212+
private Map<String, String> spanAttributeFilterValues(TraceSpanNodeDto span) {
1213+
if (span == null) {
1214+
return Collections.emptyMap();
1215+
}
1216+
Map<String, String> values = new LinkedHashMap<>();
1217+
if (!CollectionUtils.isEmpty(span.getSpanAttributes())) {
1218+
values.putAll(span.getSpanAttributes());
1219+
}
1220+
String spanName = trimText(span.getSpanName());
1221+
if (spanName != null) {
1222+
values.putIfAbsent("span.name", spanName);
1223+
values.putIfAbsent("span_name", spanName);
1224+
values.putIfAbsent("spanName", spanName);
1225+
}
1226+
return values;
12101227
}
12111228

12121229
private boolean matchesFilterMap(Map<String, String> values, ResourceFilterSet filters) {

hertzbeat-observability/src/test/java/org/apache/hertzbeat/observability/traces/service/impl/EntityTraceQueryServiceImplTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -848,6 +848,34 @@ void queryTraceListAppliesSpanAttributeFiltersWithRowFallback() {
848848
org.mockito.ArgumentMatchers.anyInt());
849849
}
850850

851+
@Test
852+
void queryTraceListMatchesSyntheticSpanNameAttributeFilters() {
853+
long now = System.currentTimeMillis();
854+
long start = now - 120_000;
855+
long end = now;
856+
when(traceQueryRepository.queryRecentTraceRows(
857+
eq(1500), eq(start), eq(end), eq("checkout-service"), org.mockito.ArgumentMatchers.isNull(),
858+
org.mockito.ArgumentMatchers.isNull(), org.mockito.ArgumentMatchers.isNull(),
859+
org.mockito.ArgumentMatchers.isNull(), org.mockito.ArgumentMatchers.isNull(),
860+
org.mockito.ArgumentMatchers.isNull(), org.mockito.ArgumentMatchers.<Map<String, Set<String>>>any(),
861+
eq(false))).thenReturn(List.of(
862+
traceRow("trace-checkout", "span-root-1", null, "POST /checkout",
863+
"checkout-service", "STATUS_CODE_OK", now - 10_000, 2_000_000L,
864+
Map.of("service.name", "checkout-service")),
865+
traceRow("trace-inventory", "span-root-2", null, "GET /inventory",
866+
"checkout-service", "STATUS_CODE_OK", now - 9_000, 2_000_000L,
867+
Map.of("service.name", "checkout-service"))
868+
));
869+
870+
var page = entityTraceQueryService.queryTraceList(null, start, end, null,
871+
false, "checkout-service", null, null,
872+
null, null, null, null, 0, 20, false, null,
873+
"span.name=\"POST /checkout\"");
874+
875+
assertEquals(1, page.getTotalElements());
876+
assertEquals("trace-checkout", page.getContent().getFirst().getTraceId());
877+
}
878+
851879
@Test
852880
void traceQueriesPreferEntityIdentityOverConflictingRouteContext() {
853881
long now = System.currentTimeMillis();

0 commit comments

Comments
 (0)