2021-08-09 07:19:24 +00:00
|
|
|
// Copyright The OpenTelemetry Authors
|
2024-08-19 08:01:33 +00:00
|
|
|
// SPDX-License-Identifier: Apache-2.0
|
2021-08-09 07:19:24 +00:00
|
|
|
|
|
|
|
package trace // import "go.opentelemetry.io/otel/trace"
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
|
|
|
|
"go.opentelemetry.io/otel/attribute"
|
|
|
|
"go.opentelemetry.io/otel/codes"
|
2023-12-21 14:13:18 +00:00
|
|
|
"go.opentelemetry.io/otel/trace/embedded"
|
2021-08-09 07:19:24 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// NewNoopTracerProvider returns an implementation of TracerProvider that
|
|
|
|
// performs no operations. The Tracer and Spans created from the returned
|
|
|
|
// TracerProvider also perform no operations.
|
2023-12-21 14:13:18 +00:00
|
|
|
//
|
|
|
|
// Deprecated: Use [go.opentelemetry.io/otel/trace/noop.NewTracerProvider]
|
|
|
|
// instead.
|
2021-08-09 07:19:24 +00:00
|
|
|
func NewNoopTracerProvider() TracerProvider {
|
|
|
|
return noopTracerProvider{}
|
|
|
|
}
|
|
|
|
|
2023-12-21 14:13:18 +00:00
|
|
|
type noopTracerProvider struct{ embedded.TracerProvider }
|
2021-08-09 07:19:24 +00:00
|
|
|
|
|
|
|
var _ TracerProvider = noopTracerProvider{}
|
|
|
|
|
|
|
|
// Tracer returns noop implementation of Tracer.
|
|
|
|
func (p noopTracerProvider) Tracer(string, ...TracerOption) Tracer {
|
|
|
|
return noopTracer{}
|
|
|
|
}
|
|
|
|
|
2023-12-18 20:31:00 +00:00
|
|
|
// noopTracer is an implementation of Tracer that performs no operations.
|
2023-12-21 14:13:18 +00:00
|
|
|
type noopTracer struct{ embedded.Tracer }
|
2021-08-09 07:19:24 +00:00
|
|
|
|
|
|
|
var _ Tracer = noopTracer{}
|
|
|
|
|
2023-02-01 17:06:36 +00:00
|
|
|
// Start carries forward a non-recording Span, if one is present in the context, otherwise it
|
|
|
|
// creates a no-op Span.
|
|
|
|
func (t noopTracer) Start(ctx context.Context, name string, _ ...SpanStartOption) (context.Context, Span) {
|
|
|
|
span := SpanFromContext(ctx)
|
|
|
|
if _, ok := span.(nonRecordingSpan); !ok {
|
|
|
|
// span is likely already a noopSpan, but let's be sure
|
2024-08-19 08:01:33 +00:00
|
|
|
span = noopSpanInstance
|
2023-02-01 17:06:36 +00:00
|
|
|
}
|
2021-08-09 07:19:24 +00:00
|
|
|
return ContextWithSpan(ctx, span), span
|
|
|
|
}
|
|
|
|
|
2023-12-18 20:31:00 +00:00
|
|
|
// noopSpan is an implementation of Span that performs no operations.
|
2023-12-21 14:13:18 +00:00
|
|
|
type noopSpan struct{ embedded.Span }
|
2021-08-09 07:19:24 +00:00
|
|
|
|
2024-08-19 08:01:33 +00:00
|
|
|
var noopSpanInstance Span = noopSpan{}
|
2021-08-09 07:19:24 +00:00
|
|
|
|
|
|
|
// SpanContext returns an empty span context.
|
|
|
|
func (noopSpan) SpanContext() SpanContext { return SpanContext{} }
|
|
|
|
|
|
|
|
// IsRecording always returns false.
|
|
|
|
func (noopSpan) IsRecording() bool { return false }
|
|
|
|
|
|
|
|
// SetStatus does nothing.
|
|
|
|
func (noopSpan) SetStatus(codes.Code, string) {}
|
|
|
|
|
|
|
|
// SetError does nothing.
|
|
|
|
func (noopSpan) SetError(bool) {}
|
|
|
|
|
|
|
|
// SetAttributes does nothing.
|
|
|
|
func (noopSpan) SetAttributes(...attribute.KeyValue) {}
|
|
|
|
|
|
|
|
// End does nothing.
|
2023-02-01 17:06:36 +00:00
|
|
|
func (noopSpan) End(...SpanEndOption) {}
|
2021-08-09 07:19:24 +00:00
|
|
|
|
|
|
|
// RecordError does nothing.
|
|
|
|
func (noopSpan) RecordError(error, ...EventOption) {}
|
|
|
|
|
|
|
|
// AddEvent does nothing.
|
|
|
|
func (noopSpan) AddEvent(string, ...EventOption) {}
|
|
|
|
|
2024-08-19 08:01:33 +00:00
|
|
|
// AddLink does nothing.
|
|
|
|
func (noopSpan) AddLink(Link) {}
|
|
|
|
|
2021-08-09 07:19:24 +00:00
|
|
|
// SetName does nothing.
|
|
|
|
func (noopSpan) SetName(string) {}
|
2023-02-01 17:06:36 +00:00
|
|
|
|
|
|
|
// TracerProvider returns a no-op TracerProvider.
|
|
|
|
func (noopSpan) TracerProvider() TracerProvider { return noopTracerProvider{} }
|