tracer.go 20 KB

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