[HSS] First diameter metric

This commit showcases how to add diameter based metrics to an app.
Follow-up commits will add further metrics for different diameter based
interfaces.
This commit is contained in:
Pau Espin Pedrol
2024-09-03 13:30:26 +02:00
committed by Sukchan Lee
parent a37a2099fc
commit 9db907a56e
4 changed files with 36 additions and 0 deletions

View File

@@ -67,6 +67,14 @@ int ogs_diam_stats_init(int mode, const ogs_diam_config_stats_t *config);
void ogs_diam_stats_final(void);
ogs_diam_stats_ctx_t* ogs_diam_stats_self(void);
#define OGS_DIAM_STATS_ADD(field, val) ogs_diam_stats_self()->stats.field += val
#define OGS_DIAM_STATS_INC(field) OGS_DIAM_STATS_ADD(field, 1)
#define OGS_DIAM_STATS_MTX(code) \
ogs_assert(pthread_mutex_lock(&ogs_diam_stats_self()->stats_lock) == 0); \
{ code } \
ogs_assert(pthread_mutex_unlock(&ogs_diam_stats_self()->stats_lock) == 0);
int ogs_diam_stats_start(void);

View File

@@ -20,6 +20,7 @@
#include "ogs-dbi.h"
#include "hss-context.h"
#include "hss-event.h"
#include "hss-fd-path.h"
#include "hss-s6a-path.h"
@@ -144,6 +145,7 @@ static int hss_context_prepare(void)
{
self.diam_config->cnf_port = DIAMETER_PORT;
self.diam_config->cnf_port_tls = DIAMETER_SECURE_PORT;
self.diam_config->stats.priv_stats_size = sizeof(hss_diam_stats_t);
return OGS_OK;
}
@@ -338,6 +340,9 @@ int hss_context_parse_config(void)
ogs_warn("unknown key `%s`", fd_key);
}
}
} else if (!strcmp(hss_key, "diameter_stats_interval")) {
const char *v = ogs_yaml_iter_value(&hss_iter);
if (v) self.diam_config->stats.interval_sec = atoi(v);
} else if (!strcmp(hss_key, "sms_over_ims")) {
self.sms_over_ims =
ogs_yaml_iter_value(&hss_iter);

View File

@@ -39,6 +39,9 @@ static int hss_ogs_diam_cx_fb_cb(struct msg **msg, struct avp *avp,
{
/* This CB should never be called */
ogs_warn("Unexpected message received!");
OGS_DIAM_STATS_MTX(
HSS_DIAM_PRIV_STATS_INC(cx.rx_unknown);
)
return ENOTSUP;
}

View File

@@ -22,6 +22,24 @@
#include "hss-context.h"
#include "hss-fd-path.h"
static hss_diam_stats_t prev_st;
static void hsss_diam_stats_update_cb(const ogs_diam_stats_t *stats, const void *priv_stats)
{
const hss_diam_stats_t *st = (const hss_diam_stats_t *)priv_stats;
ogs_debug("%s(): Update HSS diameter metrics", __func__);
#define METRIC_ADD(metric_name, field) \
{ \
int diff = st->field - prev_st.field; \
if (diff > 0) hss_metrics_inst_global_add(metric_name, diff); \
}
METRIC_ADD(HSS_METR_GLOB_CTR_CX_RX_UNKNOWN, cx.rx_unknown);
memcpy(&prev_st, st, sizeof(*st));
}
int hss_fd_init(void)
{
int rv;
@@ -37,6 +55,8 @@ int hss_fd_init(void)
rv = hss_swx_init();
ogs_assert(rv == OGS_OK);
ogs_diam_stats_update_cb_register(hsss_diam_stats_update_cb);
rv = ogs_diam_start();
ogs_assert(rv == 0);