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  }