noop.go raw
1 // Copyright The OpenTelemetry Authors
2 // SPDX-License-Identifier: Apache-2.0
3
4 package trace // import "go.opentelemetry.io/otel/trace"
5
6 import (
7 "context"
8
9 "go.opentelemetry.io/otel/attribute"
10 "go.opentelemetry.io/otel/codes"
11 "go.opentelemetry.io/otel/trace/embedded"
12 )
13
14 // NewNoopTracerProvider returns an implementation of TracerProvider that
15 // performs no operations. The Tracer and Spans created from the returned
16 // TracerProvider also perform no operations.
17 //
18 // Deprecated: Use [go.opentelemetry.io/otel/trace/noop.NewTracerProvider]
19 // instead.
20 func NewNoopTracerProvider() TracerProvider {
21 return noopTracerProvider{}
22 }
23
24 type noopTracerProvider struct{ embedded.TracerProvider }
25
26 var _ TracerProvider = noopTracerProvider{}
27
28 // Tracer returns noop implementation of Tracer.
29 func (noopTracerProvider) Tracer(string, ...TracerOption) Tracer {
30 return noopTracer{}
31 }
32
33 // noopTracer is an implementation of Tracer that performs no operations.
34 type noopTracer struct{ embedded.Tracer }
35
36 var _ Tracer = noopTracer{}
37
38 // Start carries forward a non-recording Span, if one is present in the context, otherwise it
39 // creates a no-op Span.
40 func (noopTracer) Start(ctx context.Context, _ string, _ ...SpanStartOption) (context.Context, Span) {
41 span := SpanFromContext(ctx)
42 if _, ok := span.(nonRecordingSpan); !ok {
43 // span is likely already a noopSpan, but let's be sure
44 span = noopSpanInstance
45 }
46 return ContextWithSpan(ctx, span), span
47 }
48
49 // noopSpan is an implementation of Span that performs no operations.
50 type noopSpan struct{ embedded.Span }
51
52 var noopSpanInstance Span = noopSpan{}
53
54 // SpanContext returns an empty span context.
55 func (noopSpan) SpanContext() SpanContext { return SpanContext{} }
56
57 // IsRecording always returns false.
58 func (noopSpan) IsRecording() bool { return false }
59
60 // SetStatus does nothing.
61 func (noopSpan) SetStatus(codes.Code, string) {}
62
63 // SetError does nothing.
64 func (noopSpan) SetError(bool) {}
65
66 // SetAttributes does nothing.
67 func (noopSpan) SetAttributes(...attribute.KeyValue) {}
68
69 // End does nothing.
70 func (noopSpan) End(...SpanEndOption) {}
71
72 // RecordError does nothing.
73 func (noopSpan) RecordError(error, ...EventOption) {}
74
75 // AddEvent does nothing.
76 func (noopSpan) AddEvent(string, ...EventOption) {}
77
78 // AddLink does nothing.
79 func (noopSpan) AddLink(Link) {}
80
81 // SetName does nothing.
82 func (noopSpan) SetName(string) {}
83
84 // TracerProvider returns a no-op TracerProvider.
85 func (s noopSpan) TracerProvider() TracerProvider {
86 return s.tracerProvider(autoInstEnabled)
87 }
88
89 // autoInstEnabled defines if the auto-instrumentation SDK is enabled.
90 //
91 // The auto-instrumentation is expected to overwrite this value to true when it
92 // attaches to the process.
93 var autoInstEnabled = new(bool)
94
95 // tracerProvider return a noopTracerProvider if autoEnabled is false,
96 // otherwise it will return a TracerProvider from the sdk package used in
97 // auto-instrumentation.
98 //
99 //go:noinline
100 func (noopSpan) tracerProvider(autoEnabled *bool) TracerProvider {
101 if *autoEnabled {
102 return newAutoTracerProvider()
103 }
104 return noopTracerProvider{}
105 }
106