Skip to content

Commit 245270c

Browse files
yagodacodebot
authored andcommitted
e2ap,metrics: extending metrics hub so sources and subscrbiers can be mapped to each other in a custom fashion.
1 parent e676d50 commit 245270c

File tree

7 files changed

+156
-37
lines changed

7 files changed

+156
-37
lines changed

apps/gnb/gnb.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -410,9 +410,8 @@ int main(int argc, char** argv)
410410
gnb_console_helper console(*epoll_broker);
411411
console.on_app_starting();
412412

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());
413+
std::unique_ptr<metrics_hub> hub = std::make_unique<metrics_hub>(*workers.metrics_hub_exec.get());
414+
std::vector<std::unique_ptr<e2_du_metrics_manager>> e2_du_metric_managers;
416415

417416
// Create NGAP adapter.
418417
std::unique_ptr<srsran::srs_cu_cp::ngap_network_adapter> ngap_adapter =
@@ -508,7 +507,7 @@ int main(int argc, char** argv)
508507
*mac_p,
509508
console,
510509
e2_gw,
511-
*e2_du_metric_manager.get(),
510+
e2_du_metric_managers,
512511
*hub);
513512

514513
for (unsigned sector_id = 0, sector_end = du_inst.size(); sector_id != sector_end; ++sector_id) {

apps/gnb/gnb_du_factory.cpp

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -52,24 +52,44 @@ static du_low_configuration create_du_low_config(const gnb_appconfig&
5252
return du_lo_cfg;
5353
}
5454

55-
std::vector<std::unique_ptr<du>> srsran::make_gnb_dus(const gnb_appconfig& gnb_cfg,
56-
worker_manager& workers,
57-
upper_phy_rg_gateway& rg_gateway,
58-
upper_phy_rx_symbol_request_notifier& rx_symbol_request_notifier,
59-
srs_du::f1c_connection_client& f1c_client_handler,
60-
srs_du::f1u_du_gateway& f1u_gw,
61-
timer_manager& timer_mng,
62-
mac_pcap& mac_p,
63-
gnb_console_helper& console_helper,
64-
e2_connection_client& e2_client_handler,
65-
e2_du_metrics_manager& e2_du_metric_manager,
66-
metrics_hub& metrics_hub)
55+
std::vector<std::unique_ptr<du>>
56+
srsran::make_gnb_dus(const gnb_appconfig& gnb_cfg,
57+
worker_manager& workers,
58+
upper_phy_rg_gateway& rg_gateway,
59+
upper_phy_rx_symbol_request_notifier& rx_symbol_request_notifier,
60+
srs_du::f1c_connection_client& f1c_client_handler,
61+
srs_du::f1u_du_gateway& f1u_gw,
62+
timer_manager& timer_mng,
63+
mac_pcap& mac_p,
64+
gnb_console_helper& console_helper,
65+
e2_connection_client& e2_client_handler,
66+
std::vector<std::unique_ptr<e2_du_metrics_manager>>& e2_du_metric_managers,
67+
metrics_hub& metrics_hub)
6768
{
6869
// DU cell config
6970
std::vector<du_cell_config> du_cells = generate_du_cell_config(gnb_cfg);
7071
console_helper.set_cells(du_cells);
71-
metrics_hub.add_subscriber(console_helper.get_metrics_notifier());
7272

73+
// Set up metrics hub with DU sources and e2 subscribers if enabled.
74+
for (unsigned i = 0; i < gnb_cfg.cells_cfg.size(); i++) {
75+
std::string source_name = "DU " + std::to_string(i);
76+
unsigned source_idx = metrics_hub.add_source(source_name);
77+
if (gnb_cfg.e2_cfg.enable_du_e2) {
78+
e2_du_metric_managers.push_back(std::make_unique<e2_du_metrics_manager>());
79+
auto sub = metrics_hub.add_subscriber(*e2_du_metric_managers.back().get());
80+
metrics_hub.connect_subscriber_to_source(source_idx, sub);
81+
}
82+
}
83+
// This source will aggregate the metrics from all DU sources.
84+
unsigned console_source_agg_idx = metrics_hub.add_source("console aggregator");
85+
auto console_agg_subscriber = metrics_hub.add_subscriber(*metrics_hub.get_source_notifier(console_source_agg_idx));
86+
// Connecting all DU metric sources to the console subscriber via the aggregator source.
87+
for (unsigned i = 0; i < du_cells.size(); i++) {
88+
metrics_hub.connect_subscriber_to_source(i, console_agg_subscriber);
89+
}
90+
// Adding console as a subscriber to metrics_hub with the console aggregator as a source.
91+
auto console_subscriber = metrics_hub.add_subscriber(console_helper.get_metrics_notifier());
92+
metrics_hub.connect_subscriber_to_source(console_source_agg_idx, console_subscriber);
7393
std::vector<std::unique_ptr<du>> du_insts;
7494
for (unsigned i = 0, e = du_cells.size(); i != e; ++i) {
7595
// Create a gNB config with one cell.
@@ -107,12 +127,12 @@ std::vector<std::unique_ptr<du>> srsran::make_gnb_dus(const gnb_appconfig&
107127
du_hi_cfg.gnb_du_name = fmt::format("srsdu{}", du_hi_cfg.gnb_du_id);
108128
du_hi_cfg.du_bind_addr = {fmt::format("127.0.0.{}", du_hi_cfg.gnb_du_id)};
109129
du_hi_cfg.mac_cfg = generate_mac_expert_config(gnb_cfg);
110-
du_hi_cfg.metrics_notifier = &metrics_hub;
130+
du_hi_cfg.metrics_notifier = metrics_hub.get_source_notifier(i);
111131
du_hi_cfg.sched_cfg = generate_scheduler_expert_config(gnb_cfg);
112132
if (gnb_cfg.e2_cfg.enable_du_e2) {
113133
du_hi_cfg.e2_client = &e2_client_handler;
114134
du_hi_cfg.e2ap_config = generate_e2_config(gnb_cfg);
115-
du_hi_cfg.e2_du_metric_manager = &e2_du_metric_manager;
135+
du_hi_cfg.e2_du_metric_manager = &(*(e2_du_metric_managers[i].get()));
116136
}
117137
if (gnb_cfg.test_mode_cfg.test_ue.rnti != INVALID_RNTI) {
118138
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: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "srsran/du/du.h"
1717
#include "srsran/du/du_cell_config.h"
1818
#include "srsran/e2/e2_du_metrics_manager.h"
19+
1920
namespace srsran {
2021

2122
class upper_phy_rg_gateway;
@@ -32,17 +33,18 @@ class f1u_du_gateway;
3233
} // namespace srs_du
3334

3435
/// \brief Instanties a list of Distributed Unit (DU) given a gNB application configuration.
35-
std::vector<std::unique_ptr<du>> make_gnb_dus(const gnb_appconfig& gnb_cfg,
36-
worker_manager& workers,
37-
upper_phy_rg_gateway& rg_gateway,
38-
upper_phy_rx_symbol_request_notifier& rx_symbol_request_notifier,
39-
srs_du::f1c_connection_client& f1c_client_handler,
40-
srs_du::f1u_du_gateway& f1u_gw,
41-
timer_manager& timer_mng,
42-
mac_pcap& mac_p,
43-
gnb_console_helper& console_helper,
44-
e2_connection_client& e2_client_handler,
45-
e2_du_metrics_manager& e2_du_metric_manager,
46-
metrics_hub& metrics_hub);
36+
std::vector<std::unique_ptr<du>>
37+
make_gnb_dus(const gnb_appconfig& gnb_cfg,
38+
worker_manager& workers,
39+
upper_phy_rg_gateway& rg_gateway,
40+
upper_phy_rx_symbol_request_notifier& rx_symbol_request_notifier,
41+
srs_du::f1c_connection_client& f1c_client_handler,
42+
srs_du::f1u_du_gateway& f1u_gw,
43+
timer_manager& timer_mng,
44+
mac_pcap& mac_p,
45+
gnb_console_helper& console_helper,
46+
e2_connection_client& e2_client_handler,
47+
std::vector<std::unique_ptr<e2_du_metrics_manager>>& e2_du_metric_managers,
48+
metrics_hub& metrics_hub);
4749

4850
} // namespace srsran

apps/gnb/helpers/metrics_hub.cpp

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

1313
using namespace srsran;
1414

15-
metrics_hub::metrics_hub(task_executor& du_executor_) : du_executor(du_executor_) {}
15+
metrics_hub::metrics_hub(task_executor& du_executor_) :
16+
logger(srslog::fetch_basic_logger("METRICS HUB")), du_executor(du_executor_)
17+
{
18+
}
1619
void metrics_hub::report_metrics(span<const scheduler_ue_metrics> ue_metrics)
1720
{
1821
std::vector<scheduler_ue_metrics> ue_metrics_copy(ue_metrics.begin(), ue_metrics.end());
@@ -23,7 +26,56 @@ void metrics_hub::report_metrics(span<const scheduler_ue_metrics> ue_metrics)
2326
}
2427
});
2528
}
26-
void metrics_hub::add_subscriber(scheduler_ue_metrics_notifier& subscriber)
29+
unsigned metrics_hub::add_source(std::string source_name)
30+
{
31+
sources.push_back(std::make_unique<metrics_hub_source>(du_executor, source_name));
32+
return sources.size() - 1;
33+
}
34+
35+
void metrics_hub::connect_subscriber_to_source(unsigned source_idx, scheduler_ue_metrics_notifier* subscriber)
36+
{
37+
if (source_idx >= sources.size() || subscriber == nullptr) {
38+
logger.warning("Cannot connect subscriber to source");
39+
return;
40+
}
41+
sources[source_idx]->add_subscriber(*subscriber);
42+
}
43+
44+
scheduler_ue_metrics_notifier* metrics_hub::add_subscriber(scheduler_ue_metrics_notifier& subscriber)
45+
{
46+
subscribers.push_back(&subscriber);
47+
return (subscribers.at(subscribers.size() - 1));
48+
}
49+
50+
scheduler_ue_metrics_notifier* metrics_hub::get_source_notifier(unsigned idx)
51+
{
52+
if (idx >= sources.size()) {
53+
logger.warning("Source index out of range");
54+
return nullptr;
55+
}
56+
return &(*sources[idx]);
57+
}
58+
59+
scheduler_ue_metrics_notifier* metrics_hub::get_subscriber_notifier(unsigned idx)
60+
{
61+
if (idx >= subscribers.size()) {
62+
logger.warning("Subscriber index out of range");
63+
}
64+
return subscribers[idx];
65+
}
66+
67+
void metrics_hub::metrics_hub_source::report_metrics(span<const scheduler_ue_metrics> ue_metrics)
68+
{
69+
std::vector<scheduler_ue_metrics> ue_metrics_copy(ue_metrics.begin(), ue_metrics.end());
70+
du_executor.execute([this, ue_metrics_copy]() {
71+
for (auto& subscriber : subscribers) {
72+
span<const scheduler_ue_metrics> ue_metrics_span(ue_metrics_copy);
73+
subscriber->report_metrics(ue_metrics_span);
74+
}
75+
});
76+
}
77+
78+
void metrics_hub::metrics_hub_source::add_subscriber(scheduler_ue_metrics_notifier& subscriber)
2779
{
2880
subscribers.push_back(&subscriber);
2981
}

apps/gnb/helpers/metrics_hub.h

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,54 @@ class metrics_hub : public scheduler_ue_metrics_notifier
2121
public:
2222
metrics_hub(task_executor& du_executor_);
2323
void report_metrics(span<const scheduler_ue_metrics> ue_metrics) override;
24-
void add_subscriber(scheduler_ue_metrics_notifier& subscriber);
24+
25+
/// \brief adds a subscriber to the metrics hub.
26+
/// \param[in] subscriber reference to the new subscriber.
27+
/// \return returns a pointer to the new subscriber.
28+
scheduler_ue_metrics_notifier* add_subscriber(scheduler_ue_metrics_notifier& subscriber);
29+
30+
/// \brief creates a new souce object in the metrics hub.
31+
/// \param[in] gives the source a name.
32+
/// \return returns the index of the new source.
33+
unsigned add_source(std::string source_name);
34+
35+
/// \brief connects a subscriber to a source.
36+
/// \param[in] index of the source to be connected.
37+
/// \param[in] pointer to the subscriber to be connected.
38+
void connect_subscriber_to_source(unsigned source_idx, scheduler_ue_metrics_notifier* subscriber);
39+
40+
/// \brief retrives a pointer to the source notifier at the given index.
41+
/// \param[in] index of desired source notifier.
42+
/// \return returns a pointer to the source notifier.
43+
scheduler_ue_metrics_notifier* get_source_notifier(unsigned idx);
44+
45+
/// \brief retrives a pointer to the subscriber notifier at the given index.
46+
/// \param index of the desired subscriber.
47+
/// \return returns a pointer to the subscriber notifier.
48+
scheduler_ue_metrics_notifier* get_subscriber_notifier(unsigned idx);
49+
50+
/// This class is used to create a source object in the metrics hub to which one or more subscribers can be connected.
51+
class metrics_hub_source : public scheduler_ue_metrics_notifier
52+
{
53+
public:
54+
metrics_hub_source(task_executor& du_executor_, std::string _source_name) :
55+
du_executor(du_executor_), source_name(_source_name)
56+
{
57+
}
58+
void report_metrics(span<const scheduler_ue_metrics> ue_metrics) override;
59+
void add_subscriber(scheduler_ue_metrics_notifier& subscriber);
60+
task_executor& du_executor;
61+
std::string source_name;
62+
63+
private:
64+
std::vector<scheduler_ue_metrics_notifier*> subscribers;
65+
};
2566

2667
private:
27-
std::vector<scheduler_ue_metrics_notifier*> subscribers;
28-
task_executor& du_executor;
68+
std::vector<scheduler_ue_metrics_notifier*> subscribers;
69+
std::vector<std::unique_ptr<metrics_hub_source>> sources;
70+
srslog::basic_logger& logger;
71+
task_executor& du_executor;
2972
};
3073

3174
} // namespace srsran

include/srsran/du_high/du_high_configuration.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ struct du_high_configuration {
3535
timer_manager* timers = nullptr;
3636
scheduler_ue_metrics_notifier* metrics_notifier = nullptr;
3737
e2_connection_client* e2_client = nullptr;
38-
e2_du_metrics_manager* e2_du_metric_manager = nullptr;
38+
e2_du_metrics_interface* e2_du_metric_manager = nullptr;
3939
std::string gnb_du_name;
4040
uint64_t gnb_du_id;
4141
transport_layer_address du_bind_addr;

lib/e2/common/e2_du_metrics_manager.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,8 @@ void e2_du_metrics_manager::report_metrics(span<const scheduler_ue_metrics> ue_m
2929

3030
void e2_du_metrics_manager::get_metrics(scheduler_ue_metrics& ue_metrics)
3131
{
32+
if (ue_metrics_queue.empty()) {
33+
return;
34+
}
3235
ue_metrics = ue_metrics_queue.front();
3336
}

0 commit comments

Comments
 (0)