func()

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
}