github.com/icyphox/x@v0.0.355-0.20220311094250-029bd783e8b8/tracing/middleware.go (about)

     1  // Package tracing provides helpers for dealing with Open Tracing and Distributed Tracing.
     2  package tracing
     3  
     4  import (
     5  	"net/http"
     6  	"strings"
     7  
     8  	opentracing "github.com/opentracing/opentracing-go"
     9  	"github.com/opentracing/opentracing-go/ext"
    10  	"github.com/urfave/negroni"
    11  )
    12  
    13  func (t *Tracer) ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
    14  	var span opentracing.Span
    15  	opName := r.URL.Path
    16  
    17  	// Omit health endpoints
    18  	if strings.HasPrefix(opName, "/health/") {
    19  		next(rw, r)
    20  		return
    21  	}
    22  
    23  	// It's very possible that Hydra is fronted by a proxy which could have initiated a trace.
    24  	// If so, we should attempt to join it.
    25  	carrier := opentracing.HTTPHeadersCarrier(r.Header)
    26  	remoteContext, _ := opentracing.GlobalTracer().Extract(opentracing.HTTPHeaders, carrier)
    27  	span = opentracing.StartSpan(opName, ext.RPCServerOption(remoteContext))
    28  
    29  	defer span.Finish()
    30  
    31  	ext.HTTPMethod.Set(span, r.Method)
    32  	ext.HTTPUrl.Set(span, r.URL.String())
    33  	ext.Component.Set(span, t.Config.ServiceName)
    34  	r = r.WithContext(opentracing.ContextWithSpan(r.Context(), span))
    35  
    36  	next(rw, r)
    37  
    38  	if negroniWriter, ok := rw.(negroni.ResponseWriter); ok {
    39  		statusCode := uint16(negroniWriter.Status())
    40  		if statusCode >= 400 {
    41  			ext.Error.Set(span, true)
    42  		}
    43  		ext.HTTPStatusCode.Set(span, statusCode)
    44  	}
    45  }