From 109949d33562385e0a26e6a5dd20ae52a0411b05 Mon Sep 17 00:00:00 2001 From: Carlos Giraldo Date: Wed, 8 Jun 2022 23:23:51 +0200 Subject: [PATCH] MME initial metrics support (#1587) --- configs/open5gs/mme.yaml.in | 14 +++++++ src/mme/meson.build | 6 ++- src/mme/metrics.c | 83 +++++++++++++++++++++++++++++++++++++ src/mme/metrics.h | 42 +++++++++++++++++++ src/mme/mme-context.c | 7 +++- src/mme/mme-context.h | 1 + src/mme/mme-init.c | 12 +++++- 7 files changed, 162 insertions(+), 3 deletions(-) create mode 100644 src/mme/metrics.c create mode 100644 src/mme/metrics.h diff --git a/configs/open5gs/mme.yaml.in b/configs/open5gs/mme.yaml.in index 1675c52b4..ce689b5da 100644 --- a/configs/open5gs/mme.yaml.in +++ b/configs/open5gs/mme.yaml.in @@ -421,3 +421,17 @@ usrsctp: # handover: # duration: 500 time: + +# +# metrics: +# +# +# +# o Metrics Server(http://:9090) +# metrics: +# addr: 0.0.0.0 +# port: 9090 +# +metrics: + addr: 0.0.0.0 + port: 9090 \ No newline at end of file diff --git a/src/mme/meson.build b/src/mme/meson.build index ca6a5edf1..1f3d5a238 100644 --- a/src/mme/meson.build +++ b/src/mme/meson.build @@ -40,7 +40,8 @@ libmme_sources = files(''' sbc-message.h sbc-handler.h mme-sm.h - mme-path.h + mme-path.h + metrics.h mme-init.c mme-event.c @@ -73,11 +74,13 @@ libmme_sources = files(''' mme-sm.c mme-path.c sbc-handler.c + metrics.c '''.split()) libmme = static_library('mme', sources : libmme_sources, dependencies : [libapp_dep, + libmetrics_dep, libsctp_dep, libs1ap_dep, libnas_eps_dep, @@ -88,6 +91,7 @@ libmme = static_library('mme', libmme_dep = declare_dependency( link_with : libmme, dependencies : [libapp_dep, + libmetrics_dep, libsctp_dep, libs1ap_dep, libnas_eps_dep, diff --git a/src/mme/metrics.c b/src/mme/metrics.c new file mode 100644 index 000000000..d827b2a11 --- /dev/null +++ b/src/mme/metrics.c @@ -0,0 +1,83 @@ +#include "ogs-app.h" +#include "mme-context.h" + +#include "metrics.h" + +typedef struct mme_metrics_spec_def_s { + unsigned int type; + const char *name; + const char *description; + int initial_val; + unsigned int num_labels; + const char **labels; +} mme_metrics_spec_def_t; + +ogs_metrics_spec_t *mme_metrics_spec_global[_MME_METR_GLOB_MAX]; +ogs_metrics_inst_t *mme_metrics_inst_global[_MME_METR_GLOB_MAX]; +mme_metrics_spec_def_t mme_metrics_spec_def_global[_MME_METR_GLOB_MAX] = { +[MME_METR_GLOB_GAUGE_ENB_UE] = { + .type = OGS_METRICS_METRIC_TYPE_GAUGE, + .name = "enb_ue", + .description = "Number of UEs connected to eNodeBs", + .initial_val = 0, + .num_labels = 0, + .labels = NULL, +}, +[MME_METR_GLOB_GAUGE_MME_SESS] = { + .type = OGS_METRICS_METRIC_TYPE_GAUGE, + .name = "mme_session", + .description = "MME Sessions", + .initial_val = 0, + .num_labels = 0, + .labels = NULL, +}, +[MME_METR_GLOB_GAUGE_ENB] = { + .type = OGS_METRICS_METRIC_TYPE_GAUGE, + .name = "enb", + .description = "eNodeBs", + .initial_val = 0, + .num_labels = 0, + .labels = NULL, +}, +}; + +static int mme_metrics_init_spec(ogs_metrics_context_t *ctx, + ogs_metrics_spec_t **dst, mme_metrics_spec_def_t *src, unsigned int len) +{ + unsigned int i; + for (i = 0; i < len; i++) { + dst[i] = ogs_metrics_spec_new(ctx, src[i].type, + src[i].name, src[i].description, + src[i].initial_val, src[i].num_labels, src[i].labels); + } + return OGS_OK; +} + + +static int mme_metrics_init_inst_global(ogs_metrics_inst_t **inst, ogs_metrics_spec_t **specs, unsigned int len) +{ + unsigned int i; + for (i = 0; i < len; i++) + inst[i] = ogs_metrics_inst_new(specs[i], 0, NULL); + return OGS_OK; +} + +int mme_metrics_open(void) +{ + ogs_metrics_context_t *ctx = ogs_metrics_self(); + ogs_metrics_context_open(ctx); + + mme_metrics_init_spec(ctx, mme_metrics_spec_global, mme_metrics_spec_def_global, + _MME_METR_GLOB_MAX); + + mme_metrics_init_inst_global(mme_metrics_inst_global, mme_metrics_spec_global, + _MME_METR_GLOB_MAX); + return 0; +} + +int mme_metrics_close(void) +{ + ogs_metrics_context_t *ctx = ogs_metrics_self(); + ogs_metrics_context_close(ctx); + return OGS_OK; +} diff --git a/src/mme/metrics.h b/src/mme/metrics.h new file mode 100644 index 000000000..60b5d58af --- /dev/null +++ b/src/mme/metrics.h @@ -0,0 +1,42 @@ +#ifndef MME_METRICS_H +#define MME_METRICS_H + +#include "ogs-metrics.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum mme_metric_type_global_s { + MME_METR_GLOB_GAUGE_ENB_UE, + MME_METR_GLOB_GAUGE_MME_SESS, + MME_METR_GLOB_GAUGE_ENB, + _MME_METR_GLOB_MAX, +} mme_metric_type_global_t; +extern ogs_metrics_inst_t *mme_metrics_inst_global[_MME_METR_GLOB_MAX]; + +static inline void mme_metrics_inst_global_set(mme_metric_type_global_t t, int val) +{ + ogs_metrics_inst_set(mme_metrics_inst_global[t], val); +} +static inline void mme_metrics_inst_global_add(mme_metric_type_global_t t, int val) +{ + ogs_metrics_inst_add(mme_metrics_inst_global[t], val); +} +static inline void mme_metrics_inst_global_inc(mme_metric_type_global_t t) +{ + ogs_metrics_inst_inc(mme_metrics_inst_global[t]); +} +static inline void mme_metrics_inst_global_dec(mme_metric_type_global_t t) +{ + ogs_metrics_inst_dec(mme_metrics_inst_global[t]); +} + +int mme_metrics_open(void); +int mme_metrics_close(void); + +#ifdef __cplusplus +} +#endif + +#endif /* MME_METRICS_H */ diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index be857df69..a37162a62 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -1833,6 +1833,7 @@ mme_enb_t *mme_enb_add(ogs_sock_t *sock, ogs_sockaddr_t *addr) ogs_fsm_init(&enb->sm, &e); ogs_list_add(&self.enb_list, enb); + mme_metrics_inst_global_inc(MME_METR_GLOB_GAUGE_ENB); ogs_info("[Added] Number of eNBs is now %d", ogs_list_count(&self.enb_list)); @@ -1868,7 +1869,7 @@ int mme_enb_remove(mme_enb_t *enb) ogs_sctp_flush_and_destroy(&enb->sctp); ogs_pool_free(&mme_enb_pool, enb); - + mme_metrics_inst_global_dec(MME_METR_GLOB_GAUGE_ENB); ogs_info("[Removed] Number of eNBs is now %d", ogs_list_count(&self.enb_list)); @@ -3485,24 +3486,28 @@ uint8_t mme_selected_enc_algorithm(mme_ue_t *mme_ue) static void stats_add_enb_ue(void) { + mme_metrics_inst_global_inc(MME_METR_GLOB_GAUGE_ENB_UE); num_of_enb_ue = num_of_enb_ue + 1; ogs_info("[Added] Number of eNB-UEs is now %d", num_of_enb_ue); } static void stats_remove_enb_ue(void) { + mme_metrics_inst_global_dec(MME_METR_GLOB_GAUGE_ENB_UE); num_of_enb_ue = num_of_enb_ue - 1; ogs_info("[Removed] Number of eNB-UEs is now %d", num_of_enb_ue); } static void stats_add_mme_session(void) { + mme_metrics_inst_global_inc(MME_METR_GLOB_GAUGE_MME_SESS); num_of_mme_sess = num_of_mme_sess + 1; ogs_info("[Added] Number of MME-Sessions is now %d", num_of_mme_sess); } static void stats_remove_mme_session(void) { + mme_metrics_inst_global_dec(MME_METR_GLOB_GAUGE_MME_SESS); num_of_mme_sess = num_of_mme_sess - 1; ogs_info("[Removed] Number of MME-Sessions is now %d", num_of_mme_sess); } diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index 96efe7e4b..03e44d87f 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -28,6 +28,7 @@ #include "ogs-nas-eps.h" #include "ogs-app.h" #include "ogs-sctp.h" +#include "metrics.h" /* S1AP */ #include "S1AP_Cause.h" diff --git a/src/mme/mme-init.c b/src/mme/mme-init.c index 3b6aa2a92..b389cc97c 100644 --- a/src/mme/mme-init.c +++ b/src/mme/mme-init.c @@ -29,6 +29,7 @@ #include "s1ap-path.h" #include "sgsap-path.h" #include "mme-gtp-path.h" +#include "metrics.h" static ogs_thread_t *thread; static void mme_main(void *data); @@ -38,7 +39,7 @@ static int initialized = 0; int mme_initialize() { int rv; - + ogs_metrics_context_init(); ogs_gtp_context_init(OGS_MAX_NUM_OF_GTPU_RESOURCE); mme_context_init(); @@ -48,9 +49,15 @@ int mme_initialize() rv = ogs_gtp_context_parse_config("mme", "sgwc"); if (rv != OGS_OK) return rv; + rv = ogs_metrics_context_parse_config(); + if (rv != OGS_OK) return rv; + rv = mme_context_parse_config(); if (rv != OGS_OK) return rv; + rv = mme_metrics_open(); + if (rv != 0) return OGS_ERROR; + rv = ogs_log_config_domain( ogs_app()->logger.domain, ogs_app()->logger.level); if (rv != OGS_OK) return rv; @@ -89,6 +96,7 @@ void mme_terminate(void) mme_gtp_close(); sgsap_close(); s1ap_close(); + mme_metrics_close(); mme_fd_final(); @@ -97,6 +105,8 @@ void mme_terminate(void) ogs_gtp_context_final(); ogs_gtp_xact_final(); + + ogs_metrics_context_final(); } static void mme_main(void *data)