From 9a57d68ecd12fd56a3f763d02134a4f8e725e02c Mon Sep 17 00:00:00 2001 From: toad Date: Sat, 1 Jun 2024 03:42:21 +0800 Subject: [PATCH] fix: NoopSpan should be instance --- trace/noop/noop.go | 4 +++- trace/noop/noop_test.go | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/trace/noop/noop.go b/trace/noop/noop.go index 1dfa52c5216c..64a4f1b362f6 100644 --- a/trace/noop/noop.go +++ b/trace/noop/noop.go @@ -67,11 +67,13 @@ func (t Tracer) Start(ctx context.Context, _ string, _ ...trace.SpanStartOption) span = Span{sc: sc} } else { // No parent, return a No-Op span with an empty span context. - span = Span{} + span = noopSpanInstance } return trace.ContextWithSpan(ctx, span), span } +var noopSpanInstance trace.Span = Span{} + // Span is an OpenTelemetry No-Op Span. type Span struct { embedded.Span diff --git a/trace/noop/noop_test.go b/trace/noop/noop_test.go index c228ad09918a..825ee670e039 100644 --- a/trace/noop/noop_test.go +++ b/trace/noop/noop_test.go @@ -101,6 +101,22 @@ func TestTracerStartPropagatesSpanContext(t *testing.T) { assert.False(t, span.IsRecording(), "recording span returned") } +func BenchmarkNoopInstance(b *testing.B) { + tracer := NewTracerProvider().Tracer("") + ctx := trace.ContextWithSpanContext(context.Background(), trace.SpanContext{}) + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + for j := 0; j < 10; j++ { + newCtx, span := tracer.Start(ctx, "") + ctx = newCtx + span.End() + } + } +} + type recordingSpan struct{ Span } func (recordingSpan) IsRecording() bool { return true }