2424#include " du_high_rlc_metrics.h"
2525#include " srsran/scheduler/scheduler_metrics.h"
2626#include " srsran/support/engineering_notation.h"
27+ #include " srsran/support/format/custom_formattable.h"
2728#include " fmt/ranges.h"
2829#include " fmt/std.h"
2930#include < ostream>
@@ -113,11 +114,13 @@ DECLARE_METRIC_SET("cell_events", mset_cell_event, metric_sfn, metric_slot_index
113114// / cell-wide metrics.
114115DECLARE_METRIC (" error_indication_count" , metric_error_indication_count, unsigned , " " );
115116DECLARE_METRIC (" average_latency" , metric_average_latency, unsigned , " " );
117+ DECLARE_METRIC (" max_latency" , metric_max_latency, unsigned , " " );
116118DECLARE_METRIC (" latency_histogram" , latency_histogram, std::vector<unsigned >, " " );
117119DECLARE_METRIC_SET (" cell_metrics" ,
118120 cell_metrics,
119121 metric_error_indication_count,
120122 metric_average_latency,
123+ metric_max_latency,
121124 latency_histogram);
122125
123126// / Metrics root object.
@@ -223,7 +226,7 @@ void scheduler_cell_metrics_consumer_stdout::handle_metric(const app_services::m
223226 if (ue.ul_ri_stats .get_nof_observations () > 0 ) {
224227 fmt::print (" {:>3.1f}" , ue.ul_ri_stats .get_mean ());
225228 } else {
226- fmt::print (" {:>3} " , " n/a " );
229+ fmt::print (" 1 " );
227230 }
228231
229232 fmt::print (" {:>2}" , ue.ul_mcs .to_uint ());
@@ -342,6 +345,7 @@ void scheduler_cell_metrics_consumer_json::handle_metric(const app_services::met
342345 auto & cell_output = ctx.get <cell_metrics>();
343346 cell_output.write <metric_error_indication_count>(metrics.nof_error_indications );
344347 cell_output.write <metric_average_latency>(metrics.average_decision_latency .count ());
348+ cell_output.write <metric_max_latency>(metrics.max_decision_latency .count ());
345349 cell_output.write <latency_histogram>(
346350 std::vector<unsigned >(metrics.latency_histogram .begin (), metrics.latency_histogram .end ()));
347351
@@ -364,25 +368,62 @@ void scheduler_cell_metrics_consumer_log::handle_metric(const app_services::metr
364368
365369 unsigned sum_dl_bitrate_kbps = 0 ;
366370 unsigned sum_ul_bitrate_kbps = 0 ;
371+ unsigned sum_pdsch_rbs = 0 ;
372+ unsigned sum_pusch_rbs = 0 ;
373+ float max_crc_delay = std::numeric_limits<float >::min ();
374+ float max_ce_delay = std::numeric_limits<float >::min ();
375+ float max_pucch_delay = std::numeric_limits<float >::min ();
376+ float max_pusch_delay = std::numeric_limits<float >::min ();
367377 for (const auto & ue : metrics.ue_metrics ) {
368378 sum_dl_bitrate_kbps += ue.dl_brate_kbps ;
369379 sum_ul_bitrate_kbps += ue.ul_brate_kbps ;
380+ sum_pdsch_rbs += ue.tot_pdsch_prbs_used ;
381+ sum_pusch_rbs += ue.tot_pusch_prbs_used ;
382+ if (ue.max_crc_delay_ms .has_value ()) {
383+ max_crc_delay = std::max (max_crc_delay, ue.max_crc_delay_ms .value ());
384+ }
385+ if (ue.max_ce_delay_ms .has_value ()) {
386+ max_ce_delay = std::max (max_ce_delay, ue.max_ce_delay_ms .value ());
387+ }
388+ if (ue.max_pucch_harq_delay_ms .has_value ()) {
389+ max_pucch_delay = std::max (max_pucch_delay, ue.max_pucch_harq_delay_ms .value ());
390+ }
391+ if (ue.max_pusch_harq_delay_ms .has_value ()) {
392+ max_pusch_delay = std::max (max_pusch_delay, ue.max_pusch_harq_delay_ms .value ());
393+ }
370394 }
371395
372396 // log cell-wide metrics
373397 fmt::format_to (std::back_inserter (buffer), " Cell Scheduler Metrics:" );
374398 fmt::format_to (
375399 std::back_inserter (buffer),
376400 " total_dl_brate={}bps total_ul_brate={}bps nof_prbs={} nof_dl_slots={} nof_ul_slots={} error_indications={} "
377- " mean_latency={}usec latency_hist=[{}]" ,
401+ " pdsch_rbs_per_slot={} pusch_rbs_per_slot={} mean_latency={}usec max_latency={}usec max_latency_slot={} "
402+ " latency_hist=[{}]" ,
378403 float_to_eng_string (sum_dl_bitrate_kbps * 1e3 , 1 , false ),
379404 float_to_eng_string (sum_ul_bitrate_kbps * 1e3 , 1 , false ),
380405 metrics.nof_prbs ,
381406 metrics.nof_dl_slots ,
382407 metrics.nof_ul_slots ,
383408 metrics.nof_error_indications ,
409+ sum_pdsch_rbs / metrics.nof_dl_slots ,
410+ sum_pusch_rbs / metrics.nof_ul_slots ,
384411 metrics.average_decision_latency .count (),
412+ metrics.max_decision_latency .count (),
413+ metrics.max_decision_latency_slot ,
385414 fmt::join (metrics.latency_histogram .begin (), metrics.latency_histogram .end (), " , " ));
415+ if (max_crc_delay != std::numeric_limits<float >::min ()) {
416+ fmt::format_to (std::back_inserter (buffer), " max_crc_delay={}ms" , max_crc_delay);
417+ }
418+ if (max_ce_delay != std::numeric_limits<float >::min ()) {
419+ fmt::format_to (std::back_inserter (buffer), " max_ce_delay={}ms" , max_ce_delay);
420+ }
421+ if (max_pucch_delay != std::numeric_limits<float >::min ()) {
422+ fmt::format_to (std::back_inserter (buffer), " max_pucch_harq_delay={}ms" , max_pucch_delay);
423+ }
424+ if (max_pusch_delay != std::numeric_limits<float >::min ()) {
425+ fmt::format_to (std::back_inserter (buffer), " max_pusch_harq_delay={}ms" , max_pusch_delay);
426+ }
386427 if (not metrics.events .empty ()) {
387428 fmt::format_to (std::back_inserter (buffer), " events=[" );
388429 bool first = true ;
@@ -432,7 +473,7 @@ void scheduler_cell_metrics_consumer_log::handle_metric(const app_services::metr
432473 " dl_error_rate={}%" ,
433474 dl_total > 0 ? to_percentage<int >(ue.dl_nof_nok , dl_total) : 0 );
434475 fmt::format_to (std::back_inserter (buffer), " dl_bs={}" , scaled_fmt_integer (ue.dl_bs , false ));
435- fmt::format_to (std::back_inserter (buffer), " dl_nof_prbs={}" , ue.tot_dl_prbs_used );
476+ fmt::format_to (std::back_inserter (buffer), " dl_nof_prbs={}" , ue.tot_pdsch_prbs_used );
436477 if (ue.last_dl_olla .has_value ()) {
437478 fmt::format_to (std::back_inserter (buffer), " dl_olla={}" , ue.last_dl_olla );
438479 }
@@ -456,7 +497,7 @@ void scheduler_cell_metrics_consumer_log::handle_metric(const app_services::metr
456497 if (ue.ul_ri_stats .get_nof_observations () > 0 ) {
457498 fmt::format_to (std::back_inserter (buffer), " ul_ri={:.1f}" , ue.ul_ri_stats .get_mean ());
458499 } else {
459- fmt::format_to (std::back_inserter (buffer), " ul_ri=n/a " );
500+ fmt::format_to (std::back_inserter (buffer), " ul_ri=1 " );
460501 }
461502
462503 fmt::format_to (std::back_inserter (buffer), " ul_mcs={}" , ue.ul_mcs .to_uint ());
@@ -470,81 +511,38 @@ void scheduler_cell_metrics_consumer_log::handle_metric(const app_services::metr
470511 fmt::format_to (std::back_inserter (buffer), " ul_nof_nok={}" , ue.ul_nof_nok );
471512
472513 unsigned ul_total = ue.ul_nof_ok + ue.ul_nof_nok ;
473- fmt::format_to (std::back_inserter (buffer),
474- " ul_error_rate={}%" ,
475- ul_total > 0 ? to_percentage<int >(ue.ul_nof_nok , ul_total) : 0 );
476- if (ul_total > 0 ) {
477- fmt::format_to (std::back_inserter (buffer), " avg_crc_delay={:.3}ms" , ue.avg_crc_delay_ms );
478- } else {
479- fmt::format_to (std::back_inserter (buffer), " avg_crc_delay=n/a" );
480- }
481- fmt::format_to (std::back_inserter (buffer), " ul_nof_prbs={}" , ue.tot_ul_prbs_used );
482- fmt::format_to (std::back_inserter (buffer), " bsr={}" , scaled_fmt_integer (ue.bsr , false ));
483- fmt::format_to (std::back_inserter (buffer), " sr_count={}" , ue.sr_count );
484- fmt::format_to (std::back_inserter (buffer), " f0f1_invalid_harqs={}" , ue.nof_pucch_f0f1_invalid_harqs );
485- fmt::format_to (std::back_inserter (buffer), " f2f3f4_invalid_harqs={}" , ue.nof_pucch_f2f3f4_invalid_harqs );
486- fmt::format_to (std::back_inserter (buffer), " f2f3f4_invalid_csis={}" , ue.nof_pucch_f2f3f4_invalid_csis );
487- fmt::format_to (std::back_inserter (buffer), " pusch_invalid_harqs={}" , ue.nof_pusch_invalid_harqs );
488- fmt::format_to (std::back_inserter (buffer), " pusch_invalid_csis={}" , ue.nof_pusch_invalid_csis );
514+ auto out_it = std::back_inserter (buffer);
515+ fmt::format_to (out_it, " ul_error_rate={}%" , ul_total > 0 ? to_percentage<int >(ue.ul_nof_nok , ul_total) : 0 );
516+ fmt::format_to (out_it, " ul_nof_prbs={}" , ue.tot_pusch_prbs_used );
517+ fmt::format_to (out_it, " bsr={}" , scaled_fmt_integer (ue.bsr , false ));
518+ fmt::format_to (out_it, " sr_count={}" , ue.sr_count );
519+ fmt::format_to (out_it, " f0f1_invalid_harqs={}" , ue.nof_pucch_f0f1_invalid_harqs );
520+ fmt::format_to (out_it, " f2f3f4_invalid_harqs={}" , ue.nof_pucch_f2f3f4_invalid_harqs );
521+ fmt::format_to (out_it, " f2f3f4_invalid_csis={}" , ue.nof_pucch_f2f3f4_invalid_csis );
522+ fmt::format_to (out_it, " pusch_invalid_harqs={}" , ue.nof_pusch_invalid_harqs );
523+ fmt::format_to (out_it, " pusch_invalid_csis={}" , ue.nof_pusch_invalid_csis );
489524 if (ue.last_ul_olla .has_value ()) {
490- fmt::format_to (std::back_inserter (buffer) , " ul_olla={}" , ue.last_ul_olla .value ());
525+ fmt::format_to (out_it , " ul_olla={}" , ue.last_ul_olla .value ());
491526 }
492527 if (ue.ta_stats .get_nof_observations () > 0 ) {
493- fmt::format_to (std::back_inserter (buffer) , " ta={}s" , float_to_eng_string (ue.ta_stats .get_mean (), 0 , false ));
528+ fmt::format_to (out_it , " ta={}s" , float_to_eng_string (ue.ta_stats .get_mean (), 0 , false ));
494529 } else {
495- fmt::format_to (std::back_inserter (buffer) , " ta=n/a" );
530+ fmt::format_to (out_it , " ta=n/a" );
496531 }
497532 if (ue.srs_ta_stats .get_nof_observations () > 0 ) {
498- fmt::format_to (
499- std::back_inserter (buffer), " srs_ta={}s" , float_to_eng_string (ue.srs_ta_stats .get_mean (), 0 , false ));
533+ fmt::format_to (out_it, " srs_ta={}s" , float_to_eng_string (ue.srs_ta_stats .get_mean (), 0 , false ));
500534 } else {
501- fmt::format_to (std::back_inserter (buffer), " srs_ta=n/a" );
502- }
503- if (ue.last_phr .has_value ()) {
504- fmt::format_to (std::back_inserter (buffer), " last_phr={}" , ue.last_phr .value ());
505- } else {
506- fmt::format_to (std::back_inserter (buffer), " last_phr=n/a" );
507- }
508- if (ue.avg_ce_delay_ms .has_value ()) {
509- fmt::format_to (std::back_inserter (buffer), " avg_ul_ce_delay={:.2}ms" , ue.avg_ce_delay_ms .value ());
510- } else {
511- fmt::format_to (std::back_inserter (buffer), " avg_ul_ce_delay=n/a" );
512- }
513- if (ue.max_ce_delay_ms .has_value ()) {
514- fmt::format_to (std::back_inserter (buffer), " max_ul_ce_delay={:.2}ms" , ue.max_ce_delay_ms .value ());
515- } else {
516- fmt::format_to (std::back_inserter (buffer), " max_ul_ce_delay=n/a" );
517- }
518- if (ue.avg_crc_delay_ms .has_value ()) {
519- fmt::format_to (std::back_inserter (buffer), " avg_crc_delay={:.2}ms" , ue.avg_crc_delay_ms .value ());
520- } else {
521- fmt::format_to (std::back_inserter (buffer), " avg_crc_delay=n/a" );
522- }
523- if (ue.max_crc_delay_ms .has_value ()) {
524- fmt::format_to (std::back_inserter (buffer), " max_crc_delay={:.2}ms" , ue.max_crc_delay_ms .value ());
525- } else {
526- fmt::format_to (std::back_inserter (buffer), " max_crc_delay=n/a" );
527- }
528- if (ue.avg_pusch_harq_delay_ms .has_value ()) {
529- fmt::format_to (std::back_inserter (buffer), " avg_pusch_harq_delay={:.2}ms" , ue.avg_pusch_harq_delay_ms .value ());
530- } else {
531- fmt::format_to (std::back_inserter (buffer), " avg_pusch_harq_delay=n/a" );
532- }
533- if (ue.max_pusch_harq_delay_ms .has_value ()) {
534- fmt::format_to (std::back_inserter (buffer), " max_pusch_harq_delay={:.2}ms" , ue.max_pusch_harq_delay_ms .value ());
535- } else {
536- fmt::format_to (std::back_inserter (buffer), " max_pusch_harq_delay=n/a" );
537- }
538- if (ue.avg_pucch_harq_delay_ms .has_value ()) {
539- fmt::format_to (std::back_inserter (buffer), " avg_pucch_harq_delay={:.2}ms" , ue.avg_pucch_harq_delay_ms .value ());
540- } else {
541- fmt::format_to (std::back_inserter (buffer), " avg_pucch_harq_delay=n/a" );
542- }
543- if (ue.max_pucch_harq_delay_ms .has_value ()) {
544- fmt::format_to (std::back_inserter (buffer), " max_pucch_harq_delay={:.2}ms" , ue.max_pucch_harq_delay_ms .value ());
545- } else {
546- fmt::format_to (std::back_inserter (buffer), " max_pucch_harq_delay=n/a" );
547- }
535+ fmt::format_to (out_it, " srs_ta=n/a" );
536+ }
537+ fmt::format_to (out_it, " last_phr={}" , format_value_or (ue.last_phr , " n/a" ));
538+ fmt::format_to (out_it, " avg_ul_ce_delay={:.3}" , format_unit_or (ue.avg_ce_delay_ms , " ms" , " n/a" ));
539+ fmt::format_to (out_it, " max_ul_ce_delay={:.3}" , format_unit_or (ue.max_ce_delay_ms , " ms" , " n/a" ));
540+ fmt::format_to (out_it, " avg_crc_delay={:.3}" , format_unit_or (ue.avg_crc_delay_ms , " ms" , " n/a" ));
541+ fmt::format_to (out_it, " max_crc_delay={:.3}" , format_unit_or (ue.max_crc_delay_ms , " ms" , " n/a" ));
542+ fmt::format_to (out_it, " avg_pusch_harq_delay={:.3}" , format_unit_or (ue.avg_pusch_harq_delay_ms , " ms" , " n/a" ));
543+ fmt::format_to (out_it, " max_pusch_harq_delay={:.3}" , format_unit_or (ue.max_pusch_harq_delay_ms , " ms" , " n/a" ));
544+ fmt::format_to (out_it, " avg_pucch_harq_delay={:.3}" , format_unit_or (ue.avg_pucch_harq_delay_ms , " ms" , " n/a" ));
545+ fmt::format_to (out_it, " max_pucch_harq_delay={:.3}" , format_unit_or (ue.max_pucch_harq_delay_ms , " ms" , " n/a" ));
548546
549547 log_chan (" {}" , to_c_str (buffer));
550548 buffer.clear ();
0 commit comments