Skip to content

Commit eb73b7e

Browse files
committed
Disallow multiple origin nodes.
1 parent 0bc8f9d commit eb73b7e

File tree

4 files changed

+41
-8
lines changed

4 files changed

+41
-8
lines changed

pkg/ast/ast.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ var (
2525
ErrRootNodeWithoutEventSrc = errors.New("root node has no event source")
2626
ErrInvalidWindow = errors.New("invalid window")
2727
ErrMissingOrigin = errors.New("missing origin event")
28+
ErrMultipleOrigin = errors.New("multiple origin events")
2829
ErrInvalidAnchor = errors.New("invalid negate anchor")
2930
ErrNoTermIdx = errors.New("no term idx")
3031
)
@@ -87,14 +88,14 @@ type AstEventT struct {
8788
type builderT struct {
8889
CurrentNodeId uint32
8990
CurrentDepth uint32
90-
HasOrigin bool
91+
OriginCnt int
9192
}
9293

9394
func NewBuilder() *builderT {
9495
return &builderT{
9596
CurrentNodeId: uint32(0),
9697
CurrentDepth: uint32(0),
97-
HasOrigin: false,
98+
OriginCnt: 0,
9899
}
99100
}
100101

@@ -140,8 +141,11 @@ func BuildTree(tree *parser.TreeT) (*AstT, error) {
140141
return nil, err
141142
}
142143

143-
if !rb.HasOrigin {
144+
switch {
145+
case rb.OriginCnt == 0:
144146
return nil, parserNode.WrapError(ErrMissingOrigin)
147+
case rb.OriginCnt > 1:
148+
return nil, parserNode.WrapError(ErrMultipleOrigin)
145149
}
146150

147151
ast.Nodes = append(ast.Nodes, rule)
@@ -235,7 +239,7 @@ func (b *builderT) buildMatcherChildren(parserNode *parser.NodeT, machineAddress
235239
}
236240

237241
// Implied that the root node has an origin event
238-
b.HasOrigin = true
242+
b.OriginCnt++
239243
parserNode.Metadata.Event.Origin = true
240244

241245
err = b.descendTree(func() error {
@@ -316,7 +320,7 @@ func (b *builderT) buildMachineChildren(parserNode *parser.NodeT, machineAddress
316320
// If the child has an event/data source, then it is not a state machine. Build it via buildMatcherNodes
317321

318322
if parserChildNode.Metadata.Event.Origin {
319-
b.HasOrigin = true
323+
b.OriginCnt++
320324
}
321325

322326
if parserChildNode.Metadata.Event.Source == "" {

pkg/ast/ast_metrics.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,6 @@ func (b *builderT) buildPromQLNode(parserNode *parser.NodeT, machineAddress *Ast
4141
}
4242

4343
if parserNode.Metadata.Event != nil {
44-
if parserNode.Metadata.Event.Origin {
45-
b.HasOrigin = true
46-
}
4744
pn.Event = &AstEventT{
4845
Source: parserNode.Metadata.Event.Source,
4946
Origin: parserNode.Metadata.Event.Origin,

pkg/ast/ast_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,12 @@ func TestAstFail(t *testing.T) {
185185
line: 11,
186186
col: 9,
187187
},
188+
"Fail_MultipleOrigin": {
189+
rule: testdata.TestFailMultipleOrigin,
190+
err: ErrMultipleOrigin,
191+
line: 11,
192+
col: 17,
193+
},
188194
}
189195

190196
for name, test := range tests {

pkg/testdata/rules.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1106,3 +1106,29 @@ rules:
11061106
match:
11071107
- regex: "io.vertx.core.VertxException: Thread blocked"
11081108
`
1109+
1110+
var TestFailMultipleOrigin = `
1111+
rules:
1112+
- cre:
1113+
id: TestFailMultipleOrigin
1114+
metadata:
1115+
id: "J7uRQTGpGMyL1iFpssnB3S"
1116+
hash: "rdJLgqYgkEp8jg8Qks1qqq"
1117+
generation: 1
1118+
rule:
1119+
set:
1120+
window: 50s
1121+
match:
1122+
- promql:
1123+
event:
1124+
source: cre.metrics
1125+
origin: true
1126+
expr: 'sum(rate(http_requests_total[5m])) by (service)'
1127+
interval: 10s
1128+
- set:
1129+
event:
1130+
source: kafka
1131+
origin: true
1132+
match:
1133+
- regex: "io.vertx.core.VertxException: Thread blocked"
1134+
`

0 commit comments

Comments
 (0)