4
4
"bytes"
5
5
"context"
6
6
"fmt"
7
+ "log"
7
8
"math"
8
9
"os"
9
10
"testing"
@@ -12,6 +13,13 @@ import (
12
13
"github.com/prometheus/client_golang/prometheus/testutil"
13
14
"github.com/segmentio/parquet-go"
14
15
"github.com/stretchr/testify/require"
16
+ "go.opentelemetry.io/otel"
17
+ "go.opentelemetry.io/otel/attribute"
18
+ "go.opentelemetry.io/otel/exporters/jaeger"
19
+ "go.opentelemetry.io/otel/sdk/resource"
20
+ tracesdk "go.opentelemetry.io/otel/sdk/trace"
21
+ semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
22
+ "go.opentelemetry.io/otel/trace"
15
23
)
16
24
17
25
const MaxDefinitionLevel = 5
@@ -368,7 +376,109 @@ func createFileWith[T any](t testing.TB, rows []T, rowGroups int) *parquet.File
368
376
return pf
369
377
}
370
378
379
+ type iteratorTracer struct {
380
+ it Iterator
381
+ span trace.Span
382
+ name string
383
+ nextCount uint32
384
+ seekCount uint32
385
+ }
386
+
387
+ func (i iteratorTracer ) Next () bool {
388
+ i .nextCount ++
389
+ posBefore := i .it .At ()
390
+ result := i .it .Next ()
391
+ posAfter := i .it .At ()
392
+ i .span .AddEvent ("next" , trace .WithAttributes (
393
+ attribute .String ("column" , i .name ),
394
+ attribute .Bool ("result" , result ),
395
+ attribute .Stringer ("posBefore" , posBefore ),
396
+ attribute .Stringer ("posAfter" , posAfter ),
397
+ ))
398
+ return result
399
+ }
400
+
401
+ func (i iteratorTracer ) At () * IteratorResult {
402
+ return i .it .At ()
403
+ }
404
+
405
+ func (i iteratorTracer ) Err () error {
406
+ return i .it .Err ()
407
+ }
408
+
409
+ func (i iteratorTracer ) Close () error {
410
+ return i .it .Close ()
411
+ }
412
+
413
+ func (i iteratorTracer ) Seek (pos RowNumberWithDefinitionLevel ) bool {
414
+ i .seekCount ++
415
+ posBefore := i .it .At ()
416
+ result := i .it .Seek (pos )
417
+ posAfter := i .it .At ()
418
+ i .span .AddEvent ("seek" , trace .WithAttributes (
419
+ attribute .String ("column" , i .name ),
420
+ attribute .Bool ("result" , result ),
421
+ attribute .Stringer ("seekTo" , & pos ),
422
+ attribute .Stringer ("posBefore" , posBefore ),
423
+ attribute .Stringer ("posAfter" , posAfter ),
424
+ ))
425
+ return result
426
+ }
427
+
428
+ func newIteratorTracer (span trace.Span , name string , it Iterator ) Iterator {
429
+ return & iteratorTracer {
430
+ span : span ,
431
+ name : name ,
432
+ it : it ,
433
+ }
434
+ }
435
+
436
+ // tracerProvider returns an OpenTelemetry TracerProvider configured to use
437
+ // the Jaeger exporter that will send spans to the provided url. The returned
438
+ // TracerProvider will also use a Resource configured with all the information
439
+ // about the application.
440
+ func tracerProvider (url string ) (* tracesdk.TracerProvider , error ) {
441
+ // Create the Jaeger exporter
442
+ exp , err := jaeger .New (jaeger .WithCollectorEndpoint (jaeger .WithEndpoint (url )))
443
+ if err != nil {
444
+ return nil , err
445
+ }
446
+ tp := tracesdk .NewTracerProvider (
447
+ // Always be sure to batch in production.
448
+ tracesdk .WithBatcher (exp ),
449
+ // Record information about this application in a Resource.
450
+ tracesdk .WithResource (resource .NewWithAttributes (
451
+ semconv .SchemaURL ,
452
+ semconv .ServiceName ("phlare-go-test" ),
453
+ )),
454
+ )
455
+ return tp , nil
456
+ }
457
+
458
+ func TestMain (m * testing.M ) {
459
+ tp , err := tracerProvider ("http://localhost:14268/api/traces" )
460
+ if err != nil {
461
+ log .Fatal (err )
462
+ }
463
+
464
+ // Register our TracerProvider as the global so any imported
465
+ // instrumentation in the future will default to using it.
466
+ otel .SetTracerProvider (tp )
467
+
468
+ result := m .Run ()
469
+
470
+ fmt .Println ("shutting tracer down" )
471
+ tp .Shutdown (context .Background ())
472
+
473
+ os .Exit (result )
474
+ }
475
+
371
476
func TestBinaryJoinIterator (t * testing.T ) {
477
+ tr := otel .Tracer ("query" )
478
+
479
+ _ , span := tr .Start (context .Background (), "TestBinaryJoinIterator" )
480
+ defer span .End ()
481
+
372
482
rowCount := 1600
373
483
pf := createProfileLikeFile (t , rowCount )
374
484
@@ -438,8 +548,11 @@ func TestBinaryJoinIterator(t *testing.T) {
438
548
metrics .pageReadsTotal .WithLabelValues ("ts" , "TimeNanos" ).Add (0 )
439
549
ctx = AddMetricsToContext (ctx , metrics )
440
550
441
- seriesIt := NewSyncIterator (ctx , pf .RowGroups (), 0 , "SeriesId" , 1000 , tc .seriesPredicate , "SeriesId" )
442
- timeIt := NewSyncIterator (ctx , pf .RowGroups (), 1 , "TimeNanos" , 1000 , tc .timePredicate , "TimeNanos" )
551
+ seriesIt := newIteratorTracer (span , "SeriesID" , NewSyncIterator (ctx , pf .RowGroups (), 0 , "SeriesId" , 1000 , tc .seriesPredicate , "SeriesId" ))
552
+ timeIt := newIteratorTracer (span , "TimeNanos" , NewSyncIterator (ctx , pf .RowGroups (), 1 , "TimeNanos" , 1000 , tc .timePredicate , "TimeNanos" ))
553
+
554
+ ctx , span := tr .Start (ctx , t .Name ())
555
+ defer span .End ()
443
556
444
557
it := NewBinaryJoinIterator (
445
558
0 ,
@@ -449,6 +562,9 @@ func TestBinaryJoinIterator(t *testing.T) {
449
562
450
563
results := 0
451
564
for it .Next () {
565
+ span .AddEvent ("match" , trace .WithAttributes (
566
+ attribute .Stringer ("element" , it .At ()),
567
+ ))
452
568
results ++
453
569
}
454
570
require .NoError (t , it .Err ())
0 commit comments