1- use aya:: { maps:: {
2- perf:: PerfEventArrayBuffer , Map , MapData , PerfEventArray
3- } , util:: online_cpus} ;
1+ use aya:: {
2+ maps:: { Map , MapData , PerfEventArray , perf:: PerfEventArrayBuffer } ,
3+ util:: online_cpus,
4+ } ;
45
56use bytes:: BytesMut ;
6- use tokio:: signal;
7- use std:: {
8- sync:: {
9- Arc ,
10- atomic:: { AtomicBool , Ordering } ,
11- } ,
7+ use std:: sync:: {
8+ Arc ,
9+ atomic:: { AtomicBool , Ordering } ,
1210} ;
11+ use tokio:: signal;
1312
14- use tracing:: { error, info} ;
13+ use tracing:: { debug , error, info} ;
1514
1615use crate :: structs:: NetworkMetrics ;
1716use crate :: structs:: TimeStampMetrics ;
1817
1918pub async fn display_metrics_map (
2019 mut perf_buffers : Vec < PerfEventArrayBuffer < MapData > > ,
21- running : Arc < AtomicBool > , // Changed to Arc<AtomicBool>
20+ running : Arc < AtomicBool > , // Changed to Arc<AtomicBool>
2221 mut buffers : Vec < BytesMut > ,
2322) {
2423 info ! ( "Starting metrics event listener..." ) ;
@@ -46,10 +45,23 @@ pub async fn display_metrics_map(
4645 let sk_receive_buffer_size = net_metrics. sk_receive_buffer_size ;
4746 info ! (
4847 "tgid: {}, comm: {}, ts_us: {}, sk_drops: {}, sk_err: {}, sk_err_soft: {}, sk_backlog_len: {}, sk_write_memory_queued: {}, sk_ack_backlog: {}, sk_receive_buffer_size: {}" ,
49- tgid, comm, ts_us, sk_drop_count, sk_err, sk_err_soft, sk_backlog_len, sk_write_memory_queued, sk_ack_backlog, sk_receive_buffer_size
48+ tgid,
49+ comm,
50+ ts_us,
51+ sk_drop_count,
52+ sk_err,
53+ sk_err_soft,
54+ sk_backlog_len,
55+ sk_write_memory_queued,
56+ sk_ack_backlog,
57+ sk_receive_buffer_size
5058 ) ;
5159 } else {
52- info ! ( "Received data too small: {} bytes, expected: {}" , data. len( ) , std:: mem:: size_of:: <NetworkMetrics >( ) ) ;
60+ info ! (
61+ "Received data too small: {} bytes, expected: {}" ,
62+ data. len( ) ,
63+ std:: mem:: size_of:: <NetworkMetrics >( )
64+ ) ;
5365 }
5466 }
5567 }
@@ -65,7 +77,7 @@ pub async fn display_metrics_map(
6577
6678pub async fn display_time_stamp_events_map (
6779 mut perf_buffers : Vec < PerfEventArrayBuffer < MapData > > ,
68- running : Arc < AtomicBool > , // Changed to Arc<AtomicBool>
80+ running : Arc < AtomicBool > , // Changed to Arc<AtomicBool>
6981 mut buffers : Vec < BytesMut > ,
7082) {
7183 info ! ( "Starting timestamp event listener..." ) ;
@@ -107,48 +119,67 @@ pub async fn display_time_stamp_events_map(
107119 info ! ( "Timestamp event listener stopped" ) ;
108120}
109121
110- pub async fn event_listener ( bpf_maps : ( Map , Map ) ) -> Result < ( ) , anyhow:: Error > {
122+ pub async fn event_listener ( bpf_maps : Vec < Map > ) -> Result < ( ) , anyhow:: Error > {
111123 info ! ( "Getting CPU count..." ) ;
112- let cpu_count = online_cpus ( ) . map_err ( |e| anyhow:: anyhow!( "Error {:?}" , e) ) ?. len ( ) ;
113- info ! ( "CPU count: {}" , cpu_count) ;
114-
124+
125+ let mut perf_event_arrays = Vec :: new ( ) ; // contains a vector of PerfEventArrays
126+ let mut event_buffers = Vec :: new ( ) ; // contains a vector of buffers
127+
115128 info ! ( "Creating perf buffers..." ) ;
116- let mut net_perf_buffer: Vec < PerfEventArrayBuffer < MapData > > = Vec :: new ( ) ;
117- let mut net_perf_array: PerfEventArray < MapData > = PerfEventArray :: try_from ( bpf_maps. 0 ) ?;
118- let mut time_stamp_events_perf_buffer: Vec < PerfEventArrayBuffer < MapData > > = Vec :: new ( ) ;
119- let mut time_stamp_events_perf_array: PerfEventArray < MapData > =
120- PerfEventArray :: try_from ( bpf_maps. 1 ) ?;
121-
122- info ! ( "Opening perf buffers for {} CPUs..." , cpu_count) ;
123- for cpu_id in online_cpus ( ) . map_err ( |e| anyhow:: anyhow!( "Error {:?}" , e) ) ? {
124- let buf: PerfEventArrayBuffer < MapData > = net_perf_array. open ( cpu_id, None ) ?;
125- net_perf_buffer. push ( buf) ;
129+ for map in bpf_maps {
130+ debug ! ( "Debugging map type:{:?}" , map) ;
131+ let perf_event_array = PerfEventArray :: try_from ( map) . map_err ( |e| {
132+ error ! ( "Cannot create perf_event_array for map.Reason: {}" , e) ;
133+ anyhow:: anyhow!( "Cannot create perf_event_array for map.Reason: {}" , e)
134+ } ) ?;
135+ perf_event_arrays. push ( perf_event_array) ; // this is step 1
136+ let perf_event_array_buffer = Vec :: new ( ) ;
137+ event_buffers. push ( perf_event_array_buffer) ; //this is step 2
126138 }
127- for cpu_id in online_cpus ( ) . map_err ( |e| anyhow:: anyhow!( "Error {:?}" , e) ) ? {
128- let buf: PerfEventArrayBuffer < MapData > = time_stamp_events_perf_array. open ( cpu_id, None ) ?;
129- time_stamp_events_perf_buffer. push ( buf) ;
139+
140+ let cpu_count = online_cpus ( ) . map_err ( |e| anyhow:: anyhow!( "Error {:?}" , e) ) ?;
141+
142+ //info!("CPU count: {}", cpu_count);
143+ for ( perf_evt_array, perf_evt_array_buffer) in
144+ perf_event_arrays. iter_mut ( ) . zip ( event_buffers. iter_mut ( ) )
145+ {
146+ for cpu_id in & cpu_count {
147+ let single_buffer = perf_evt_array. open ( * cpu_id, None ) ?;
148+ perf_evt_array_buffer. push ( single_buffer) ;
149+ }
130150 }
151+
152+ //info!("Opening perf buffers for {} CPUs...", cpu_count);
131153 info ! ( "Perf buffers created successfully" ) ;
154+ let mut event_buffers = event_buffers. into_iter ( ) ;
155+
156+ let time_stamp_events_perf_buffer = event_buffers. next ( ) . expect ( "" ) ;
157+ let net_perf_buffer = event_buffers. next ( ) . expect ( "" ) ;
132158
133159 // Create shared running flags
134160 let net_metrics_running = Arc :: new ( AtomicBool :: new ( true ) ) ;
135161 let time_stamp_events_running = Arc :: new ( AtomicBool :: new ( true ) ) ;
136-
162+
137163 // Create proper sized buffers
138- let net_metrics_buffers = vec ! [ BytesMut :: with_capacity( 1024 ) ; cpu_count] ;
139- let time_stamp_events_buffers = vec ! [ BytesMut :: with_capacity( 1024 ) ; cpu_count] ;
140-
164+ let net_metrics_buffers = vec ! [ BytesMut :: with_capacity( 1024 ) ; cpu_count. len ( ) ] ;
165+ let time_stamp_events_buffers = vec ! [ BytesMut :: with_capacity( 1024 ) ; cpu_count. len ( ) ] ;
166+
141167 // Clone for the signal handler
142168 let net_metrics_running_signal = net_metrics_running. clone ( ) ;
143169 let time_stamp_events_running_signal = time_stamp_events_running. clone ( ) ;
144-
170+
145171 info ! ( "Starting event listener tasks..." ) ;
146172 let metrics_map_displayer = tokio:: spawn ( async move {
147173 display_metrics_map ( net_perf_buffer, net_metrics_running, net_metrics_buffers) . await ;
148174 } ) ;
149175
150176 let time_stamp_events_displayer = tokio:: spawn ( async move {
151- display_time_stamp_events_map ( time_stamp_events_perf_buffer, time_stamp_events_running, time_stamp_events_buffers) . await
177+ display_time_stamp_events_map (
178+ time_stamp_events_perf_buffer,
179+ time_stamp_events_running,
180+ time_stamp_events_buffers,
181+ )
182+ . await
152183 } ) ;
153184
154185 info ! ( "Event listeners started, entering main loop..." ) ;
@@ -176,4 +207,4 @@ pub async fn event_listener(bpf_maps: (Map, Map)) -> Result<(), anyhow::Error> {
176207
177208 // return success
178209 Ok ( ( ) )
179- }
210+ }
0 commit comments