[ue-info] consolidate page/page size for ue-info API interface

Remove function pointers to set page/page sizes per info type
(UE/PDU/gNB/eNB info). Instead, call dumpers functions with this
information as function arguments.
This commit is contained in:
Bostjan Meglic
2025-10-13 10:12:31 +02:00
committed by Sukchan Lee
parent fd897f35a3
commit 37c74da44f
17 changed files with 52 additions and 163 deletions

View File

@@ -25,30 +25,31 @@
#define DEFAULT_PROMETHEUS_HTTP_PORT 9090
size_t (*ogs_metrics_pdu_info_dumper)(char *buf, size_t buflen) = NULL;
size_t (*ogs_metrics_ue_info_dumper)(char *buf, size_t buflen) = NULL;
size_t (*ogs_metrics_gnb_info_dumper)(char *buf, size_t buflen) = NULL;
size_t (*ogs_metrics_enb_info_dumper)(char *buf, size_t buflen) = NULL;
size_t (*ogs_metrics_pdu_info_dumper)(char *buf, size_t buflen, size_t page, size_t page_size) = NULL;
size_t (*ogs_metrics_ue_info_dumper)(char *buf, size_t buflen, size_t page, size_t page_size) = NULL;
size_t (*ogs_metrics_gnb_info_dumper)(char *buf, size_t buflen, size_t page, size_t page_size) = NULL;
size_t (*ogs_metrics_enb_info_dumper)(char *buf, size_t buflen, size_t page, size_t page_size) = NULL;
void ogs_metrics_register_ue_info(size_t (*fn)(char *buf, size_t buflen))
void ogs_metrics_register_ue_info(size_t (*fn)(char *buf, size_t buflen, size_t page, size_t page_size))
{
ogs_metrics_ue_info_dumper = fn;
}
void ogs_metrics_register_pdu_info(size_t (*fn)(char *buf, size_t buflen))
void ogs_metrics_register_pdu_info(size_t (*fn)(char *buf, size_t buflen, size_t page, size_t page_size))
{
ogs_metrics_pdu_info_dumper = fn;
}
void ogs_metrics_register_gnb_info(size_t (*fn)(char *buf, size_t buflen))
void ogs_metrics_register_gnb_info(size_t (*fn)(char *buf, size_t buflen, size_t page, size_t page_size))
{
ogs_metrics_gnb_info_dumper = fn;
}
void ogs_metrics_register_enb_info(size_t (*fn)(char *buf, size_t buflen))
void ogs_metrics_register_enb_info(size_t (*fn)(char *buf, size_t buflen, size_t page, size_t page_size))
{
ogs_metrics_enb_info_dumper = fn;
}
int __ogs_metrics_domain;
static ogs_metrics_context_t self;
static int context_initialized = 0;

View File

@@ -36,17 +36,17 @@
extern "C" {
#endif
extern size_t (*ogs_metrics_pdu_info_dumper)(char *buf, size_t buflen);
void ogs_metrics_register_pdu_info(size_t (*fn)(char *buf, size_t buflen));
extern size_t (*ogs_metrics_pdu_info_dumper)(char *buf, size_t buflen, size_t page, size_t page_size);
void ogs_metrics_register_pdu_info(size_t (*fn)(char *buf, size_t buflen, size_t page, size_t page_size));
extern size_t (*ogs_metrics_ue_info_dumper)(char *buf, size_t buflen);
void ogs_metrics_register_ue_info(size_t (*fn)(char *buf, size_t buflen));
extern size_t (*ogs_metrics_ue_info_dumper)(char *buf, size_t buflen, size_t page, size_t page_size);
void ogs_metrics_register_ue_info(size_t (*fn)(char *buf, size_t buflen, size_t page, size_t page_size));
extern size_t (*ogs_metrics_gnb_info_dumper)(char *buf, size_t buflen);
void ogs_metrics_register_gnb_info(size_t (*fn)(char *buf, size_t buflen));
extern size_t (*ogs_metrics_gnb_info_dumper)(char *buf, size_t buflen, size_t page, size_t page_size);
void ogs_metrics_register_gnb_info(size_t (*fn)(char *buf, size_t buflen, size_t page, size_t page_size));
extern size_t (*ogs_metrics_enb_info_dumper)(char *buf, size_t buflen);
void ogs_metrics_register_enb_info(size_t (*fn)(char *buf, size_t buflen));
extern size_t (*ogs_metrics_enb_info_dumper)(char *buf, size_t buflen, size_t page, size_t page_size);
void ogs_metrics_register_enb_info(size_t (*fn)(char *buf, size_t buflen, size_t page, size_t page_size));
#ifdef __cplusplus

View File

@@ -36,12 +36,7 @@
#include "prom.h"
#include "microhttpd.h"
#include <string.h>
#include "prometheus/pager.h"
ogs_metrics_pager_fn ogs_metrics_pdu_info_set_pager = NULL;
ogs_metrics_pager_fn ogs_metrics_gnb_info_set_pager = NULL;
ogs_metrics_pager_fn ogs_metrics_enb_info_set_pager = NULL;
ogs_metrics_pager_fn ogs_metrics_ue_info_set_pager = NULL;
extern int __ogs_metrics_domain;
#define MAX_LABELS 8
@@ -199,7 +194,8 @@ typedef int _MHD_Result;
/* Small helper to serve JSON from a registered dumper */
static _MHD_Result serve_json_from_dumper(struct MHD_Connection *connection,
size_t (*dumper)(char*, size_t),
size_t (*dumper)(char*, size_t, size_t, size_t),
size_t page, size_t page_size,
const char *missing_msg)
{
if (!dumper) {
@@ -223,7 +219,7 @@ static _MHD_Result serve_json_from_dumper(struct MHD_Connection *connection,
return (_MHD_Result)ret;
}
size_t n = dumper(bufjson, cap);
size_t n = dumper(bufjson, cap, page, page_size);
if (n >= cap - 1) {
/* grow once */
size_t newcap = cap * 2;
@@ -239,7 +235,7 @@ static _MHD_Result serve_json_from_dumper(struct MHD_Connection *connection,
return (_MHD_Result)ret;
}
bufjson = tmp; cap = newcap;
n = dumper(bufjson, cap);
n = dumper(bufjson, cap, page, page_size);
if (n >= cap - 1) {
/* graceful fallback */
n = ogs_snprintf(bufjson, cap, "[]");
@@ -309,43 +305,34 @@ mhd_server_access_handler(void *cls, struct MHD_Connection *connection,
return (_MHD_Result)ret;
}
/* JSON: connected PDUs (SMF) */
if (strcmp(url, "/pdu-info") == 0) {
size_t page = get_query_size_t(connection, "page", 0);
size_t page_size = get_query_size_t(connection, "page_size", 100);
if (ogs_metrics_pdu_info_set_pager)
ogs_metrics_pdu_info_set_pager(page, page_size);
/* JSON: connected PDUs (SMF) */
if (strcmp(url, "/pdu-info") == 0) {
return serve_json_from_dumper(connection, ogs_metrics_pdu_info_dumper,
page, page_size,
"pdu-info endpoint not available on this NF\n");
}
/* JSON: connected gNBs (AMF) */
if (strcmp(url, "/gnb-info") == 0) {
size_t page = get_query_size_t(connection, "page", 0);
size_t page_size = get_query_size_t(connection, "page_size", 100);
if (ogs_metrics_gnb_info_set_pager)
ogs_metrics_gnb_info_set_pager(page, page_size);
return serve_json_from_dumper(connection, ogs_metrics_gnb_info_dumper,
page, page_size,
"gnb-info endpoint not available on this NF\n");
}
/* JSON: connected eNBs (MME) */
if (strcmp(url, "/enb-info") == 0) {
size_t page = get_query_size_t(connection, "page", 0);
size_t page_size = get_query_size_t(connection, "page_size", 100);
if (ogs_metrics_enb_info_set_pager)
ogs_metrics_enb_info_set_pager(page, page_size);
return serve_json_from_dumper(connection, ogs_metrics_enb_info_dumper,
page, page_size,
"enb-info endpoint not available on this NF\n");
}
/* JSON: connected UEs (AMF/MME) */
if (strcmp(url, "/ue-info") == 0) {
size_t page = get_query_size_t(connection, "page", 0);
size_t page_size = get_query_size_t(connection, "page_size", 100);
if (ogs_metrics_ue_info_set_pager)
ogs_metrics_ue_info_set_pager(page, page_size);
return serve_json_from_dumper(connection, ogs_metrics_ue_info_dumper,
page, page_size,
"ue-info endpoint not available on this NF\n");
}

View File

@@ -1,38 +0,0 @@
/*
* Copyright (C) 2025 by Juraj Elias <juraj.elias@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/>.
*/
#ifndef OGS_METRICS_PROM_PAGER_H
#define OGS_METRICS_PROM_PAGER_H
#include <stddef.h>
/* NF-specific optional pager setter signatures.
* NFs may assign these at init time. If left NULL, paging is ignored for that NF.
*/
typedef void (*ogs_metrics_pager_fn)(size_t page, size_t page_size);
/* Connected PDUs (SMF) */
extern ogs_metrics_pager_fn ogs_metrics_pdu_info_set_pager;
extern ogs_metrics_pager_fn ogs_metrics_ue_info_set_pager;
extern ogs_metrics_pager_fn ogs_metrics_gnb_info_set_pager;
extern ogs_metrics_pager_fn ogs_metrics_enb_info_set_pager;
#endif /* OGS_METRICS_PROM_PAGER_H */

View File

@@ -94,18 +94,9 @@
#define GNB_INFO_PAGE_SIZE_DEFAULT 100U
#endif
static size_t g_page = SIZE_MAX; /* SIZE_MAX => no paging */
static size_t g_page_size = 0; /* 0 => use default in dumper */
void amf_metrics_gnb_info_set_pager(size_t page, size_t page_size)
size_t amf_dump_gnb_info(char *buf, size_t buflen, size_t page, size_t page_size)
{
g_page = page;
g_page_size = page_size;
}
size_t amf_dump_gnb_info(char *buf, size_t buflen)
{
return amf_dump_gnb_info_paged(buf, buflen, g_page, g_page_size);
return amf_dump_gnb_info_paged(buf, buflen, page, page_size);
}
static inline uint32_t u24_to_u32(ogs_uint24_t v)

View File

@@ -33,9 +33,8 @@ extern "C" {
#define GNB_INFO_PAGE_SIZE_DEFAULT 100U
#endif
size_t amf_dump_gnb_info(char *buf, size_t buflen);
size_t amf_dump_gnb_info(char *buf, size_t buflen, size_t page, size_t page_size);
size_t amf_dump_gnb_info_paged(char *buf, size_t buflen, size_t page, size_t page_size);
void amf_metrics_gnb_info_set_pager(size_t page, size_t page_size);
#ifdef __cplusplus
}

View File

@@ -23,7 +23,6 @@
#include "ogs-metrics.h"
#include "metrics/prometheus/json_pager.h"
#include "metrics/prometheus/pager.h"
#include "gnb-info.h"
#include "ue-info.h"
@@ -65,8 +64,6 @@ int amf_initialize(void)
/* dumpers /gnb-info /ue-info */
ogs_metrics_register_gnb_info(amf_dump_gnb_info);
ogs_metrics_register_ue_info(amf_dump_ue_info);
ogs_metrics_gnb_info_set_pager = amf_metrics_gnb_info_set_pager;
ogs_metrics_ue_info_set_pager = amf_metrics_ue_info_set_pager;
rv = amf_sbi_open();
if (rv != OGS_OK) return rv;

View File

@@ -115,20 +115,12 @@
#include "sbi/openapi/external/cJSON.h"
#include "metrics/prometheus/json_pager.h"
static size_t g_ue_page = 0;
static size_t g_ue_page_size = 0;
void amf_metrics_ue_info_set_pager(size_t page, size_t page_size)
size_t amf_dump_ue_info(char *buf, size_t buflen, size_t page, size_t page_size)
{
g_ue_page = page;
g_ue_page_size = page_size;
}
size_t amf_dump_ue_info(char *buf, size_t buflen)
{
size_t page = g_ue_page;
size_t page_size = g_ue_page_size ? g_ue_page_size : 100;
page_size = page_size ? page_size : 100;
if (page_size > 100) page_size = 100;
return amf_dump_ue_info_paged(buf, buflen, page, page_size);
}

View File

@@ -33,9 +33,10 @@ extern "C" {
#define UE_INFO_PAGE_SIZE_DEFAULT 100U
#endif
size_t amf_dump_ue_info(char *buf, size_t buflen);
size_t amf_dump_ue_info_paged(char *buf, size_t buflen, size_t page, size_t page_size);
void amf_metrics_ue_info_set_pager(size_t page, size_t page_size);
size_t amf_dump_ue_info(char *buf, size_t buflen,
size_t page, size_t page_size);
size_t amf_dump_ue_info_paged(char *buf, size_t buflen,
size_t page, size_t page_size);
#ifdef __cplusplus
}

View File

@@ -73,20 +73,12 @@
#define ENB_INFO_PAGE_SIZE_DEFAULT 100U
#endif
static size_t g_enb_page = 0;
static size_t g_enb_page_size = 0;
void mme_metrics_enb_info_set_pager(size_t page, size_t page_size)
size_t mme_dump_enb_info(char *buf, size_t buflen, size_t page, size_t page_size)
{
g_enb_page = page;
g_enb_page_size = page_size;
}
size_t mme_dump_enb_info(char *buf, size_t buflen)
{
size_t page = g_enb_page;
size_t page_size = g_enb_page_size ? g_enb_page_size : ENB_INFO_PAGE_SIZE_DEFAULT;
page_size = page_size ? page_size : ENB_INFO_PAGE_SIZE_DEFAULT;
if (page_size > ENB_INFO_PAGE_SIZE_DEFAULT) page_size = ENB_INFO_PAGE_SIZE_DEFAULT;
return mme_dump_enb_info_paged(buf, buflen, page, page_size);
}

View File

@@ -33,9 +33,8 @@ extern "C" {
#define ENB_INFO_PAGE_SIZE_DEFAULT 100U
#endif
size_t mme_dump_enb_info(char *buf, size_t buflen);
size_t mme_dump_enb_info(char *buf, size_t buflen, size_t page, size_t page_size);
size_t mme_dump_enb_info_paged(char *buf, size_t buflen, size_t page, size_t page_size);
void mme_metrics_enb_info_set_pager(size_t page, size_t page_size);
#ifdef __cplusplus
}

View File

@@ -31,7 +31,6 @@
#include "mme-gtp-path.h"
#include "metrics.h"
#include "metrics/prometheus/json_pager.h"
#include "metrics/prometheus/pager.h"
#include "enb-info.h"
#include "ue-info.h"
@@ -74,8 +73,6 @@ int mme_initialize(void)
/* dumpers /enb-info /ue-info */
ogs_metrics_register_enb_info(mme_dump_enb_info);
ogs_metrics_register_ue_info(mme_dump_ue_info);
ogs_metrics_enb_info_set_pager = mme_metrics_enb_info_set_pager;
ogs_metrics_ue_info_set_pager = mme_metrics_ue_info_set_pager;
rv = mme_fd_init();
if (rv != OGS_OK) return OGS_ERROR;

View File

@@ -88,7 +88,6 @@
#include "ue-info.h"
#include "mme-context.h"
#include "metrics/prometheus/pager.h"
#include "metrics/prometheus/json_pager.h"
#include "metrics/ogs-metrics.h"
#include "sbi/openapi/external/cJSON.h"
@@ -97,20 +96,9 @@
#define MME_UE_INFO_PAGE_SIZE_DEFAULT 100U
#endif
static size_t g_ue_page = SIZE_MAX;
static size_t g_ue_page_size = 0;
void mme_metrics_ue_info_set_pager(size_t page, size_t page_size)
size_t mme_dump_ue_info(char *buf, size_t buflen, size_t page, size_t page_size)
{
g_ue_page = page;
g_ue_page_size = page_size;
}
size_t mme_dump_ue_info(char *buf, size_t buflen)
{
size_t page = g_ue_page;
size_t page_size = g_ue_page_size;
if (page == SIZE_MAX) {
page = 0;
page_size = MME_UE_INFO_PAGE_SIZE_DEFAULT;

View File

@@ -33,9 +33,10 @@ extern "C" {
#define UE_INFO_PAGE_SIZE_DEFAULT 100U
#endif
void mme_metrics_ue_info_set_pager(size_t page, size_t page_size);
size_t mme_dump_ue_info(char *buf, size_t buflen);
size_t mme_dump_ue_info_paged(char *buf, size_t buflen, size_t page, size_t page_size);
size_t mme_dump_ue_info(char *buf, size_t buflen,
size_t page, size_t page_size);
size_t mme_dump_ue_info_paged(char *buf, size_t buflen,
size_t page, size_t page_size);
#ifdef __cplusplus
}

View File

@@ -25,7 +25,6 @@
#include "metrics.h"
#include "ogs-metrics.h"
#include "metrics/prometheus/json_pager.h"
#include "metrics/prometheus/pager.h"
#include "pdu-info.h"
static ogs_thread_t *thread;
@@ -96,7 +95,6 @@ int smf_initialize(void)
/* dumper /pdu-info */
ogs_metrics_register_pdu_info(smf_dump_pdu_info);
smf_register_metrics_pager();
initialized = 1;

View File

@@ -67,23 +67,9 @@
#include "ogs-core.h"
#include "context.h"
#include "pdu-info.h"
#include "metrics/prometheus/pager.h"
#include "sbi/openapi/external/cJSON.h"
#include "metrics/prometheus/json_pager.h"
static size_t g_page = SIZE_MAX;
static size_t g_page_size = 0;
static void smf_metrics_pdu_info_set_pager(size_t page, size_t page_size)
{
g_page = page;
g_page_size = page_size;
}
void smf_register_metrics_pager(void)
{
ogs_metrics_pdu_info_set_pager = smf_metrics_pdu_info_set_pager;
}
static inline uint32_t u24_to_u32(ogs_uint24_t v)
{
@@ -393,11 +379,8 @@ size_t smf_dump_pdu_info_paged(char *buf, size_t buflen, size_t page, size_t pag
return json_pager_finalize(root, buf, buflen);
}
size_t smf_dump_pdu_info(char *buf, size_t buflen)
size_t smf_dump_pdu_info(char *buf, size_t buflen, size_t page, size_t page_size)
{
size_t page = g_page;
size_t page_size = g_page_size;
if (page == SIZE_MAX) {
page = 0;
page_size = PDU_INFO_PAGE_SIZE_DEFAULT;

View File

@@ -34,9 +34,10 @@ extern "C" {
#define PDU_INFO_PAGE_SIZE_DEFAULT 100U
#endif
void smf_register_metrics_pager(void);
size_t smf_dump_pdu_info(char *buf, size_t buflen);
size_t smf_dump_pdu_info_paged(char *buf, size_t buflen, size_t page, size_t page_size);
size_t smf_dump_pdu_info(char *buf, size_t buflen,
size_t page, size_t page_size);
size_t smf_dump_pdu_info_paged(char *buf, size_t buflen,
size_t page, size_t page_size);
#ifdef __cplusplus
}
#endif