Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[query] Enable trace adjusters in api_v2 and api_v3 handlers #6423

Merged
merged 28 commits into from
Dec 29, 2024
Merged
Show file tree
Hide file tree
Changes from 26 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
7efc6c5
Add RawTraces To Query Parameters
mahadzaryab1 Dec 27, 2024
1b00ffd
Propagate RawTraces Flag
mahadzaryab1 Dec 27, 2024
4fa576e
Update Query Service To Adjust Traces
mahadzaryab1 Dec 27, 2024
bfbaa8b
Make Adjust Function Private
mahadzaryab1 Dec 27, 2024
9b278b3
Update HTTP Handler To Propagate Flag
mahadzaryab1 Dec 27, 2024
5d732f7
Add Raw Traces To Query Parameter
mahadzaryab1 Dec 27, 2024
7de00b4
Fix Linting
mahadzaryab1 Dec 27, 2024
3ec9ded
Merge branch 'main' into query-service-adjust
mahadzaryab1 Dec 27, 2024
f1b111c
Fix Failing Unit Test
mahadzaryab1 Dec 27, 2024
59709d4
Merge branch 'main' into query-service-adjust
mahadzaryab1 Dec 27, 2024
f189b90
Fix Failures After Merge
mahadzaryab1 Dec 27, 2024
1dab334
Fix Tests
mahadzaryab1 Dec 27, 2024
2886f9f
Fix Tests
mahadzaryab1 Dec 27, 2024
65c7d77
Fix Failing Tests
mahadzaryab1 Dec 28, 2024
6d172be
Minimize Changes
mahadzaryab1 Dec 28, 2024
a23b51d
Merge branch 'main' into query-service-adjust
mahadzaryab1 Dec 29, 2024
2362c56
Fix Error From Merge
mahadzaryab1 Dec 29, 2024
c4176c0
Remove Unused Function
mahadzaryab1 Dec 29, 2024
ab7f9fb
Add Test To Query Service For Find Traces With Raw
mahadzaryab1 Dec 29, 2024
b4f3fdd
Remove RawTraces Flags From Storage Interface
mahadzaryab1 Dec 29, 2024
dc9f3db
Fix Tests
mahadzaryab1 Dec 29, 2024
8bd77da
Remove Debug Statement
mahadzaryab1 Dec 29, 2024
bb14dda
Fix Test
mahadzaryab1 Dec 29, 2024
3841808
Add Test To Query Service For Get Trace With Raw
mahadzaryab1 Dec 29, 2024
427f7d4
Fix Lint
mahadzaryab1 Dec 29, 2024
e540463
Revert http_handler_test.go
mahadzaryab1 Dec 29, 2024
9e2452e
Add Error Handling To FindTraces
mahadzaryab1 Dec 29, 2024
8c7124e
Add Test For Missing Code Coverage
mahadzaryab1 Dec 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cmd/query/app/apiv3/gateway_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ func makeTestTrace() (*model.Trace, spanstore.GetTraceParameters) {
model.SpanKindTag(model.SpanKindServer),
model.Bool("error", true),
},
Process: &model.Process{},
},
},
}, query
Expand Down
5 changes: 5 additions & 0 deletions cmd/query/app/apiv3/grpc_handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ func TestGetTrace(t *testing.T) {
&model.Trace{
Spans: []*model.Span{
{
Process: &model.Process{},
OperationName: "foobar",
},
},
Expand Down Expand Up @@ -172,6 +173,7 @@ func TestFindTraces(t *testing.T) {
{
Spans: []*model.Span{
{
Process: &model.Process{},
OperationName: "name",
},
},
Expand Down Expand Up @@ -204,6 +206,9 @@ func TestFindTracesSendError(t *testing.T) {
{
Spans: []*model.Span{
{
Process: &model.Process{
ServiceName: "myservice",
},
OperationName: "name",
},
},
Expand Down
24 changes: 5 additions & 19 deletions cmd/query/app/http_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ func (aH *APIHandler) transformOTLP(w http.ResponseWriter, r *http.Request) {
}

var uiErrors []structuredError
structuredRes := aH.tracesToResponse(traces, false, uiErrors)
structuredRes := aH.tracesToResponse(traces, uiErrors)
aH.writeJSON(w, r, structuredRes)
}

Expand Down Expand Up @@ -245,14 +245,14 @@ func (aH *APIHandler) search(w http.ResponseWriter, r *http.Request) {
}
}

structuredRes := aH.tracesToResponse(tracesFromStorage, true, uiErrors)
structuredRes := aH.tracesToResponse(tracesFromStorage, uiErrors)
aH.writeJSON(w, r, structuredRes)
}

func (aH *APIHandler) tracesToResponse(traces []*model.Trace, adjust bool, uiErrors []structuredError) *structuredResponse {
func (*APIHandler) tracesToResponse(traces []*model.Trace, uiErrors []structuredError) *structuredResponse {
uiTraces := make([]*ui.Trace, len(traces))
for i, v := range traces {
uiTrace := aH.convertModelToUI(v, adjust)
uiTrace := uiconv.FromDomain(v)
uiTraces[i] = uiTrace
}

Expand Down Expand Up @@ -362,14 +362,6 @@ func (aH *APIHandler) metrics(w http.ResponseWriter, r *http.Request, getMetrics
aH.writeJSON(w, r, m)
}

func (aH *APIHandler) convertModelToUI(trc *model.Trace, adjust bool) *ui.Trace {
if adjust {
aH.queryService.Adjust(trc)
}
uiTrace := uiconv.FromDomain(trc)
return uiTrace
}

func (*APIHandler) deduplicateDependencies(dependencies []model.DependencyLink) []ui.DependencyLink {
type Key struct {
parent string
Expand Down Expand Up @@ -483,16 +475,10 @@ func (aH *APIHandler) getTrace(w http.ResponseWriter, r *http.Request) {
}

var uiErrors []structuredError
structuredRes := aH.tracesToResponse([]*model.Trace{trc}, shouldAdjust(r), uiErrors)
structuredRes := aH.tracesToResponse([]*model.Trace{trc}, uiErrors)
aH.writeJSON(w, r, structuredRes)
}

func shouldAdjust(r *http.Request) bool {
raw := r.FormValue("raw")
isRaw, _ := strconv.ParseBool(raw)
return !isRaw
}

// archiveTrace implements the REST API POST:/archive/{trace-id}.
// It passes the traceID to queryService.ArchiveTrace for writing.
func (aH *APIHandler) archiveTrace(w http.ResponseWriter, r *http.Request) {
Expand Down
18 changes: 15 additions & 3 deletions cmd/query/app/querysvc/query_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,13 @@ func (qs QueryService) GetTrace(ctx context.Context, query GetTraceParameters) (
}
trace, err = qs.options.ArchiveSpanReader.GetTrace(ctx, query.GetTraceParameters)
}
return trace, err
if err != nil {
return nil, err
}
if !query.RawTraces {
qs.adjust(trace)
}
return trace, nil
}

// GetServices is the queryService implementation of spanstore.Reader.GetServices
Expand Down Expand Up @@ -116,7 +122,13 @@ func (qs QueryService) FindTraces(ctx context.Context, query *TraceQueryParamete
if err != nil {
return nil, err
}
return spanReader.FindTraces(ctx, &query.TraceQueryParameters)
traces, err := spanReader.FindTraces(ctx, &query.TraceQueryParameters)
if !query.RawTraces {
for _, trace := range traces {
qs.adjust(trace)
}
}
return traces, err
}

// ArchiveTrace is the queryService utility to archive traces.
Expand All @@ -140,7 +152,7 @@ func (qs QueryService) ArchiveTrace(ctx context.Context, query spanstore.GetTrac
}

// Adjust applies adjusters to the trace.
func (qs QueryService) Adjust(trace *model.Trace) {
func (qs QueryService) adjust(trace *model.Trace) {
qs.options.Adjuster.Adjust(trace)
}

Expand Down
123 changes: 123 additions & 0 deletions cmd/query/app/querysvc/query_service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package querysvc
import (
"context"
"errors"
"fmt"
"testing"
"time"

Expand Down Expand Up @@ -115,6 +116,68 @@ func TestGetTraceSuccess(t *testing.T) {
assert.Equal(t, res, mockTrace)
}

func TestGetTraceWithRawTraces(t *testing.T) {
mahadzaryab1 marked this conversation as resolved.
Show resolved Hide resolved
traceID := model.NewTraceID(0, 1)
tests := []struct {
rawTraces bool
tags model.KeyValues
expected model.KeyValues
}{
{
// tags should not get sorted by SortTagsAndLogFields adjuster
rawTraces: true,
tags: model.KeyValues{
model.String("z", "key"),
model.String("a", "key"),
},
expected: model.KeyValues{
model.String("z", "key"),
model.String("a", "key"),
},
},
{
// tags should get sorted by SortTagsAndLogFields adjuster
rawTraces: false,
tags: model.KeyValues{
model.String("z", "key"),
model.String("a", "key"),
},
expected: model.KeyValues{
model.String("a", "key"),
model.String("z", "key"),
},
},
}
for _, test := range tests {
t.Run(fmt.Sprintf("rawTraces=%v", test.rawTraces), func(t *testing.T) {
trace := &model.Trace{
Spans: []*model.Span{
{
TraceID: traceID,
SpanID: model.NewSpanID(1),
Process: &model.Process{},
Tags: test.tags,
},
},
}
tqs := initializeTestService()
tqs.spanReader.On("GetTrace", mock.Anything, mock.AnythingOfType("spanstore.GetTraceParameters")).
Return(trace, nil).Once()
query := GetTraceParameters{
GetTraceParameters: spanstore.GetTraceParameters{
TraceID: mockTraceID,
},
RawTraces: test.rawTraces,
}
gotTrace, err := tqs.queryService.GetTrace(context.Background(), query)
require.NoError(t, err)
spans := gotTrace.Spans
require.Len(t, spans, 1)
require.EqualValues(t, test.expected, spans[0].Tags)
})
}
}

// Test QueryService.GetTrace() without ArchiveSpanReader
func TestGetTraceNotFound(t *testing.T) {
tqs := initializeTestService()
Expand Down Expand Up @@ -239,6 +302,66 @@ func TestFindTraces(t *testing.T) {
assert.Len(t, traces, 1)
}

func TestFindTracesWithRawTraces(t *testing.T) {
traceID := model.NewTraceID(0, 1)
tests := []struct {
rawTraces bool
tags model.KeyValues
expected model.KeyValues
}{
{
// tags should not get sorted by SortTagsAndLogFields adjuster
rawTraces: true,
tags: model.KeyValues{
model.String("z", "key"),
model.String("a", "key"),
},
expected: model.KeyValues{
model.String("z", "key"),
model.String("a", "key"),
},
},
{
// tags should get sorted by SortTagsAndLogFields adjuster
rawTraces: false,
tags: model.KeyValues{
model.String("z", "key"),
model.String("a", "key"),
},
expected: model.KeyValues{
model.String("a", "key"),
model.String("z", "key"),
},
},
}
for _, test := range tests {
t.Run(fmt.Sprintf("rawTraces=%v", test.rawTraces), func(t *testing.T) {
trace := &model.Trace{
Spans: []*model.Span{
{
TraceID: traceID,
SpanID: model.NewSpanID(1),
Process: &model.Process{},
Tags: test.tags,
},
},
}
tqs := initializeTestService()
tqs.spanReader.On("FindTraces", mock.Anything, mock.AnythingOfType("*spanstore.TraceQueryParameters")).
Return([]*model.Trace{trace}, nil).Once()
params := &TraceQueryParameters{
RawTraces: test.rawTraces,
}
traces, err := tqs.queryService.FindTraces(context.Background(), params)
require.NoError(t, err)
require.Len(t, traces, 1)
spans := traces[0].Spans
require.Len(t, spans, 1)
require.EqualValues(t, test.expected, spans[0].Tags)
})
}
}

func TestFindTraces_V1ReaderNotFound(t *testing.T) {
fr := new(tracestoremocks.Reader)
qs := QueryService{
Expand Down
Loading