From 1a972eb37053683c59acfc192c6bd25ebd8112be Mon Sep 17 00:00:00 2001 From: Mahad Zaryab Date: Sun, 23 Feb 2025 11:47:50 -0500 Subject: [PATCH 1/9] Create New FindTraceIDsResponse Signed-off-by: Mahad Zaryab --- internal/storage/v2/api/tracestore/reader.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/internal/storage/v2/api/tracestore/reader.go b/internal/storage/v2/api/tracestore/reader.go index 83b5f073865..88351ca2a0f 100644 --- a/internal/storage/v2/api/tracestore/reader.go +++ b/internal/storage/v2/api/tracestore/reader.go @@ -61,7 +61,7 @@ type Reader interface { // of matching trace IDs. This is useful in some contexts, such as batch jobs, where a // large list of trace IDs may be queried first and then the full traces are loaded // in batches. - FindTraceIDs(ctx context.Context, query TraceQueryParams) iter.Seq2[[]pcommon.TraceID, error] + FindTraceIDs(ctx context.Context, query TraceQueryParams) iter.Seq2[FindTraceIDsResponse, error] } // GetTraceParams contains single-trace parameters for a GetTraces request. @@ -88,6 +88,12 @@ type TraceQueryParams struct { NumTraces int } +type FindTraceIDsResponse struct { + TraceIDs []pcommon.TraceID + Start time.Time + End time.Time +} + func (t *TraceQueryParams) ToSpanStoreQueryParameters() *spanstore.TraceQueryParameters { return &spanstore.TraceQueryParameters{ ServiceName: t.ServiceName, From b7309912df76549ba33196dc1cbec983a1dedfa4 Mon Sep 17 00:00:00 2001 From: Mahad Zaryab Date: Sun, 23 Feb 2025 11:47:58 -0500 Subject: [PATCH 2/9] Generate Mocks Signed-off-by: Mahad Zaryab --- internal/storage/v2/api/tracestore/mocks/Reader.go | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/internal/storage/v2/api/tracestore/mocks/Reader.go b/internal/storage/v2/api/tracestore/mocks/Reader.go index f4ea5052e1d..d9b88a57313 100644 --- a/internal/storage/v2/api/tracestore/mocks/Reader.go +++ b/internal/storage/v2/api/tracestore/mocks/Reader.go @@ -13,8 +13,6 @@ import ( mock "github.com/stretchr/testify/mock" - pcommon "go.opentelemetry.io/collector/pdata/pcommon" - ptrace "go.opentelemetry.io/collector/pdata/ptrace" tracestore "github.com/jaegertracing/jaeger/internal/storage/v2/api/tracestore" @@ -26,19 +24,19 @@ type Reader struct { } // FindTraceIDs provides a mock function with given fields: ctx, query -func (_m *Reader) FindTraceIDs(ctx context.Context, query tracestore.TraceQueryParams) iter.Seq2[[]pcommon.TraceID, error] { +func (_m *Reader) FindTraceIDs(ctx context.Context, query tracestore.TraceQueryParams) iter.Seq2[tracestore.FindTraceIDsResponse, error] { ret := _m.Called(ctx, query) if len(ret) == 0 { panic("no return value specified for FindTraceIDs") } - var r0 iter.Seq2[[]pcommon.TraceID, error] - if rf, ok := ret.Get(0).(func(context.Context, tracestore.TraceQueryParams) iter.Seq2[[]pcommon.TraceID, error]); ok { + var r0 iter.Seq2[tracestore.FindTraceIDsResponse, error] + if rf, ok := ret.Get(0).(func(context.Context, tracestore.TraceQueryParams) iter.Seq2[tracestore.FindTraceIDsResponse, error]); ok { r0 = rf(ctx, query) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(iter.Seq2[[]pcommon.TraceID, error]) + r0 = ret.Get(0).(iter.Seq2[tracestore.FindTraceIDsResponse, error]) } } From 049231bd9d5a5cd9d8befb684771d2d22c15d322 Mon Sep 17 00:00:00 2001 From: Mahad Zaryab Date: Sun, 23 Feb 2025 11:53:52 -0500 Subject: [PATCH 3/9] Fix Usages Signed-off-by: Mahad Zaryab --- .../internal/integration/trace_reader.go | 3 +-- internal/storage/v2/v1adapter/tracereader.go | 12 ++++++---- .../storage/v2/v1adapter/tracereader_test.go | 2 +- internal/storage/v2/v1adapter/translator.go | 7 +++--- .../storage/v2/v1adapter/translator_test.go | 23 +++++++++++-------- 5 files changed, 28 insertions(+), 19 deletions(-) diff --git a/cmd/jaeger/internal/integration/trace_reader.go b/cmd/jaeger/internal/integration/trace_reader.go index bfbb3c50709..f0b7399812d 100644 --- a/cmd/jaeger/internal/integration/trace_reader.go +++ b/cmd/jaeger/internal/integration/trace_reader.go @@ -12,7 +12,6 @@ import ( "math" "strings" - "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" "go.uber.org/zap" "google.golang.org/grpc" @@ -138,7 +137,7 @@ func (r *traceReader) FindTraces( func (*traceReader) FindTraceIDs( _ context.Context, _ tracestore.TraceQueryParams, -) iter.Seq2[[]pcommon.TraceID, error] { +) iter.Seq2[tracestore.FindTraceIDsResponse, error] { panic("not implemented") } diff --git a/internal/storage/v2/v1adapter/tracereader.go b/internal/storage/v2/v1adapter/tracereader.go index 59256e3eff3..3491385e81c 100644 --- a/internal/storage/v2/v1adapter/tracereader.go +++ b/internal/storage/v2/v1adapter/tracereader.go @@ -113,18 +113,22 @@ func (tr *TraceReader) FindTraces( func (tr *TraceReader) FindTraceIDs( ctx context.Context, query tracestore.TraceQueryParams, -) iter.Seq2[[]pcommon.TraceID, error] { - return func(yield func([]pcommon.TraceID, error) bool) { +) iter.Seq2[tracestore.FindTraceIDsResponse, error] { + return func(yield func(tracestore.FindTraceIDsResponse, error) bool) { traceIDs, err := tr.spanReader.FindTraceIDs(ctx, query.ToSpanStoreQueryParameters()) if err != nil { - yield(nil, err) + yield(tracestore.FindTraceIDsResponse{ + TraceIDs: nil, + }, err) return } otelIDs := make([]pcommon.TraceID, 0, len(traceIDs)) for _, traceID := range traceIDs { otelIDs = append(otelIDs, FromV1TraceID(traceID)) } - yield(otelIDs, nil) + yield(tracestore.FindTraceIDsResponse{ + TraceIDs: otelIDs, + }, nil) } } diff --git a/internal/storage/v2/v1adapter/tracereader_test.go b/internal/storage/v2/v1adapter/tracereader_test.go index 67af5c6a05c..1862cc38df2 100644 --- a/internal/storage/v2/v1adapter/tracereader_test.go +++ b/internal/storage/v2/v1adapter/tracereader_test.go @@ -456,7 +456,7 @@ func TestTraceReader_FindTraceIDsDelegatesResponse(t *testing.T) { traceReader := &TraceReader{ spanReader: sr, } - traceIDs, err := jiter.FlattenWithErrors(traceReader.FindTraceIDs( + traceIDs, err := jiter.CollectWithErrors(traceReader.FindTraceIDs( context.Background(), tracestore.TraceQueryParams{ ServiceName: "service", diff --git a/internal/storage/v2/v1adapter/translator.go b/internal/storage/v2/v1adapter/translator.go index 191294841e7..f1b80a3e6de 100644 --- a/internal/storage/v2/v1adapter/translator.go +++ b/internal/storage/v2/v1adapter/translator.go @@ -12,6 +12,7 @@ import ( "github.com/jaegertracing/jaeger-idl/model/v1" "github.com/jaegertracing/jaeger/internal/jptrace" + "github.com/jaegertracing/jaeger/internal/storage/v2/api/tracestore" ) // V1BatchesFromTraces converts OpenTelemetry traces (ptrace.Traces) @@ -62,17 +63,17 @@ func V1TracesFromSeq2(otelSeq iter.Seq2[[]ptrace.Traces, error]) ([]*model.Trace return jaegerTraces, nil } -func V1TraceIDsFromSeq2(traceIDsIter iter.Seq2[[]pcommon.TraceID, error]) ([]model.TraceID, error) { +func V1TraceIDsFromSeq2(traceIDsIter iter.Seq2[tracestore.FindTraceIDsResponse, error]) ([]model.TraceID, error) { var ( iterErr error modelTraceIDs []model.TraceID ) - traceIDsIter(func(traceIDs []pcommon.TraceID, err error) bool { + traceIDsIter(func(traceIDsResponse tracestore.FindTraceIDsResponse, err error) bool { if err != nil { iterErr = err return false } - for _, traceID := range traceIDs { + for _, traceID := range traceIDsResponse.TraceIDs { modelTraceIDs = append(modelTraceIDs, ToV1TraceID(traceID)) } return true diff --git a/internal/storage/v2/v1adapter/translator_test.go b/internal/storage/v2/v1adapter/translator_test.go index f8e6f806e1b..a8eafd9a1f7 100644 --- a/internal/storage/v2/v1adapter/translator_test.go +++ b/internal/storage/v2/v1adapter/translator_test.go @@ -16,6 +16,7 @@ import ( "github.com/jaegertracing/jaeger-idl/model/v1" "github.com/jaegertracing/jaeger/internal/jptrace" + "github.com/jaegertracing/jaeger/internal/storage/v2/api/tracestore" ) func TestProtoFromTraces_AddsWarnings(t *testing.T) { @@ -287,30 +288,34 @@ func TestV1TraceToOtelTrace_ReturnEmptyOtelTrace(t *testing.T) { func TestV1TraceIDsFromSeq2(t *testing.T) { testCases := []struct { name string - seqTraceIDs iter.Seq2[[]pcommon.TraceID, error] + seqTraceIDs iter.Seq2[tracestore.FindTraceIDsResponse, error] expectedIDs []model.TraceID expectedError error }{ { name: "empty sequence", - seqTraceIDs: func(func([]pcommon.TraceID, error) bool) {}, + seqTraceIDs: func(func(tracestore.FindTraceIDsResponse, error) bool) {}, expectedIDs: nil, expectedError: nil, }, { name: "sequence with error", - seqTraceIDs: func(yield func([]pcommon.TraceID, error) bool) { - yield(nil, assert.AnError) + seqTraceIDs: func(yield func(tracestore.FindTraceIDsResponse, error) bool) { + yield(tracestore.FindTraceIDsResponse{ + TraceIDs: nil, + }, assert.AnError) }, expectedIDs: nil, expectedError: assert.AnError, }, { name: "sequence with one chunk of trace IDs", - seqTraceIDs: func(yield func([]pcommon.TraceID, error) bool) { + seqTraceIDs: func(yield func(tracestore.FindTraceIDsResponse, error) bool) { traceID1 := pcommon.TraceID([16]byte{0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3}) traceID2 := pcommon.TraceID([16]byte{0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5}) - yield([]pcommon.TraceID{traceID1, traceID2}, nil) + yield(tracestore.FindTraceIDsResponse{ + TraceIDs: []pcommon.TraceID{traceID1, traceID2}, + }, nil) }, expectedIDs: []model.TraceID{ model.NewTraceID(2, 3), @@ -320,12 +325,12 @@ func TestV1TraceIDsFromSeq2(t *testing.T) { }, { name: "sequence with multiple chunks of trace IDs", - seqTraceIDs: func(yield func([]pcommon.TraceID, error) bool) { + seqTraceIDs: func(yield func(tracestore.FindTraceIDsResponse, error) bool) { traceID1 := pcommon.TraceID([16]byte{0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3}) traceID2 := pcommon.TraceID([16]byte{0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5}) traceID3 := pcommon.TraceID([16]byte{0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7}) - yield([]pcommon.TraceID{traceID1}, nil) - yield([]pcommon.TraceID{traceID2, traceID3}, nil) + yield(tracestore.FindTraceIDsResponse{TraceIDs: []pcommon.TraceID{traceID1}}, nil) + yield(tracestore.FindTraceIDsResponse{TraceIDs: []pcommon.TraceID{traceID2, traceID3}}, nil) }, expectedIDs: []model.TraceID{ model.NewTraceID(2, 3), From 92972eff990792b25296f8c669313b3ba74792a1 Mon Sep 17 00:00:00 2001 From: Mahad Zaryab Date: Sun, 23 Feb 2025 11:54:54 -0500 Subject: [PATCH 4/9] FindTraceIDsResponse -> FindTraceIDsChunk Signed-off-by: Mahad Zaryab --- .../internal/integration/trace_reader.go | 2 +- .../storage/v2/api/tracestore/mocks/Reader.go | 8 ++++---- internal/storage/v2/api/tracestore/reader.go | 4 ++-- internal/storage/v2/v1adapter/tracereader.go | 8 ++++---- internal/storage/v2/v1adapter/translator.go | 4 ++-- .../storage/v2/v1adapter/translator_test.go | 18 +++++++++--------- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/cmd/jaeger/internal/integration/trace_reader.go b/cmd/jaeger/internal/integration/trace_reader.go index f0b7399812d..c7c2a5192f3 100644 --- a/cmd/jaeger/internal/integration/trace_reader.go +++ b/cmd/jaeger/internal/integration/trace_reader.go @@ -137,7 +137,7 @@ func (r *traceReader) FindTraces( func (*traceReader) FindTraceIDs( _ context.Context, _ tracestore.TraceQueryParams, -) iter.Seq2[tracestore.FindTraceIDsResponse, error] { +) iter.Seq2[tracestore.FindTraceIDsChunk, error] { panic("not implemented") } diff --git a/internal/storage/v2/api/tracestore/mocks/Reader.go b/internal/storage/v2/api/tracestore/mocks/Reader.go index d9b88a57313..03a895c0246 100644 --- a/internal/storage/v2/api/tracestore/mocks/Reader.go +++ b/internal/storage/v2/api/tracestore/mocks/Reader.go @@ -24,19 +24,19 @@ type Reader struct { } // FindTraceIDs provides a mock function with given fields: ctx, query -func (_m *Reader) FindTraceIDs(ctx context.Context, query tracestore.TraceQueryParams) iter.Seq2[tracestore.FindTraceIDsResponse, error] { +func (_m *Reader) FindTraceIDs(ctx context.Context, query tracestore.TraceQueryParams) iter.Seq2[tracestore.FindTraceIDsChunk, error] { ret := _m.Called(ctx, query) if len(ret) == 0 { panic("no return value specified for FindTraceIDs") } - var r0 iter.Seq2[tracestore.FindTraceIDsResponse, error] - if rf, ok := ret.Get(0).(func(context.Context, tracestore.TraceQueryParams) iter.Seq2[tracestore.FindTraceIDsResponse, error]); ok { + var r0 iter.Seq2[tracestore.FindTraceIDsChunk, error] + if rf, ok := ret.Get(0).(func(context.Context, tracestore.TraceQueryParams) iter.Seq2[tracestore.FindTraceIDsChunk, error]); ok { r0 = rf(ctx, query) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(iter.Seq2[tracestore.FindTraceIDsResponse, error]) + r0 = ret.Get(0).(iter.Seq2[tracestore.FindTraceIDsChunk, error]) } } diff --git a/internal/storage/v2/api/tracestore/reader.go b/internal/storage/v2/api/tracestore/reader.go index 88351ca2a0f..5dc5d9c6a36 100644 --- a/internal/storage/v2/api/tracestore/reader.go +++ b/internal/storage/v2/api/tracestore/reader.go @@ -61,7 +61,7 @@ type Reader interface { // of matching trace IDs. This is useful in some contexts, such as batch jobs, where a // large list of trace IDs may be queried first and then the full traces are loaded // in batches. - FindTraceIDs(ctx context.Context, query TraceQueryParams) iter.Seq2[FindTraceIDsResponse, error] + FindTraceIDs(ctx context.Context, query TraceQueryParams) iter.Seq2[FindTraceIDsChunk, error] } // GetTraceParams contains single-trace parameters for a GetTraces request. @@ -88,7 +88,7 @@ type TraceQueryParams struct { NumTraces int } -type FindTraceIDsResponse struct { +type FindTraceIDsChunk struct { TraceIDs []pcommon.TraceID Start time.Time End time.Time diff --git a/internal/storage/v2/v1adapter/tracereader.go b/internal/storage/v2/v1adapter/tracereader.go index 3491385e81c..c5fe01bd524 100644 --- a/internal/storage/v2/v1adapter/tracereader.go +++ b/internal/storage/v2/v1adapter/tracereader.go @@ -113,11 +113,11 @@ func (tr *TraceReader) FindTraces( func (tr *TraceReader) FindTraceIDs( ctx context.Context, query tracestore.TraceQueryParams, -) iter.Seq2[tracestore.FindTraceIDsResponse, error] { - return func(yield func(tracestore.FindTraceIDsResponse, error) bool) { +) iter.Seq2[tracestore.FindTraceIDsChunk, error] { + return func(yield func(tracestore.FindTraceIDsChunk, error) bool) { traceIDs, err := tr.spanReader.FindTraceIDs(ctx, query.ToSpanStoreQueryParameters()) if err != nil { - yield(tracestore.FindTraceIDsResponse{ + yield(tracestore.FindTraceIDsChunk{ TraceIDs: nil, }, err) return @@ -126,7 +126,7 @@ func (tr *TraceReader) FindTraceIDs( for _, traceID := range traceIDs { otelIDs = append(otelIDs, FromV1TraceID(traceID)) } - yield(tracestore.FindTraceIDsResponse{ + yield(tracestore.FindTraceIDsChunk{ TraceIDs: otelIDs, }, nil) } diff --git a/internal/storage/v2/v1adapter/translator.go b/internal/storage/v2/v1adapter/translator.go index f1b80a3e6de..752c42c7c72 100644 --- a/internal/storage/v2/v1adapter/translator.go +++ b/internal/storage/v2/v1adapter/translator.go @@ -63,12 +63,12 @@ func V1TracesFromSeq2(otelSeq iter.Seq2[[]ptrace.Traces, error]) ([]*model.Trace return jaegerTraces, nil } -func V1TraceIDsFromSeq2(traceIDsIter iter.Seq2[tracestore.FindTraceIDsResponse, error]) ([]model.TraceID, error) { +func V1TraceIDsFromSeq2(traceIDsIter iter.Seq2[tracestore.FindTraceIDsChunk, error]) ([]model.TraceID, error) { var ( iterErr error modelTraceIDs []model.TraceID ) - traceIDsIter(func(traceIDsResponse tracestore.FindTraceIDsResponse, err error) bool { + traceIDsIter(func(traceIDsResponse tracestore.FindTraceIDsChunk, err error) bool { if err != nil { iterErr = err return false diff --git a/internal/storage/v2/v1adapter/translator_test.go b/internal/storage/v2/v1adapter/translator_test.go index a8eafd9a1f7..347e869bcba 100644 --- a/internal/storage/v2/v1adapter/translator_test.go +++ b/internal/storage/v2/v1adapter/translator_test.go @@ -288,20 +288,20 @@ func TestV1TraceToOtelTrace_ReturnEmptyOtelTrace(t *testing.T) { func TestV1TraceIDsFromSeq2(t *testing.T) { testCases := []struct { name string - seqTraceIDs iter.Seq2[tracestore.FindTraceIDsResponse, error] + seqTraceIDs iter.Seq2[tracestore.FindTraceIDsChunk, error] expectedIDs []model.TraceID expectedError error }{ { name: "empty sequence", - seqTraceIDs: func(func(tracestore.FindTraceIDsResponse, error) bool) {}, + seqTraceIDs: func(func(tracestore.FindTraceIDsChunk, error) bool) {}, expectedIDs: nil, expectedError: nil, }, { name: "sequence with error", - seqTraceIDs: func(yield func(tracestore.FindTraceIDsResponse, error) bool) { - yield(tracestore.FindTraceIDsResponse{ + seqTraceIDs: func(yield func(tracestore.FindTraceIDsChunk, error) bool) { + yield(tracestore.FindTraceIDsChunk{ TraceIDs: nil, }, assert.AnError) }, @@ -310,10 +310,10 @@ func TestV1TraceIDsFromSeq2(t *testing.T) { }, { name: "sequence with one chunk of trace IDs", - seqTraceIDs: func(yield func(tracestore.FindTraceIDsResponse, error) bool) { + seqTraceIDs: func(yield func(tracestore.FindTraceIDsChunk, error) bool) { traceID1 := pcommon.TraceID([16]byte{0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3}) traceID2 := pcommon.TraceID([16]byte{0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5}) - yield(tracestore.FindTraceIDsResponse{ + yield(tracestore.FindTraceIDsChunk{ TraceIDs: []pcommon.TraceID{traceID1, traceID2}, }, nil) }, @@ -325,12 +325,12 @@ func TestV1TraceIDsFromSeq2(t *testing.T) { }, { name: "sequence with multiple chunks of trace IDs", - seqTraceIDs: func(yield func(tracestore.FindTraceIDsResponse, error) bool) { + seqTraceIDs: func(yield func(tracestore.FindTraceIDsChunk, error) bool) { traceID1 := pcommon.TraceID([16]byte{0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3}) traceID2 := pcommon.TraceID([16]byte{0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5}) traceID3 := pcommon.TraceID([16]byte{0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7}) - yield(tracestore.FindTraceIDsResponse{TraceIDs: []pcommon.TraceID{traceID1}}, nil) - yield(tracestore.FindTraceIDsResponse{TraceIDs: []pcommon.TraceID{traceID2, traceID3}}, nil) + yield(tracestore.FindTraceIDsChunk{TraceIDs: []pcommon.TraceID{traceID1}}, nil) + yield(tracestore.FindTraceIDsChunk{TraceIDs: []pcommon.TraceID{traceID2, traceID3}}, nil) }, expectedIDs: []model.TraceID{ model.NewTraceID(2, 3), From 0d969e5637c3fdcf4771e37f116a10c0267e2684 Mon Sep 17 00:00:00 2001 From: Mahad Zaryab Date: Sun, 23 Feb 2025 12:01:39 -0500 Subject: [PATCH 5/9] Update Documentation Signed-off-by: Mahad Zaryab --- internal/storage/v2/api/tracestore/reader.go | 21 ++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/internal/storage/v2/api/tracestore/reader.go b/internal/storage/v2/api/tracestore/reader.go index 5dc5d9c6a36..098dd14ef12 100644 --- a/internal/storage/v2/api/tracestore/reader.go +++ b/internal/storage/v2/api/tracestore/reader.go @@ -88,10 +88,27 @@ type TraceQueryParams struct { NumTraces int } +// FindTraceIDsChunk represents a chunk of trace IDs that match specific query parameters. type FindTraceIDsChunk struct { + // TraceIDs is a slice of trace IDs that match the query parameters. TraceIDs []pcommon.TraceID - Start time.Time - End time.Time + + // Start is the start time of the earliest trace in the chunk. + // + // This field is provided as an optimization hint for some storage backends + // that can perform more efficient queries when they know the approximate time range. + // The value should not be used for precise time-based filtering or assumptions. + // It is meant as a rough boundary for the traces contained in the chunk and may not + // be populated in all cases. + Start time.Time + + // End is the end time of the latest trace in the chunk. + // + // Similar to the Start field, this serves as an optimization for certain + // storage backends that can benefit from knowing the approximate end time + // of the traces. It should not be relied upon for any exact time-based logic + // and is only a hint for optimization purposes that may not be populated in all cases. + End time.Time } func (t *TraceQueryParams) ToSpanStoreQueryParameters() *spanstore.TraceQueryParameters { From 85bd09a2e656e80a76524d2420f3714a18817be2 Mon Sep 17 00:00:00 2001 From: Mahad Zaryab Date: Sun, 23 Feb 2025 12:10:46 -0500 Subject: [PATCH 6/9] Fix Unit Test Signed-off-by: Mahad Zaryab --- internal/storage/v2/v1adapter/spanreader_test.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/internal/storage/v2/v1adapter/spanreader_test.go b/internal/storage/v2/v1adapter/spanreader_test.go index ec1052c2bcc..52847e03c72 100644 --- a/internal/storage/v2/v1adapter/spanreader_test.go +++ b/internal/storage/v2/v1adapter/spanreader_test.go @@ -385,8 +385,10 @@ func TestSpanReader_FindTraceIDs(t *testing.T) { for _, test := range tests { tr := tracestoremocks.Reader{} tr.On("FindTraceIDs", mock.Anything, test.expectedQuery). - Return(iter.Seq2[[]pcommon.TraceID, error](func(yield func([]pcommon.TraceID, error) bool) { - yield(test.traceIDs, test.err) + Return(iter.Seq2[tracestore.FindTraceIDsChunk, error](func(yield func(tracestore.FindTraceIDsChunk, error) bool) { + yield(tracestore.FindTraceIDsChunk{ + TraceIDs: test.traceIDs, + }, test.err) })).Once() sr := NewSpanReader(&tr) From cb185077400daa3b89e1609e54d0258a48a01460 Mon Sep 17 00:00:00 2001 From: Mahad Zaryab Date: Sun, 23 Feb 2025 12:37:36 -0500 Subject: [PATCH 7/9] Fix Unit Test Signed-off-by: Mahad Zaryab --- internal/storage/v2/v1adapter/tracereader.go | 6 +++ .../storage/v2/v1adapter/tracereader_test.go | 43 ++++++++++++------- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/internal/storage/v2/v1adapter/tracereader.go b/internal/storage/v2/v1adapter/tracereader.go index c5fe01bd524..2003c07a9a7 100644 --- a/internal/storage/v2/v1adapter/tracereader.go +++ b/internal/storage/v2/v1adapter/tracereader.go @@ -122,6 +122,12 @@ func (tr *TraceReader) FindTraceIDs( }, err) return } + if traceIDs == nil { + yield(tracestore.FindTraceIDsChunk{ + TraceIDs: nil, + }, nil) + return + } otelIDs := make([]pcommon.TraceID, 0, len(traceIDs)) for _, traceID := range traceIDs { otelIDs = append(otelIDs, FromV1TraceID(traceID)) diff --git a/internal/storage/v2/v1adapter/tracereader_test.go b/internal/storage/v2/v1adapter/tracereader_test.go index 1862cc38df2..01b81e8cd30 100644 --- a/internal/storage/v2/v1adapter/tracereader_test.go +++ b/internal/storage/v2/v1adapter/tracereader_test.go @@ -404,7 +404,7 @@ func TestTraceReader_FindTraceIDsDelegatesResponse(t *testing.T) { tests := []struct { name string modelTraceIDs []model.TraceID - expectedTraceIDs []pcommon.TraceID + expectedTraceIDs tracestore.FindTraceIDsChunk err error }{ { @@ -413,26 +413,34 @@ func TestTraceReader_FindTraceIDsDelegatesResponse(t *testing.T) { {Low: 3, High: 2}, {Low: 4, High: 3}, }, - expectedTraceIDs: []pcommon.TraceID{ - pcommon.TraceID([]byte{0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3}), - pcommon.TraceID([]byte{0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4}), + expectedTraceIDs: tracestore.FindTraceIDsChunk{ + TraceIDs: []pcommon.TraceID{ + pcommon.TraceID([]byte{0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3}), + pcommon.TraceID([]byte{0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4}), + }, }, }, { - name: "empty response", - modelTraceIDs: []model.TraceID{}, - expectedTraceIDs: nil, + name: "empty response", + modelTraceIDs: []model.TraceID{}, + expectedTraceIDs: tracestore.FindTraceIDsChunk{ + TraceIDs: []pcommon.TraceID{}, + }, }, { - name: "nil response", - modelTraceIDs: nil, - expectedTraceIDs: nil, + name: "nil response", + modelTraceIDs: nil, + expectedTraceIDs: tracestore.FindTraceIDsChunk{ + TraceIDs: nil, + }, }, { - name: "error response", - modelTraceIDs: nil, - expectedTraceIDs: nil, - err: errors.New("test error"), + name: "error response", + modelTraceIDs: nil, + expectedTraceIDs: tracestore.FindTraceIDsChunk{ + TraceIDs: nil, + }, + err: errors.New("test error"), }, } for _, test := range tests { @@ -469,8 +477,11 @@ func TestTraceReader_FindTraceIDsDelegatesResponse(t *testing.T) { NumTraces: 10, }, )) - require.ErrorIs(t, err, test.err) - require.Equal(t, test.expectedTraceIDs, traceIDs) + if test.err != nil { + require.ErrorIs(t, err, test.err) + } else { + require.Equal(t, test.expectedTraceIDs, traceIDs[0]) + } }) } } From fc4186b93b9edf69588ee83d2398feb6ccd5a6b0 Mon Sep 17 00:00:00 2001 From: Mahad Zaryab Date: Sun, 23 Feb 2025 13:44:42 -0500 Subject: [PATCH 8/9] Address Feedback Signed-off-by: Mahad Zaryab --- .../internal/integration/trace_reader.go | 2 +- .../storage/v2/api/tracestore/mocks/Reader.go | 8 ++-- internal/storage/v2/api/tracestore/reader.go | 10 ++-- .../storage/v2/v1adapter/spanreader_test.go | 20 ++++---- internal/storage/v2/v1adapter/tracereader.go | 25 ++++------ .../storage/v2/v1adapter/tracereader_test.go | 47 ++++++++----------- internal/storage/v2/v1adapter/translator.go | 8 ++-- .../storage/v2/v1adapter/translator_test.go | 29 ++++++------ 8 files changed, 68 insertions(+), 81 deletions(-) diff --git a/cmd/jaeger/internal/integration/trace_reader.go b/cmd/jaeger/internal/integration/trace_reader.go index c7c2a5192f3..fca5bcaf7ae 100644 --- a/cmd/jaeger/internal/integration/trace_reader.go +++ b/cmd/jaeger/internal/integration/trace_reader.go @@ -137,7 +137,7 @@ func (r *traceReader) FindTraces( func (*traceReader) FindTraceIDs( _ context.Context, _ tracestore.TraceQueryParams, -) iter.Seq2[tracestore.FindTraceIDsChunk, error] { +) iter.Seq2[[]tracestore.FoundTraceID, error] { panic("not implemented") } diff --git a/internal/storage/v2/api/tracestore/mocks/Reader.go b/internal/storage/v2/api/tracestore/mocks/Reader.go index 03a895c0246..d863a6d6b79 100644 --- a/internal/storage/v2/api/tracestore/mocks/Reader.go +++ b/internal/storage/v2/api/tracestore/mocks/Reader.go @@ -24,19 +24,19 @@ type Reader struct { } // FindTraceIDs provides a mock function with given fields: ctx, query -func (_m *Reader) FindTraceIDs(ctx context.Context, query tracestore.TraceQueryParams) iter.Seq2[tracestore.FindTraceIDsChunk, error] { +func (_m *Reader) FindTraceIDs(ctx context.Context, query tracestore.TraceQueryParams) iter.Seq2[[]tracestore.FoundTraceID, error] { ret := _m.Called(ctx, query) if len(ret) == 0 { panic("no return value specified for FindTraceIDs") } - var r0 iter.Seq2[tracestore.FindTraceIDsChunk, error] - if rf, ok := ret.Get(0).(func(context.Context, tracestore.TraceQueryParams) iter.Seq2[tracestore.FindTraceIDsChunk, error]); ok { + var r0 iter.Seq2[[]tracestore.FoundTraceID, error] + if rf, ok := ret.Get(0).(func(context.Context, tracestore.TraceQueryParams) iter.Seq2[[]tracestore.FoundTraceID, error]); ok { r0 = rf(ctx, query) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(iter.Seq2[tracestore.FindTraceIDsChunk, error]) + r0 = ret.Get(0).(iter.Seq2[[]tracestore.FoundTraceID, error]) } } diff --git a/internal/storage/v2/api/tracestore/reader.go b/internal/storage/v2/api/tracestore/reader.go index 098dd14ef12..e083e3f5751 100644 --- a/internal/storage/v2/api/tracestore/reader.go +++ b/internal/storage/v2/api/tracestore/reader.go @@ -61,7 +61,7 @@ type Reader interface { // of matching trace IDs. This is useful in some contexts, such as batch jobs, where a // large list of trace IDs may be queried first and then the full traces are loaded // in batches. - FindTraceIDs(ctx context.Context, query TraceQueryParams) iter.Seq2[FindTraceIDsChunk, error] + FindTraceIDs(ctx context.Context, query TraceQueryParams) iter.Seq2[[]FoundTraceID, error] } // GetTraceParams contains single-trace parameters for a GetTraces request. @@ -88,10 +88,10 @@ type TraceQueryParams struct { NumTraces int } -// FindTraceIDsChunk represents a chunk of trace IDs that match specific query parameters. -type FindTraceIDsChunk struct { - // TraceIDs is a slice of trace IDs that match the query parameters. - TraceIDs []pcommon.TraceID +// FoundTraceID represents a chunk of trace IDs that match specific query parameters. +type FoundTraceID struct { + // TraceID is a slice of trace IDs that match the query parameters. + TraceID pcommon.TraceID // Start is the start time of the earliest trace in the chunk. // diff --git a/internal/storage/v2/v1adapter/spanreader_test.go b/internal/storage/v2/v1adapter/spanreader_test.go index 52847e03c72..3804ad8d235 100644 --- a/internal/storage/v2/v1adapter/spanreader_test.go +++ b/internal/storage/v2/v1adapter/spanreader_test.go @@ -336,7 +336,7 @@ func TestSpanReader_FindTraceIDs(t *testing.T) { name string query *spanstore.TraceQueryParameters expectedQuery tracestore.TraceQueryParams - traceIDs []pcommon.TraceID + traceIDs []tracestore.FoundTraceID expectedTraceIDs []model.TraceID err error expectedErr error @@ -360,7 +360,7 @@ func TestSpanReader_FindTraceIDs(t *testing.T) { expectedQuery: tracestore.TraceQueryParams{ ServiceName: "service1", }, - traceIDs: []pcommon.TraceID{}, + traceIDs: []tracestore.FoundTraceID{}, expectedTraceIDs: nil, }, { @@ -371,9 +371,13 @@ func TestSpanReader_FindTraceIDs(t *testing.T) { expectedQuery: tracestore.TraceQueryParams{ ServiceName: "service1", }, - traceIDs: []pcommon.TraceID{ - pcommon.TraceID([16]byte{0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2}), - pcommon.TraceID([16]byte{0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4}), + traceIDs: []tracestore.FoundTraceID{ + { + TraceID: [16]byte{0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2}, + }, + { + TraceID: [16]byte{0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4}, + }, }, expectedTraceIDs: []model.TraceID{ model.NewTraceID(1, 2), @@ -385,10 +389,8 @@ func TestSpanReader_FindTraceIDs(t *testing.T) { for _, test := range tests { tr := tracestoremocks.Reader{} tr.On("FindTraceIDs", mock.Anything, test.expectedQuery). - Return(iter.Seq2[tracestore.FindTraceIDsChunk, error](func(yield func(tracestore.FindTraceIDsChunk, error) bool) { - yield(tracestore.FindTraceIDsChunk{ - TraceIDs: test.traceIDs, - }, test.err) + Return(iter.Seq2[[]tracestore.FoundTraceID, error](func(yield func([]tracestore.FoundTraceID, error) bool) { + yield(test.traceIDs, test.err) })).Once() sr := NewSpanReader(&tr) diff --git a/internal/storage/v2/v1adapter/tracereader.go b/internal/storage/v2/v1adapter/tracereader.go index 2003c07a9a7..1f16942020d 100644 --- a/internal/storage/v2/v1adapter/tracereader.go +++ b/internal/storage/v2/v1adapter/tracereader.go @@ -8,7 +8,6 @@ import ( "errors" "iter" - "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" "github.com/jaegertracing/jaeger-idl/model/v1" @@ -113,28 +112,20 @@ func (tr *TraceReader) FindTraces( func (tr *TraceReader) FindTraceIDs( ctx context.Context, query tracestore.TraceQueryParams, -) iter.Seq2[tracestore.FindTraceIDsChunk, error] { - return func(yield func(tracestore.FindTraceIDsChunk, error) bool) { +) iter.Seq2[[]tracestore.FoundTraceID, error] { + return func(yield func([]tracestore.FoundTraceID, error) bool) { traceIDs, err := tr.spanReader.FindTraceIDs(ctx, query.ToSpanStoreQueryParameters()) if err != nil { - yield(tracestore.FindTraceIDsChunk{ - TraceIDs: nil, - }, err) - return - } - if traceIDs == nil { - yield(tracestore.FindTraceIDsChunk{ - TraceIDs: nil, - }, nil) + yield(nil, err) return } - otelIDs := make([]pcommon.TraceID, 0, len(traceIDs)) + otelIDs := make([]tracestore.FoundTraceID, 0, len(traceIDs)) for _, traceID := range traceIDs { - otelIDs = append(otelIDs, FromV1TraceID(traceID)) + otelIDs = append(otelIDs, tracestore.FoundTraceID{ + TraceID: FromV1TraceID(traceID), + }) } - yield(tracestore.FindTraceIDsChunk{ - TraceIDs: otelIDs, - }, nil) + yield(otelIDs, nil) } } diff --git a/internal/storage/v2/v1adapter/tracereader_test.go b/internal/storage/v2/v1adapter/tracereader_test.go index 01b81e8cd30..f6a2b40d67e 100644 --- a/internal/storage/v2/v1adapter/tracereader_test.go +++ b/internal/storage/v2/v1adapter/tracereader_test.go @@ -404,7 +404,7 @@ func TestTraceReader_FindTraceIDsDelegatesResponse(t *testing.T) { tests := []struct { name string modelTraceIDs []model.TraceID - expectedTraceIDs tracestore.FindTraceIDsChunk + expectedTraceIDs []tracestore.FoundTraceID err error }{ { @@ -413,34 +413,30 @@ func TestTraceReader_FindTraceIDsDelegatesResponse(t *testing.T) { {Low: 3, High: 2}, {Low: 4, High: 3}, }, - expectedTraceIDs: tracestore.FindTraceIDsChunk{ - TraceIDs: []pcommon.TraceID{ - pcommon.TraceID([]byte{0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3}), - pcommon.TraceID([]byte{0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4}), + expectedTraceIDs: []tracestore.FoundTraceID{ + { + TraceID: pcommon.TraceID([]byte{0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3}), + }, + { + TraceID: pcommon.TraceID([]byte{0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4}), }, }, }, { - name: "empty response", - modelTraceIDs: []model.TraceID{}, - expectedTraceIDs: tracestore.FindTraceIDsChunk{ - TraceIDs: []pcommon.TraceID{}, - }, + name: "empty response", + modelTraceIDs: []model.TraceID{}, + expectedTraceIDs: nil, }, { - name: "nil response", - modelTraceIDs: nil, - expectedTraceIDs: tracestore.FindTraceIDsChunk{ - TraceIDs: nil, - }, + name: "nil response", + modelTraceIDs: nil, + expectedTraceIDs: nil, }, { - name: "error response", - modelTraceIDs: nil, - expectedTraceIDs: tracestore.FindTraceIDsChunk{ - TraceIDs: nil, - }, - err: errors.New("test error"), + name: "error response", + modelTraceIDs: nil, + expectedTraceIDs: nil, + err: errors.New("test error"), }, } for _, test := range tests { @@ -464,7 +460,7 @@ func TestTraceReader_FindTraceIDsDelegatesResponse(t *testing.T) { traceReader := &TraceReader{ spanReader: sr, } - traceIDs, err := jiter.CollectWithErrors(traceReader.FindTraceIDs( + traceIDs, err := jiter.FlattenWithErrors(traceReader.FindTraceIDs( context.Background(), tracestore.TraceQueryParams{ ServiceName: "service", @@ -477,11 +473,8 @@ func TestTraceReader_FindTraceIDsDelegatesResponse(t *testing.T) { NumTraces: 10, }, )) - if test.err != nil { - require.ErrorIs(t, err, test.err) - } else { - require.Equal(t, test.expectedTraceIDs, traceIDs[0]) - } + require.ErrorIs(t, err, test.err) + require.Equal(t, test.expectedTraceIDs, traceIDs) }) } } diff --git a/internal/storage/v2/v1adapter/translator.go b/internal/storage/v2/v1adapter/translator.go index 752c42c7c72..3590a074d66 100644 --- a/internal/storage/v2/v1adapter/translator.go +++ b/internal/storage/v2/v1adapter/translator.go @@ -63,18 +63,18 @@ func V1TracesFromSeq2(otelSeq iter.Seq2[[]ptrace.Traces, error]) ([]*model.Trace return jaegerTraces, nil } -func V1TraceIDsFromSeq2(traceIDsIter iter.Seq2[tracestore.FindTraceIDsChunk, error]) ([]model.TraceID, error) { +func V1TraceIDsFromSeq2(traceIDsIter iter.Seq2[[]tracestore.FoundTraceID, error]) ([]model.TraceID, error) { var ( iterErr error modelTraceIDs []model.TraceID ) - traceIDsIter(func(traceIDsResponse tracestore.FindTraceIDsChunk, err error) bool { + traceIDsIter(func(traceIDs []tracestore.FoundTraceID, err error) bool { if err != nil { iterErr = err return false } - for _, traceID := range traceIDsResponse.TraceIDs { - modelTraceIDs = append(modelTraceIDs, ToV1TraceID(traceID)) + for _, traceID := range traceIDs { + modelTraceIDs = append(modelTraceIDs, ToV1TraceID(traceID.TraceID)) } return true }) diff --git a/internal/storage/v2/v1adapter/translator_test.go b/internal/storage/v2/v1adapter/translator_test.go index 347e869bcba..696b56ac967 100644 --- a/internal/storage/v2/v1adapter/translator_test.go +++ b/internal/storage/v2/v1adapter/translator_test.go @@ -288,33 +288,34 @@ func TestV1TraceToOtelTrace_ReturnEmptyOtelTrace(t *testing.T) { func TestV1TraceIDsFromSeq2(t *testing.T) { testCases := []struct { name string - seqTraceIDs iter.Seq2[tracestore.FindTraceIDsChunk, error] + seqTraceIDs iter.Seq2[[]tracestore.FoundTraceID, error] expectedIDs []model.TraceID expectedError error }{ { name: "empty sequence", - seqTraceIDs: func(func(tracestore.FindTraceIDsChunk, error) bool) {}, + seqTraceIDs: func(func([]tracestore.FoundTraceID, error) bool) {}, expectedIDs: nil, expectedError: nil, }, { name: "sequence with error", - seqTraceIDs: func(yield func(tracestore.FindTraceIDsChunk, error) bool) { - yield(tracestore.FindTraceIDsChunk{ - TraceIDs: nil, - }, assert.AnError) + seqTraceIDs: func(yield func([]tracestore.FoundTraceID, error) bool) { + yield(nil, assert.AnError) }, expectedIDs: nil, expectedError: assert.AnError, }, { name: "sequence with one chunk of trace IDs", - seqTraceIDs: func(yield func(tracestore.FindTraceIDsChunk, error) bool) { - traceID1 := pcommon.TraceID([16]byte{0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3}) - traceID2 := pcommon.TraceID([16]byte{0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5}) - yield(tracestore.FindTraceIDsChunk{ - TraceIDs: []pcommon.TraceID{traceID1, traceID2}, + seqTraceIDs: func(yield func([]tracestore.FoundTraceID, error) bool) { + yield([]tracestore.FoundTraceID{ + { + TraceID: pcommon.TraceID([16]byte{0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3}), + }, + { + TraceID: pcommon.TraceID([16]byte{0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5}), + }, }, nil) }, expectedIDs: []model.TraceID{ @@ -325,12 +326,12 @@ func TestV1TraceIDsFromSeq2(t *testing.T) { }, { name: "sequence with multiple chunks of trace IDs", - seqTraceIDs: func(yield func(tracestore.FindTraceIDsChunk, error) bool) { + seqTraceIDs: func(yield func([]tracestore.FoundTraceID, error) bool) { traceID1 := pcommon.TraceID([16]byte{0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3}) traceID2 := pcommon.TraceID([16]byte{0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5}) traceID3 := pcommon.TraceID([16]byte{0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7}) - yield(tracestore.FindTraceIDsChunk{TraceIDs: []pcommon.TraceID{traceID1}}, nil) - yield(tracestore.FindTraceIDsChunk{TraceIDs: []pcommon.TraceID{traceID2, traceID3}}, nil) + yield([]tracestore.FoundTraceID{{TraceID: traceID1}}, nil) + yield([]tracestore.FoundTraceID{{TraceID: traceID2}, {TraceID: traceID3}}, nil) }, expectedIDs: []model.TraceID{ model.NewTraceID(2, 3), From 97178caf4897a724694a2c0586d030eab4e358fb Mon Sep 17 00:00:00 2001 From: Mahad Zaryab Date: Sun, 23 Feb 2025 19:42:13 -0500 Subject: [PATCH 9/9] Address Feedback Signed-off-by: Mahad Zaryab --- internal/storage/v2/api/tracestore/reader.go | 28 +++++++------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/internal/storage/v2/api/tracestore/reader.go b/internal/storage/v2/api/tracestore/reader.go index e083e3f5751..a5d51f79ede 100644 --- a/internal/storage/v2/api/tracestore/reader.go +++ b/internal/storage/v2/api/tracestore/reader.go @@ -88,27 +88,17 @@ type TraceQueryParams struct { NumTraces int } -// FoundTraceID represents a chunk of trace IDs that match specific query parameters. +// FoundTraceID is a wrapper around trace ID returned from FindTraceIDs +// with an optional time range that may be used in GetTraces calls. +// +// The time range is provided as an optimization hint for some storage backends +// that can perform more efficient queries when they know the approximate time range. +// The value should not be used for precise time-based filtering or assumptions. +// It is meant as a rough boundary and may not be populated in all cases. type FoundTraceID struct { - // TraceID is a slice of trace IDs that match the query parameters. TraceID pcommon.TraceID - - // Start is the start time of the earliest trace in the chunk. - // - // This field is provided as an optimization hint for some storage backends - // that can perform more efficient queries when they know the approximate time range. - // The value should not be used for precise time-based filtering or assumptions. - // It is meant as a rough boundary for the traces contained in the chunk and may not - // be populated in all cases. - Start time.Time - - // End is the end time of the latest trace in the chunk. - // - // Similar to the Start field, this serves as an optimization for certain - // storage backends that can benefit from knowing the approximate end time - // of the traces. It should not be relied upon for any exact time-based logic - // and is only a hint for optimization purposes that may not be populated in all cases. - End time.Time + Start time.Time + End time.Time } func (t *TraceQueryParams) ToSpanStoreQueryParameters() *spanstore.TraceQueryParameters {