50 lines
		
	
	
		
			994 B
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			50 lines
		
	
	
		
			994 B
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package spancontext
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"context"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									opentracing "github.com/opentracing/opentracing-go"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func WithContext(ctx context.Context, sctx opentracing.SpanContext) context.Context {
							 | 
						||
| 
								 | 
							
									return context.WithValue(ctx, "span_context", sctx)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func FromContext(ctx context.Context) opentracing.SpanContext {
							 | 
						||
| 
								 | 
							
									sctx, ok := ctx.Value("span_context").(opentracing.SpanContext)
							 | 
						||
| 
								 | 
							
									if ok {
							 | 
						||
| 
								 | 
							
										return sctx
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return nil
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func StartSpan(ctx context.Context, name string) (context.Context, opentracing.Span) {
							 | 
						||
| 
								 | 
							
									tracer := opentracing.GlobalTracer()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									sctx := FromContext(ctx)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var sp opentracing.Span
							 | 
						||
| 
								 | 
							
									if sctx != nil {
							 | 
						||
| 
								 | 
							
										sp = tracer.StartSpan(
							 | 
						||
| 
								 | 
							
											name,
							 | 
						||
| 
								 | 
							
											opentracing.ChildOf(sctx))
							 | 
						||
| 
								 | 
							
									} else {
							 | 
						||
| 
								 | 
							
										sp = tracer.StartSpan(name)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									nctx := context.WithValue(ctx, "span_context", sp.Context())
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return nctx, sp
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func StartSpanFrom(name string, sctx opentracing.SpanContext) opentracing.Span {
							 | 
						||
| 
								 | 
							
									tracer := opentracing.GlobalTracer()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									sp := tracer.StartSpan(
							 | 
						||
| 
								 | 
							
										name,
							 | 
						||
| 
								 | 
							
										opentracing.ChildOf(sctx))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return sp
							 | 
						||
| 
								 | 
							
								}
							 |