Skip to content

Commit e676d50

Browse files
yagodacodebot
authored andcommitted
e2ap,metrics: adding metrics hub to send metrics to an arbitrary number of subscribers (e2,console)
1 parent 78bba65 commit e676d50

File tree

10 files changed

+42
-18
lines changed

10 files changed

+42
-18
lines changed

apps/gnb/gnb.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
#include "gnb_worker_manager.h"
4141

4242
#include "helpers/gnb_console_helper.h"
43+
#include "helpers/metrics_hub.h"
4344

4445
#include "gnb_du_factory.h"
4546
#include "lib/pcap/dlt_pcap_impl.h"
@@ -52,6 +53,7 @@
5253
#include "srsran/ru/ru_ofh_factory.h"
5354

5455
#include "apps/gnb/adapters/e2_gateway_remote_connector.h"
56+
#include "srsran/e2/e2_du_metrics_manager.h"
5557
#include "srsran/support/sysinfo.h"
5658

5759
#include <atomic>
@@ -408,6 +410,10 @@ int main(int argc, char** argv)
408410
gnb_console_helper console(*epoll_broker);
409411
console.on_app_starting();
410412

413+
std::unique_ptr<metrics_hub> hub = std::make_unique<metrics_hub>(*workers.metrics_hub_exec.get());
414+
std::unique_ptr<e2_du_metrics_manager> e2_du_metric_manager = std::make_unique<e2_du_metrics_manager>();
415+
hub->add_subscriber(*e2_du_metric_manager.get());
416+
411417
// Create NGAP adapter.
412418
std::unique_ptr<srsran::srs_cu_cp::ngap_network_adapter> ngap_adapter =
413419
std::make_unique<srsran::srs_cu_cp::ngap_network_adapter>(*epoll_broker, *ngap_p);
@@ -501,7 +507,9 @@ int main(int argc, char** argv)
501507
app_timers,
502508
*mac_p,
503509
console,
504-
e2_gw);
510+
e2_gw,
511+
*e2_du_metric_manager.get(),
512+
*hub);
505513

506514
for (unsigned sector_id = 0, sector_end = du_inst.size(); sector_id != sector_end; ++sector_id) {
507515
auto& du = du_inst[sector_id];

apps/gnb/gnb_du_factory.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,14 @@ std::vector<std::unique_ptr<du>> srsran::make_gnb_dus(const gnb_appconfig&
6161
timer_manager& timer_mng,
6262
mac_pcap& mac_p,
6363
gnb_console_helper& console_helper,
64-
e2_connection_client& e2_client_handler)
64+
e2_connection_client& e2_client_handler,
65+
e2_du_metrics_manager& e2_du_metric_manager,
66+
metrics_hub& metrics_hub)
6567
{
6668
// DU cell config
6769
std::vector<du_cell_config> du_cells = generate_du_cell_config(gnb_cfg);
6870
console_helper.set_cells(du_cells);
71+
metrics_hub.add_subscriber(console_helper.get_metrics_notifier());
6972

7073
std::vector<std::unique_ptr<du>> du_insts;
7174
for (unsigned i = 0, e = du_cells.size(); i != e; ++i) {
@@ -104,11 +107,12 @@ std::vector<std::unique_ptr<du>> srsran::make_gnb_dus(const gnb_appconfig&
104107
du_hi_cfg.gnb_du_name = fmt::format("srsdu{}", du_hi_cfg.gnb_du_id);
105108
du_hi_cfg.du_bind_addr = {fmt::format("127.0.0.{}", du_hi_cfg.gnb_du_id)};
106109
du_hi_cfg.mac_cfg = generate_mac_expert_config(gnb_cfg);
107-
du_hi_cfg.metrics_notifier = &console_helper.get_metrics_notifier();
110+
du_hi_cfg.metrics_notifier = &metrics_hub;
108111
du_hi_cfg.sched_cfg = generate_scheduler_expert_config(gnb_cfg);
109112
if (gnb_cfg.e2_cfg.enable_du_e2) {
110-
du_hi_cfg.e2_client = &e2_client_handler;
111-
du_hi_cfg.e2ap_config = generate_e2_config(gnb_cfg);
113+
du_hi_cfg.e2_client = &e2_client_handler;
114+
du_hi_cfg.e2ap_config = generate_e2_config(gnb_cfg);
115+
du_hi_cfg.e2_du_metric_manager = &e2_du_metric_manager;
112116
}
113117
if (gnb_cfg.test_mode_cfg.test_ue.rnti != INVALID_RNTI) {
114118
du_hi_cfg.test_cfg.test_ue = srs_du::du_test_config::test_ue_config{gnb_cfg.test_mode_cfg.test_ue.rnti,

apps/gnb/gnb_du_factory.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@
1212

1313
#include "gnb_appconfig.h"
1414
#include "gnb_worker_manager.h"
15+
#include "helpers/metrics_hub.h"
1516
#include "srsran/du/du.h"
1617
#include "srsran/du/du_cell_config.h"
17-
18+
#include "srsran/e2/e2_du_metrics_manager.h"
1819
namespace srsran {
1920

2021
class upper_phy_rg_gateway;
@@ -40,6 +41,8 @@ std::vector<std::unique_ptr<du>> make_gnb_dus(const gnb_appconfig&
4041
timer_manager& timer_mng,
4142
mac_pcap& mac_p,
4243
gnb_console_helper& console_helper,
43-
e2_connection_client& e2_client_handler);
44+
e2_connection_client& e2_client_handler,
45+
e2_du_metrics_manager& e2_du_metric_manager,
46+
metrics_hub& metrics_hub);
4447

4548
} // namespace srsran

apps/gnb/gnb_worker_manager.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,9 @@ void worker_manager::create_du_cu_executors(bool is_blocki
131131
cu_cp_e2_exec = make_priority_task_executor_ptr<task_queue_priority::min>(*gnb_ctrl_worker);
132132
cu_up_e2_exec = make_priority_task_executor_ptr<task_queue_priority::min>(*gnb_ctrl_worker);
133133

134+
// metrics hub executor
135+
metrics_hub_exec = make_priority_task_executor_ptr<task_queue_priority::min>(*gnb_ctrl_worker);
136+
134137
du_high_executors.resize(cells_cfg.size());
135138
for (unsigned i = 0, e = cells_cfg.size(); i != e; ++i) {
136139
auto& du_item = du_high_executors[i];

apps/gnb/gnb_worker_manager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ struct worker_manager {
115115
std::vector<std::unique_ptr<task_executor>> ru_rx_exec;
116116
std::unique_ptr<task_executor> cu_cp_e2_exec;
117117
std::unique_ptr<task_executor> cu_up_e2_exec;
118+
std::unique_ptr<task_executor> metrics_hub_exec;
118119

119120
std::unordered_map<std::string, std::unique_ptr<task_executor>> task_execs;
120121

include/srsran/du_high/du_high_configuration.h

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "srsran/du_high/du_high_executor_mapper.h"
88
#include "srsran/e2/e2.h"
99
#include "srsran/e2/e2_connection_client.h"
10+
#include "srsran/e2/e2_du_metrics_manager.h"
1011
#include "srsran/e2/e2ap_configuration.h"
1112
#include "srsran/f1ap/du/f1ap_du.h"
1213
#include "srsran/f1ap/du/f1c_connection_client.h"
@@ -27,13 +28,14 @@ class f1u_du_gateway;
2728

2829
/// Configuration passed to DU-High.
2930
struct du_high_configuration {
30-
du_high_executor_mapper* exec_mapper = nullptr;
31-
f1c_connection_client* f1c_client = nullptr;
32-
f1u_du_gateway* f1u_gw = nullptr;
33-
mac_result_notifier* phy_adapter = nullptr;
34-
timer_manager* timers = nullptr;
35-
scheduler_ue_metrics_notifier* metrics_notifier = nullptr;
36-
e2_connection_client* e2_client = nullptr;
31+
du_high_executor_mapper* exec_mapper = nullptr;
32+
f1c_connection_client* f1c_client = nullptr;
33+
f1u_du_gateway* f1u_gw = nullptr;
34+
mac_result_notifier* phy_adapter = nullptr;
35+
timer_manager* timers = nullptr;
36+
scheduler_ue_metrics_notifier* metrics_notifier = nullptr;
37+
e2_connection_client* e2_client = nullptr;
38+
e2_du_metrics_manager* e2_du_metric_manager = nullptr;
3739
std::string gnb_du_name;
3840
uint64_t gnb_du_id;
3941
transport_layer_address du_bind_addr;

lib/du_high/du_high_impl.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,10 @@ du_high_impl::du_high_impl(const du_high_configuration& config_) :
126126
main_cell_slot_handler = std::make_unique<du_high_slot_handler>(timers, *mac, cfg.exec_mapper->du_timer_executor());
127127

128128
if (cfg.e2_client) {
129-
e2_metric_manager = std::make_unique<e2_du_metrics_manager>();
130129
// todo: subscribe e2_metric_manager to a metric hub (currently not present)
131130
e2ap_entity = create_e2_entity(cfg.e2ap_config,
132131
cfg.e2_client,
133-
*e2_metric_manager,
132+
*cfg.e2_du_metric_manager,
134133
timer_factory{timers, cfg.exec_mapper->du_e2_executor()},
135134
cfg.exec_mapper->du_e2_executor());
136135
}

lib/du_high/du_high_impl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class du_high_impl final : public du_high
5555
// Connection between DU-high layers.
5656
std::unique_ptr<layer_connector> adapters;
5757

58+
std::unique_ptr<scheduler_ue_metrics_notifier> hub_metrics;
5859
std::unique_ptr<scheduler_ue_metrics_notifier> metrics_notifier;
5960

6061
// DU-high Layers.

lib/e2/e2sm/e2sm_kpm_impl.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,8 @@ void e2sm_kpm_impl::handle_action_definition_format1(asn1::e2sm_kpm::e2_sm_kpm_i
9797
// Set the granularity period (TODO: disable as currently not supported in flexric)
9898
ric_ind_message.ind_msg_formats.ind_msg_format1().granul_period_present = false;
9999
// ric_ind_message.ind_msg_formats.ind_msg_format2().granul_period = action_def.granul_period;
100-
100+
scheduler_ue_metrics ue_metrics = {};
101+
du_metrics_interface.get_metrics(ue_metrics);
101102
// Fill indication msg
102103
auto& meas_info_list = action_def.meas_info_list;
103104
for (auto& meas_info : meas_info_list) {
@@ -112,7 +113,7 @@ void e2sm_kpm_impl::handle_action_definition_format1(asn1::e2sm_kpm::e2_sm_kpm_i
112113

113114
meas_data_item_s meas_data_item;
114115
meas_record_item_c meas_record_item;
115-
meas_record_item.set_integer() = 123;
116+
meas_record_item.set_integer() = (int)ue_metrics.pusch_snr_db;
116117
meas_data_item.meas_record.push_back(meas_record_item);
117118
ric_ind_message.ind_msg_formats.ind_msg_format1().meas_data.push_back(meas_data_item);
118119
}

lib/e2/procedures/e2_indication_procedure.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ void e2_indication_procedure::operator()(coro_context<eager_async_task<void>>& c
4343
}
4444
for (const auto& action : subscription.action_list) {
4545
e2_indication_message e2_ind = {};
46+
e2_ind.indication->ri_cind_msg.crit = asn1::crit_opts::reject;
4647
e2_ind.request_id = subscription.request_id;
4748
e2_ind.indication->ra_nfunction_id.value = subscription.ran_function_id;
4849
e2_ind.indication->ri_caction_id.value = action.ric_action_id;
@@ -82,5 +83,6 @@ void e2_indication_procedure::send_e2_indication(e2_indication_message& e2_ind)
8283
e2_msg.pdu.set_init_msg();
8384
e2_msg.pdu.init_msg().load_info_obj(ASN1_E2AP_ID_RI_CIND);
8485
e2_msg.pdu.init_msg().value.ri_cind() = e2_ind.indication;
86+
e2_msg.pdu.init_msg().crit = e2_ind.indication->ri_cind_msg.crit;
8587
notifier.on_new_message(e2_msg);
8688
}

0 commit comments

Comments
 (0)