Przeglądaj źródła

Feature #TASK_QT-18250 进程退出时卸载所有点

Carl 1 rok temu
rodzic
commit
d5bfa002d4
5 zmienionych plików z 46 dodań i 19 usunięć
  1. 1 1
      common/net.go
  2. 4 4
      containers/cilium.go
  3. 9 0
      containers/registry.go
  4. 8 5
      ebpftracer/tracer.go
  5. 24 9
      main.go

+ 1 - 1
common/net.go

@@ -17,7 +17,7 @@ var (
 )
 
 func init() {
-	klog.Infoln("whitelisted public IPs:", *flags.ExternalNetworksWhitelist)
+	//klog.Infoln("whitelisted public IPs:", *flags.ExternalNetworksWhitelist)
 	for _, prefix := range *flags.ExternalNetworksWhitelist {
 		if prefix == "" {
 			continue

+ 4 - 4
containers/cilium.go

@@ -27,20 +27,20 @@ func init() {
 
 	ciliumCt4, err = bpf.OpenMap(proc.HostPath(filepath.Join(defaults.DefaultMapRoot, defaults.DefaultMapPrefix, ctmap.MapNameTCP4Global)))
 	if err != nil {
-		klog.Infoln(err)
+		//klog.Infoln(err)
 	} else {
 		klog.Infoln("found cilium ebpf-map:", ctmap.MapNameTCP4Global)
 	}
 	ciliumCt6, err = bpf.OpenMap(proc.HostPath(filepath.Join(defaults.DefaultMapRoot, defaults.DefaultMapPrefix, ctmap.MapNameTCP6Global)))
 	if err != nil {
-		klog.Infoln(err)
+		//klog.Infoln(err)
 	} else {
 		klog.Infoln("found cilium ebpf-map:", ctmap.MapNameTCP6Global)
 	}
 	for _, n := range []string{lbmap.Backend4MapV2Name, lbmap.Backend4MapV3Name} {
 		backends4Map, err = bpf.OpenMap(proc.HostPath(filepath.Join(defaults.DefaultMapRoot, defaults.DefaultMapPrefix, n)))
 		if err != nil {
-			klog.Infoln(err)
+			//klog.Infoln(err)
 		} else {
 			klog.Infoln("found cilium ebpf-map:", n)
 			break
@@ -49,7 +49,7 @@ func init() {
 	for _, n := range []string{lbmap.Backend6MapV2Name, lbmap.Backend6MapV3Name} {
 		backends6Map, err = bpf.OpenMap(proc.HostPath(filepath.Join(defaults.DefaultMapRoot, defaults.DefaultMapPrefix, n)))
 		if err != nil {
-			klog.Infoln(err)
+			//klog.Infoln(err)
 		} else {
 			klog.Infoln("found cilium ebpf-map:", n)
 			break

+ 9 - 0
containers/registry.go

@@ -197,10 +197,19 @@ func (r *Registry) Collect(ch chan<- prometheus.Metric) {
 }
 
 func (r *Registry) Close() {
+	r.CloseContainers()
 	r.tracer.Close()
 	close(r.events)
 }
 
+func (r *Registry) CloseContainers() {
+	for pid, c := range r.containersByPid {
+		if c.Isl7AttachSuccess() {
+			c.Detach(pid, APP_UNINSTALL)
+		}
+	}
+}
+
 func (r *Registry) handleEvents(ch <-chan ebpftracer.Event) {
 	gcTicker := time.NewTicker(gcInterval)
 	defer gcTicker.Stop()

+ 8 - 5
ebpftracer/tracer.go

@@ -184,14 +184,17 @@ func (t *Tracer) Run(events chan<- Event) error {
 }
 
 func (t *Tracer) Close() {
-	for _, p := range t.uprobes {
-		_ = p.Close()
+	for k, p := range t.uprobes {
+		err := p.Close()
+		klog.WithError(err).Infof("[close] uprobes %s", k)
 	}
 	for _, l := range t.links {
-		_ = l.Close()
+		err := l.Close()
+		klog.WithError(err).Infof("[close] links")
 	}
-	for _, r := range t.readers {
-		_ = r.Close()
+	for k, r := range t.readers {
+		err := r.Close()
+		klog.WithError(err).Infof("[close] readers %s", k)
 	}
 	t.collection.Close()
 }

+ 24 - 9
main.go

@@ -15,8 +15,11 @@ import (
 	"net/http"
 	_ "net/http/pprof"
 	"os"
+	"os/signal"
 	"path"
 	"path/filepath"
+	"syscall"
+
 	// "regexp"
 	"runtime"
 	"strconv"
@@ -28,10 +31,8 @@ import (
 	"github.com/coroot/coroot-node-agent/flags"
 	"github.com/coroot/coroot-node-agent/logs"
 	"github.com/coroot/coroot-node-agent/node"
-	"github.com/coroot/coroot-node-agent/prom"
 	"github.com/coroot/coroot-node-agent/tracing"
 	"github.com/prometheus/client_golang/prometheus"
-	"github.com/prometheus/client_golang/prometheus/promhttp"
 	"golang.org/x/mod/semver"
 	"golang.org/x/sys/unix"
 	"golang.org/x/time/rate"
@@ -140,7 +141,7 @@ func main() {
 		MaxSize:    50, // 日志文件最大尺寸,单位MB
 		MaxBackups: 3,  // 最多保留的旧日志文件数
 		MaxAge:     3,  // 日志文件保留的最长时间,单位天
-		Console:    false,
+		Console:    true,
 	})
 
 	if err != nil {
@@ -206,7 +207,7 @@ func main() {
 	if err != nil {
 		log.Fatalln(err)
 	}
-	defer cr.Close()
+	//defer cr.Close()
 	log.Infoln("START_TRACE")
 
 	if *flags.RunInOmniagent {
@@ -379,7 +380,7 @@ func main() {
 		}
 	}()
 
-	metricsHandler := func(w http.ResponseWriter, r *http.Request) {
+	/*	metricsHandler := func(w http.ResponseWriter, r *http.Request) {
 		// 从注册表中获取指标数据
 		metrics, err := registry.Gather()
 		if err != nil {
@@ -515,17 +516,31 @@ func main() {
 		// 输出响应状态码和响应正文
 		log.Debugln("Status Code:", response.StatusCode)
 		log.Infoln("Response Body:", string(responseData))
-	}
+	}*/
 
-	if err := prom.StartAgent(SystemUUID); err != nil {
+	/*if err := prom.StartAgent(SystemUUID); err != nil {
 		log.Fatalln(err)
 	}
 
 	http.Handle("/metrics", promhttp.HandlerFor(registry, promhttp.HandlerOpts{ErrorLog: logger{}, Registry: registerer}))
 	http.HandleFunc("/metrics2", metricsHandler)
 	log.Infoln("listening on:", *flags.ListenAddress)
-	log.Errorln(http.ListenAndServe(*flags.ListenAddress, nil))
-	close(sendNetDataDone)
+	log.Errorln(http.ListenAndServe(*flags.ListenAddress, nil))*/
+	sigs := make(chan os.Signal, 1)
+	signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
+
+	done := make(chan struct{})
+	go func() {
+		<-sigs
+		log.Infoln("Signal received, shutting down...")
+		cr.Close()
+		close(sendNetDataDone)
+		close(done)
+	}()
+	select {
+	case <-done:
+		log.Infoln(flags.AgentName + " exited successfully.")
+	}
 }
 
 func info(name, version string) prometheus.Collector {