2020-04-26 19:36:05 +00:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
|
|
|
|
*
|
|
|
|
* This file is part of Open5GS.
|
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Affero General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "context.h"
|
|
|
|
#include "fd-path.h"
|
2021-04-21 08:24:17 +00:00
|
|
|
#include "gtp-path.h"
|
|
|
|
#include "pfcp-path.h"
|
|
|
|
#include "sbi-path.h"
|
Initial metrics support based on Prometheus (#1571)
* Initial metrics support based on Prometheus
This commit introduces initial support for metrics in open5gs.
The metrics code is added as libogsmetrics (lib/metrics/), with a well
defined opaque API to manage different types of metrics, allowing for
different implementations for different technologies to scrap the
metrics (placed as lib/metrics/<impl>/. The implementation is right now
selected at build time, in order to be able to opt-out the related dependencies
for users not interested in the features. 2 implementations are already
provided in this commit to start with:
* void: Default implementation. Empty stubs, acts as a NOOP.
* prometheus: open5gs processes become Prometheus servers, offering
states through an http server to the Prometheus scrappers. Relies on
libprom (prometheus-client-ci [1] project) to track the metrics and format
them during export, and libmicrohttpd to make the export possible through
HTTP.
[1] https://github.com/digitalocean/prometheus-client-c
The prometheus-client-c is not well maintained nowadays in upstream, and
furthermore it uses a quite peculiar mixture of build systems (autolib
on the main dir, cmake for libprom in a subdir). This makes it difficult
to have it widely available in distros, and difficult to find it if it
is installed in the system. Hence, the best is to include it as a
meson subproject like we already do for freeDiameter. An open5gs fork is
requried in order to have an extra patch adding a top-level
CMakeList.txt in order to be able to includ eit from open5gs's meson
build. Furthermore, this allows adding bugfixes to the subproject if any
are found in the future.
* [SMF] Initial metrics support
* [SMF] Add metrics at gtp_node level
* docs: Add tutorial documenting metrics with Prometheus
2022-06-07 20:51:02 +00:00
|
|
|
#include "metrics.h"
|
2020-04-26 19:36:05 +00:00
|
|
|
|
|
|
|
static ogs_thread_t *thread;
|
|
|
|
static void smf_main(void *data);
|
|
|
|
|
|
|
|
static int initialized = 0;
|
|
|
|
|
|
|
|
int smf_initialize()
|
|
|
|
{
|
|
|
|
int rv;
|
|
|
|
|
Initial metrics support based on Prometheus (#1571)
* Initial metrics support based on Prometheus
This commit introduces initial support for metrics in open5gs.
The metrics code is added as libogsmetrics (lib/metrics/), with a well
defined opaque API to manage different types of metrics, allowing for
different implementations for different technologies to scrap the
metrics (placed as lib/metrics/<impl>/. The implementation is right now
selected at build time, in order to be able to opt-out the related dependencies
for users not interested in the features. 2 implementations are already
provided in this commit to start with:
* void: Default implementation. Empty stubs, acts as a NOOP.
* prometheus: open5gs processes become Prometheus servers, offering
states through an http server to the Prometheus scrappers. Relies on
libprom (prometheus-client-ci [1] project) to track the metrics and format
them during export, and libmicrohttpd to make the export possible through
HTTP.
[1] https://github.com/digitalocean/prometheus-client-c
The prometheus-client-c is not well maintained nowadays in upstream, and
furthermore it uses a quite peculiar mixture of build systems (autolib
on the main dir, cmake for libprom in a subdir). This makes it difficult
to have it widely available in distros, and difficult to find it if it
is installed in the system. Hence, the best is to include it as a
meson subproject like we already do for freeDiameter. An open5gs fork is
requried in order to have an extra patch adding a top-level
CMakeList.txt in order to be able to includ eit from open5gs's meson
build. Furthermore, this allows adding bugfixes to the subproject if any
are found in the future.
* [SMF] Initial metrics support
* [SMF] Add metrics at gtp_node level
* docs: Add tutorial documenting metrics with Prometheus
2022-06-07 20:51:02 +00:00
|
|
|
ogs_metrics_context_init();
|
2021-03-15 01:01:55 +00:00
|
|
|
ogs_gtp_context_init(ogs_app()->pool.nf * OGS_MAX_NUM_OF_GTPU_RESOURCE);
|
|
|
|
ogs_pfcp_context_init();
|
2022-06-18 14:56:12 +00:00
|
|
|
ogs_sbi_context_init();
|
2021-03-15 01:01:55 +00:00
|
|
|
|
2020-04-26 19:36:05 +00:00
|
|
|
smf_context_init();
|
2020-08-26 03:05:01 +00:00
|
|
|
smf_event_init();
|
2020-04-26 19:36:05 +00:00
|
|
|
|
2020-08-26 03:05:01 +00:00
|
|
|
rv = ogs_gtp_xact_init();
|
2020-04-26 19:36:05 +00:00
|
|
|
if (rv != OGS_OK) return rv;
|
|
|
|
|
2020-08-26 03:05:01 +00:00
|
|
|
rv = ogs_pfcp_xact_init();
|
2020-04-26 19:36:05 +00:00
|
|
|
if (rv != OGS_OK) return rv;
|
|
|
|
|
2021-03-15 01:01:55 +00:00
|
|
|
rv = ogs_gtp_context_parse_config("smf", "upf");
|
|
|
|
if (rv != OGS_OK) return rv;
|
|
|
|
|
2020-04-26 19:36:05 +00:00
|
|
|
rv = ogs_pfcp_context_parse_config("smf", "upf");
|
|
|
|
if (rv != OGS_OK) return rv;
|
|
|
|
|
2022-07-16 04:27:18 +00:00
|
|
|
rv = ogs_sbi_context_parse_config("smf", "nrf", "scp");
|
2020-05-18 21:00:37 +00:00
|
|
|
if (rv != OGS_OK) return rv;
|
|
|
|
|
Initial metrics support based on Prometheus (#1571)
* Initial metrics support based on Prometheus
This commit introduces initial support for metrics in open5gs.
The metrics code is added as libogsmetrics (lib/metrics/), with a well
defined opaque API to manage different types of metrics, allowing for
different implementations for different technologies to scrap the
metrics (placed as lib/metrics/<impl>/. The implementation is right now
selected at build time, in order to be able to opt-out the related dependencies
for users not interested in the features. 2 implementations are already
provided in this commit to start with:
* void: Default implementation. Empty stubs, acts as a NOOP.
* prometheus: open5gs processes become Prometheus servers, offering
states through an http server to the Prometheus scrappers. Relies on
libprom (prometheus-client-ci [1] project) to track the metrics and format
them during export, and libmicrohttpd to make the export possible through
HTTP.
[1] https://github.com/digitalocean/prometheus-client-c
The prometheus-client-c is not well maintained nowadays in upstream, and
furthermore it uses a quite peculiar mixture of build systems (autolib
on the main dir, cmake for libprom in a subdir). This makes it difficult
to have it widely available in distros, and difficult to find it if it
is installed in the system. Hence, the best is to include it as a
meson subproject like we already do for freeDiameter. An open5gs fork is
requried in order to have an extra patch adding a top-level
CMakeList.txt in order to be able to includ eit from open5gs's meson
build. Furthermore, this allows adding bugfixes to the subproject if any
are found in the future.
* [SMF] Initial metrics support
* [SMF] Add metrics at gtp_node level
* docs: Add tutorial documenting metrics with Prometheus
2022-06-07 20:51:02 +00:00
|
|
|
rv = ogs_metrics_context_parse_config();
|
|
|
|
if (rv != OGS_OK) return rv;
|
|
|
|
|
2020-04-26 19:36:05 +00:00
|
|
|
rv = smf_context_parse_config();
|
|
|
|
if (rv != OGS_OK) return rv;
|
|
|
|
|
|
|
|
rv = ogs_log_config_domain(
|
2020-08-26 03:05:01 +00:00
|
|
|
ogs_app()->logger.domain, ogs_app()->logger.level);
|
2020-04-26 19:36:05 +00:00
|
|
|
if (rv != OGS_OK) return rv;
|
|
|
|
|
|
|
|
rv = ogs_pfcp_ue_pool_generate();
|
|
|
|
if (rv != OGS_OK) return rv;
|
|
|
|
|
Initial metrics support based on Prometheus (#1571)
* Initial metrics support based on Prometheus
This commit introduces initial support for metrics in open5gs.
The metrics code is added as libogsmetrics (lib/metrics/), with a well
defined opaque API to manage different types of metrics, allowing for
different implementations for different technologies to scrap the
metrics (placed as lib/metrics/<impl>/. The implementation is right now
selected at build time, in order to be able to opt-out the related dependencies
for users not interested in the features. 2 implementations are already
provided in this commit to start with:
* void: Default implementation. Empty stubs, acts as a NOOP.
* prometheus: open5gs processes become Prometheus servers, offering
states through an http server to the Prometheus scrappers. Relies on
libprom (prometheus-client-ci [1] project) to track the metrics and format
them during export, and libmicrohttpd to make the export possible through
HTTP.
[1] https://github.com/digitalocean/prometheus-client-c
The prometheus-client-c is not well maintained nowadays in upstream, and
furthermore it uses a quite peculiar mixture of build systems (autolib
on the main dir, cmake for libprom in a subdir). This makes it difficult
to have it widely available in distros, and difficult to find it if it
is installed in the system. Hence, the best is to include it as a
meson subproject like we already do for freeDiameter. An open5gs fork is
requried in order to have an extra patch adding a top-level
CMakeList.txt in order to be able to includ eit from open5gs's meson
build. Furthermore, this allows adding bugfixes to the subproject if any
are found in the future.
* [SMF] Initial metrics support
* [SMF] Add metrics at gtp_node level
* docs: Add tutorial documenting metrics with Prometheus
2022-06-07 20:51:02 +00:00
|
|
|
rv = smf_metrics_open();
|
|
|
|
if (rv != 0) return OGS_ERROR;
|
|
|
|
|
2020-04-26 19:36:05 +00:00
|
|
|
rv = smf_fd_init();
|
|
|
|
if (rv != 0) return OGS_ERROR;
|
|
|
|
|
2021-04-21 08:24:17 +00:00
|
|
|
rv = smf_gtp_open();
|
|
|
|
if (rv != 0) return OGS_ERROR;
|
|
|
|
|
|
|
|
rv = smf_pfcp_open();
|
|
|
|
if (rv != 0) return OGS_ERROR;
|
|
|
|
|
|
|
|
rv = smf_sbi_open();
|
|
|
|
if (rv != 0) return OGS_ERROR;
|
|
|
|
|
2020-04-26 19:36:05 +00:00
|
|
|
thread = ogs_thread_create(smf_main, NULL);
|
|
|
|
if (!thread) return OGS_ERROR;
|
|
|
|
|
|
|
|
initialized = 1;
|
|
|
|
|
|
|
|
return OGS_OK;
|
|
|
|
}
|
|
|
|
|
2020-05-18 21:00:37 +00:00
|
|
|
static ogs_timer_t *t_termination_holding = NULL;
|
|
|
|
|
|
|
|
static void event_termination(void)
|
|
|
|
{
|
|
|
|
ogs_sbi_nf_instance_t *nf_instance = NULL;
|
|
|
|
|
|
|
|
/* Sending NF Instance De-registeration to NRF */
|
|
|
|
ogs_list_for_each(&ogs_sbi_self()->nf_instance_list, nf_instance)
|
|
|
|
smf_nf_fsm_fini(nf_instance);
|
|
|
|
|
|
|
|
/* Starting holding timer */
|
2020-08-26 03:05:01 +00:00
|
|
|
t_termination_holding = ogs_timer_add(ogs_app()->timer_mgr, NULL, NULL);
|
2020-05-18 21:00:37 +00:00
|
|
|
ogs_assert(t_termination_holding);
|
|
|
|
#define TERMINATION_HOLDING_TIME ogs_time_from_msec(300)
|
|
|
|
ogs_timer_start(t_termination_holding, TERMINATION_HOLDING_TIME);
|
|
|
|
|
|
|
|
/* Sending termination event to the queue */
|
2020-08-26 03:05:01 +00:00
|
|
|
ogs_queue_term(ogs_app()->queue);
|
|
|
|
ogs_pollset_notify(ogs_app()->pollset);
|
2020-05-18 21:00:37 +00:00
|
|
|
}
|
|
|
|
|
2020-04-26 19:36:05 +00:00
|
|
|
void smf_terminate(void)
|
|
|
|
{
|
|
|
|
if (!initialized) return;
|
|
|
|
|
2020-05-18 21:00:37 +00:00
|
|
|
/* Daemon terminating */
|
|
|
|
event_termination();
|
2020-04-26 19:36:05 +00:00
|
|
|
ogs_thread_destroy(thread);
|
2020-05-18 21:00:37 +00:00
|
|
|
ogs_timer_delete(t_termination_holding);
|
2020-04-26 19:36:05 +00:00
|
|
|
|
2021-04-21 08:46:03 +00:00
|
|
|
smf_gtp_close();
|
|
|
|
smf_pfcp_close();
|
|
|
|
smf_sbi_close();
|
Initial metrics support based on Prometheus (#1571)
* Initial metrics support based on Prometheus
This commit introduces initial support for metrics in open5gs.
The metrics code is added as libogsmetrics (lib/metrics/), with a well
defined opaque API to manage different types of metrics, allowing for
different implementations for different technologies to scrap the
metrics (placed as lib/metrics/<impl>/. The implementation is right now
selected at build time, in order to be able to opt-out the related dependencies
for users not interested in the features. 2 implementations are already
provided in this commit to start with:
* void: Default implementation. Empty stubs, acts as a NOOP.
* prometheus: open5gs processes become Prometheus servers, offering
states through an http server to the Prometheus scrappers. Relies on
libprom (prometheus-client-ci [1] project) to track the metrics and format
them during export, and libmicrohttpd to make the export possible through
HTTP.
[1] https://github.com/digitalocean/prometheus-client-c
The prometheus-client-c is not well maintained nowadays in upstream, and
furthermore it uses a quite peculiar mixture of build systems (autolib
on the main dir, cmake for libprom in a subdir). This makes it difficult
to have it widely available in distros, and difficult to find it if it
is installed in the system. Hence, the best is to include it as a
meson subproject like we already do for freeDiameter. An open5gs fork is
requried in order to have an extra patch adding a top-level
CMakeList.txt in order to be able to includ eit from open5gs's meson
build. Furthermore, this allows adding bugfixes to the subproject if any
are found in the future.
* [SMF] Initial metrics support
* [SMF] Add metrics at gtp_node level
* docs: Add tutorial documenting metrics with Prometheus
2022-06-07 20:51:02 +00:00
|
|
|
smf_metrics_close();
|
2021-04-21 08:46:03 +00:00
|
|
|
|
2020-04-26 19:36:05 +00:00
|
|
|
smf_fd_final();
|
|
|
|
|
|
|
|
smf_context_final();
|
2021-03-15 01:01:55 +00:00
|
|
|
|
2020-04-26 19:36:05 +00:00
|
|
|
ogs_pfcp_context_final();
|
2020-05-18 21:00:37 +00:00
|
|
|
ogs_sbi_context_final();
|
2021-03-15 01:01:55 +00:00
|
|
|
ogs_gtp_context_final();
|
Initial metrics support based on Prometheus (#1571)
* Initial metrics support based on Prometheus
This commit introduces initial support for metrics in open5gs.
The metrics code is added as libogsmetrics (lib/metrics/), with a well
defined opaque API to manage different types of metrics, allowing for
different implementations for different technologies to scrap the
metrics (placed as lib/metrics/<impl>/. The implementation is right now
selected at build time, in order to be able to opt-out the related dependencies
for users not interested in the features. 2 implementations are already
provided in this commit to start with:
* void: Default implementation. Empty stubs, acts as a NOOP.
* prometheus: open5gs processes become Prometheus servers, offering
states through an http server to the Prometheus scrappers. Relies on
libprom (prometheus-client-ci [1] project) to track the metrics and format
them during export, and libmicrohttpd to make the export possible through
HTTP.
[1] https://github.com/digitalocean/prometheus-client-c
The prometheus-client-c is not well maintained nowadays in upstream, and
furthermore it uses a quite peculiar mixture of build systems (autolib
on the main dir, cmake for libprom in a subdir). This makes it difficult
to have it widely available in distros, and difficult to find it if it
is installed in the system. Hence, the best is to include it as a
meson subproject like we already do for freeDiameter. An open5gs fork is
requried in order to have an extra patch adding a top-level
CMakeList.txt in order to be able to includ eit from open5gs's meson
build. Furthermore, this allows adding bugfixes to the subproject if any
are found in the future.
* [SMF] Initial metrics support
* [SMF] Add metrics at gtp_node level
* docs: Add tutorial documenting metrics with Prometheus
2022-06-07 20:51:02 +00:00
|
|
|
ogs_metrics_context_final();
|
2020-04-26 19:36:05 +00:00
|
|
|
|
|
|
|
ogs_pfcp_xact_final();
|
|
|
|
ogs_gtp_xact_final();
|
|
|
|
|
2020-05-18 21:00:37 +00:00
|
|
|
smf_event_final(); /* Destroy event */
|
2020-04-26 19:36:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void smf_main(void *data)
|
|
|
|
{
|
|
|
|
ogs_fsm_t smf_sm;
|
|
|
|
int rv;
|
|
|
|
|
|
|
|
ogs_fsm_create(&smf_sm, smf_state_initial, smf_state_final);
|
|
|
|
ogs_fsm_init(&smf_sm, 0);
|
|
|
|
|
|
|
|
for ( ;; ) {
|
2020-08-26 03:05:01 +00:00
|
|
|
ogs_pollset_poll(ogs_app()->pollset,
|
|
|
|
ogs_timer_mgr_next(ogs_app()->timer_mgr));
|
2020-04-26 19:36:05 +00:00
|
|
|
|
2020-05-18 21:00:37 +00:00
|
|
|
/*
|
|
|
|
* After ogs_pollset_poll(), ogs_timer_mgr_expire() must be called.
|
2020-04-26 19:36:05 +00:00
|
|
|
*
|
2020-05-18 21:00:37 +00:00
|
|
|
* The reason is why ogs_timer_mgr_next() can get the corrent value
|
|
|
|
* when ogs_timer_stop() is called internally in ogs_timer_mgr_expire().
|
|
|
|
*
|
|
|
|
* You should not use event-queue before ogs_timer_mgr_expire().
|
|
|
|
* In this case, ogs_timer_mgr_expire() does not work
|
|
|
|
* because 'if rv == OGS_DONE' statement is exiting and
|
|
|
|
* not calling ogs_timer_mgr_expire().
|
|
|
|
*/
|
2020-08-26 03:05:01 +00:00
|
|
|
ogs_timer_mgr_expire(ogs_app()->timer_mgr);
|
2020-04-26 19:36:05 +00:00
|
|
|
|
|
|
|
for ( ;; ) {
|
|
|
|
smf_event_t *e = NULL;
|
|
|
|
|
2020-08-26 03:05:01 +00:00
|
|
|
rv = ogs_queue_trypop(ogs_app()->queue, (void**)&e);
|
2020-04-26 19:36:05 +00:00
|
|
|
ogs_assert(rv != OGS_ERROR);
|
|
|
|
|
|
|
|
if (rv == OGS_DONE)
|
|
|
|
goto done;
|
|
|
|
|
|
|
|
if (rv == OGS_RETRY)
|
|
|
|
break;
|
|
|
|
|
|
|
|
ogs_assert(e);
|
|
|
|
ogs_fsm_dispatch(&smf_sm, e);
|
|
|
|
smf_event_free(e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
done:
|
|
|
|
|
|
|
|
ogs_fsm_fini(&smf_sm, 0);
|
|
|
|
ogs_fsm_delete(&smf_sm);
|
|
|
|
}
|