From 37c74da44fc2debe3b2e9f4558b259e5062e3260 Mon Sep 17 00:00:00 2001 From: Bostjan Meglic Date: Mon, 13 Oct 2025 10:12:31 +0200 Subject: [PATCH] [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. --- lib/metrics/context.c | 17 +++++++------- lib/metrics/ogs-metrics.h | 16 +++++++------- lib/metrics/prometheus/context.c | 35 +++++++++-------------------- lib/metrics/prometheus/pager.h | 38 -------------------------------- src/amf/gnb-info.c | 13 ++--------- src/amf/gnb-info.h | 3 +-- src/amf/init.c | 3 --- src/amf/ue-info.c | 14 +++--------- src/amf/ue-info.h | 7 +++--- src/mme/enb-info.c | 14 +++--------- src/mme/enb-info.h | 3 +-- src/mme/mme-init.c | 3 --- src/mme/ue-info.c | 14 +----------- src/mme/ue-info.h | 7 +++--- src/smf/init.c | 2 -- src/smf/pdu-info.c | 19 +--------------- src/smf/pdu-info.h | 7 +++--- 17 files changed, 52 insertions(+), 163 deletions(-) delete mode 100644 lib/metrics/prometheus/pager.h diff --git a/lib/metrics/context.c b/lib/metrics/context.c index fa0399b23..d5d4ca6ef 100644 --- a/lib/metrics/context.c +++ b/lib/metrics/context.c @@ -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; diff --git a/lib/metrics/ogs-metrics.h b/lib/metrics/ogs-metrics.h index d96617c55..71c23f060 100644 --- a/lib/metrics/ogs-metrics.h +++ b/lib/metrics/ogs-metrics.h @@ -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 diff --git a/lib/metrics/prometheus/context.c b/lib/metrics/prometheus/context.c index 59348353b..0c3c53d34 100644 --- a/lib/metrics/prometheus/context.c +++ b/lib/metrics/prometheus/context.c @@ -36,12 +36,7 @@ #include "prom.h" #include "microhttpd.h" #include -#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, "[]"); @@ -308,44 +304,35 @@ mhd_server_access_handler(void *cls, struct MHD_Connection *connection, MHD_destroy_response(rsp); return (_MHD_Result)ret; } + + size_t page = get_query_size_t(connection, "page", 0); + size_t page_size = get_query_size_t(connection, "page_size", 100); /* 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); 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"); } diff --git a/lib/metrics/prometheus/pager.h b/lib/metrics/prometheus/pager.h deleted file mode 100644 index b395c05d6..000000000 --- a/lib/metrics/prometheus/pager.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2025 by Juraj Elias - * - * 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 . - */ - -#ifndef OGS_METRICS_PROM_PAGER_H -#define OGS_METRICS_PROM_PAGER_H - -#include - -/* 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 */ - diff --git a/src/amf/gnb-info.c b/src/amf/gnb-info.c index 28887af46..d4811f2e8 100644 --- a/src/amf/gnb-info.c +++ b/src/amf/gnb-info.c @@ -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) diff --git a/src/amf/gnb-info.h b/src/amf/gnb-info.h index 7bc4c8de4..ef190a1bc 100644 --- a/src/amf/gnb-info.h +++ b/src/amf/gnb-info.h @@ -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 } diff --git a/src/amf/init.c b/src/amf/init.c index ab0783539..7f257a34a 100644 --- a/src/amf/init.c +++ b/src/amf/init.c @@ -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; diff --git a/src/amf/ue-info.c b/src/amf/ue-info.c index 8c877e7ef..d8d5bb11a 100644 --- a/src/amf/ue-info.c +++ b/src/amf/ue-info.c @@ -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); } diff --git a/src/amf/ue-info.h b/src/amf/ue-info.h index 2166ac0ff..8dd4f25f1 100644 --- a/src/amf/ue-info.h +++ b/src/amf/ue-info.h @@ -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 } diff --git a/src/mme/enb-info.c b/src/mme/enb-info.c index a2586c34e..a1125d3f3 100644 --- a/src/mme/enb-info.c +++ b/src/mme/enb-info.c @@ -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); } diff --git a/src/mme/enb-info.h b/src/mme/enb-info.h index 19566e98d..b274ed970 100644 --- a/src/mme/enb-info.h +++ b/src/mme/enb-info.h @@ -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 } diff --git a/src/mme/mme-init.c b/src/mme/mme-init.c index 7a5638b72..4895d43e1 100644 --- a/src/mme/mme-init.c +++ b/src/mme/mme-init.c @@ -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; diff --git a/src/mme/ue-info.c b/src/mme/ue-info.c index 197e5f27a..b5298489c 100644 --- a/src/mme/ue-info.c +++ b/src/mme/ue-info.c @@ -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; diff --git a/src/mme/ue-info.h b/src/mme/ue-info.h index 07bc3e194..2a8be4f0d 100644 --- a/src/mme/ue-info.h +++ b/src/mme/ue-info.h @@ -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 } diff --git a/src/smf/init.c b/src/smf/init.c index df367696f..7eb8caa38 100644 --- a/src/smf/init.c +++ b/src/smf/init.c @@ -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; diff --git a/src/smf/pdu-info.c b/src/smf/pdu-info.c index bf7c6bccc..77d6f05e5 100644 --- a/src/smf/pdu-info.c +++ b/src/smf/pdu-info.c @@ -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; diff --git a/src/smf/pdu-info.h b/src/smf/pdu-info.h index ad8c59fb1..793b93eb2 100644 --- a/src/smf/pdu-info.h +++ b/src/smf/pdu-info.h @@ -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