github.com/blend/go-sdk@v1.20240719.1/tracing/oauthtrace/tracer.go (about) 1 /* 2 3 Copyright (c) 2024 - Present. Blend Labs, Inc. All rights reserved 4 Use of this source code is governed by a MIT license that can be found in the LICENSE file. 5 6 */ 7 8 package oauthtrace 9 10 import ( 11 "context" 12 "time" 13 14 opentracing "github.com/opentracing/opentracing-go" 15 opentracingExt "github.com/opentracing/opentracing-go/ext" 16 17 "golang.org/x/oauth2" 18 19 "github.com/blend/go-sdk/oauth" 20 "github.com/blend/go-sdk/tracing" 21 ) 22 23 var ( 24 _ oauth.Tracer = (*oauthTracer)(nil) 25 _ oauth.TraceFinisher = (*oauthTraceFinisher)(nil) 26 ) 27 28 // Tracer returns a request tracer that also injects span context into outgoing headers. 29 func Tracer(tracer opentracing.Tracer) oauth.Tracer { 30 return &oauthTracer{tracer: tracer} 31 } 32 33 type oauthTracer struct { 34 tracer opentracing.Tracer 35 } 36 37 func (t oauthTracer) Start(ctx context.Context, config *oauth2.Config) oauth.TraceFinisher { 38 startOptions := []opentracing.StartSpanOption{ 39 opentracingExt.SpanKindRPCClient, 40 opentracing.Tag{Key: tracing.TagKeySpanType, Value: tracing.SpanTypeHTTP}, 41 tracing.TagMeasured(), 42 opentracing.StartTime(time.Now().UTC()), 43 } 44 span, _ := tracing.StartSpanFromContext(ctx, t.tracer, tracing.OperationHTTPRequestOutgoing, startOptions...) 45 return oauthTraceFinisher{span: span} 46 } 47 48 type oauthTraceFinisher struct { 49 span opentracing.Span 50 } 51 52 func (of oauthTraceFinisher) Finish(ctx context.Context, config *oauth2.Config, result *oauth.Result, err error) { 53 if of.span == nil { 54 return 55 } 56 tracing.SpanError(of.span, err) 57 if result != nil { 58 of.span.SetTag(tracing.TagKeyOAuthUsername, result.Profile.Email) 59 } 60 of.span.Finish() 61 }