tracer.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730
  1. package ebpftracer
  2. import (
  3. "bytes"
  4. debugelf "debug/elf"
  5. "encoding/binary"
  6. "encoding/hex"
  7. "errors"
  8. "fmt"
  9. "os"
  10. "strconv"
  11. "strings"
  12. "time"
  13. "github.com/cilium/ebpf"
  14. "github.com/cilium/ebpf/link"
  15. "github.com/cilium/ebpf/perf"
  16. "github.com/coroot/coroot-node-agent/common"
  17. "github.com/coroot/coroot-node-agent/ebpftracer/l7"
  18. "github.com/coroot/coroot-node-agent/ebpftracer/tracer"
  19. "github.com/coroot/coroot-node-agent/proc"
  20. "github.com/coroot/coroot-node-agent/utils"
  21. "golang.org/x/sys/unix"
  22. "inet.af/netaddr"
  23. "k8s.io/klog/v2"
  24. )
  25. /*
  26. #define TASK_COMM_LEN 16
  27. #define BURST_DATA_BUF_SIZE 8192 // For brust send buffer
  28. #include <linux/types.h>
  29. struct __tuple_t {
  30. __u8 daddr[16];
  31. __u8 rcv_saddr[16];
  32. __u8 addr_len;
  33. __u8 l4_protocol;
  34. __u16 dport;
  35. __u16 num;
  36. };
  37. struct __socket_data {
  38. __u32 pid;
  39. __u32 tgid;
  40. __u64 coroutine_id;
  41. __u8 source;
  42. __u8 comm[TASK_COMM_LEN];
  43. __u64 socket_id;
  44. struct __tuple_t tuple;
  45. __u32 extra_data;
  46. __u32 extra_data_count;
  47. __u32 tcp_seq;
  48. __u64 thread_trace_id;
  49. __u64 timestamp;
  50. __u8 direction: 1;
  51. __u8 msg_type: 7;
  52. __u64 syscall_len;
  53. __u64 data_seq;
  54. __u16 data_type;
  55. __u16 data_len;
  56. char data[BURST_DATA_BUF_SIZE];
  57. } __attribute__((packed));
  58. struct __socket_data_buffer {
  59. __u32 events_num;
  60. __u32 len;
  61. char data[32760];
  62. };
  63. */
  64. import "C"
  65. type SocketData C.struct___socket_data
  66. type SocketDataBuffer C.struct___socket_data_buffer
  67. const MaxPayloadSize = 1024
  68. type EventType uint32
  69. type EventReason uint32
  70. const (
  71. EventTypeProcessStart EventType = 1
  72. EventTypeProcessExit EventType = 2
  73. EventTypeConnectionOpen EventType = 3
  74. EventTypeConnectionClose EventType = 4
  75. EventTypeConnectionError EventType = 5
  76. EventTypeListenOpen EventType = 6
  77. EventTypeListenClose EventType = 7
  78. EventTypeFileOpen EventType = 8
  79. EventTypeTCPRetransmit EventType = 9
  80. EventTypeL7Request EventType = 10
  81. EventTypeFunEnt EventType = 11
  82. EventTypeFunRet EventType = 12
  83. EventReasonNone EventReason = 0
  84. EventReasonOOMKill EventReason = 1
  85. )
  86. type Event struct {
  87. Type EventType
  88. Reason EventReason
  89. Pid uint32
  90. SrcAddr netaddr.IPPort
  91. DstAddr netaddr.IPPort
  92. Fd uint64
  93. Timestamp uint64
  94. L7Request *l7.RequestData
  95. StackEvent *StackEvent
  96. }
  97. type perfMapType uint8
  98. const (
  99. perfMapTypeProcEvents perfMapType = 1
  100. perfMapTypeTCPEvents perfMapType = 2
  101. perfMapTypeFileEvents perfMapType = 3
  102. perfMapTypeL7Events perfMapType = 4
  103. perfMapTypeSocketEvents perfMapType = 5
  104. perfMapTypeEventQueue perfMapType = 6
  105. )
  106. type Tracer struct {
  107. kernelVersion string
  108. disableL7Tracing bool
  109. collection *ebpf.Collection
  110. readers map[string]*perf.Reader
  111. links []link.Link
  112. uprobes map[string]*ebpf.Program
  113. Symbols []debugelf.Symbol
  114. Uprobes []tracer.Uprobe
  115. UprobesMap map[string]tracer.Uprobe
  116. }
  117. func NewTracer(kernelVersion string, disableL7Tracing bool) *Tracer {
  118. if disableL7Tracing {
  119. klog.Infoln("L7 tracing is disabled")
  120. }
  121. return &Tracer{
  122. kernelVersion: kernelVersion,
  123. disableL7Tracing: disableL7Tracing,
  124. readers: map[string]*perf.Reader{},
  125. uprobes: map[string]*ebpf.Program{},
  126. }
  127. }
  128. func (t *Tracer) Run(events chan<- Event) error {
  129. if err := t.ebpf(events); err != nil {
  130. return err
  131. }
  132. if err := t.stack(); err != nil {
  133. return err
  134. }
  135. if err := t.init(events); err != nil {
  136. return err
  137. }
  138. return nil
  139. }
  140. func (t *Tracer) Close() {
  141. for _, p := range t.uprobes {
  142. _ = p.Close()
  143. }
  144. for _, l := range t.links {
  145. _ = l.Close()
  146. }
  147. for _, r := range t.readers {
  148. _ = r.Close()
  149. }
  150. t.collection.Close()
  151. }
  152. func (t *Tracer) init(ch chan<- Event) error {
  153. pids, err := proc.ListPids()
  154. if err != nil {
  155. return fmt.Errorf("failed to list pids: %w", err)
  156. }
  157. for _, pid := range pids {
  158. ch <- Event{Type: EventTypeProcessStart, Pid: pid}
  159. }
  160. fds, sockets := readFds(pids)
  161. for _, fd := range fds {
  162. ch <- Event{Type: EventTypeFileOpen, Pid: fd.pid, Fd: fd.fd}
  163. }
  164. listens := map[uint64]bool{}
  165. for _, s := range sockets {
  166. if s.Listen {
  167. listens[uint64(s.pid)<<32|uint64(s.SAddr.Port())] = true
  168. }
  169. }
  170. for _, s := range sockets {
  171. typ := EventTypeConnectionOpen
  172. if s.Listen {
  173. typ = EventTypeListenOpen
  174. } else if listens[uint64(s.pid)<<32|uint64(s.SAddr.Port())] || s.DAddr.Port() > s.SAddr.Port() { // inbound
  175. continue
  176. }
  177. ch <- Event{
  178. Type: typ,
  179. Pid: s.pid,
  180. Fd: s.fd,
  181. SrcAddr: s.SAddr,
  182. DstAddr: s.DAddr,
  183. }
  184. }
  185. return nil
  186. }
  187. type perfMap struct {
  188. name string
  189. perCPUBufferSizePages int
  190. typ perfMapType
  191. }
  192. func (t *Tracer) ebpf(ch chan<- Event) error {
  193. kv := "v" + common.KernelMajorMinor(t.kernelVersion)
  194. path, prg, err := EbpfCode(kv)
  195. klog.Infof("kv is %s, kernel version: %s path: %s\n", kv, t.kernelVersion, path)
  196. if len(prg) == 0 || err != nil {
  197. return fmt.Errorf("kv is %s, unsupported kernel version: %s path: %s err:<%v>", kv, t.kernelVersion, path, err)
  198. }
  199. _, debugFsErr := os.Stat("/sys/kernel/debug/tracing")
  200. _, traceFsErr := os.Stat("/sys/kernel/tracing")
  201. if debugFsErr != nil && traceFsErr != nil {
  202. return fmt.Errorf("kernel tracing is not available: debugfs or tracefs must be mounted")
  203. }
  204. collectionSpec, err := ebpf.LoadCollectionSpecFromReader(bytes.NewReader(prg))
  205. if err != nil {
  206. return fmt.Errorf("failed to load collection spec: %w", err)
  207. }
  208. _ = unix.Setrlimit(unix.RLIMIT_MEMLOCK, &unix.Rlimit{Cur: unix.RLIM_INFINITY, Max: unix.RLIM_INFINITY})
  209. tracer.PidFilter(collectionSpec)
  210. opts := &ebpf.CollectionOptions{MapReplacements: make(map[string]*ebpf.Map)}
  211. for _, spec := range collectionSpec.Maps {
  212. fmt.Println("maps:", spec.Name)
  213. }
  214. tracer.MapInit(collectionSpec, opts)
  215. // TODO 多进程
  216. // tracer.SetConstants(collectionSpec)
  217. c, err := ebpf.NewCollectionWithOptions(collectionSpec, *opts)
  218. if err != nil {
  219. var verr *ebpf.VerifierError
  220. if errors.As(err, &verr) {
  221. klog.Errorf("----%+v", verr)
  222. }
  223. return fmt.Errorf("failed to load collection: %w", err)
  224. }
  225. tracer.Offset()
  226. t.collection = c
  227. perfMaps := []perfMap{
  228. {name: "proc_events", typ: perfMapTypeProcEvents, perCPUBufferSizePages: 4},
  229. {name: "tcp_listen_events", typ: perfMapTypeTCPEvents, perCPUBufferSizePages: 4},
  230. {name: "tcp_connect_events", typ: perfMapTypeTCPEvents, perCPUBufferSizePages: 8},
  231. {name: "tcp_retransmit_events", typ: perfMapTypeTCPEvents, perCPUBufferSizePages: 4},
  232. {name: "file_events", typ: perfMapTypeFileEvents, perCPUBufferSizePages: 4},
  233. {name: "event_queue", typ: perfMapTypeEventQueue, perCPUBufferSizePages: 32},
  234. }
  235. fmt.Println(len(collectionSpec.Programs))
  236. fmt.Println(len(c.Programs))
  237. tracer.MapInsert(c)
  238. if !t.disableL7Tracing {
  239. perfMaps = append(perfMaps, perfMap{name: "l7_events", typ: perfMapTypeL7Events, perCPUBufferSizePages: 32})
  240. }
  241. perfMaps = append(perfMaps, perfMap{name: tracer.MAP_PERF_SOCKET_DATA_NAME, typ: perfMapTypeSocketEvents, perCPUBufferSizePages: 64})
  242. fmt.Println("perfMaps start --")
  243. for _, pm := range perfMaps {
  244. fmt.Println("pm.namepm.name: ", pm.name)
  245. m, ok := t.collection.Maps[pm.name]
  246. if ok {
  247. r, err := perf.NewReader(m, pm.perCPUBufferSizePages*os.Getpagesize())
  248. if err != nil {
  249. t.Close()
  250. return fmt.Errorf("failed to create ebpf reader: %w", err)
  251. }
  252. t.readers[pm.name] = r
  253. // event监听
  254. go runEventsReader(pm.name, r, ch, pm.typ)
  255. }
  256. }
  257. fmt.Println("perfMaps end --")
  258. for _, programSpec := range collectionSpec.Programs {
  259. program := t.collection.Programs[programSpec.Name]
  260. fmt.Println("programSpecprogramSpec:--:", programSpec.Name, programSpec.SectionName, programSpec.Type)
  261. if t.disableL7Tracing {
  262. switch programSpec.Name {
  263. case "sys_enter_writev", "sys_enter_write", "sys_enter_sendto", "sys_enter_sendmsg", "sys_enter_sendmmsg":
  264. continue
  265. case "sys_enter_read", "sys_enter_readv", "sys_enter_recvfrom", "sys_enter_recvmsg":
  266. continue
  267. case "sys_exit_read", "sys_exit_readv", "sys_exit_recvfrom", "sys_exit_recvmsg":
  268. continue
  269. }
  270. }
  271. var l link.Link
  272. switch programSpec.Type {
  273. case ebpf.TracePoint:
  274. if strings.Contains(programSpec.SectionName, "prog") {
  275. continue
  276. }
  277. parts := strings.SplitN(programSpec.AttachTo, "/", 2)
  278. l, err = link.Tracepoint(parts[0], parts[1], program, nil)
  279. case ebpf.Kprobe:
  280. if strings.HasPrefix(programSpec.SectionName, "uprobe/") {
  281. fmt.Println("==============uprobe s")
  282. fmt.Println(programSpec.Name, programSpec.SectionName, programSpec.Type)
  283. fmt.Println("==============uprobe e")
  284. t.uprobes[programSpec.Name] = program
  285. continue
  286. }
  287. l, err = link.Kprobe(programSpec.AttachTo, program, nil)
  288. }
  289. if err != nil {
  290. t.Close()
  291. return fmt.Errorf("failed to link program: %w", err)
  292. }
  293. t.links = append(t.links, l)
  294. }
  295. return nil
  296. }
  297. func (t EventType) String() string {
  298. switch t {
  299. case EventTypeProcessStart:
  300. return "process-start"
  301. case EventTypeProcessExit:
  302. return "process-exit"
  303. case EventTypeConnectionOpen:
  304. return "connection-open"
  305. case EventTypeConnectionClose:
  306. return "connection-close"
  307. case EventTypeConnectionError:
  308. return "connection-error"
  309. case EventTypeListenOpen:
  310. return "listen-open"
  311. case EventTypeListenClose:
  312. return "listen-close"
  313. case EventTypeFileOpen:
  314. return "file-open"
  315. case EventTypeTCPRetransmit:
  316. return "tcp-retransmit"
  317. case EventTypeL7Request:
  318. return "l7-request"
  319. }
  320. return "unknown: " + strconv.Itoa(int(t))
  321. }
  322. func (t EventReason) String() string {
  323. switch t {
  324. case EventReasonNone:
  325. return "none"
  326. case EventReasonOOMKill:
  327. return "oom-kill"
  328. }
  329. return "unknown: " + strconv.Itoa(int(t))
  330. }
  331. type procEvent struct {
  332. Type EventType
  333. Pid uint32
  334. Reason uint32
  335. }
  336. type tcpEvent struct {
  337. Fd uint64
  338. Timestamp uint64
  339. Type EventType
  340. Pid uint32
  341. SPort uint16
  342. DPort uint16
  343. SAddr [16]byte
  344. DAddr [16]byte
  345. }
  346. type fileEvent struct {
  347. Type EventType
  348. Pid uint32
  349. Fd uint64
  350. }
  351. // struct l7_event in l7.c
  352. type l7Event struct {
  353. Fd uint64
  354. ConnectionTimestamp uint64
  355. Pid uint32
  356. Status uint32
  357. Duration uint64
  358. Protocol uint8
  359. Method uint8
  360. Padding uint16
  361. StatementId uint32
  362. PayloadSize uint64
  363. TraceId uint64
  364. StartAt uint64 // ns
  365. EndtAt uint64 // ns
  366. TraceStart uint32
  367. TraceEnd uint32
  368. EventCount uint32
  369. AssumedAppId utils.HashByte
  370. SpanId utils.HashByte
  371. TraceIdFrom utils.HashByte16
  372. CalledId utils.HashByte
  373. InstanceIdFrom utils.HashByte
  374. AppIdFrom utils.HashByte
  375. SpanIdFrom utils.HashByte
  376. }
  377. type SocketDataBufferddd struct {
  378. EventsNum uint32
  379. Len uint32
  380. Data [32760]byte
  381. }
  382. const (
  383. TASK_COMM_LEN = 16
  384. BURST_DATA_BUF_SIZE = 8192
  385. )
  386. type Tuple struct {
  387. Daddr [16]uint8
  388. RcvSaddr [16]uint8
  389. AddrLen uint8
  390. L4Protocol uint8
  391. Dport uint16
  392. Num uint16
  393. }
  394. type SocketDatadddd struct {
  395. Pid uint32 // 表示线程号 如果'pid == tgid'表示一个进程, 否则是线程
  396. Tgid uint32 // 进程号
  397. CoroutineID uint64
  398. Source uint8
  399. Comm [TASK_COMM_LEN]byte
  400. SocketID uint64
  401. Tuple Tuple
  402. ExtraData uint32
  403. ExtraDataCount uint32
  404. TcpSeq uint32
  405. ThreadTraceID uint64
  406. Timestamp uint64
  407. Direction uint8
  408. MsgType uint8
  409. SyscallLen uint64
  410. DataSeq uint64
  411. DataType uint16
  412. DataLen uint16
  413. Data [BURST_DATA_BUF_SIZE]byte
  414. }
  415. type StackEvent struct {
  416. Pid uint64
  417. TraceId uint64
  418. Goid uint64
  419. Ip uint64
  420. Bp uint64
  421. CallerIp uint64
  422. CallerBp uint64
  423. TimeNsStart uint64
  424. TimeNsEnd uint64
  425. // Nid uint64
  426. // Fpid uint64
  427. // Level uint64
  428. Location byte
  429. }
  430. type StackFunEvent struct {
  431. StackEvent StackEvent
  432. Uprobe *tracer.Uprobe
  433. }
  434. func runEventsReader(name string, r *perf.Reader, ch chan<- Event, typ perfMapType) {
  435. for {
  436. rec, err := r.Read()
  437. if err != nil {
  438. if errors.Is(err, perf.ErrClosed) {
  439. break
  440. }
  441. continue
  442. }
  443. if rec.LostSamples > 0 {
  444. klog.Errorln(name, "lost samples:", rec.LostSamples)
  445. continue
  446. }
  447. var event Event
  448. switch typ {
  449. case perfMapTypeSocketEvents:
  450. //fmt.Println("perfMapTypeSocketEvents")
  451. // 假设 rec.RawSample 包含数据,类型为 []byte
  452. //rawData := rec.RawSample
  453. //fmt.Println("perfMapTypeSocketEvents2")
  454. //
  455. //// 创建一个 SocketDataBuffer 结构体实例
  456. //var buffer SocketDataBuffer
  457. //
  458. //// 创建一个字节缓冲区,并将数据填充到其中
  459. //reader := bytes.NewReader(rawData)
  460. //fmt.Println("perfMapTypeSocketEvents3")
  461. //fmt.Println(len(rawData))
  462. //// 使用 binary.Read 函数读取数据并解析为 SocketDataBuffer 结构体实例
  463. //if err := binary.Read(reader, binary.LittleEndian, &buffer); err != nil {
  464. // fmt.Println(reader.Len())
  465. // fmt.Println("Failed to read data:", err)
  466. // continue
  467. //}
  468. //fmt.Println("perfMapTypeSocketEvents4")
  469. //
  470. //// 打印解析后的数据
  471. //fmt.Println("EventsNum:", buffer.EventsNum)
  472. //fmt.Println("Len:", buffer.Len)
  473. //
  474. //// 打印 char data 的内容
  475. //fmt.Printf("Data: %s\n", string(buffer.Data[:buffer.Len])) // 仅打印实际长度的数据
  476. //socketDataBuffer := rec.RawSample
  477. // 解析 __socket_data_buffer
  478. //buf := (*SocketDataBuffer)(unsafe.Pointer(&rec.RawSample[0])) //nolint:gosec
  479. //
  480. //// 获取 char data[32760];
  481. //socketData := (*SocketData)(unsafe.Pointer(&buf.data[0])) //nolint:gosec
  482. //// todo
  483. //fmt.Printf("socketData.DataType:%d \n", (socketData.data_type))
  484. //fmt.Printf("socketData.DataLen:%d \n", (socketData.data_len))
  485. //
  486. //// 解析C结构体中的data字段
  487. //dataSlice := C.GoBytes(unsafe.Pointer(&socketData.data[0]), C.int(socketData.data_len))
  488. //// 打印或处理包含的数据
  489. //fmt.Printf("socketData.Payload:%v \n", string(dataSlice))
  490. /*todo */
  491. //socketData := (*(*[128]byte)(unsafe.Pointer(&eventC.line)))
  492. //dataPtr := unsafe.Pointer(&buf.data[0])
  493. //socketData := (*SocketData)(dataPtr)
  494. //reader2 := bytes.NewBuffer(rec.RawSample)
  495. // 222222
  496. //fmt.Println("socketData.Pid:", socketData.pid)
  497. //fmt.Println("socketData.Tgid:", socketData.tgid)
  498. //fmt.Println("socketData.CoroutineID:", socketData.coroutine_id)
  499. //fmt.Println("socketData.Source:", socketData.source)
  500. //
  501. //fmt.Printf("socketData.Comm: %s \n", socketData.comm)
  502. //fmt.Printf("socketData.SocketID :%v \n", socketData.socket_id)
  503. //fmt.Println("socketData.Tuple:", socketData.Tuple)
  504. //fmt.Println("socketData.ExtraData:", socketData.ExtraData)
  505. //fmt.Println("socketData.ExtraDataCount:", socketData.ExtraDataCount)
  506. //fmt.Println("socketData.TCPSeq:", socketData.TcpSeq)
  507. //fmt.Println("socketData.ThreadTraceID:", socketData.ThreadTraceID)
  508. //fmt.Println("socketData.Timestamp:", socketData.Timestamp)
  509. //fmt.Println("socketData.Direction:", socketData.Direction)
  510. //fmt.Println("socketData.MsgType:", socketData.MsgType)
  511. //fmt.Println("socketData.SyscallLen:", socketData.SyscallLen)
  512. //fmt.Println("socketData.DataSeq:", socketData.DataSeq)
  513. //socketData := &SocketData{}
  514. //reader := bytes.NewBuffer(rec.RawSample)
  515. //if err := binary.Read(reader, binary.LittleEndian, v); err != nil {
  516. // klog.Warningln("failed1 to read msg:", err)
  517. // continue
  518. //}
  519. //
  520. //var data []byte
  521. //payload := reader.Bytes()
  522. //switch {
  523. //case v.Len == 0:
  524. //case v.Len > 32760:
  525. // data = payload[:32760]
  526. //default:
  527. // data = payload[:v.Len]
  528. //}
  529. //////data2 := data[:v.Len]
  530. ////fmt.Println("perfMapTypeSocketEvents")
  531. //fmt.Println(v.EventsNum)
  532. //fmt.Println(v.Len)
  533. //fmt.Println(string(data))
  534. //
  535. //var data2 SocketData
  536. //reader2 := bytes.NewBuffer(data)
  537. //if err := binary.Read(reader2, binary.LittleEndian, data2); err != nil {
  538. // klog.Warningln("failed2 to read msg:", err)
  539. // continue
  540. //}
  541. //
  542. //fmt.Println(data2.Pid)
  543. //fmt.Println(data2.Tgid)
  544. //fmt.Println(string(v.Data))
  545. //continue
  546. case perfMapTypeL7Events:
  547. v := &l7Event{}
  548. reader := bytes.NewBuffer(rec.RawSample)
  549. if err := binary.Read(reader, binary.LittleEndian, v); err != nil {
  550. klog.Warningln("failed to read msg:", err)
  551. continue
  552. }
  553. //fmt.Println("v.TraceIdFrom")
  554. //fmt.Println(v.TraceIdFrom)
  555. //a := hex.EncodeToString(v.TraceIdFrom[:])
  556. //for _, b := range v.AssumedAppId {
  557. // fmt.Printf("v.AssumedAppId- %02\n", b)
  558. //}
  559. //fmt.Println(a)
  560. payload := reader.Bytes()
  561. req := &l7.RequestData{
  562. Protocol: l7.Protocol(v.Protocol),
  563. Status: l7.Status(v.Status),
  564. Duration: time.Duration(v.Duration),
  565. Method: l7.Method(v.Method),
  566. StatementId: v.StatementId,
  567. TraceId: v.TraceId,
  568. TraceStart: v.TraceStart,
  569. TraceEnd: v.TraceEnd,
  570. EventCount: v.EventCount,
  571. AssumedAppId: hex.EncodeToString(v.AssumedAppId[:]),
  572. SpanId: hex.EncodeToString(v.SpanId[:]),
  573. StartAt: v.StartAt,
  574. EndAt: v.EndtAt,
  575. }
  576. if v.TraceEnd == 1 {
  577. req.ParentSpanContext.TraceIdFrom = hex.EncodeToString(v.TraceIdFrom[:])
  578. req.ParentSpanContext.CalledId = hex.EncodeToString(v.CalledId[:])
  579. req.ParentSpanContext.InstanceIdFrom = hex.EncodeToString(v.InstanceIdFrom[:])
  580. req.ParentSpanContext.AppIdFrom = hex.EncodeToString(v.AppIdFrom[:])
  581. req.ParentSpanContext.SpanIdFrom = hex.EncodeToString(v.SpanIdFrom[:])
  582. }
  583. switch {
  584. case v.PayloadSize == 0:
  585. case v.PayloadSize > MaxPayloadSize:
  586. req.Payload = payload[:MaxPayloadSize]
  587. default:
  588. req.Payload = payload[:v.PayloadSize]
  589. }
  590. //fmt.Println("==========")
  591. //fmt.Println("req.Payload:", string(req.Payload))
  592. //fmt.Println("==========")
  593. event = Event{Type: EventTypeL7Request, Pid: v.Pid, Fd: v.Fd, Timestamp: v.ConnectionTimestamp, L7Request: req}
  594. case perfMapTypeFileEvents:
  595. v := &fileEvent{}
  596. if err := binary.Read(bytes.NewBuffer(rec.RawSample), binary.LittleEndian, v); err != nil {
  597. klog.Warningln("failed to read msg:", err)
  598. continue
  599. }
  600. event = Event{Type: v.Type, Pid: v.Pid, Fd: v.Fd}
  601. case perfMapTypeProcEvents:
  602. v := &procEvent{}
  603. if err := binary.Read(bytes.NewBuffer(rec.RawSample), binary.LittleEndian, v); err != nil {
  604. klog.Warningln("failed to read msg:", err)
  605. continue
  606. }
  607. event = Event{Type: v.Type, Reason: EventReason(v.Reason), Pid: v.Pid}
  608. case perfMapTypeTCPEvents:
  609. v := &tcpEvent{}
  610. if err := binary.Read(bytes.NewBuffer(rec.RawSample), binary.LittleEndian, v); err != nil {
  611. klog.Warningln("failed to read msg:", err)
  612. continue
  613. }
  614. event = Event{
  615. Type: v.Type,
  616. Pid: v.Pid,
  617. SrcAddr: ipPort(v.SAddr, v.SPort),
  618. DstAddr: ipPort(v.DAddr, v.DPort),
  619. Fd: v.Fd,
  620. Timestamp: v.Timestamp,
  621. }
  622. case perfMapTypeEventQueue:
  623. v := &StackEvent{}
  624. if err := binary.Read(bytes.NewBuffer(rec.RawSample), binary.LittleEndian, v); err != nil {
  625. klog.Warningln("failed to read msg:", err)
  626. continue
  627. }
  628. event = Event{
  629. Type: EventTypeFunEnt,
  630. StackEvent: v,
  631. }
  632. default:
  633. continue
  634. }
  635. ch <- event
  636. }
  637. }
  638. func ipPort(ip [16]byte, port uint16) netaddr.IPPort {
  639. i, _ := netaddr.FromStdIP(ip[:])
  640. return netaddr.IPPortFrom(i, port)
  641. }
  642. func (t *Tracer) InitKProcInfo(pid uint32, insID utils.ID) error {
  643. info := tracer.EbpfProcInfo{}
  644. info.InstanceId = insID.HashtVal
  645. // 获取内存地址
  646. allocDetails, err := tracer.Allocate(int(pid))
  647. if err == nil && allocDetails != nil {
  648. info.StartAddr = allocDetails.StartAddr
  649. info.EndAddr = allocDetails.EndAddr
  650. }
  651. //klog.Infoln("Major:", major)
  652. //klog.Infoln("Minor:", minor)
  653. //klog.Infoln("Revision:", revision)
  654. //klog.Infoln("goVersion", goVersion)
  655. //klog.Infoln("info.StartAddr", info.StartAddr)
  656. //klog.Infoln("info.EndAddr", info.EndAddr)
  657. _, err = tracer.UpdateProcInfoToMap(t.collection, pid, info)
  658. if err != nil {
  659. klog.Error("failed to update program info", err)
  660. }
  661. return err
  662. }