1 package tracing 2 3 // Copyright 2018 Microsoft Corporation 4 // 5 // Licensed under the Apache License, Version 2.0 (the "License"); 6 // you may not use this file except in compliance with the License. 7 // You may obtain a copy of the License at 8 // 9 // http://www.apache.org/licenses/LICENSE-2.0 10 // 11 // Unless required by applicable law or agreed to in writing, software 12 // distributed under the License is distributed on an "AS IS" BASIS, 13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 // See the License for the specific language governing permissions and 15 // limitations under the License. 16 17 import ( 18 "context" 19 "net/http" 20 ) 21 22 // Tracer represents an HTTP tracing facility. 23 type Tracer interface { 24 NewTransport(base *http.Transport) http.RoundTripper 25 StartSpan(ctx context.Context, name string) context.Context 26 EndSpan(ctx context.Context, httpStatusCode int, err error) 27 } 28 29 var ( 30 tracer Tracer 31 ) 32 33 // Register will register the provided Tracer. Pass nil to unregister a Tracer. 34 func Register(t Tracer) { 35 tracer = t 36 } 37 38 // IsEnabled returns true if a Tracer has been registered. 39 func IsEnabled() bool { 40 return tracer != nil 41 } 42 43 // NewTransport creates a new instrumenting http.RoundTripper for the 44 // registered Tracer. If no Tracer has been registered it returns nil. 45 func NewTransport(base *http.Transport) http.RoundTripper { 46 if tracer != nil { 47 return tracer.NewTransport(base) 48 } 49 return nil 50 } 51 52 // StartSpan starts a trace span with the specified name, associating it with the 53 // provided context. Has no effect if a Tracer has not been registered. 54 func StartSpan(ctx context.Context, name string) context.Context { 55 if tracer != nil { 56 return tracer.StartSpan(ctx, name) 57 } 58 return ctx 59 } 60 61 // EndSpan ends a previously started span stored in the context. 62 // Has no effect if a Tracer has not been registered. 63 func EndSpan(ctx context.Context, httpStatusCode int, err error) { 64 if tracer != nil { 65 tracer.EndSpan(ctx, httpStatusCode, err) 66 } 67 } 68