open5gs/lib/metrics/context.h
Bostjan Meglic 40351e5a38 [ue-info] consolidate separate function pointers into custom endpoints
Instead of predetermined endpoints in the metrics library, each NF can
now set it's own endpoints on which it listens for requests to dump info
(UE/PDU/gNB/eNB).
2025-10-17 08:30:45 +09:00

137 lines
4.4 KiB
C

/*
* Copyright (C) 2022 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
*
* 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/>.
*/
#if !defined(OGS_METRICS_INSIDE) && !defined(OGS_METRICS_COMPILATION)
#error "This header cannot be included directly."
#endif
#ifndef OGS_METRICS_CONTEXT_H
#define OGS_METRICS_CONTEXT_H
#ifdef __cplusplus
extern "C" {
#endif
typedef struct ogs_metrics_server_s ogs_metrics_server_t;
typedef enum ogs_metrics_metric_type_s {
OGS_METRICS_METRIC_TYPE_COUNTER,
OGS_METRICS_METRIC_TYPE_GAUGE,
OGS_METRICS_METRIC_TYPE_HISTOGRAM,
} ogs_metrics_metric_type_t;
typedef struct ogs_metrics_context_s {
ogs_list_t server_list;
ogs_list_t spec_list;
uint16_t metrics_port;
/* custom endpoints */
ogs_list_t custom_eps;
} ogs_metrics_context_t;
typedef enum ogs_metrics_histogram_bucket_type_s {
OGS_METRICS_HISTOGRAM_BUCKET_TYPE_VARIABLE,
OGS_METRICS_HISTOGRAM_BUCKET_TYPE_LINEAR,
OGS_METRICS_HISTOGRAM_BUCKET_TYPE_EXPONENTIAL,
} ogs_metrics_histogram_bucket_type_t;
typedef struct ogs_metrics_histogram_bucket_params_s {
ogs_metrics_histogram_bucket_type_t type;
unsigned int count;
#define OGS_METRICS_HIST_VAR_BUCKETS_MAX 10
union {
struct {
float start;
float width;
} lin;
struct {
float start;
float factor;
} exp;
struct {
float buckets[OGS_METRICS_HIST_VAR_BUCKETS_MAX];
} var;
};
} ogs_metrics_histogram_params_t;
typedef struct ogs_metrics_context_s ogs_metrics_context_t;
void ogs_metrics_context_init(void);
void ogs_metrics_context_open(ogs_metrics_context_t *ctx);
void ogs_metrics_context_close(ogs_metrics_context_t *ctx);
void ogs_metrics_context_final(void);
ogs_metrics_context_t *ogs_metrics_self(void);
int ogs_metrics_context_parse_config(const char *local);
void ogs_metrics_server_init(ogs_metrics_context_t *ctx);
void ogs_metrics_server_open(ogs_metrics_context_t *ctx);
void ogs_metrics_server_close(ogs_metrics_context_t *ctx);
void ogs_metrics_server_final(ogs_metrics_context_t *ctx);
ogs_metrics_server_t *ogs_metrics_server_add(
ogs_sockaddr_t *addr, ogs_sockopt_t *option);
void ogs_metrics_server_remove(ogs_metrics_server_t *server);
void ogs_metrics_server_remove_all(void);
typedef struct ogs_metrics_spec_s ogs_metrics_spec_t;
void ogs_metrics_spec_init(ogs_metrics_context_t *ctx);
void ogs_metrics_spec_final(ogs_metrics_context_t *ctx);
ogs_metrics_spec_t *ogs_metrics_spec_new(
ogs_metrics_context_t *ctx, ogs_metrics_metric_type_t type,
const char *name, const char *description,
int initial_val, unsigned int num_labels, const char ** labels,
ogs_metrics_histogram_params_t *histogram_params);
void ogs_metrics_spec_free(ogs_metrics_spec_t *spec);
typedef struct ogs_metrics_inst_s ogs_metrics_inst_t;
ogs_metrics_inst_t *ogs_metrics_inst_new(
ogs_metrics_spec_t *spec,
unsigned int num_labels, const char **label_values);
void ogs_metrics_inst_free(ogs_metrics_inst_t *inst);
void ogs_metrics_inst_set(ogs_metrics_inst_t *inst, int val);
void ogs_metrics_inst_reset(ogs_metrics_inst_t *inst);
void ogs_metrics_inst_add(ogs_metrics_inst_t *inst, int val);
static inline void ogs_metrics_inst_inc(ogs_metrics_inst_t *inst)
{
ogs_metrics_inst_add(inst, 1);
}
static inline void ogs_metrics_inst_dec(ogs_metrics_inst_t *inst)
{
ogs_metrics_inst_add(inst, -1);
}
typedef size_t (*ogs_metrics_custom_ep_hdlr_t)(
char *buf, size_t buflen, size_t page, size_t page_size);
typedef struct ogs_metrics_custom_ep_s {
ogs_lnode_t lnode;
char *endpoint;
ogs_metrics_custom_ep_hdlr_t handler;
} ogs_metrics_custom_ep_t;
void ogs_metrics_register_custom_ep(ogs_metrics_custom_ep_hdlr_t handler,
const char *endpoint);
#ifdef __cplusplus
}
#endif
#endif /* OGS_METRICS_CONTEXT_H */