common.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. package tracer
  2. import "github.com/coroot/coroot-node-agent/utils"
  3. const (
  4. ETR_OK = 0
  5. ETR_NOTEXIST = -4
  6. ETR_UPDATE_MAP_FAILD = -9 /* update map failed */
  7. ETR_NOTSUPP = -14
  8. )
  9. const (
  10. // eBPF Map Name
  11. MAP_MEMBERS_OFFSET_NAME = "__members_offset"
  12. MAP_SOCKET_INFO_NAME = "__socket_info_map"
  13. MAP_TRACE_NAME = "__trace_map"
  14. MAP_PERF_SOCKET_DATA_NAME = "__socket_data"
  15. MAP_TRACE_CONF_NAME = "__trace_conf_map"
  16. MAP_TRACE_STATS_NAME = "__trace_stats_map"
  17. MAP_PROTO_FILTER_NAME = "__protocol_filter"
  18. MAP_ALLOW_PORT_BITMAP_NAME = "__allow_port_bitmap"
  19. MAP_ADAPT_KERN_UID_NAME = "__adapt_kern_uid_map"
  20. //Program jmp tables
  21. MAP_PROGS_JMP_KP_NAME = "__progs_jmp_kp_map"
  22. MAP_PROGS_JMP_TP_NAME = "__progs_jmp_tp_map"
  23. // This prog is designed to handle data transfer
  24. PROG_DATA_SUBMIT_NAME_FOR_KP = "bpf_prog_kp__data_submit"
  25. PROG_DATA_SUBMIT_NAME_FOR_TP = "bpf_prog_tp__data_submit"
  26. PROG_OUTPUT_DATA_NAME_FOR_KP = "bpf_prog_kp__output_data"
  27. PROG_OUTPUT_DATA_NAME_FOR_TP = "bpf_prog_tp__output_data"
  28. PROG_IO_EVENT_NAME_FOR_TP = "bpf_prog_tp__io_event"
  29. MAP_PROC_INFO_MAP_NAME = "proc_info_map"
  30. )
  31. const (
  32. PROG_DATA_SUBMIT_TP_IDX = iota
  33. PROG_OUTPUT_DATA_TP_IDX
  34. PROG_IO_EVENT_TP_IDX
  35. PROG_TP_NUM
  36. )
  37. const (
  38. PROG_DATA_SUBMIT_KP_IDX = iota
  39. PROG_OUTPUT_DATA_KP_IDX
  40. PROG_KP_NUM
  41. )
  42. // 数据协议
  43. const (
  44. PROTO_UNKNOWN = 0
  45. PROTO_ORTHER = 1
  46. PROTO_HTTP1 = 20
  47. PROTO_HTTP2 = 21
  48. PROTO_TLS_HTTP1 = 22
  49. PROTO_TLS_HTTP2 = 23
  50. PROTO_DUBBO = 40
  51. PROTO_SOFARPC = 43
  52. PROTO_MYSQL = 60
  53. PROTO_POSTGRESQL = 61
  54. PROTO_REDIS = 80
  55. PROTO_KAFKA = 100
  56. PROTO_MQTT = 101
  57. PROTO_DNS = 120
  58. PROTO_NUM = 130
  59. )
  60. const (
  61. HASH_SIZE = 8
  62. )
  63. var EbpfConfigProtocolFilter [PROTO_NUM]uint32
  64. type testStruct struct {
  65. test_id uint32
  66. }
  67. type bpfOffsetParam struct {
  68. Ready uint32 `json:"ready"`
  69. TaskFilesOffset uint32 `json:"task__files_offset"`
  70. SockFlagsOffset uint32 `json:"sock__flags_offset"`
  71. TcpSockCopiedSeqOffset uint32 `json:"tcp_sock__copied_seq_offset"`
  72. TcpSockWriteSeqOffset uint32 `json:"tcp_sock__write_seq_offset"`
  73. StructFilesStructFdtOffset uint32 `json:"struct_files_struct_fdt_offset"`
  74. StructFilesPrivateDataOffset uint32 `json:"struct_files_private_data_offset"`
  75. StructFileFInodeOffset uint32 `json:"struct_file_f_inode_offset"`
  76. StructInodeIModeOffset uint32 `json:"struct_inode_i_mode_offset"`
  77. StructFileDentryOffset uint32 `json:"struct_file_dentry_offset"`
  78. StructDentryNameOffset uint32 `json:"struct_dentry_name_offset"`
  79. StructSockFamilyOffset uint32 `json:"struct_sock_family_offset"`
  80. StructSockSaddrOffset uint32 `json:"struct_sock_saddr_offset"`
  81. StructSockDaddrOffset uint32 `json:"struct_sock_daddr_offset"`
  82. StructSockIp6saddrOffset uint32 `json:"struct_sock_ip6saddr_offset"`
  83. StructSockIp6daddrOffset uint32 `json:"struct_sock_ip6daddr_offset"`
  84. StructSockDportOffset uint32 `json:"struct_sock_dport_offset"`
  85. StructSockSportOffset uint32 `json:"struct_sock_sport_offset"`
  86. StructSockSkcStateOffset uint32 `json:"struct_sock_skc_state_offset"`
  87. StructSockCommonIpv6onlyOffset uint32 `json:"struct_sock_common_ipv6only_offset"`
  88. }
  89. const (
  90. OFFSET_IDX_GOID_RUNTIME_G = iota
  91. OFFSET_IDX_CONN_TLS_CONN
  92. OFFSET_IDX_SYSFD_POLL_FD
  93. OFFSET_IDX_CONN_HTTP2_SERVER_CONN
  94. OFFSET_IDX_TCONN_HTTP2_CLIENT_CONN
  95. OFFSET_IDX_CC_HTTP2_CLIENT_CONN_READ_LOOP
  96. OFFSET_IDX_CONN_GRPC_HTTP2_CLIENT
  97. OFFSET_IDX_CONN_GRPC_HTTP2_SERVER
  98. OFFSET_IDX_FRAMER_GRPC_TRANSPORT_LOOPY_WRITER
  99. OFFSET_IDX_WRITER_GRPC_TRANSPORT_FRAMER
  100. OFFSET_IDX_CONN_GRPC_TRANSPORT_BUFWRITER
  101. OFFSET_IDX_SIDE_GRPC_TRANSPORT_LOOPY_WRITER
  102. OFFSET_IDX_FIELDS_HTTP2_META_HEADERS_FRAME
  103. OFFSET_IDX_STREAM_HTTP2_CLIENT_CONN
  104. OFFSET_IDX_STREAM_ID_HTTP2_FRAME_HEADER
  105. OFFSET_IDX_MAX
  106. )
  107. type traceConf struct {
  108. SocketID uint64 // 会话标识
  109. CoroutineTraceID uint64 // 同一协程的数据转发关联
  110. ThreadTraceID uint64 // 同一进程/线程的数据转发关联,用于多事务流转场景
  111. DataLimitMax uint64 // Maximum number of data transfers
  112. GoTracingTimeout uint64
  113. IOEventCollectMode uint64
  114. IOEventMinimalDuartion uint64
  115. HostID utils.HashByte
  116. APPID utils.HashByte
  117. }
  118. /*
  119. struct ebpf_proc_info {
  120. __u32 version;
  121. __u16 offsets[OFFSET_IDX_MAX];
  122. // In golang, itab represents type, and in interface, struct is represented
  123. // by the address of itab. We use itab to judge the structure type, and
  124. // find the fd representing the connection after multiple jumps. These
  125. // types are not available in Go ELF files without a symbol table.
  126. // Go 用 itab 表示类型, 在 interface 中通过 itab 确定具体的 struct, 并根据
  127. // struct 找到表示连接的 fd.
  128. __u64 net_TCPConn_itab;
  129. __u64 crypto_tls_Conn_itab; // TLS_HTTP1,TLS_HTTP2
  130. __u64 credentials_syscallConn_itab; // gRPC
  131. // __u64 start_addr;
  132. // __u64 end_addr;
  133. unsigned char instance_id[APM_INSTANCE_ID_SIZE];
  134. } __attribute__((packed))
  135. */
  136. type EbpfProcInfo struct {
  137. Version uint32
  138. Offsets [OFFSET_IDX_MAX]uint16
  139. NetTCPConnItab uint64
  140. CryptoTLSConnItab uint64 // TLS_HTTP1,TLS_HTTP2
  141. CredentialsSyscallConnItab uint64 // gRPC
  142. InstanceId utils.HashByte
  143. }
  144. type allowPortBitmap struct {
  145. Bitmap [65536 / 8]uint8
  146. }