trace.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package trace
  2. import (
  3. "crypto/rand"
  4. "encoding/hex"
  5. "io"
  6. "sync"
  7. )
  8. const Header = "X-TRACE-ID"
  9. var _ T = (*Trace)(nil)
  10. type T interface {
  11. i()
  12. ID() string
  13. WithRequest(req *Request) *Trace
  14. WithResponse(resp *Response) *Trace
  15. AppendDialog(dialog *Dialog) *Trace
  16. AppendDebug(debug *Debug) *Trace
  17. AppendSQL(sql *SQL) *Trace
  18. AppendRedis(redis *Redis) *Trace
  19. AppendGRPC(grpc *Grpc) *Trace
  20. }
  21. // Trace 记录的参数
  22. type Trace struct {
  23. mux sync.Mutex
  24. Identifier string `json:"trace_id"` // 链路ID
  25. Request *Request `json:"request"` // 请求信息
  26. Response *Response `json:"response"` // 返回信息
  27. ThirdPartyRequests []*Dialog `json:"third_party_requests"` // 调用第三方接口的信息
  28. Debugs []*Debug `json:"debugs"` // 调试信息
  29. SQLs []*SQL `json:"sqls"` // 执行的 SQL 信息
  30. Redis []*Redis `json:"redis"` // 执行的 Redis 信息
  31. GRPCs []*Grpc `json:"grpc"` // 执行的 gRPC 信息
  32. Success bool `json:"success"` // 请求结果 true or false
  33. CostSeconds float64 `json:"cost_seconds"` // 执行时长(单位秒)
  34. }
  35. // Request 请求信息
  36. type Request struct {
  37. TTL string `json:"ttl"` // 请求超时时间
  38. Method string `json:"method"` // 请求方式
  39. DecodedURL string `json:"decoded_url"` // 请求地址
  40. Header any `json:"header"` // 请求 Header 信息
  41. Body any `json:"body"` // 请求 Body 信息
  42. }
  43. // Response 响应信息
  44. type Response struct {
  45. Header any `json:"header"` // Header 信息
  46. Body any `json:"body"` // Body 信息
  47. BusinessCode int `json:"business_code,omitempty"` // 业务码
  48. BusinessCodeMsg string `json:"business_code_msg,omitempty"` // 提示信息
  49. HttpCode int `json:"http_code"` // HTTP 状态码
  50. HttpCodeMsg string `json:"http_code_msg"` // HTTP 状态码信息
  51. CostSeconds float64 `json:"cost_seconds"` // 执行时间(单位秒)
  52. }
  53. func New(id string) *Trace {
  54. if id == "" {
  55. buf := make([]byte, 10)
  56. io.ReadFull(rand.Reader, buf)
  57. id = string(hex.EncodeToString(buf))
  58. }
  59. return &Trace{
  60. Identifier: id,
  61. }
  62. }
  63. func (t *Trace) i() {}
  64. // ID 唯一标识符
  65. func (t *Trace) ID() string {
  66. return t.Identifier
  67. }
  68. // WithRequest 设置request
  69. func (t *Trace) WithRequest(req *Request) *Trace {
  70. t.Request = req
  71. return t
  72. }
  73. // WithResponse 设置response
  74. func (t *Trace) WithResponse(resp *Response) *Trace {
  75. t.Response = resp
  76. return t
  77. }
  78. // AppendDialog 安全的追加内部调用过程dialog
  79. func (t *Trace) AppendDialog(dialog *Dialog) *Trace {
  80. if dialog == nil {
  81. return t
  82. }
  83. t.mux.Lock()
  84. defer t.mux.Unlock()
  85. t.ThirdPartyRequests = append(t.ThirdPartyRequests, dialog)
  86. return t
  87. }
  88. // AppendDebug 追加 debug
  89. func (t *Trace) AppendDebug(debug *Debug) *Trace {
  90. if debug == nil {
  91. return t
  92. }
  93. t.mux.Lock()
  94. defer t.mux.Unlock()
  95. t.Debugs = append(t.Debugs, debug)
  96. return t
  97. }
  98. // AppendSQL 追加 SQL
  99. func (t *Trace) AppendSQL(sql *SQL) *Trace {
  100. if sql == nil {
  101. return t
  102. }
  103. t.mux.Lock()
  104. defer t.mux.Unlock()
  105. t.SQLs = append(t.SQLs, sql)
  106. return t
  107. }
  108. // AppendRedis 追加 Redis
  109. func (t *Trace) AppendRedis(redis *Redis) *Trace {
  110. if redis == nil {
  111. return t
  112. }
  113. t.mux.Lock()
  114. defer t.mux.Unlock()
  115. t.Redis = append(t.Redis, redis)
  116. return t
  117. }
  118. // AppendGRPC 追加 gRPC 调用信息
  119. func (t *Trace) AppendGRPC(grpc *Grpc) *Trace {
  120. if grpc == nil {
  121. return t
  122. }
  123. t.mux.Lock()
  124. defer t.mux.Unlock()
  125. t.GRPCs = append(t.GRPCs, grpc)
  126. return t
  127. }