in xray/client.go [57:124]
func (rt *roundtripper) RoundTrip(r *http.Request) (*http.Response, error) {
var isEmptyHost bool
var resp *http.Response
host := r.Host
if host == "" {
if h := r.URL.Host; h != "" {
host = h
} else {
host = emptyHostRename
isEmptyHost = true
}
}
err := Capture(r.Context(), host, func(ctx context.Context) error {
var err error
seg := GetSegment(ctx)
if seg == nil {
resp, err = rt.Base.RoundTrip(r)
logger.Warnf("failed to record HTTP transaction: segment cannot be found.")
return err
}
ct, e := NewClientTrace(ctx)
if e != nil {
return e
}
r = r.WithContext(httptrace.WithClientTrace(ctx, ct.httpTrace))
seg.Lock()
if isEmptyHost {
seg.Namespace = ""
} else {
seg.Namespace = "remote"
}
seg.GetHTTP().GetRequest().Method = r.Method
seg.GetHTTP().GetRequest().URL = stripURL(*r.URL)
r.Header.Set(TraceIDHeaderKey, seg.DownstreamHeader().String())
seg.Unlock()
resp, err = rt.Base.RoundTrip(r)
if resp != nil {
seg.Lock()
seg.GetHTTP().GetResponse().Status = resp.StatusCode
seg.GetHTTP().GetResponse().ContentLength, _ = strconv.Atoi(resp.Header.Get("Content-Length"))
if resp.StatusCode >= 400 && resp.StatusCode < 500 {
seg.Error = true
}
if resp.StatusCode == 429 {
seg.Throttle = true
}
if resp.StatusCode >= 500 && resp.StatusCode < 600 {
seg.Fault = true
}
seg.Unlock()
}
if err != nil {
ct.subsegments.GotConn(nil, err)
}
return err
})
return resp, err
}