11use anyhow:: anyhow;
22use aya:: util:: online_cpus;
33use cortexbrain_common:: map_handlers:: map_manager;
4- use cortexbrain_common:: {
5- buffer_type:: { BufferSize , BufferType , read_perf_buffer} ,
6- map_handlers:: BpfMapsData ,
7- } ;
4+ use cortexbrain_common:: { buffer_type:: BufferSize , map_handlers:: BpfMapsData } ;
5+ use opentelemetry:: metrics:: Meter ;
6+ use std:: sync:: Arc ;
87use tokio:: signal;
98use tracing:: { error, info} ;
109
11- pub async fn event_listener ( bpf_maps : BpfMapsData ) -> Result < ( ) , anyhow:: Error > {
10+ use cortexbrain_common:: buffer_type:: { BufferType , read_perf_buffer} ;
11+ use cortexbrain_common:: otel_metrics:: Metrics ;
12+
13+ /// Listen for eBPF perf-buffer events and record OpenTelemetry metrics.
14+ ///
15+ /// This function bridges the eBPF perf-buffer layer with the OpenTelemetry
16+ /// metrics pipeline. It opens per-CPU buffers for the two maps of interest
17+ /// (`net_metrics` and `time_stamp_events`), spawns asynchronous consumers,
18+ /// and parks until a `Ctrl-C` signal is received or one of the consumers
19+ /// terminates.
20+ ///
21+ /// # Arguments
22+ ///
23+ /// -`bpf_maps` – handles for the pinned BPF maps produced by
24+ /// [`cortexbrain_common::map_handlers::map_pinner`].
25+ /// - `meter` – an initialised OpenTelemetry [`Meter`].
26+ ///
27+ /// # Errors
28+ ///
29+ /// Returns `Err` if the map manager or CPU enumeration fails.
30+ ///
31+ pub async fn event_listener ( bpf_maps : BpfMapsData , meter : Meter ) -> Result < ( ) , anyhow:: Error > {
1232 info ! ( "Getting CPU count..." ) ;
1333
1434 let mut maps = map_manager ( bpf_maps) ?;
@@ -35,48 +55,63 @@ pub async fn event_listener(bpf_maps: BpfMapsData) -> Result<(), anyhow::Error>
3555
3656 info ! ( "Perf buffers created successfully" ) ;
3757
38- let ( time_stamp_events_array , time_stamp_events_perf_buffer) = maps
58+ let ( _time_stamp_events_array , time_stamp_events_perf_buffer) = maps
3959 . remove ( "time_stamp_events" )
4060 . expect ( "Cannot create time_stamp_events_buffer" ) ;
41- let ( net_perf_array , net_perf_buffer) = maps
61+ let ( _net_perf_array , net_perf_buffer) = maps
4262 . remove ( "net_metrics" )
4363 . expect ( "Cannot create net_perf_buffer" ) ;
4464
45- // Create proper sized buffers
65+ // Allocate byte-buffers sized for each structure type
4666 let net_metrics_buffers = BufferSize :: NetworkMetricsEvents . set_buffer ( ) ;
4767 let time_stamp_events_buffers = BufferSize :: TimeMetricsEvents . set_buffer ( ) ;
4868
69+ let metrics = Arc :: new ( Metrics :: new ( & meter) ) ;
70+
4971 info ! ( "Starting event listener tasks..." ) ;
50- let metrics_map_displayer = tokio:: spawn ( async move {
51- read_perf_buffer (
52- net_perf_buffer,
53- net_metrics_buffers,
54- BufferType :: NetworkMetrics ,
55- )
56- . await ;
57- } ) ;
58-
59- let time_stamp_events_displayer = tokio:: spawn ( async move {
60- read_perf_buffer (
61- time_stamp_events_perf_buffer,
62- time_stamp_events_buffers,
63- BufferType :: TimeStampMetrics ,
64- )
65- . await ;
66- } ) ;
72+
73+ let net_metrics_handle = {
74+ let metrics = Arc :: clone ( & metrics) ;
75+ let mut array_buffers = net_perf_buffer;
76+ let mut buffers = net_metrics_buffers;
77+ tokio:: spawn ( async move {
78+ read_perf_buffer (
79+ array_buffers,
80+ buffers,
81+ BufferType :: NetworkMetrics ,
82+ Some ( metrics) ,
83+ )
84+ . await ;
85+ } )
86+ } ;
87+
88+ let time_stamp_handle = {
89+ let metrics = Arc :: clone ( & metrics) ;
90+ let mut array_buffers = time_stamp_events_perf_buffer;
91+ let mut buffers = time_stamp_events_buffers;
92+ tokio:: spawn ( async move {
93+ read_perf_buffer (
94+ array_buffers,
95+ buffers,
96+ BufferType :: TimeStampMetrics ,
97+ Some ( metrics) ,
98+ )
99+ . await ;
100+ } )
101+ } ;
67102
68103 info ! ( "Event listeners started, entering main loop..." ) ;
69104
70105 tokio:: select! {
71- result = metrics_map_displayer => {
106+ result = net_metrics_handle => {
72107 if let Err ( e) = result {
73- error!( "Metrics map displayer task failed: {:?}" , e) ;
108+ error!( "Network metrics task failed: {:?}" , e) ;
74109 }
75110 }
76111
77- result = time_stamp_events_displayer => {
112+ result = time_stamp_handle => {
78113 if let Err ( e) = result {
79- error!( "Time stamp events displayer task failed: {:?}" , e) ;
114+ error!( "Timestamp events task failed: {:?}" , e) ;
80115 }
81116 }
82117
@@ -85,6 +120,5 @@ pub async fn event_listener(bpf_maps: BpfMapsData) -> Result<(), anyhow::Error>
85120 }
86121 }
87122
88- // return success
89123 Ok ( ( ) )
90124}
0 commit comments