ilucky.si 2 лет назад
Родитель
Сommit
16026ad02b
5 измененных файлов с 23 добавлено и 22 удалено
  1. 1 1
      containers/container.go
  2. 11 11
      containers/registry.go
  3. 3 3
      ebpftracer/tls.go
  4. 5 4
      ebpftracer/tracer.go
  5. 3 3
      main.go

+ 1 - 1
containers/container.go

@@ -1090,7 +1090,7 @@ func (c *Container) attachTlsUprobes(tracer *ebpftracer.Tracer, pid uint32) {
 		p.openSslUprobesChecked = true
 	}
 	if !p.goTlsUprobesChecked {
-		p.uprobes = append(p.uprobes, tracer.AttachGoTlsUprobes(pid)...)
+		p.uprobes = append(p.uprobes, tracer.AttachGoTlsUprobes(pid)...) // TODO: 核心代码
 		p.goTlsUprobesChecked = true
 	}
 }

+ 11 - 11
containers/registry.go

@@ -94,24 +94,24 @@ func NewRegistry(reg prometheus.Registerer, kernelVersion string, processInfoCh
 
 	r := &Registry{
 		reg:    reg,
-		events: make(chan ebpftracer.Event, 10000),
+		events: make(chan ebpftracer.Event, 10000), // TODO: 队列
 
 		hostConntrack: ct,
 
-		containersById:       map[ContainerID]*Container{},
+		containersById:       map[ContainerID]*Container{}, // TODO: 缓存的一些关系映射
 		containersByCgroupId: map[string]*Container{},
 		containersByPid:      map[uint32]*Container{},
 		ip2fqdn:              map[netaddr.IP]string{},
 
-		processInfoCh: processInfoCh,
+		processInfoCh: processInfoCh, // TODO: 进程信息
 
-		tracer: ebpftracer.NewTracer(kernelVersion, *flags.DisableL7Tracing),
+		tracer: ebpftracer.NewTracer(kernelVersion, *flags.DisableL7Tracing), // TODO: 核心代码
 	}
 	if err = reg.Register(r); err != nil {
 		return nil, err
 	}
-	go r.handleEvents(r.events)
-	if err = r.tracer.Run(r.events); err != nil {
+	go r.handleEvents(r.events)                   // TODO: 处理EBPF程序发出来的数据
+	if err = r.tracer.Run(r.events); err != nil { // TODO: 核心代码, attach Uprobe
 		close(r.events)
 		return nil, err
 	}
@@ -141,7 +141,7 @@ func (r *Registry) handleEvents(ch <-chan ebpftracer.Event) {
 	defer gcTicker.Stop()
 	for {
 		select {
-		case now := <-gcTicker.C:
+		case now := <-gcTicker.C: // TODO: 周期性做一些操作
 			for pid, c := range r.containersByPid {
 				cg, err := proc.ReadCgroup(pid)
 				if err != nil {
@@ -192,7 +192,7 @@ func (r *Registry) handleEvents(ch <-chan ebpftracer.Event) {
 				}
 			}
 			r.ip2fqdnLock.Unlock()
-		case e, more := <-ch:
+		case e, more := <-ch: // TODO: 核心代码, 读取chan中的数据
 			if e.Pid == uint32(os.Getpid()) {
 				continue
 			}
@@ -247,7 +247,7 @@ func (r *Registry) handleEvents(ch <-chan ebpftracer.Event) {
 				//fmt.Println("ebpftracer.EventTypeConnectionOpen==================", e.Pid)
 				if c := r.getOrCreateContainer(e.Pid); c != nil {
 					c.onConnectionOpen(e.Pid, e.Fd, e.SrcAddr, e.DstAddr, e.Timestamp, false)
-					c.attachTlsUprobes(r.tracer, e.Pid)
+					c.attachTlsUprobes(r.tracer, e.Pid) // TODO: 根据进程语言...
 				} else {
 					klog.Infoln("TCP connection from unknown container", e)
 				}
@@ -271,14 +271,14 @@ func (r *Registry) handleEvents(ch <-chan ebpftracer.Event) {
 						break
 					}
 				}
-			case ebpftracer.EventTypeL7Request:
+			case ebpftracer.EventTypeL7Request: // TODO: 核心代码, 处理7层协议请求
 				//fmt.Println("EventTypeL7Request")
 				//fmt.Println("e.L7Request Payload:", string(e.L7Request.Payload))
 				if e.L7Request == nil {
 					continue
 				}
 				if c := r.containersByPid[e.Pid]; c != nil {
-					ip2fqdn := c.onL7RequestApm(e.Pid, e.Fd, e.Timestamp, e.L7Request)
+					ip2fqdn := c.onL7RequestApm(e.Pid, e.Fd, e.Timestamp, e.L7Request) // TODO: 核心代码
 					r.ip2fqdnLock.Lock()
 					for ip, fqdn := range ip2fqdn {
 						r.ip2fqdn[ip] = fqdn

+ 3 - 3
ebpftracer/tls.go

@@ -114,7 +114,7 @@ func (t *Tracer) AttachOpenSslUprobes(pid uint32) []link.Link {
 	return links
 }
 
-func (t *Tracer) AttachGoTlsUprobes(pid uint32) []link.Link {
+func (t *Tracer) AttachGoTlsUprobes(pid uint32) []link.Link { // TODO: 核心方法
 	if t.disableL7Tracing {
 		return nil
 	}
@@ -160,7 +160,7 @@ func (t *Tracer) AttachGoTlsUprobes(pid uint32) []link.Link {
 	}
 	defer ef.Close()
 
-	symbols, err := ef.Symbols()
+	symbols, err := ef.Symbols() // TODO: 根据进程语言...走不同的逻辑...
 	if err != nil {
 		if errors.Is(err, elf.ErrNoSymbols) {
 			log("no symbol section", nil)
@@ -227,7 +227,7 @@ func (t *Tracer) AttachGoTlsUprobes(pid uint32) []link.Link {
 	}
 
 	var links []link.Link
-	for _, s := range symbols {
+	for _, s := range symbols { // TODO: 遍历的方式找Func的Offset?
 		if elf.ST_TYPE(s.Info) != elf.STT_FUNC || s.Size == 0 {
 			continue
 		}

+ 5 - 4
ebpftracer/tracer.go

@@ -134,7 +134,7 @@ func NewTracer(kernelVersion string, disableL7Tracing bool) *Tracer {
 		kernelVersion:    kernelVersion,
 		disableL7Tracing: disableL7Tracing,
 
-		readers: map[string]*perf.Reader{},
+		readers: map[string]*perf.Reader{}, // TODO: readers和uprobes有什么区别呢?
 		uprobes: map[string]*ebpf.Program{},
 	}
 }
@@ -162,7 +162,7 @@ func (t *Tracer) Close() {
 	t.collection.Close()
 }
 
-func (t *Tracer) init(ch chan<- Event) error {
+func (t *Tracer) init(ch chan<- Event) error { // TODO: 触发handleEvent.....这些数据的作用是什么呢?
 	pids, err := proc.ListPids()
 	if err != nil {
 		return fmt.Errorf("failed to list pids: %w", err)
@@ -213,7 +213,8 @@ func (t *Tracer) ebpf(ch chan<- Event) error {
 	}
 	kv := "v" + common.KernelMajorMinor(t.kernelVersion)
 	var prg []byte
-	for _, p := range ebpfProg[runtime.GOARCH] {
+	for _, p := range ebpfProg[runtime.GOARCH] { // TODO: 核心方法: 返回当前架构下支持的EBPF程序
+		fmt.Println(p)
 		if semver.Compare(kv, p.v) >= 0 {
 			prg = p.p
 			break
@@ -229,7 +230,7 @@ func (t *Tracer) ebpf(ch chan<- Event) error {
 		return fmt.Errorf("kernel tracing is not available: debugfs or tracefs must be mounted")
 	}
 
-	collectionSpec, err := ebpf.LoadCollectionSpecFromReader(bytes.NewReader(prg))
+	collectionSpec, err := ebpf.LoadCollectionSpecFromReader(bytes.NewReader(prg)) // TODO: 核心代码...
 	if err != nil {
 		return fmt.Errorf("failed to load collection spec: %w", err)
 	}

+ 3 - 3
main.go

@@ -131,7 +131,7 @@ func main() {
 	whitelistNodeExternalNetworks()
 
 	machineId := machineID()
-	tracing.Init(machineId, hostname, version)
+	tracing.Init(machineId, hostname, version) // TODO: 初始化发送地址等逻辑
 	logs.Init(machineId, hostname, version)
 
 	registry := prometheus.NewRegistry()
@@ -145,7 +145,7 @@ func main() {
 
 	//processInfoCh := profiling.Init(machineId, hostname)
 
-	cr, err := containers.NewRegistry(registerer, kv, nil)
+	cr, err := containers.NewRegistry(registerer, kv, nil) // TODO: 核心代码
 
 	if err != nil {
 		klog.Exitln(err)
@@ -224,7 +224,7 @@ func main() {
 		w.Write(jsonData)
 	}
 
-	if err := prom.StartAgent(machineId); err != nil {
+	if err := prom.StartAgent(machineId); err != nil { // TODO?
 		klog.Exitln(err)
 	}