tracing/correlation/baggage_handler.go (24 lines of code) (raw):
package tracingcorrelation
import (
"net/http"
opentracing "github.com/opentracing/opentracing-go"
"gitlab.com/gitlab-org/labkit/correlation"
)
// BaggageHandler will set opentracing baggage items with the current correlation_id.
func BaggageHandler(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
if span := opentracing.SpanFromContext(ctx); span != nil {
correlationID := correlation.ExtractFromContext(ctx)
if correlationID != "" {
span.SetBaggageItem(correlation.FieldName, correlationID)
} else {
// If the span contains the correlation_id, but the context doesn't
// inject it from the span
correlationID = span.BaggageItem(correlation.FieldName)
if correlationID != "" {
ctx = correlation.ContextWithCorrelation(ctx, correlationID)
r = r.WithContext(ctx)
}
}
}
h.ServeHTTP(w, r)
})
}