correlation/outbound_http.go (29 lines of code) (raw):

package correlation import ( "net/http" ) const ( propagationHeader = "X-Request-ID" clientNameHeader = "X-GitLab-Client-Name" ) type instrumentedRoundTripper struct { delegate http.RoundTripper config instrumentedRoundTripperConfig } // injectRequest will pass the CorrelationId through to a downstream http request // for propagation. func (c instrumentedRoundTripper) injectRequest(req *http.Request) { correlationID := ExtractFromContext(req.Context()) if correlationID != "" { req.Header.Set(propagationHeader, correlationID) } if c.config.clientName != "" { req.Header.Set(clientNameHeader, c.config.clientName) } } func (c instrumentedRoundTripper) RoundTrip(req *http.Request) (res *http.Response, e error) { c.injectRequest(req) return c.delegate.RoundTrip(req) } // NewInstrumentedRoundTripper acts as a "client-middleware" for outbound http requests // adding instrumentation to the outbound request and then delegating to the underlying // transport. // // If will extract the current Correlation-ID from the request context and pass this via // the X-Request-ID request header to downstream services. func NewInstrumentedRoundTripper(delegate http.RoundTripper, opts ...InstrumentedRoundTripperOption) http.RoundTripper { config := applyInstrumentedRoundTripperOptions(opts) return &instrumentedRoundTripper{delegate: delegate, config: config} }