| 
									
										
										
										
											2023-05-09 19:19:48 +02:00
										 |  |  | // Copyright The OpenTelemetry Authors | 
					
						
							| 
									
										
										
										
											2024-04-11 11:46:18 +02:00
										 |  |  | // SPDX-License-Identifier: Apache-2.0 | 
					
						
							| 
									
										
										
										
											2023-05-09 19:19:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | package trace // import "go.opentelemetry.io/otel/trace" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import "context" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type traceContextKeyType int | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const currentSpanKey traceContextKeyType = iota | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // ContextWithSpan returns a copy of parent with span set as the current Span. | 
					
						
							|  |  |  | func ContextWithSpan(parent context.Context, span Span) context.Context { | 
					
						
							|  |  |  | 	return context.WithValue(parent, currentSpanKey, span) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // ContextWithSpanContext returns a copy of parent with sc as the current | 
					
						
							|  |  |  | // Span. The Span implementation that wraps sc is non-recording and performs | 
					
						
							|  |  |  | // no operations other than to return sc as the SpanContext from the | 
					
						
							|  |  |  | // SpanContext method. | 
					
						
							|  |  |  | func ContextWithSpanContext(parent context.Context, sc SpanContext) context.Context { | 
					
						
							|  |  |  | 	return ContextWithSpan(parent, nonRecordingSpan{sc: sc}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-02-06 12:14:37 +01:00
										 |  |  | // ContextWithRemoteSpanContext returns a copy of parent with rsc set explicitly | 
					
						
							| 
									
										
										
										
											2023-05-09 19:19:48 +02:00
										 |  |  | // as a remote SpanContext and as the current Span. The Span implementation | 
					
						
							|  |  |  | // that wraps rsc is non-recording and performs no operations other than to | 
					
						
							|  |  |  | // return rsc as the SpanContext from the SpanContext method. | 
					
						
							|  |  |  | func ContextWithRemoteSpanContext(parent context.Context, rsc SpanContext) context.Context { | 
					
						
							|  |  |  | 	return ContextWithSpanContext(parent, rsc.WithRemote(true)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // SpanFromContext returns the current Span from ctx. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // If no Span is currently set in ctx an implementation of a Span that | 
					
						
							|  |  |  | // performs no operations is returned. | 
					
						
							|  |  |  | func SpanFromContext(ctx context.Context) Span { | 
					
						
							|  |  |  | 	if ctx == nil { | 
					
						
							| 
									
										
										
										
											2024-04-11 11:46:18 +02:00
										 |  |  | 		return noopSpanInstance | 
					
						
							| 
									
										
										
										
											2023-05-09 19:19:48 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	if span, ok := ctx.Value(currentSpanKey).(Span); ok { | 
					
						
							|  |  |  | 		return span | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-04-11 11:46:18 +02:00
										 |  |  | 	return noopSpanInstance | 
					
						
							| 
									
										
										
										
											2023-05-09 19:19:48 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // SpanContextFromContext returns the current Span's SpanContext. | 
					
						
							|  |  |  | func SpanContextFromContext(ctx context.Context) SpanContext { | 
					
						
							|  |  |  | 	return SpanFromContext(ctx).SpanContext() | 
					
						
							|  |  |  | } |