package trace import ( "context" "fmt" "net/http" "time" "git.shuncheng.lu/bigthing/gocommon/pkg/internal/util" "github.com/SkyAPM/go2sky/propagation" v3 "github.com/SkyAPM/go2sky/reporter/grpc/language-agent" ) func HttpClientTrace(ctx context.Context, client *http.Client, request *http.Request, serverName string) (*http.Response, error) { var _url = request.URL.String() reqSpan, err := GinNewExitSpan(ctx, fmt.Sprintf("%s:%s", serverName, request.URL.Path), serverName, func(header string) error { request.Header.Set(propagation.Header, header) return nil }) if reqSpan == nil || err != nil { return client.Do(request) } startTime := time.Now() defer func() { reqSpan.Tag("spend", util.SubTimeToSeconds(startTime, time.Now())) reqSpan.End() }() reqSpan.SetComponent(HttpClientComponentID) reqSpan.SetSpanLayer(v3.SpanLayer_RPCFramework) reqSpan.Tag("http.method", request.Method) reqSpan.Tag("http.url", _url) response, err := client.Do(request) if err != nil { reqSpan.Error(time.Now(), "Error", fmt.Sprintf("%v", err)) return nil, err } reqSpan.Tag("http.status", response.Status) return response, err }