context.go

 1// Copyright The OpenTelemetry Authors
 2// SPDX-License-Identifier: Apache-2.0
 3
 4package trace // import "go.opentelemetry.io/otel/trace"
 5
 6import "context"
 7
 8type traceContextKeyType int
 9
10const currentSpanKey traceContextKeyType = iota
11
12// ContextWithSpan returns a copy of parent with span set as the current Span.
13func ContextWithSpan(parent context.Context, span Span) context.Context {
14	return context.WithValue(parent, currentSpanKey, span)
15}
16
17// ContextWithSpanContext returns a copy of parent with sc as the current
18// Span. The Span implementation that wraps sc is non-recording and performs
19// no operations other than to return sc as the SpanContext from the
20// SpanContext method.
21func ContextWithSpanContext(parent context.Context, sc SpanContext) context.Context {
22	return ContextWithSpan(parent, nonRecordingSpan{sc: sc})
23}
24
25// ContextWithRemoteSpanContext returns a copy of parent with rsc set explicitly
26// as a remote SpanContext and as the current Span. The Span implementation
27// that wraps rsc is non-recording and performs no operations other than to
28// return rsc as the SpanContext from the SpanContext method.
29func ContextWithRemoteSpanContext(parent context.Context, rsc SpanContext) context.Context {
30	return ContextWithSpanContext(parent, rsc.WithRemote(true))
31}
32
33// SpanFromContext returns the current Span from ctx.
34//
35// If no Span is currently set in ctx an implementation of a Span that
36// performs no operations is returned.
37func SpanFromContext(ctx context.Context) Span {
38	if ctx == nil {
39		return noopSpanInstance
40	}
41	if span, ok := ctx.Value(currentSpanKey).(Span); ok {
42		return span
43	}
44	return noopSpanInstance
45}
46
47// SpanContextFromContext returns the current Span's SpanContext.
48func SpanContextFromContext(ctx context.Context) SpanContext {
49	return SpanFromContext(ctx).SpanContext()
50}