Skip to content

Commit fd28541

Browse files
ekefanyurishkuro
authored andcommitted
Upgrade storage integration test to v2 Trace Reader (jaegertracing#6388)
## Which problem is this PR solving? - Part of jaegertracing#6366 ## Description of the changes - Incrementally swaps the fields of `StorageIntegration` to align with v2 storage api while supporting v1 api - Updates test functions accordingly to work with the updated fields ## How was this change tested? - make test ## Checklist - [x] I have read https://github.com/jaegertracing/jaeger/blob/master/CONTRIBUTING_GUIDELINES.md - [x] I have signed all commits - [ ] I have added unit tests for the new functionality - [x] I have run lint and test steps successfully - for `jaeger`: `make lint test` - for `jaeger-ui`: `npm run lint` and `npm run test` --------- Signed-off-by: Emmanuel Emonueje Ebenezer <[email protected]> Signed-off-by: Ebenezer <[email protected]> Signed-off-by: Yuri Shkuro <[email protected]> Co-authored-by: Yuri Shkuro <[email protected]>
1 parent 9c60046 commit fd28541

File tree

11 files changed

+254
-33
lines changed

11 files changed

+254
-33
lines changed

cmd/jaeger/internal/integration/e2e_integration.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"github.com/jaegertracing/jaeger/cmd/jaeger/internal/integration/storagecleaner"
2525
"github.com/jaegertracing/jaeger/plugin/storage/integration"
2626
"github.com/jaegertracing/jaeger/ports"
27+
"github.com/jaegertracing/jaeger/storage_v2/v1adapter"
2728
)
2829

2930
const otlpPort = 4317
@@ -149,8 +150,9 @@ func (s *E2EStorageIntegration) e2eInitialize(t *testing.T, storage string) {
149150

150151
s.SpanWriter, err = createSpanWriter(logger, otlpPort)
151152
require.NoError(t, err)
152-
s.SpanReader, err = createSpanReader(logger, ports.QueryGRPC)
153+
spanReader, err := createSpanReader(logger, ports.QueryGRPC)
153154
require.NoError(t, err)
155+
s.TraceReader = v1adapter.NewTraceReader(spanReader)
154156

155157
t.Cleanup(func() {
156158
// Call e2eCleanUp to close the SpanReader and SpanWriter gRPC connection.
@@ -207,7 +209,9 @@ func (s *E2EStorageIntegration) doHealthCheck(t *testing.T) bool {
207209
// e2eCleanUp closes the SpanReader and SpanWriter gRPC connection.
208210
// This function should be called after all the tests are finished.
209211
func (s *E2EStorageIntegration) e2eCleanUp(t *testing.T) {
210-
require.NoError(t, s.SpanReader.(io.Closer).Close())
212+
spanReader, err := v1adapter.GetV1Reader(s.TraceReader)
213+
require.NoError(t, err)
214+
require.NoError(t, spanReader.(io.Closer).Close())
211215
require.NoError(t, s.SpanWriter.(io.Closer).Close())
212216
}
213217

cmd/jaeger/internal/integration/tailsampling_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func (ts *TailSamplingIntegration) testTailSamplingProccessor(t *testing.T) {
7676
var actual []string
7777
assert.Eventually(t, func() bool {
7878
var err error
79-
actual, err = ts.SpanReader.GetServices(context.Background())
79+
actual, err = ts.TraceReader.GetServices(context.Background())
8080
require.NoError(t, err)
8181
sort.Strings(actual)
8282
return assert.ObjectsAreEqualValues(ts.expectedServices, actual)

plugin/storage/integration/badgerstore_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/jaegertracing/jaeger/pkg/metrics"
1515
"github.com/jaegertracing/jaeger/pkg/testutils"
1616
"github.com/jaegertracing/jaeger/plugin/storage/badger"
17+
"github.com/jaegertracing/jaeger/storage_v2/v1adapter"
1718
)
1819

1920
type BadgerIntegrationStorage struct {
@@ -35,8 +36,9 @@ func (s *BadgerIntegrationStorage) initialize(t *testing.T) {
3536
s.SpanWriter, err = s.factory.CreateSpanWriter()
3637
require.NoError(t, err)
3738

38-
s.SpanReader, err = s.factory.CreateSpanReader()
39+
spanReader, err := s.factory.CreateSpanReader()
3940
require.NoError(t, err)
41+
s.TraceReader = v1adapter.NewTraceReader(spanReader)
4042

4143
s.SamplingStore, err = s.factory.CreateSamplingStore(0)
4244
require.NoError(t, err)

plugin/storage/integration/cassandra_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"github.com/jaegertracing/jaeger/pkg/testutils"
2020
"github.com/jaegertracing/jaeger/plugin/storage/cassandra"
2121
"github.com/jaegertracing/jaeger/storage/dependencystore"
22+
"github.com/jaegertracing/jaeger/storage_v2/v1adapter"
2223
)
2324

2425
type CassandraStorageIntegration struct {
@@ -74,8 +75,9 @@ func (s *CassandraStorageIntegration) initializeCassandra(t *testing.T) {
7475
var err error
7576
s.SpanWriter, err = f.CreateSpanWriter()
7677
require.NoError(t, err)
77-
s.SpanReader, err = f.CreateSpanReader()
78+
spanReader, err := f.CreateSpanReader()
7879
require.NoError(t, err)
80+
s.TraceReader = v1adapter.NewTraceReader(spanReader)
7981
s.ArchiveSpanReader, err = f.CreateArchiveSpanReader()
8082
require.NoError(t, err)
8183
s.ArchiveSpanWriter, err = f.CreateArchiveSpanWriter()

plugin/storage/integration/elasticsearch_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"github.com/jaegertracing/jaeger/pkg/testutils"
2727
"github.com/jaegertracing/jaeger/plugin/storage/es"
2828
"github.com/jaegertracing/jaeger/storage/dependencystore"
29+
"github.com/jaegertracing/jaeger/storage_v2/v1adapter"
2930
)
3031

3132
const (
@@ -134,8 +135,9 @@ func (s *ESStorageIntegration) initSpanstore(t *testing.T, allTagsAsFields bool)
134135
var err error
135136
s.SpanWriter, err = f.CreateSpanWriter()
136137
require.NoError(t, err)
137-
s.SpanReader, err = f.CreateSpanReader()
138+
spanReader, err := f.CreateSpanReader()
138139
require.NoError(t, err)
140+
s.TraceReader = v1adapter.NewTraceReader(spanReader)
139141
s.ArchiveSpanReader, err = f.CreateArchiveSpanReader()
140142
require.NoError(t, err)
141143
s.ArchiveSpanWriter, err = f.CreateArchiveSpanWriter()

plugin/storage/integration/grpc_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/jaegertracing/jaeger/pkg/metrics"
1616
"github.com/jaegertracing/jaeger/pkg/testutils"
1717
"github.com/jaegertracing/jaeger/plugin/storage/grpc"
18+
"github.com/jaegertracing/jaeger/storage_v2/v1adapter"
1819
)
1920

2021
type GRPCStorageIntegrationTestSuite struct {
@@ -38,8 +39,9 @@ func (s *GRPCStorageIntegrationTestSuite) initialize(t *testing.T) {
3839

3940
s.SpanWriter, err = f.CreateSpanWriter()
4041
require.NoError(t, err)
41-
s.SpanReader, err = f.CreateSpanReader()
42+
spanReader, err := f.CreateSpanReader()
4243
require.NoError(t, err)
44+
s.TraceReader = v1adapter.NewTraceReader(spanReader)
4345
s.ArchiveSpanReader, err = f.CreateArchiveSpanReader()
4446
require.NoError(t, err)
4547
s.ArchiveSpanWriter, err = f.CreateArchiveSpanWriter()

plugin/storage/integration/integration.go

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ import (
2727
"github.com/jaegertracing/jaeger/storage/dependencystore"
2828
"github.com/jaegertracing/jaeger/storage/samplingstore"
2929
"github.com/jaegertracing/jaeger/storage/spanstore"
30+
"github.com/jaegertracing/jaeger/storage_v2/tracestore"
31+
"github.com/jaegertracing/jaeger/storage_v2/v1adapter"
3032
)
3133

3234
//go:embed fixtures
@@ -42,7 +44,7 @@ var fixtures embed.FS
4244
// and RunAll() under different conditions.
4345
type StorageIntegration struct {
4446
SpanWriter spanstore.Writer
45-
SpanReader spanstore.Reader
47+
TraceReader tracestore.Reader
4648
ArchiveSpanReader spanstore.Reader
4749
ArchiveSpanWriter spanstore.Writer
4850
DependencyWriter dependencystore.Writer
@@ -79,7 +81,7 @@ type StorageIntegration struct {
7981
// the service name is formatted "query##-service".
8082
type QueryFixtures struct {
8183
Caption string
82-
Query *spanstore.TraceQueryParameters
84+
Query *tracestore.TraceQueryParams
8385
ExpectedFixtures []string
8486
}
8587

@@ -143,7 +145,7 @@ func (s *StorageIntegration) testGetServices(t *testing.T) {
143145
var actual []string
144146
found := s.waitForCondition(t, func(t *testing.T) bool {
145147
var err error
146-
actual, err = s.SpanReader.GetServices(context.Background())
148+
actual, err = s.TraceReader.GetServices(context.Background())
147149
if err != nil {
148150
t.Log(err)
149151
return false
@@ -154,9 +156,10 @@ func (s *StorageIntegration) testGetServices(t *testing.T) {
154156
// If the storage backend returns more services than expected, let's log traces for those
155157
t.Log("🛑 Found unexpected services!")
156158
for _, service := range actual {
157-
traces, err := s.SpanReader.FindTraces(context.Background(), &spanstore.TraceQueryParameters{
159+
iterTraces := s.TraceReader.FindTraces(context.Background(), tracestore.TraceQueryParams{
158160
ServiceName: service,
159161
})
162+
traces, err := v1adapter.V1TracesFromSeq2(iterTraces)
160163
if err != nil {
161164
t.Log(err)
162165
continue
@@ -214,10 +217,13 @@ func (s *StorageIntegration) testGetLargeSpan(t *testing.T) {
214217
expected := s.writeLargeTraceWithDuplicateSpanIds(t)
215218
expectedTraceID := expected.Spans[0].TraceID
216219

217-
var actual *model.Trace
220+
actual := &model.Trace{} // no spans
218221
found := s.waitForCondition(t, func(_ *testing.T) bool {
219-
var err error
220-
actual, err = s.SpanReader.GetTrace(context.Background(), spanstore.GetTraceParameters{TraceID: expectedTraceID})
222+
iterTraces := s.TraceReader.GetTraces(context.Background(), tracestore.GetTraceParams{TraceID: expectedTraceID.ToOTELTraceID()})
223+
traces, err := v1adapter.V1TracesFromSeq2(iterTraces)
224+
if len(traces) > 0 {
225+
actual = traces[0]
226+
}
221227
return err == nil && len(actual.Spans) >= len(expected.Spans)
222228
})
223229

@@ -242,27 +248,27 @@ func (s *StorageIntegration) testGetOperations(t *testing.T) {
242248
s.skipIfNeeded(t)
243249
defer s.cleanUp(t)
244250

245-
var expected []spanstore.Operation
251+
var expected []tracestore.Operation
246252
if s.GetOperationsMissingSpanKind {
247-
expected = []spanstore.Operation{
253+
expected = []tracestore.Operation{
248254
{Name: "example-operation-1"},
249255
{Name: "example-operation-3"},
250256
{Name: "example-operation-4"},
251257
}
252258
} else {
253-
expected = []spanstore.Operation{
259+
expected = []tracestore.Operation{
254260
{Name: "example-operation-1", SpanKind: ""},
255261
{Name: "example-operation-3", SpanKind: "server"},
256262
{Name: "example-operation-4", SpanKind: "client"},
257263
}
258264
}
259265
s.loadParseAndWriteExampleTrace(t)
260266

261-
var actual []spanstore.Operation
267+
var actual []tracestore.Operation
262268
found := s.waitForCondition(t, func(t *testing.T) bool {
263269
var err error
264-
actual, err = s.SpanReader.GetOperations(context.Background(),
265-
spanstore.OperationQueryParameters{ServiceName: "example-service-1"})
270+
actual, err = s.TraceReader.GetOperations(context.Background(),
271+
tracestore.OperationQueryParameters{ServiceName: "example-service-1"})
266272
if err != nil {
267273
t.Log(err)
268274
return false
@@ -287,24 +293,29 @@ func (s *StorageIntegration) testGetTrace(t *testing.T) {
287293
expected := s.loadParseAndWriteExampleTrace(t)
288294
expectedTraceID := expected.Spans[0].TraceID
289295

290-
var actual *model.Trace
296+
actual := &model.Trace{} // no spans
291297
found := s.waitForCondition(t, func(t *testing.T) bool {
292-
var err error
293-
actual, err = s.SpanReader.GetTrace(context.Background(), spanstore.GetTraceParameters{TraceID: expectedTraceID})
298+
iterTraces := s.TraceReader.GetTraces(context.Background(), tracestore.GetTraceParams{TraceID: expectedTraceID.ToOTELTraceID()})
299+
traces, err := v1adapter.V1TracesFromSeq2(iterTraces)
294300
if err != nil {
295301
t.Log(err)
302+
return false
303+
}
304+
if len(traces) > 0 {
305+
actual = traces[0]
296306
}
297-
return err == nil && len(actual.Spans) == len(expected.Spans)
307+
return len(actual.Spans) == len(expected.Spans)
298308
})
299309
if !assert.True(t, found) {
300310
CompareTraces(t, expected, actual)
301311
}
302312

303313
t.Run("NotFound error", func(t *testing.T) {
304314
fakeTraceID := model.TraceID{High: 0, Low: 1}
305-
trace, err := s.SpanReader.GetTrace(context.Background(), spanstore.GetTraceParameters{TraceID: fakeTraceID})
306-
assert.Equal(t, spanstore.ErrTraceNotFound, err)
307-
assert.Nil(t, trace)
315+
iterTraces := s.TraceReader.GetTraces(context.Background(), tracestore.GetTraceParams{TraceID: fakeTraceID.ToOTELTraceID()})
316+
traces, err := v1adapter.V1TracesFromSeq2(iterTraces)
317+
require.NoError(t, err) // v2 TraceReader no longer returns an error for not found
318+
assert.Empty(t, traces)
308319
})
309320
}
310321

@@ -342,11 +353,12 @@ func (s *StorageIntegration) testFindTraces(t *testing.T) {
342353
}
343354
}
344355

345-
func (s *StorageIntegration) findTracesByQuery(t *testing.T, query *spanstore.TraceQueryParameters, expected []*model.Trace) []*model.Trace {
356+
func (s *StorageIntegration) findTracesByQuery(t *testing.T, query *tracestore.TraceQueryParams, expected []*model.Trace) []*model.Trace {
346357
var traces []*model.Trace
347358
found := s.waitForCondition(t, func(t *testing.T) bool {
348359
var err error
349-
traces, err = s.SpanReader.FindTraces(context.Background(), query)
360+
iterTraces := s.TraceReader.FindTraces(context.Background(), *query)
361+
traces, err = v1adapter.V1TracesFromSeq2(iterTraces)
350362
if err != nil {
351363
t.Log(err)
352364
return false

plugin/storage/integration/kafka_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"github.com/jaegertracing/jaeger/plugin/storage/kafka"
2626
"github.com/jaegertracing/jaeger/plugin/storage/memory"
2727
"github.com/jaegertracing/jaeger/storage/spanstore"
28+
"github.com/jaegertracing/jaeger/storage_v2/v1adapter"
2829
)
2930

3031
const defaultLocalKafkaBroker = "127.0.0.1:9092"
@@ -91,7 +92,8 @@ func (s *KafkaIntegrationTestSuite) initialize(t *testing.T) {
9192
spanConsumer.Start()
9293

9394
s.SpanWriter = spanWriter
94-
s.SpanReader = &ingester{traceStore}
95+
spanReader := &ingester{traceStore}
96+
s.TraceReader = v1adapter.NewTraceReader(spanReader)
9597
s.CleanUp = func(_ *testing.T) {}
9698
s.SkipArchiveTest = true
9799
}

plugin/storage/integration/memstore_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
"github.com/jaegertracing/jaeger/pkg/testutils"
1313
"github.com/jaegertracing/jaeger/plugin/storage/memory"
14+
"github.com/jaegertracing/jaeger/storage_v2/v1adapter"
1415
)
1516

1617
type MemStorageIntegrationTestSuite struct {
@@ -24,7 +25,8 @@ func (s *MemStorageIntegrationTestSuite) initialize(_ *testing.T) {
2425
store := memory.NewStore()
2526
archiveStore := memory.NewStore()
2627
s.SamplingStore = memory.NewSamplingStore(2)
27-
s.SpanReader = store
28+
spanReader := store
29+
s.TraceReader = v1adapter.NewTraceReader(spanReader)
2830
s.SpanWriter = store
2931
s.ArchiveSpanReader = archiveStore
3032
s.ArchiveSpanWriter = archiveStore

storage_v2/v1adapter/translator.go

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,26 @@ import (
1010

1111
"github.com/jaegertracing/jaeger/internal/jptrace"
1212
"github.com/jaegertracing/jaeger/model"
13+
"github.com/jaegertracing/jaeger/pkg/iter"
1314
)
1415

15-
// ProtoFromTraces converts OpenTelemetry traces (ptrace.Traces)
16+
// V1BatchesFromTraces converts OpenTelemetry traces (ptrace.Traces)
1617
// to Jaeger model batches ([]*model.Batch).
17-
func ProtoFromTraces(traces ptrace.Traces) []*model.Batch {
18+
func V1BatchesFromTraces(traces ptrace.Traces) []*model.Batch {
1819
batches := jaegerTranslator.ProtoFromTraces(traces)
1920
spanMap := createSpanMapFromBatches(batches)
2021
transferWarningsToModelSpans(traces, spanMap)
2122
return batches
2223
}
2324

25+
// ProtoFromTraces converts OpenTelemetry traces (ptrace.Traces)
26+
// to Jaeger model batches ([]*model.Batch).
27+
//
28+
// TODO remove this function in favor of V1BatchesFromTraces
29+
func ProtoFromTraces(traces ptrace.Traces) []*model.Batch {
30+
return V1BatchesFromTraces(traces)
31+
}
32+
2433
// V1BatchesToTraces converts Jaeger model batches ([]*model.Batch)
2534
// to OpenTelemetry traces (ptrace.Traces).
2635
func V1BatchesToTraces(batches []*model.Batch) ptrace.Traces {
@@ -32,6 +41,42 @@ func V1BatchesToTraces(batches []*model.Batch) ptrace.Traces {
3241
return traces
3342
}
3443

44+
// V1TracesFromSeq2 converts an interator of ptrace.Traces chunks into v1 traces.
45+
func V1TracesFromSeq2(otelSeq iter.Seq2[[]ptrace.Traces, error]) ([]*model.Trace, error) {
46+
var (
47+
jaegerTraces []*model.Trace
48+
iterErr error
49+
)
50+
jptrace.AggregateTraces(otelSeq)(func(otelTrace ptrace.Traces, err error) bool {
51+
if err != nil {
52+
iterErr = err
53+
return false
54+
}
55+
jaegerTraces = append(jaegerTraces, modelTraceFromOtelTrace(otelTrace))
56+
return true
57+
})
58+
if iterErr != nil {
59+
return nil, iterErr
60+
}
61+
return jaegerTraces, nil
62+
}
63+
64+
// modelTraceFromOtelTrace extracts spans from otel traces
65+
func modelTraceFromOtelTrace(otelTrace ptrace.Traces) *model.Trace {
66+
var spans []*model.Span
67+
batches := V1BatchesFromTraces(otelTrace)
68+
for _, batch := range batches {
69+
for _, span := range batch.Spans {
70+
if span.Process == nil {
71+
proc := *batch.Process // shallow clone
72+
span.Process = &proc
73+
}
74+
spans = append(spans, span)
75+
}
76+
}
77+
return &model.Trace{Spans: spans}
78+
}
79+
3580
func createSpanMapFromBatches(batches []*model.Batch) map[model.SpanID]*model.Span {
3681
spanMap := make(map[model.SpanID]*model.Span)
3782
for _, batch := range batches {

0 commit comments

Comments
 (0)