From a77cd71712d1fc98fe66c96530cbc916b6dc53ff Mon Sep 17 00:00:00 2001 From: Martin Disibio Date: Mon, 9 Dec 2024 16:16:57 -0500 Subject: [PATCH 1/2] Exit early on autocomplete noops --- pkg/traceql/engine.go | 8 ++++++++ pkg/traceql/engine_test.go | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/pkg/traceql/engine.go b/pkg/traceql/engine.go index 18107711482..26ac6e30486 100644 --- a/pkg/traceql/engine.go +++ b/pkg/traceql/engine.go @@ -177,6 +177,14 @@ func (e *Engine) ExecuteTagValues( span.SetAttributes(attribute.String("pipeline", rootExpr.Pipeline.String())) span.SetAttributes(attribute.String("autocompleteReq", fmt.Sprint(autocompleteReq))) + // If the tag we are fetching is already filtered in the query, then this is a noop. + // I.e. we are autocompleting resource.service.name and the query was {resource.service.name="foo"} + for _, c := range autocompleteReq.Conditions { + if c.Attribute == tag && c.Op == OpEqual { + return nil + } + } + return fetcher.Fetch(ctx, autocompleteReq, cb) } diff --git a/pkg/traceql/engine_test.go b/pkg/traceql/engine_test.go index a578d2451e0..11f0e8d4573 100644 --- a/pkg/traceql/engine_test.go +++ b/pkg/traceql/engine_test.go @@ -666,6 +666,12 @@ func TestExecuteTagValues(t *testing.T) { {Type: "string", Value: "redis call"}, }, }, + { + name: "noop", // autocompleting an attribute already filtered by the query + attribute: "name", + query: `{ name = "foo" }`, + expectedValues: []tempopb.TagValue{}, + }, } { t.Run(tc.name, func(t *testing.T) { distinctValues := collector.NewDistinctValue[tempopb.TagValue](100_000, 0, 0, func(v tempopb.TagValue) int { return len(v.Type) + len(v.Value) }) From 793f1a59d284f8c2422c541cfac9631316876b0b Mon Sep 17 00:00:00 2001 From: Martin Disibio Date: Tue, 10 Dec 2024 11:31:11 -0500 Subject: [PATCH 2/2] review feedback, cleanup old comment --- pkg/traceql/engine.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/pkg/traceql/engine.go b/pkg/traceql/engine.go index 26ac6e30486..4120bf3c607 100644 --- a/pkg/traceql/engine.go +++ b/pkg/traceql/engine.go @@ -238,12 +238,6 @@ func (e *Engine) createAutocompleteRequest(tag Attribute, pipeline Pipeline) Fet pipeline.extractConditions(&req) - // TODO: remove other conditions for the wantAttr we're searching for - // for _, cond := range fetchSpansRequest.Conditions { - // if cond.Attribute == wantAttr { - // return fmt.Errorf("cannot search for tag values for tag that is already used in query") - // } - // } req.Conditions = append(req.Conditions, Condition{ Attribute: tag, Op: OpNone,