l7.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. package l7
  2. import (
  3. "strconv"
  4. "time"
  5. "inet.af/netaddr"
  6. )
  7. type Protocol uint8
  8. const (
  9. ProtocolTrace Protocol = 200
  10. ProtocolHTTP Protocol = 1
  11. ProtocolPostgres Protocol = 2
  12. ProtocolRedis Protocol = 3
  13. ProtocolMemcached Protocol = 4
  14. ProtocolMysql Protocol = 5
  15. ProtocolMongo Protocol = 6
  16. ProtocolKafka Protocol = 7
  17. ProtocolCassandra Protocol = 8
  18. ProtocolRabbitmq Protocol = 9
  19. ProtocolNats Protocol = 10
  20. ProtocolHTTP2 Protocol = 11
  21. ProtocolDubbo2 Protocol = 12
  22. ProtocolDNS Protocol = 13
  23. ProtocolDM Protocol = 14
  24. ProtocolMariaDB Protocol = 15
  25. ProtocolGrpc Protocol = 16
  26. ProtocolES Protocol = 17
  27. ProtocolTiDB Protocol = 18
  28. )
  29. func (p Protocol) Int() int {
  30. return int(p)
  31. }
  32. func (p Protocol) String() string {
  33. switch p {
  34. case ProtocolTrace:
  35. return "TRACE"
  36. case ProtocolHTTP:
  37. return "HTTP"
  38. case ProtocolPostgres:
  39. return "Postgres"
  40. case ProtocolRedis:
  41. return "Redis"
  42. case ProtocolMemcached:
  43. return "Memcached"
  44. case ProtocolMysql:
  45. return "Mysql"
  46. case ProtocolMongo:
  47. return "Mongo"
  48. case ProtocolKafka:
  49. return "Kafka"
  50. case ProtocolCassandra:
  51. return "Cassandra"
  52. case ProtocolRabbitmq:
  53. return "Rabbitmq"
  54. case ProtocolNats:
  55. return "NATS"
  56. case ProtocolHTTP2:
  57. return "HTTP2"
  58. case ProtocolDubbo2:
  59. return "Dubbo2"
  60. case ProtocolDNS:
  61. return "DNS"
  62. case ProtocolDM:
  63. return "DM"
  64. case ProtocolMariaDB:
  65. return "Mariadb"
  66. case ProtocolTiDB:
  67. return "TiDB"
  68. case ProtocolGrpc:
  69. return "GRPC"
  70. case ProtocolES:
  71. return "Elasticsearch"
  72. }
  73. return "UNKNOWN:" + strconv.Itoa(int(p))
  74. }
  75. func (p Protocol) ServiceNameString() string {
  76. switch p {
  77. case ProtocolTrace:
  78. return "TRACE"
  79. case ProtocolHTTP:
  80. return "HTTP"
  81. case ProtocolPostgres:
  82. return "POSTGRESQL"
  83. case ProtocolRedis:
  84. return "REDIS"
  85. case ProtocolMemcached:
  86. return "Memcached"
  87. case ProtocolMysql:
  88. return "MYSQL"
  89. case ProtocolMongo:
  90. return "Mongo"
  91. case ProtocolKafka:
  92. return "KAFKA"
  93. case ProtocolCassandra:
  94. return "CASSANDRA"
  95. case ProtocolRabbitmq:
  96. return "Rabbitmq"
  97. case ProtocolNats:
  98. return "NATS"
  99. case ProtocolHTTP2:
  100. return "HTTP2"
  101. case ProtocolDubbo2:
  102. return "Dubbo2"
  103. case ProtocolDNS:
  104. return "DNS"
  105. case ProtocolDM:
  106. return "DM"
  107. case ProtocolMariaDB:
  108. return "MARIA"
  109. case ProtocolTiDB:
  110. return "TIDB"
  111. case ProtocolGrpc:
  112. return "GRPC"
  113. case ProtocolES:
  114. return "ELASTICSEARCH"
  115. }
  116. return "UNKNOWN:" + strconv.Itoa(int(p))
  117. }
  118. type Method uint8
  119. const (
  120. MethodUnknown Method = 0
  121. MethodProduce Method = 1
  122. MethodConsume Method = 2
  123. MethodStatementPrepare Method = 3
  124. MethodStatementClose Method = 4
  125. MethodHttp2ClientFrames Method = 5
  126. MethodHttp2ServerFrames Method = 6
  127. )
  128. func (m Method) String() string {
  129. switch m {
  130. case MethodUnknown:
  131. return "unknown"
  132. case MethodProduce:
  133. return "produce"
  134. case MethodConsume:
  135. return "consume"
  136. case MethodStatementPrepare:
  137. return "statement_prepare"
  138. case MethodStatementClose:
  139. return "statement_close"
  140. case MethodHttp2ClientFrames:
  141. return "http2_client_frames"
  142. case MethodHttp2ServerFrames:
  143. return "http2_server_frames"
  144. }
  145. return "UNKNOWN:" + strconv.Itoa(int(m))
  146. }
  147. type Status int
  148. const (
  149. StatusUnknown Status = 0
  150. StatusOk Status = 200
  151. StatusFailed Status = 500
  152. )
  153. func (s Status) String() string {
  154. switch s {
  155. case StatusUnknown:
  156. return "unknown"
  157. case StatusOk:
  158. return "ok"
  159. case StatusFailed:
  160. return "failed"
  161. }
  162. return strconv.Itoa(int(s))
  163. }
  164. func (s Status) Http() string {
  165. return strconv.Itoa(int(s))
  166. }
  167. func (s Status) DNS() string {
  168. switch s {
  169. case 0:
  170. return "ok"
  171. case 1:
  172. return "format_error"
  173. case 2:
  174. return "servfail"
  175. case 3:
  176. return "nxdomain"
  177. case 4:
  178. return "not_implemented"
  179. case 5:
  180. return "refused"
  181. }
  182. return ""
  183. }
  184. func (s Status) Error() bool {
  185. return s == StatusFailed
  186. }
  187. // TypeFrom represents the code type from the parent span context
  188. type TypeFrom string
  189. // String returns the human-readable name for the type code
  190. func (t TypeFrom) String() string {
  191. switch string(t) {
  192. case "10":
  193. return "SDK"
  194. case "00":
  195. return "GO"
  196. case "01":
  197. return "JAVA"
  198. case "02":
  199. return "NODEJS"
  200. case "03":
  201. return "NGINX"
  202. case "04":
  203. return ".NET"
  204. case "05":
  205. return ".NETCORE"
  206. case "06":
  207. return "PHP"
  208. case "07":
  209. return "PYTHON"
  210. case "08":
  211. return "C"
  212. case "09":
  213. return "RUBY"
  214. default:
  215. return string(t)
  216. }
  217. }
  218. type RequestData struct {
  219. Protocol Protocol
  220. Pid uint32
  221. Status Status
  222. Duration time.Duration
  223. Method Method
  224. StatementId uint32
  225. Payload []byte
  226. TraceId uint64
  227. TraceStart uint32
  228. TraceEnd uint32
  229. TraceType uint32
  230. EventCount uint32
  231. AssumedAppId string
  232. SpanId string
  233. StartAt uint64
  234. EndAt uint64
  235. SAddr netaddr.IPPort
  236. DAddr netaddr.IPPort
  237. ComponentSAddr netaddr.IPPort
  238. ComponentDAddr netaddr.IPPort
  239. DestAddrString string
  240. ParentSpanContext struct {
  241. TraceIdFrom string
  242. CalledId string
  243. InstanceIdFrom string
  244. AppIdFrom string
  245. SpanIdFrom string
  246. TypeFrom TypeFrom
  247. }
  248. SysvcFrom string // cwother header value: NN:ParentServiceName:MM:ParentServiceSysTag
  249. ErrorMsg string
  250. IsTls bool
  251. MQTopic string // MQ topic (e.g., Kafka topic)
  252. MQKey string // MQ key (e.g., Kafka message key)
  253. }