github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/internal/engine/telemetry/start_tracker_test.go (about)

     1  package telemetry
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  	"github.com/stretchr/testify/require"
    10  	sdktrace "go.opentelemetry.io/otel/sdk/trace"
    11  
    12  	"github.com/tilt-dev/tilt/internal/store"
    13  	"github.com/tilt-dev/tilt/pkg/model"
    14  )
    15  
    16  func TestStart(t *testing.T) {
    17  	ctx := context.Background()
    18  
    19  	fp := newFakeProcessor()
    20  
    21  	tp := sdktrace.NewTracerProvider()
    22  	tp.RegisterSpanProcessor(fp)
    23  	cst := NewStartTracker(tp.Tracer("tilt.dev/test"))
    24  
    25  	st := store.NewTestingStore()
    26  	manifest := model.Manifest{Name: "test"}
    27  	mt := store.NewManifestTarget(manifest)
    28  	engineState := store.EngineState{ManifestTargets: map[model.ManifestName]*store.ManifestTarget{
    29  		model.ManifestName("test"): mt,
    30  	}}
    31  	st.SetState(engineState)
    32  	_ = cst.OnChange(ctx, st, store.LegacyChangeSummary())
    33  
    34  	// first run span should be started
    35  	span, exists := fp.spans["first_run"]
    36  	require.True(t, exists)
    37  	assert.Zero(t, span.EndTime())
    38  
    39  	// first run span should still not be ended
    40  	_ = cst.OnChange(ctx, st, store.LegacyChangeSummary())
    41  	span, exists = fp.spans["first_run"]
    42  	require.True(t, exists)
    43  	assert.Zero(t, span.EndTime())
    44  
    45  	engineState.CompletedBuildCount = 1
    46  	engineState.ManifestTargets[manifest.ManifestName()].State.BuildHistory = append(engineState.ManifestTargets[manifest.ManifestName()].State.BuildHistory, model.BuildRecord{StartTime: time.Now()})
    47  	st.SetState(engineState)
    48  	_ = cst.OnChange(ctx, st, store.LegacyChangeSummary())
    49  
    50  	// first run span should be ended
    51  	span, exists = fp.spans["first_run"]
    52  	require.True(t, exists)
    53  	assert.NotZero(t, span.EndTime())
    54  
    55  	_ = cst.OnChange(ctx, st, store.LegacyChangeSummary())
    56  
    57  	// first run span should still be ended
    58  	span, exists = fp.spans["first_run"]
    59  	require.True(t, exists)
    60  	assert.NotZero(t, span.EndTime())
    61  }
    62  
    63  type capturingProcessor struct {
    64  	spans     map[string]sdktrace.ReadOnlySpan
    65  	processor sdktrace.SpanProcessor
    66  }
    67  
    68  func (f *capturingProcessor) OnStart(parent context.Context, s sdktrace.ReadWriteSpan) {
    69  	f.processor.OnStart(parent, s)
    70  	f.spans[s.Name()] = s
    71  }
    72  
    73  func (f *capturingProcessor) OnEnd(s sdktrace.ReadOnlySpan) {
    74  	f.processor.OnEnd(s)
    75  	f.spans[s.Name()] = s
    76  }
    77  
    78  func (f *capturingProcessor) Shutdown(ctx context.Context) error {
    79  	return f.processor.Shutdown(ctx)
    80  }
    81  
    82  func (f *capturingProcessor) ForceFlush(ctx context.Context) error {
    83  	return f.processor.ForceFlush(ctx)
    84  }
    85  
    86  func newFakeProcessor() *capturingProcessor {
    87  	return &capturingProcessor{
    88  		spans:     make(map[string]sdktrace.ReadOnlySpan),
    89  		processor: sdktrace.NewSimpleSpanProcessor(nil),
    90  	}
    91  }
    92  
    93  var _ sdktrace.SpanProcessor = &capturingProcessor{}