Skip to content

Commit d144b9d

Browse files
authored
[feat][backend]: fix span filter logic (#227)
* feat(backend): fix span filter logic * feat(backend): remove unused code
1 parent 803e5b2 commit d144b9d

File tree

2 files changed

+244
-3
lines changed

2 files changed

+244
-3
lines changed

backend/modules/observability/domain/trace/entity/loop_span/filter.go

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,9 @@ func (f *FilterFields) Satisfied(obj FilterObject) bool {
173173
}
174174
}
175175
}
176+
if len(f.FilterFields) == 0 {
177+
hit = true
178+
}
176179
return hit
177180
}
178181

@@ -245,19 +248,36 @@ func (f *FilterField) ValidateField() error {
245248
}
246249

247250
func (f *FilterField) Satisfied(obj FilterObject) bool {
251+
op := QueryAndOrEnumAnd
252+
hit := true
253+
if f.QueryAndOr != nil && *f.QueryAndOr == QueryAndOrEnumOr {
254+
op = QueryAndOrEnumOr
255+
hit = false
256+
}
248257
// 检测是否满足筛选条件
249258
if f.FieldName != "" {
250259
// 不满足field过滤条件
251260
if !f.CheckValue(obj.GetFieldValue(f.FieldName, f.IsSystem)) {
252-
return false
261+
if op == QueryAndOrEnumAnd {
262+
return false
263+
}
264+
} else if op == QueryAndOrEnumOr {
265+
return true
253266
}
254267
}
255268
if f.SubFilter != nil {
256269
if !f.SubFilter.Satisfied(obj) {
257-
return false
270+
if op == QueryAndOrEnumAnd {
271+
return false
272+
}
273+
} else if op == QueryAndOrEnumOr {
274+
return true
258275
}
259276
}
260-
return true
277+
if f.FieldName == "" && f.SubFilter == nil {
278+
hit = true
279+
}
280+
return hit
261281
}
262282

263283
// 当前支持特定类型, 满足可用性和可拓展性

backend/modules/observability/domain/trace/entity/loop_span/filter_test.go

Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1410,6 +1410,227 @@ func TestFilterSpan(t *testing.T) {
14101410
},
14111411
satisfied: false,
14121412
},
1413+
{
1414+
filter: &FilterFields{
1415+
QueryAndOr: ptr.Of(QueryAndOrEnumAnd),
1416+
FilterFields: []*FilterField{
1417+
{
1418+
FieldName: SpanFieldParentID,
1419+
FieldType: FieldTypeString,
1420+
Values: []string{"0", ""},
1421+
QueryType: ptr.Of(QueryTypeEnumIn),
1422+
QueryAndOr: ptr.Of(QueryAndOrEnumOr),
1423+
SubFilter: &FilterFields{
1424+
FilterFields: []*FilterField{
1425+
{
1426+
FieldName: "abc",
1427+
FieldType: FieldTypeBool,
1428+
Values: []string{"true"},
1429+
QueryType: ptr.Of(QueryTypeEnumEq),
1430+
},
1431+
},
1432+
},
1433+
},
1434+
},
1435+
},
1436+
span: &Span{
1437+
ParentID: "0",
1438+
},
1439+
satisfied: true,
1440+
},
1441+
{
1442+
filter: &FilterFields{
1443+
QueryAndOr: ptr.Of(QueryAndOrEnumAnd),
1444+
FilterFields: []*FilterField{
1445+
{
1446+
FieldName: SpanFieldParentID,
1447+
FieldType: FieldTypeString,
1448+
Values: []string{"0", ""},
1449+
QueryType: ptr.Of(QueryTypeEnumIn),
1450+
QueryAndOr: ptr.Of(QueryAndOrEnumOr),
1451+
SubFilter: &FilterFields{
1452+
FilterFields: []*FilterField{
1453+
{
1454+
FieldName: "abc",
1455+
FieldType: FieldTypeBool,
1456+
Values: []string{"true"},
1457+
QueryType: ptr.Of(QueryTypeEnumEq),
1458+
},
1459+
},
1460+
},
1461+
},
1462+
},
1463+
},
1464+
span: &Span{
1465+
ParentID: "",
1466+
},
1467+
satisfied: true,
1468+
},
1469+
{
1470+
filter: &FilterFields{
1471+
QueryAndOr: ptr.Of(QueryAndOrEnumAnd),
1472+
FilterFields: []*FilterField{
1473+
{
1474+
FieldName: SpanFieldParentID,
1475+
FieldType: FieldTypeString,
1476+
Values: []string{"0", ""},
1477+
QueryType: ptr.Of(QueryTypeEnumIn),
1478+
QueryAndOr: ptr.Of(QueryAndOrEnumOr),
1479+
SubFilter: &FilterFields{
1480+
FilterFields: []*FilterField{
1481+
{
1482+
FieldName: "abc",
1483+
FieldType: FieldTypeBool,
1484+
Values: []string{"true"},
1485+
QueryType: ptr.Of(QueryTypeEnumEq),
1486+
},
1487+
},
1488+
},
1489+
},
1490+
},
1491+
},
1492+
span: &Span{
1493+
ParentID: "anc",
1494+
},
1495+
satisfied: false,
1496+
},
1497+
{
1498+
filter: &FilterFields{
1499+
QueryAndOr: ptr.Of(QueryAndOrEnumAnd),
1500+
FilterFields: []*FilterField{
1501+
{
1502+
FieldName: SpanFieldParentID,
1503+
FieldType: FieldTypeString,
1504+
Values: []string{"0", ""},
1505+
QueryType: ptr.Of(QueryTypeEnumIn),
1506+
QueryAndOr: ptr.Of(QueryAndOrEnumOr),
1507+
SubFilter: &FilterFields{
1508+
FilterFields: []*FilterField{
1509+
{
1510+
FieldName: "abc",
1511+
FieldType: FieldTypeBool,
1512+
Values: []string{"true"},
1513+
QueryType: ptr.Of(QueryTypeEnumEq),
1514+
},
1515+
},
1516+
},
1517+
},
1518+
},
1519+
},
1520+
span: &Span{
1521+
ParentID: "cnv",
1522+
TagsBool: map[string]bool{
1523+
"abc": true,
1524+
},
1525+
},
1526+
satisfied: true,
1527+
},
1528+
{
1529+
filter: &FilterFields{
1530+
QueryAndOr: ptr.Of(QueryAndOrEnumOr),
1531+
FilterFields: []*FilterField{
1532+
{
1533+
FieldName: SpanFieldParentID,
1534+
FieldType: FieldTypeString,
1535+
Values: []string{"0"},
1536+
QueryType: ptr.Of(QueryTypeEnumIn),
1537+
QueryAndOr: ptr.Of(QueryAndOrEnumOr),
1538+
SubFilter: &FilterFields{
1539+
FilterFields: []*FilterField{
1540+
{
1541+
FieldName: "abc",
1542+
FieldType: FieldTypeBool,
1543+
Values: []string{"true"},
1544+
QueryType: ptr.Of(QueryTypeEnumEq),
1545+
},
1546+
},
1547+
},
1548+
},
1549+
{
1550+
FieldName: SpanFieldTraceId,
1551+
FieldType: FieldTypeString,
1552+
Values: []string{"123"},
1553+
QueryType: ptr.Of(QueryTypeEnumEq),
1554+
QueryAndOr: ptr.Of(QueryAndOrEnumOr),
1555+
},
1556+
},
1557+
},
1558+
span: &Span{
1559+
TraceID: "123",
1560+
},
1561+
satisfied: true,
1562+
},
1563+
{
1564+
filter: &FilterFields{
1565+
QueryAndOr: ptr.Of(QueryAndOrEnumOr),
1566+
FilterFields: []*FilterField{
1567+
{
1568+
FieldName: SpanFieldParentID,
1569+
FieldType: FieldTypeString,
1570+
Values: []string{"0"},
1571+
QueryType: ptr.Of(QueryTypeEnumIn),
1572+
QueryAndOr: ptr.Of(QueryAndOrEnumOr),
1573+
SubFilter: &FilterFields{
1574+
FilterFields: []*FilterField{
1575+
{
1576+
FieldName: "abc",
1577+
FieldType: FieldTypeBool,
1578+
Values: []string{"true"},
1579+
QueryType: ptr.Of(QueryTypeEnumEq),
1580+
},
1581+
},
1582+
},
1583+
},
1584+
{
1585+
FieldName: SpanFieldTraceId,
1586+
FieldType: FieldTypeString,
1587+
Values: []string{"123"},
1588+
QueryType: ptr.Of(QueryTypeEnumEq),
1589+
QueryAndOr: ptr.Of(QueryAndOrEnumOr),
1590+
},
1591+
},
1592+
},
1593+
span: &Span{
1594+
ParentID: "0",
1595+
},
1596+
satisfied: true,
1597+
},
1598+
{
1599+
filter: &FilterFields{
1600+
QueryAndOr: ptr.Of(QueryAndOrEnumAnd),
1601+
FilterFields: []*FilterField{
1602+
{
1603+
FieldName: SpanFieldParentID,
1604+
FieldType: FieldTypeString,
1605+
Values: []string{"0"},
1606+
QueryType: ptr.Of(QueryTypeEnumIn),
1607+
QueryAndOr: ptr.Of(QueryAndOrEnumOr),
1608+
SubFilter: &FilterFields{
1609+
FilterFields: []*FilterField{
1610+
{
1611+
FieldName: "abc",
1612+
FieldType: FieldTypeBool,
1613+
Values: []string{"true"},
1614+
QueryType: ptr.Of(QueryTypeEnumEq),
1615+
},
1616+
},
1617+
},
1618+
},
1619+
{
1620+
FieldName: SpanFieldTraceId,
1621+
FieldType: FieldTypeString,
1622+
Values: []string{"123"},
1623+
QueryType: ptr.Of(QueryTypeEnumEq),
1624+
QueryAndOr: ptr.Of(QueryAndOrEnumOr),
1625+
},
1626+
},
1627+
},
1628+
span: &Span{
1629+
ParentID: "0",
1630+
TraceID: "123",
1631+
},
1632+
satisfied: true,
1633+
},
14131634
}
14141635
for _, tc := range tests {
14151636
assert.Equal(t, tc.filter.Satisfied(tc.span), tc.satisfied)

0 commit comments

Comments
 (0)