http_client_trace.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package trace
  2. import (
  3. "context"
  4. "fmt"
  5. "net/http"
  6. "time"
  7. "git.shuncheng.lu/bigthing/gocommon/pkg/internal/util"
  8. "github.com/SkyAPM/go2sky/propagation"
  9. v3 "github.com/SkyAPM/go2sky/reporter/grpc/language-agent"
  10. )
  11. func HttpClientTrace(ctx context.Context, client *http.Client, request *http.Request, serverName string) (*http.Response, error) {
  12. var _url = request.URL.String()
  13. reqSpan, err := GinNewExitSpan(ctx, fmt.Sprintf("%s:%s", serverName, request.URL.Path), serverName, func(header string) error {
  14. request.Header.Set(propagation.Header, header)
  15. return nil
  16. })
  17. if reqSpan == nil || err != nil {
  18. return client.Do(request)
  19. }
  20. startTime := time.Now()
  21. defer func() {
  22. reqSpan.Tag("spend", util.SubTimeToSeconds(startTime, time.Now()))
  23. reqSpan.End()
  24. }()
  25. reqSpan.SetComponent(HttpClientComponentID)
  26. reqSpan.SetSpanLayer(v3.SpanLayer_RPCFramework)
  27. reqSpan.Tag("http.method", request.Method)
  28. reqSpan.Tag("http.url", _url)
  29. response, err := client.Do(request)
  30. if err != nil {
  31. reqSpan.Error(time.Now(), "Error", fmt.Sprintf("%v", err))
  32. return nil, err
  33. }
  34. reqSpan.Tag("http.status", response.Status)
  35. return response, err
  36. }