From 3761a1da3db7ac9dbacffa4eb7f9391bbe23989a Mon Sep 17 00:00:00 2001 From: Wangjunqi123 Date: Wed, 4 Dec 2024 09:35:28 +0800 Subject: [PATCH] agent/probes/network: process tcp net flow data --- agent/probes/network/flow/flowdata.go | 61 ++++++++++++++++++++++ agent/probes/network/main.go | 5 +- agent/probes/network/src/tcp_netflow.bpf.c | 8 --- agent/probes/network/src/tcp_netflow.go | 18 ------- agent/probes/network/src/tcp_netflow.h | 7 +++ 5 files changed, 71 insertions(+), 28 deletions(-) create mode 100644 agent/probes/network/flow/flowdata.go diff --git a/agent/probes/network/flow/flowdata.go b/agent/probes/network/flow/flowdata.go new file mode 100644 index 0000000..1957450 --- /dev/null +++ b/agent/probes/network/flow/flowdata.go @@ -0,0 +1,61 @@ +/* + * Copyright (c) KylinSoft Co., Ltd. 2024.All rights reserved. + * PilotGo-plugin-prometheus licensed under the Mulan Permissive Software License, Version 2. + * See LICENSE file for more details. + * Author: Wangjunqi123 + * Date: Mon Dec 2 09:19:50 2024 +0800 + */ +package flow + +import ( + "fmt" + "os" + "time" + + "openeuler.org/PilotGo/prometheus-plugin/agent/probes/network/global" +) + +func TcpNetFlow(stop chan os.Signal) { + ticker := time.NewTicker(time.Second * 1) + for { + select { + case <-stop: + return + case <-ticker.C: + global.Global_ProcTcpManager.ProcTcpMetricsMap.Range(func(key, value any) bool { + pid := key.(uint32) + proc_tcp_metrics := value.(*global.ProcTcpMetrics) + + proc_tcp_flow_any, _ := global.Global_ProcTcpManager.ProcTcpFlowMap.Load(pid) + proc_tcp_flow := proc_tcp_flow_any.(*global.ProcTcpFlow) + proc_tcp_flow.TxFlow = proc_tcp_metrics.TcpMetrics.Tx - proc_tcp_metrics.TxLatest + proc_tcp_flow.RxFlow = proc_tcp_metrics.TcpMetrics.Rx - proc_tcp_metrics.RxLatest + + proc_tcp_metrics.TxLatest = proc_tcp_metrics.TcpMetrics.Tx + proc_tcp_metrics.RxLatest = proc_tcp_metrics.TcpMetrics.Rx + + // ttcode + if proc_tcp_metrics.TcpMetrics.Tx < proc_tcp_metrics.TxLatest { + fmt.Printf(">>>tx: %d, txlatest: %d\n", proc_tcp_metrics.TcpMetrics.Tx, proc_tcp_metrics.TxLatest) + } + clients := []string{} + proc_tcp_metrics.TcpMetrics.Clients_addr_map.Range(func(key, value any) bool { + addr := key.(string) + clients = append(clients, addr) + return true + }) + fmt.Printf("\033[33mtime\033[0m: %s \033[33mcomm\033[0m: %s \033[33mpid\033[0m: %d \033[33mrole\033[0m: %s \033[33mclient\033[0m(%v)->\033[33mserver\033[0m(%s:%d) \033[32mtx: %d Byte/s rx: %d Byte/s\033[0m\n", + time.Now().Format("15:04:05"), + proc_tcp_metrics.TcpMetrics.Comm, + pid, + proc_tcp_metrics.TcpMetrics.Role, + clients, + proc_tcp_metrics.TcpMetrics.S_ip, proc_tcp_metrics.TcpMetrics.S_port, + proc_tcp_flow.TxFlow, + proc_tcp_flow.RxFlow, + ) + return true + }) + } + } +} diff --git a/agent/probes/network/main.go b/agent/probes/network/main.go index 14775f1..95b1f8a 100644 --- a/agent/probes/network/main.go +++ b/agent/probes/network/main.go @@ -8,6 +8,7 @@ package main import ( + "openeuler.org/PilotGo/prometheus-plugin/agent/probes/network/flow" "openeuler.org/PilotGo/prometheus-plugin/agent/probes/network/global" "openeuler.org/PilotGo/prometheus-plugin/agent/probes/network/src" @@ -19,8 +20,8 @@ import ( func main() { stopper := make(chan os.Signal, 1) signal.Notify(stopper, os.Interrupt, syscall.SIGTERM, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) - - global.InitProcTcpManger() + global.InitProcTcpManger() + go flow.TcpNetFlow(stopper) src.Netflow(stopper) } diff --git a/agent/probes/network/src/tcp_netflow.bpf.c b/agent/probes/network/src/tcp_netflow.bpf.c index 0b74ab9..aabb901 100644 --- a/agent/probes/network/src/tcp_netflow.bpf.c +++ b/agent/probes/network/src/tcp_netflow.bpf.c @@ -35,7 +35,6 @@ int BPF_KPROBE(tcp_sendmsg, struct sock *sk, size_t size) { bpf_printk("(tcp_sendmsg) pid: %u", pid); struct tcp_metrics *metrics = bpf_map_lookup_elem(&tcp_link_map, &pid); - // struct tcp_metrics *metrics = bpf_map_lookup_elem(&tcp_link_map, &sk); if (!metrics) { return 0; } @@ -91,7 +90,6 @@ int BPF_KRETPROBE(tcp_sendmsg_exit, int ret) { } metrics->tx = (u64)ret; - // __sync_fetch_and_add(&(metrics->tx), (u64)(ret)); bpf_ringbuf_output(&tcp_output, metrics, sizeof(struct tcp_metrics), 0); @@ -119,7 +117,6 @@ int BPF_KPROBE(tcp_cleanup_rbuf, struct sock *sk, int copied) { bpf_printk("(tcp_cleanup_rbuf) pid: %u", pid); struct tcp_metrics *metrics = bpf_map_lookup_elem(&tcp_link_map, &pid); - // struct tcp_metrics *metrics = bpf_map_lookup_elem(&tcp_link_map, &sk); if (!metrics) { return 0; } @@ -154,7 +151,6 @@ int BPF_KPROBE(tcp_cleanup_rbuf, struct sock *sk, int copied) { (void)bpf_get_current_comm(metrics->comm, sizeof(metrics->comm)); metrics->rx = (u64)copied; - // __sync_fetch_and_add(&(metrics->rx), (u64)(copied)); bpf_ringbuf_output(&tcp_output, metrics, sizeof(struct tcp_metrics), 0); return 0; @@ -245,15 +241,11 @@ int BPF_KPROBE(tcp_set_state, struct sock *sk, u16 new_state) { if (old_state == TCP_SYN_SENT && new_state == TCP_ESTABLISHED) { tcpmetrics.role = LINK_ROLE_CLIENT; - // bpf_map_update_elem(&tcp_link_send_map, &pid, &tcpmetrics, BPF_ANY); - // bpf_map_update_elem(&tcp_link_recv_map, &pid, &tcpmetrics, BPF_ANY); bpf_map_update_elem(&tcp_link_map, &pid, &tcpmetrics, BPF_ANY); } if (old_state == TCP_SYN_RECV && new_state == TCP_ESTABLISHED) { tcpmetrics.role = LINK_ROLE_SERVER; - // bpf_map_update_elem(&tcp_link_send_map, &pid, &tcpmetrics, BPF_ANY); - // bpf_map_update_elem(&tcp_link_recv_map, &pid, &tcpmetrics, BPF_ANY); bpf_map_update_elem(&tcp_link_map, &pid, &tcpmetrics, BPF_ANY); } diff --git a/agent/probes/network/src/tcp_netflow.go b/agent/probes/network/src/tcp_netflow.go index 0297b4a..331194f 100644 --- a/agent/probes/network/src/tcp_netflow.go +++ b/agent/probes/network/src/tcp_netflow.go @@ -190,23 +190,5 @@ func Netflow(stop chan os.Signal) { } AddProcTcp(bpftcpmetrics) - - // ttcode - // clients := []string{} - // tcpmetrics := AddProcTcp(bpftcpmetrics) - // tcpmetrics.Clients_addr_map.Range(func(key, value any) bool { - // addr := key.(string) - // clients = append(clients, addr) - // return true - // }) - // fmt.Printf("pid: %d client(%v) server(%s:%d) family: %d socket role: %s comm: %v rx: %v tx:%v\n", - // tcpmetrics.Pid, - // clients, - // tcpmetrics.S_ip, tcpmetrics.S_port, - // tcpmetrics.Family, - // tcpmetrics.Role, - // tcpmetrics.Comm, - // tcpmetrics.Rx, tcpmetrics.Tx, - // ) } } diff --git a/agent/probes/network/src/tcp_netflow.h b/agent/probes/network/src/tcp_netflow.h index 2da525a..2338aed 100644 --- a/agent/probes/network/src/tcp_netflow.h +++ b/agent/probes/network/src/tcp_netflow.h @@ -1,3 +1,10 @@ +/* + * Copyright (c) KylinSoft Co., Ltd. 2024.All rights reserved. + * PilotGo-plugin-prometheus licensed under the Mulan Permissive Software License, Version 2. + * See LICENSE file for more details. + * Author: Wangjunqi123 + * Date: Thu Nov 14 13:40:55 2024 +0800 + */ #ifndef __TCP_NETFLOW_H #define __TCP_NETFLOW_H -- Gitee