Skip to content

Commit e7063e0

Browse files
alvasMancodebot
authored andcommitted
cu_cp: added initial glue between the CU-CP and the metrics service
1 parent 434af39 commit e7063e0

15 files changed

+251
-201
lines changed

apps/units/o_cu_cp/cu_cp/metrics/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
#
88

99
set(SOURCES
10-
cu_cp_pdcp_metrics_producer.cpp
11-
cu_cp_pdcp_metrics_consumers.cpp)
10+
cu_cp_metrics_producer.cpp
11+
cu_cp_metrics_consumers.cpp)
1212

1313
add_library(srsran_cu_cp_unit_metrics_helpers STATIC ${SOURCES})
1414
target_include_directories(srsran_cu_cp_unit_metrics_helpers PRIVATE ${CMAKE_SOURCE_DIR})
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*
2+
*
3+
* Copyright 2021-2025 Software Radio Systems Limited
4+
*
5+
* By using this file, you agree to the terms and conditions set
6+
* forth in the LICENSE file which can be found at the top level of
7+
* the distribution.
8+
*
9+
*/
10+
11+
#pragma once
12+
13+
#include "apps/services/metrics/metrics_consumer.h"
14+
#include "apps/services/metrics/metrics_properties.h"
15+
#include "apps/services/metrics/metrics_set.h"
16+
#include "srsran/adt/span.h"
17+
#include "srsran/adt/unique_function.h"
18+
#include "srsran/cu_cp/cu_cp_metrics_notifier.h"
19+
20+
namespace srsran {
21+
22+
/// CU-CP metrics properties implementation.
23+
class cu_cp_metrics_properties_impl : public app_services::metrics_properties
24+
{
25+
public:
26+
std::string_view name() const override { return "CU-CP metrics"; }
27+
};
28+
29+
/// CU-CP metrics implementation.
30+
class cu_cp_metrics_impl : public app_services::metrics_set
31+
{
32+
cu_cp_metrics_properties_impl properties;
33+
srs_cu_cp::metrics_report metrics;
34+
35+
public:
36+
explicit cu_cp_metrics_impl(const srs_cu_cp::metrics_report& metrics_) : metrics(metrics_) {}
37+
38+
// See interface for documentation.
39+
const app_services::metrics_properties& get_properties() const override { return properties; }
40+
41+
const srs_cu_cp::metrics_report& get_metrics() const { return metrics; }
42+
};
43+
44+
/// Callback for the CU-CP PDCP metrics.
45+
inline auto cu_cp_metrics_callback = [](const app_services::metrics_set& report,
46+
span<app_services::metrics_consumer*> consumers,
47+
task_executor& executor,
48+
srslog::basic_logger& logger) {
49+
const auto& metric = static_cast<const cu_cp_metrics_impl&>(report);
50+
51+
if (!executor.defer(TRACE_TASK([metric, consumers]() {
52+
for (auto& consumer : consumers) {
53+
consumer->handle_metric(metric);
54+
}
55+
}))) {
56+
logger.error("Failed to dispatch the metric '{}'", metric.get_properties().name());
57+
}
58+
};
59+
60+
} // namespace srsran
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
*
3+
* Copyright 2021-2025 Software Radio Systems Limited
4+
*
5+
* By using this file, you agree to the terms and conditions set
6+
* forth in the LICENSE file which can be found at the top level of
7+
* the distribution.
8+
*
9+
*/
10+
11+
#include "cu_cp_metrics_consumers.h"
12+
#include "cu_cp_metrics.h"
13+
14+
using namespace srsran;
15+
16+
void cu_cp_metrics_consumer_json::handle_metric(const app_services::metrics_set& metric)
17+
{
18+
const srs_cu_cp::metrics_report& cp_metrics = static_cast<const cu_cp_metrics_impl&>(metric).get_metrics();
19+
(void)cp_metrics;
20+
/// TODO write to JSON file.
21+
log_chan.enabled();
22+
}
23+
24+
void cu_cp_metrics_consumer_log::handle_metric(const app_services::metrics_set& metric)
25+
{
26+
const srs_cu_cp::metrics_report& cp_metrics = static_cast<const cu_cp_metrics_impl&>(metric).get_metrics();
27+
(void)cp_metrics;
28+
/// TODO write to log file.
29+
log_chan.enabled();
30+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
*
3+
* Copyright 2021-2025 Software Radio Systems Limited
4+
*
5+
* By using this file, you agree to the terms and conditions set
6+
* forth in the LICENSE file which can be found at the top level of
7+
* the distribution.
8+
*
9+
*/
10+
11+
#pragma once
12+
13+
#include "apps/services/metrics/metrics_consumer.h"
14+
#include "srsran/srslog/log_channel.h"
15+
#include "srsran/support/srsran_assert.h"
16+
17+
namespace srsran {
18+
19+
/// Consumer for the json CU-CP metrics.
20+
class cu_cp_metrics_consumer_json : public app_services::metrics_consumer
21+
{
22+
public:
23+
explicit cu_cp_metrics_consumer_json(srslog::log_channel& log_chan_) : log_chan(log_chan_) {}
24+
25+
// See interface for documentation.
26+
void handle_metric(const app_services::metrics_set& metric) override;
27+
28+
private:
29+
srslog::log_channel& log_chan;
30+
};
31+
32+
/// Consumer for the log CU-CP metrics.
33+
class cu_cp_metrics_consumer_log : public app_services::metrics_consumer
34+
{
35+
public:
36+
explicit cu_cp_metrics_consumer_log(srslog::log_channel& log_chan_) : log_chan(log_chan_)
37+
{
38+
srsran_assert(log_chan.enabled(), "Logger log channel is not enabled");
39+
}
40+
41+
// See interface for documentation.
42+
void handle_metric(const app_services::metrics_set& metric) override;
43+
44+
private:
45+
srslog::log_channel& log_chan;
46+
};
47+
48+
} // namespace srsran

apps/units/o_cu_cp/cu_cp/metrics/cu_cp_pdcp_metrics_producer.cpp renamed to apps/units/o_cu_cp/cu_cp/metrics/cu_cp_metrics_producer.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
*
99
*/
1010

11-
#include "cu_cp_pdcp_metrics_producer.h"
12-
#include "cu_cp_pdcp_metrics.h"
11+
#include "cu_cp_metrics_producer.h"
12+
#include "cu_cp_metrics.h"
1313

1414
using namespace srsran;
1515

16-
void cu_cp_pdcp_metrics_producer_impl::report_metrics(const pdcp_metrics_container& report)
16+
void cu_cp_metrics_producer_impl::notify_metrics_report_request(const srs_cu_cp::metrics_report& report)
1717
{
18-
notifier.on_new_metric(cu_cp_pdcp_metrics_impl(report));
18+
notifier.on_new_metric(cu_cp_metrics_impl(report));
1919
}

apps/units/o_cu_cp/cu_cp/metrics/cu_cp_pdcp_metrics_producer.h renamed to apps/units/o_cu_cp/cu_cp/metrics/cu_cp_metrics_producer.h

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

1313
#include "apps/services/metrics/metrics_notifier.h"
1414
#include "apps/services/metrics/metrics_producer.h"
15-
#include "srsran/pdcp/pdcp_metrics.h"
15+
#include "srsran/cu_cp/cu_cp_metrics_notifier.h"
1616

1717
namespace srsran {
1818

19-
/// CU-CP PDCP metrics producer implementation.
20-
class cu_cp_pdcp_metrics_producer_impl : public pdcp_metrics_notifier, public app_services::metrics_producer
19+
/// CU-CP metrics producer implementation.
20+
class cu_cp_metrics_producer_impl : public srs_cu_cp::metrics_report_notifier, public app_services::metrics_producer
2121
{
2222
public:
23-
explicit cu_cp_pdcp_metrics_producer_impl(app_services::metrics_notifier& notifier_) : notifier(notifier_) {}
23+
explicit cu_cp_metrics_producer_impl(app_services::metrics_notifier& notifier_) : notifier(notifier_) {}
2424

2525
// See interface for documentation.
26-
void report_metrics(const pdcp_metrics_container& metrics) override;
26+
void notify_metrics_report_request(const srs_cu_cp::metrics_report& metrics) override;
2727

2828
// See interface for documentation.
2929
void on_new_report_period() override {}

apps/units/o_cu_cp/cu_cp/metrics/cu_cp_pdcp_metrics.h

Lines changed: 0 additions & 60 deletions
This file was deleted.

apps/units/o_cu_cp/cu_cp/metrics/cu_cp_pdcp_metrics_consumers.cpp

Lines changed: 0 additions & 21 deletions
This file was deleted.

apps/units/o_cu_cp/cu_cp/metrics/cu_cp_pdcp_metrics_consumers.h

Lines changed: 0 additions & 31 deletions
This file was deleted.

apps/units/o_cu_cp/o_cu_cp_builder.cpp

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111
#include "o_cu_cp_builder.h"
1212
#include "apps/helpers/metrics/metrics_helpers.h"
1313
#include "apps/services/metrics/metrics_config.h"
14+
#include "apps/units/o_cu_cp/cu_cp/metrics/cu_cp_metrics.h"
15+
#include "apps/units/o_cu_cp/cu_cp/metrics/cu_cp_metrics_consumers.h"
16+
#include "apps/units/o_cu_cp/cu_cp/metrics/cu_cp_metrics_producer.h"
1417
#include "cu_cp/cu_cp_cmdline_commands.h"
1518
#include "cu_cp/cu_cp_config_translators.h"
16-
#include "cu_cp/metrics/cu_cp_pdcp_metrics.h"
17-
#include "cu_cp/metrics/cu_cp_pdcp_metrics_consumers.h"
18-
#include "cu_cp/metrics/cu_cp_pdcp_metrics_producer.h"
1919
#include "e2/o_cu_cp_e2_config_translators.h"
2020
#include "o_cu_cp_unit_config.h"
2121
#include "o_cu_cp_unit_impl.h"
@@ -26,30 +26,28 @@
2626

2727
using namespace srsran;
2828

29-
static pdcp_metrics_notifier* build_pdcp_metrics_config(std::vector<app_services::metrics_config>& cu_up_services_cfg,
30-
app_services::metrics_notifier& metrics_notifier,
31-
const cu_cp_unit_metrics_config& cu_cp_metrics_cfg)
29+
static srs_cu_cp::metrics_report_notifier*
30+
build_cu_cp_metrics_config(std::vector<app_services::metrics_config>& cu_cp_services_cfg,
31+
app_services::metrics_notifier& metrics_notifier,
32+
const cu_cp_unit_metrics_config& cu_cp_metrics_cfg)
3233
{
33-
// NOTE: do not report CU-CP metrics for now. Remove this when CU-CP metrics are needed.
34-
return nullptr;
34+
srs_cu_cp::metrics_report_notifier* out = nullptr;
3535

36-
if (!cu_cp_metrics_cfg.layers_cfg.enable_pdcp) {
37-
return nullptr;
38-
}
39-
40-
pdcp_metrics_notifier* out = nullptr;
41-
42-
auto metrics_generator = std::make_unique<cu_cp_pdcp_metrics_producer_impl>(metrics_notifier);
43-
out = &(*metrics_generator);
44-
app_services::metrics_config& metrics_service_cfg = cu_up_services_cfg.emplace_back();
45-
metrics_service_cfg.metric_name = cu_cp_pdcp_metrics_properties_impl().name();
46-
metrics_service_cfg.callback = cu_cp_pdcp_metrics_callback;
36+
auto metrics_generator = std::make_unique<cu_cp_metrics_producer_impl>(metrics_notifier);
37+
out = &(*metrics_generator);
38+
app_services::metrics_config& metrics_service_cfg = cu_cp_services_cfg.emplace_back();
39+
metrics_service_cfg.metric_name = cu_cp_metrics_properties_impl().name();
40+
metrics_service_cfg.callback = cu_cp_metrics_callback;
4741
metrics_service_cfg.producers.push_back(std::move(metrics_generator));
4842

4943
const app_helpers::metrics_config& unit_metrics_cfg = cu_cp_metrics_cfg.common_metrics_cfg;
5044
if (unit_metrics_cfg.json_config.enable_json_metrics) {
5145
metrics_service_cfg.consumers.push_back(
52-
std::make_unique<cu_cp_pdcp_metrics_consumer_json>(app_helpers::fetch_json_metrics_log_channel()));
46+
std::make_unique<cu_cp_metrics_consumer_json>(app_helpers::fetch_json_metrics_log_channel()));
47+
}
48+
if (cu_cp_metrics_cfg.common_metrics_cfg.enable_log_metrics) {
49+
metrics_service_cfg.consumers.push_back(
50+
std::make_unique<cu_cp_metrics_consumer_log>(app_helpers::fetch_logger_metrics_log_channel()));
5351
}
5452

5553
return out;
@@ -71,8 +69,10 @@ o_cu_cp_unit srsran::build_o_cu_cp(const o_cu_cp_unit_config& unit_cfg, o_cu_cp_
7169
cu_cp_cfg.services.timers = dependencies.timers;
7270

7371
o_cu_cp_unit ocucp;
74-
cu_cp_cfg.pdcp_metric_notifier =
75-
build_pdcp_metrics_config(ocucp.metrics, *dependencies.metrics_notifier, unit_cfg.cucp_cfg.metrics);
72+
73+
cu_cp_cfg.metrics.metrics_report_period = std::chrono::milliseconds(unit_cfg.cucp_cfg.metrics.cu_cp_report_period);
74+
cu_cp_cfg.metrics_notifier =
75+
build_cu_cp_metrics_config(ocucp.metrics, *dependencies.metrics_notifier, unit_cfg.cucp_cfg.metrics);
7676

7777
// Create N2 Client Gateways.
7878
std::vector<std::unique_ptr<srs_cu_cp::n2_connection_client>> n2_clients;

0 commit comments

Comments
 (0)