MME initial metrics support (#1587)
This commit is contained in:
parent
9e25482d99
commit
109949d335
|
@ -421,3 +421,17 @@ usrsctp:
|
||||||
# handover:
|
# handover:
|
||||||
# duration: 500
|
# duration: 500
|
||||||
time:
|
time:
|
||||||
|
|
||||||
|
#
|
||||||
|
# metrics:
|
||||||
|
#
|
||||||
|
# <Metrics Server>
|
||||||
|
#
|
||||||
|
# o Metrics Server(http://<any address>:9090)
|
||||||
|
# metrics:
|
||||||
|
# addr: 0.0.0.0
|
||||||
|
# port: 9090
|
||||||
|
#
|
||||||
|
metrics:
|
||||||
|
addr: 0.0.0.0
|
||||||
|
port: 9090
|
|
@ -40,7 +40,8 @@ libmme_sources = files('''
|
||||||
sbc-message.h
|
sbc-message.h
|
||||||
sbc-handler.h
|
sbc-handler.h
|
||||||
mme-sm.h
|
mme-sm.h
|
||||||
mme-path.h
|
mme-path.h
|
||||||
|
metrics.h
|
||||||
|
|
||||||
mme-init.c
|
mme-init.c
|
||||||
mme-event.c
|
mme-event.c
|
||||||
|
@ -73,11 +74,13 @@ libmme_sources = files('''
|
||||||
mme-sm.c
|
mme-sm.c
|
||||||
mme-path.c
|
mme-path.c
|
||||||
sbc-handler.c
|
sbc-handler.c
|
||||||
|
metrics.c
|
||||||
'''.split())
|
'''.split())
|
||||||
|
|
||||||
libmme = static_library('mme',
|
libmme = static_library('mme',
|
||||||
sources : libmme_sources,
|
sources : libmme_sources,
|
||||||
dependencies : [libapp_dep,
|
dependencies : [libapp_dep,
|
||||||
|
libmetrics_dep,
|
||||||
libsctp_dep,
|
libsctp_dep,
|
||||||
libs1ap_dep,
|
libs1ap_dep,
|
||||||
libnas_eps_dep,
|
libnas_eps_dep,
|
||||||
|
@ -88,6 +91,7 @@ libmme = static_library('mme',
|
||||||
libmme_dep = declare_dependency(
|
libmme_dep = declare_dependency(
|
||||||
link_with : libmme,
|
link_with : libmme,
|
||||||
dependencies : [libapp_dep,
|
dependencies : [libapp_dep,
|
||||||
|
libmetrics_dep,
|
||||||
libsctp_dep,
|
libsctp_dep,
|
||||||
libs1ap_dep,
|
libs1ap_dep,
|
||||||
libnas_eps_dep,
|
libnas_eps_dep,
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -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 */
|
|
@ -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_fsm_init(&enb->sm, &e);
|
||||||
|
|
||||||
ogs_list_add(&self.enb_list, enb);
|
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_info("[Added] Number of eNBs is now %d",
|
||||||
ogs_list_count(&self.enb_list));
|
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_sctp_flush_and_destroy(&enb->sctp);
|
||||||
|
|
||||||
ogs_pool_free(&mme_enb_pool, enb);
|
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_info("[Removed] Number of eNBs is now %d",
|
||||||
ogs_list_count(&self.enb_list));
|
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)
|
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;
|
num_of_enb_ue = num_of_enb_ue + 1;
|
||||||
ogs_info("[Added] Number of eNB-UEs is now %d", num_of_enb_ue);
|
ogs_info("[Added] Number of eNB-UEs is now %d", num_of_enb_ue);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void stats_remove_enb_ue(void)
|
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;
|
num_of_enb_ue = num_of_enb_ue - 1;
|
||||||
ogs_info("[Removed] Number of eNB-UEs is now %d", num_of_enb_ue);
|
ogs_info("[Removed] Number of eNB-UEs is now %d", num_of_enb_ue);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void stats_add_mme_session(void)
|
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;
|
num_of_mme_sess = num_of_mme_sess + 1;
|
||||||
ogs_info("[Added] Number of MME-Sessions is now %d", num_of_mme_sess);
|
ogs_info("[Added] Number of MME-Sessions is now %d", num_of_mme_sess);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void stats_remove_mme_session(void)
|
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;
|
num_of_mme_sess = num_of_mme_sess - 1;
|
||||||
ogs_info("[Removed] Number of MME-Sessions is now %d", num_of_mme_sess);
|
ogs_info("[Removed] Number of MME-Sessions is now %d", num_of_mme_sess);
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include "ogs-nas-eps.h"
|
#include "ogs-nas-eps.h"
|
||||||
#include "ogs-app.h"
|
#include "ogs-app.h"
|
||||||
#include "ogs-sctp.h"
|
#include "ogs-sctp.h"
|
||||||
|
#include "metrics.h"
|
||||||
|
|
||||||
/* S1AP */
|
/* S1AP */
|
||||||
#include "S1AP_Cause.h"
|
#include "S1AP_Cause.h"
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "s1ap-path.h"
|
#include "s1ap-path.h"
|
||||||
#include "sgsap-path.h"
|
#include "sgsap-path.h"
|
||||||
#include "mme-gtp-path.h"
|
#include "mme-gtp-path.h"
|
||||||
|
#include "metrics.h"
|
||||||
|
|
||||||
static ogs_thread_t *thread;
|
static ogs_thread_t *thread;
|
||||||
static void mme_main(void *data);
|
static void mme_main(void *data);
|
||||||
|
@ -38,7 +39,7 @@ static int initialized = 0;
|
||||||
int mme_initialize()
|
int mme_initialize()
|
||||||
{
|
{
|
||||||
int rv;
|
int rv;
|
||||||
|
ogs_metrics_context_init();
|
||||||
ogs_gtp_context_init(OGS_MAX_NUM_OF_GTPU_RESOURCE);
|
ogs_gtp_context_init(OGS_MAX_NUM_OF_GTPU_RESOURCE);
|
||||||
mme_context_init();
|
mme_context_init();
|
||||||
|
|
||||||
|
@ -48,9 +49,15 @@ int mme_initialize()
|
||||||
rv = ogs_gtp_context_parse_config("mme", "sgwc");
|
rv = ogs_gtp_context_parse_config("mme", "sgwc");
|
||||||
if (rv != OGS_OK) return rv;
|
if (rv != OGS_OK) return rv;
|
||||||
|
|
||||||
|
rv = ogs_metrics_context_parse_config();
|
||||||
|
if (rv != OGS_OK) return rv;
|
||||||
|
|
||||||
rv = mme_context_parse_config();
|
rv = mme_context_parse_config();
|
||||||
if (rv != OGS_OK) return rv;
|
if (rv != OGS_OK) return rv;
|
||||||
|
|
||||||
|
rv = mme_metrics_open();
|
||||||
|
if (rv != 0) return OGS_ERROR;
|
||||||
|
|
||||||
rv = ogs_log_config_domain(
|
rv = ogs_log_config_domain(
|
||||||
ogs_app()->logger.domain, ogs_app()->logger.level);
|
ogs_app()->logger.domain, ogs_app()->logger.level);
|
||||||
if (rv != OGS_OK) return rv;
|
if (rv != OGS_OK) return rv;
|
||||||
|
@ -89,6 +96,7 @@ void mme_terminate(void)
|
||||||
mme_gtp_close();
|
mme_gtp_close();
|
||||||
sgsap_close();
|
sgsap_close();
|
||||||
s1ap_close();
|
s1ap_close();
|
||||||
|
mme_metrics_close();
|
||||||
|
|
||||||
mme_fd_final();
|
mme_fd_final();
|
||||||
|
|
||||||
|
@ -97,6 +105,8 @@ void mme_terminate(void)
|
||||||
ogs_gtp_context_final();
|
ogs_gtp_context_final();
|
||||||
|
|
||||||
ogs_gtp_xact_final();
|
ogs_gtp_xact_final();
|
||||||
|
|
||||||
|
ogs_metrics_context_final();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mme_main(void *data)
|
static void mme_main(void *data)
|
||||||
|
|
Loading…
Reference in New Issue