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 }