github.com/blend/go-sdk@v1.20240719.1/tracing/r2trace/tracer_test.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 r2trace 9 10 import ( 11 "context" 12 "fmt" 13 "net/http" 14 "testing" 15 "time" 16 17 opentracing "github.com/opentracing/opentracing-go" 18 opentracingExt "github.com/opentracing/opentracing-go/ext" 19 20 "github.com/opentracing/opentracing-go/mocktracer" 21 22 "github.com/blend/go-sdk/assert" 23 "github.com/blend/go-sdk/r2" 24 "github.com/blend/go-sdk/tracing" 25 ) 26 27 func TestStart(t *testing.T) { 28 assert := assert.New(t) 29 mockTracer := mocktracer.New() 30 reqTracer := Tracer(mockTracer) 31 32 req := r2.New("https://foo.com/bar", r2.OptHeader(make(http.Header))) 33 rtf := reqTracer.Start(req.Request) 34 35 spanContext, err := mockTracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Request.Header)) 36 assert.Nil(err) 37 mockSpanContext := spanContext.(mocktracer.MockSpanContext) 38 39 span := rtf.(r2TraceFinisher).span 40 mockSpan := span.(*mocktracer.MockSpan) 41 assert.Equal(mockSpanContext.SpanID, mockSpan.SpanContext.SpanID) 42 assert.Equal(tracing.OperationHTTPRequestOutgoing, mockSpan.OperationName) 43 44 assert.Len(mockSpan.Tags(), 6) 45 assert.Equal(tracing.SpanTypeHTTP, mockSpan.Tags()[tracing.TagKeySpanType]) 46 assert.Equal(opentracingExt.SpanKindRPCClientEnum, mockSpan.Tags()[string(opentracingExt.SpanKind)]) 47 assert.True(mockSpan.FinishTime.IsZero()) 48 } 49 50 func TestStartNoHeader(t *testing.T) { 51 assert := assert.New(t) 52 mockTracer := mocktracer.New() 53 reqTracer := Tracer(mockTracer) 54 55 req := r2.New("https://foo.com/bar") 56 rtf := reqTracer.Start(req.Request) 57 58 spanContext, err := mockTracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Request.Header)) 59 assert.Nil(err) 60 mockSpanContext := spanContext.(mocktracer.MockSpanContext) 61 62 span := rtf.(r2TraceFinisher).span 63 mockSpan := span.(*mocktracer.MockSpan) 64 assert.Equal(mockSpanContext.SpanID, mockSpan.SpanContext.SpanID) 65 assert.Equal(tracing.OperationHTTPRequestOutgoing, mockSpan.OperationName) 66 67 assert.Len(mockSpan.Tags(), 6) 68 assert.Equal(tracing.SpanTypeHTTP, mockSpan.Tags()[tracing.TagKeySpanType]) 69 assert.Equal(opentracingExt.SpanKindRPCClientEnum, mockSpan.Tags()[string(opentracingExt.SpanKind)]) 70 assert.True(mockSpan.FinishTime.IsZero()) 71 } 72 73 func TestStartWithParentSpan(t *testing.T) { 74 assert := assert.New(t) 75 mockTracer := mocktracer.New() 76 reqTracer := Tracer(mockTracer) 77 78 parentSpan := mockTracer.StartSpan("test_op") 79 ctx := opentracing.ContextWithSpan(context.Background(), parentSpan) 80 81 req := r2.New("https://foo.com/bar", r2.OptContext(ctx)) 82 rtf := reqTracer.Start(req.Request) 83 84 span := rtf.(r2TraceFinisher).span 85 mockSpan := span.(*mocktracer.MockSpan) 86 assert.Equal(tracing.OperationHTTPRequestOutgoing, mockSpan.OperationName) 87 88 mockParentSpan := parentSpan.(*mocktracer.MockSpan) 89 assert.Equal(mockSpan.ParentID, mockParentSpan.SpanContext.SpanID) 90 } 91 92 func TestStartParameterizedPath(t *testing.T) { 93 assert := assert.New(t) 94 mockTracer := mocktracer.New() 95 reqTracer := Tracer(mockTracer) 96 97 req := r2.New("https://foo.com/", r2.OptHeader(make(http.Header)), r2.OptPathParameterized("bar/:bar_id", map[string]string{"bar_id": "123"})) 98 rtf := reqTracer.Start(req.Request) 99 100 spanContext, err := mockTracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Request.Header)) 101 assert.Nil(err) 102 mockSpanContext := spanContext.(mocktracer.MockSpanContext) 103 104 span := rtf.(r2TraceFinisher).span 105 mockSpan := span.(*mocktracer.MockSpan) 106 assert.Equal(mockSpanContext.SpanID, mockSpan.SpanContext.SpanID) 107 assert.Equal(tracing.OperationHTTPRequestOutgoing, mockSpan.OperationName) 108 109 assert.Len(mockSpan.Tags(), 6) 110 assert.Equal(tracing.SpanTypeHTTP, mockSpan.Tags()[tracing.TagKeySpanType]) 111 assert.Equal(opentracingExt.SpanKindRPCClientEnum, mockSpan.Tags()[string(opentracingExt.SpanKind)]) 112 assert.Equal("https://foo.com/bar/:bar_id", mockSpan.Tags()[tracing.TagKeyResourceName]) 113 assert.True(mockSpan.FinishTime.IsZero()) 114 } 115 116 func TestStartParameterizedPathAndServiceHostName(t *testing.T) { 117 assert := assert.New(t) 118 mockTracer := mocktracer.New() 119 reqTracer := Tracer(mockTracer) 120 121 req := r2.New("https://foo.com/", r2.OptHeader(make(http.Header)), r2.OptPathParameterized("bar/:bar_id", map[string]string{"bar_id": "123"}), r2.OptServiceHostName("somehost")) 122 rtf := reqTracer.Start(req.Request) 123 124 spanContext, err := mockTracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Request.Header)) 125 assert.Nil(err) 126 mockSpanContext := spanContext.(mocktracer.MockSpanContext) 127 128 span := rtf.(r2TraceFinisher).span 129 mockSpan := span.(*mocktracer.MockSpan) 130 assert.Equal(mockSpanContext.SpanID, mockSpan.SpanContext.SpanID) 131 assert.Equal(tracing.OperationHTTPRequestOutgoing, mockSpan.OperationName) 132 133 assert.Len(mockSpan.Tags(), 6) 134 assert.Equal(tracing.SpanTypeHTTP, mockSpan.Tags()[tracing.TagKeySpanType]) 135 assert.Equal(opentracingExt.SpanKindRPCClientEnum, mockSpan.Tags()[string(opentracingExt.SpanKind)]) 136 assert.Equal("https://{somehost}/bar/:bar_id", mockSpan.Tags()[tracing.TagKeyResourceName]) 137 assert.True(mockSpan.FinishTime.IsZero()) 138 } 139 140 func TestStartServiceHostName(t *testing.T) { 141 assert := assert.New(t) 142 mockTracer := mocktracer.New() 143 reqTracer := Tracer(mockTracer) 144 145 req := r2.New("https://foo.com/og/url", r2.OptHeader(make(http.Header)), r2.OptServiceHostName("somehost")) 146 rtf := reqTracer.Start(req.Request) 147 148 spanContext, err := mockTracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Request.Header)) 149 assert.Nil(err) 150 mockSpanContext := spanContext.(mocktracer.MockSpanContext) 151 152 span := rtf.(r2TraceFinisher).span 153 mockSpan := span.(*mocktracer.MockSpan) 154 assert.Equal(mockSpanContext.SpanID, mockSpan.SpanContext.SpanID) 155 assert.Equal(tracing.OperationHTTPRequestOutgoing, mockSpan.OperationName) 156 157 assert.Len(mockSpan.Tags(), 6) 158 assert.Equal(tracing.SpanTypeHTTP, mockSpan.Tags()[tracing.TagKeySpanType]) 159 assert.Equal(opentracingExt.SpanKindRPCClientEnum, mockSpan.Tags()[string(opentracingExt.SpanKind)]) 160 assert.Equal("https://{somehost}/og/url", mockSpan.Tags()[tracing.TagKeyResourceName]) 161 assert.True(mockSpan.FinishTime.IsZero()) 162 } 163 164 func TestFinish(t *testing.T) { 165 assert := assert.New(t) 166 mockTracer := mocktracer.New() 167 reqTracer := Tracer(mockTracer) 168 169 req := r2.New("https://foo.com/bar") 170 rtf := reqTracer.Start(req.Request) 171 rtf.Finish(req.Request, &http.Response{StatusCode: 200}, time.Now(), nil) 172 173 span := rtf.(r2TraceFinisher).span 174 mockSpan := span.(*mocktracer.MockSpan) 175 assert.Equal("200", mockSpan.Tags()[tracing.TagKeyHTTPCode]) 176 assert.False(mockSpan.FinishTime.IsZero()) 177 } 178 179 func TestFinishError(t *testing.T) { 180 assert := assert.New(t) 181 mockTracer := mocktracer.New() 182 reqTracer := Tracer(mockTracer) 183 184 req := r2.New("https://foo.com/bar") 185 rtf := reqTracer.Start(req.Request) 186 rtf.Finish(req.Request, &http.Response{StatusCode: 500}, time.Now(), fmt.Errorf("error")) 187 188 span := rtf.(r2TraceFinisher).span 189 mockSpan := span.(*mocktracer.MockSpan) 190 assert.Equal("500", mockSpan.Tags()[tracing.TagKeyHTTPCode]) 191 assert.Equal("error", mockSpan.Tags()[tracing.TagKeyError]) 192 assert.False(mockSpan.FinishTime.IsZero()) 193 } 194 195 func TestFinishNilSpan(t *testing.T) { 196 assert := assert.New(t) 197 198 rtf := r2TraceFinisher{} 199 rtf.Finish(nil, nil, time.Now(), nil) 200 assert.Nil(rtf.span) 201 }