Skip to content

Commit

Permalink
[Fix] OR statements not being evaluated as part of nested line filters (
Browse files Browse the repository at this point in the history
grafana#11735)

**What this PR does / why we need it**:
When nester line filters were being evaluated, the `OR` statements in
right expressions were omitted and only `LineFilters` were returned.
Resulting in only first value being returned.
It can be reproduced in stringer unit test failing with, 
```
Error Trace:	/Users/poyzannur/workspace/loki/pkg/logql/syntax/ast_test.go:535
        	Error:      	Not equal: 
        	            	expected: "{app=\"foo\"} |= \"foo\" or \"bar\" |= \"baz\" or \"bal\""
        	            	actual  : "{app=\"foo\"} |= \"foo\" or \"bar\" |= \"baz\""
```

We now return the `OR` expression as part of nested line filters. Thanks
a million to @ashwanthgoli for help with debugging, and extra unit test.

**Which issue(s) this PR fixes**:
Fixes https://github.com/grafana/support-escalations/issues/9042

**Special notes for your reviewer**:

**Checklist**
- [x] Reviewed the
[`CONTRIBUTING.md`](https://github.com/grafana/loki/blob/main/CONTRIBUTING.md)
guide (**required**)
- [ ] Documentation added
- [x] Tests updated
- [ ] `CHANGELOG.md` updated
- [ ] If the change is worth mentioning in the release notes, add
`add-to-release-notes` label
- [ ] Changes that require user attention or interaction to upgrade are
documented in `docs/sources/setup/upgrade/_index.md`
- [ ] For Helm chart changes bump the Helm chart version in
`production/helm/loki/Chart.yaml` and update
`production/helm/loki/CHANGELOG.md` and
`production/helm/loki/README.md`. [Example
PR](grafana@d10549e)
- [ ] If the change is deprecating or removing a configuration option,
update the `deprecated-config.yaml` and `deleted-config.yaml` files
respectively in the `tools/deprecated-config-checker` directory.
[Example
PR](grafana@0d4416a)
  • Loading branch information
poyzannur authored and Gordejj committed Jan 29, 2024
1 parent 1abe640 commit f762220
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 0 deletions.
2 changes: 2 additions & 0 deletions pkg/logql/syntax/ast.go
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,8 @@ func newNestedLineFilterExpr(left *LineFilterExpr, right *LineFilterExpr) *LineF
return &LineFilterExpr{
Left: left,
LineFilter: right.LineFilter,
Or: right.Or,
IsOrChild: right.IsOrChild,
}
}

Expand Down
15 changes: 15 additions & 0 deletions pkg/logql/syntax/ast_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,13 @@ func Test_FilterMatcher(t *testing.T) {
},
[]linecheck{{"foo", true}, {"bar", true}, {"none", false}},
},
{
`{app="foo"} |= "foo" or "bar" |= "buzz" or "fizz"`,
[]*labels.Matcher{
mustNewMatcher(labels.MatchEqual, "app", "foo"),
},
[]linecheck{{"foo buzz", true}, {"bar fizz", true}, {"foo", false}, {"bar", false}, {"none", false}},
},
{
`{app="foo"} != "foo" or "bar"`,
[]*labels.Matcher{
Expand Down Expand Up @@ -496,6 +503,14 @@ func TestStringer(t *testing.T) {
in: `{app="foo"} |~ "foo" or "bar" or "baz"`,
out: `{app="foo"} |~ "foo" or "bar" or "baz"`,
},
{
in: `{app="foo"} |= "foo" or "bar" |= "buzz" or "fizz"`,
out: `{app="foo"} |= "foo" or "bar" |= "buzz" or "fizz"`,
},
{
out: `{app="foo"} |= "foo" or "bar" |~ "buzz|fizz"`,
in: `{app="foo"} |= "foo" or "bar" |~ "buzz|fizz"`,
},
{
in: `{app="foo"} |= ip("127.0.0.1") or "foo"`,
out: `{app="foo"} |= ip("127.0.0.1") or "foo"`,
Expand Down
35 changes: 35 additions & 0 deletions pkg/logql/syntax/parser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3138,6 +3138,41 @@ var ParseTestCases = []struct {
},
},
},
{
in: `{app="foo"} |= "foo" or "bar" |= "buzz" or "fizz"`,
exp: &PipelineExpr{
Left: newMatcherExpr([]*labels.Matcher{mustNewMatcher(labels.MatchEqual, "app", "foo")}),
MultiStages: MultiStageExpr{
&LineFilterExpr{
Left: newOrLineFilter(
&LineFilterExpr{
LineFilter: LineFilter{
Ty: labels.MatchEqual,
Match: "foo",
},
},
&LineFilterExpr{
LineFilter: LineFilter{
Ty: labels.MatchEqual,
Match: "bar",
},
}),
LineFilter: LineFilter{
Ty: labels.MatchEqual,
Match: "buzz",
},
Or: &LineFilterExpr{
LineFilter: LineFilter{
Ty: labels.MatchEqual,
Match: "fizz",
},
IsOrChild: true,
},
IsOrChild: false,
},
},
},
},
}

func TestParse(t *testing.T) {
Expand Down

0 comments on commit f762220

Please sign in to comment.