tracing.go raw

   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