44 "bytes"
55 "context"
66 "fmt"
7+ "log"
78 "math"
89 "os"
910 "testing"
@@ -12,6 +13,13 @@ import (
1213 "github.com/prometheus/client_golang/prometheus/testutil"
1314 "github.com/segmentio/parquet-go"
1415 "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"
1523)
1624
1725const MaxDefinitionLevel = 5
@@ -368,7 +376,109 @@ func createFileWith[T any](t testing.TB, rows []T, rowGroups int) *parquet.File
368376 return pf
369377}
370378
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+
371476func TestBinaryJoinIterator (t * testing.T ) {
477+ tr := otel .Tracer ("query" )
478+
479+ _ , span := tr .Start (context .Background (), "TestBinaryJoinIterator" )
480+ defer span .End ()
481+
372482 rowCount := 1600
373483 pf := createProfileLikeFile (t , rowCount )
374484
@@ -438,8 +548,11 @@ func TestBinaryJoinIterator(t *testing.T) {
438548 metrics .pageReadsTotal .WithLabelValues ("ts" , "TimeNanos" ).Add (0 )
439549 ctx = AddMetricsToContext (ctx , metrics )
440550
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 ()
443556
444557 it := NewBinaryJoinIterator (
445558 0 ,
@@ -449,6 +562,9 @@ func TestBinaryJoinIterator(t *testing.T) {
449562
450563 results := 0
451564 for it .Next () {
565+ span .AddEvent ("match" , trace .WithAttributes (
566+ attribute .Stringer ("element" , it .At ()),
567+ ))
452568 results ++
453569 }
454570 require .NoError (t , it .Err ())
0 commit comments