forked from acouzens/open5gs
Release v2.6.1
This commit is contained in:
parent
cb7c8a7854
commit
66b2f6120e
|
@ -1,32 +1,8 @@
|
||||||
open5gs (2.6.0) unstable; urgency=medium
|
open5gs (2.6.1) unstable; urgency=medium
|
||||||
|
|
||||||
* Upgrade to Release-17
|
* Upgrade to Release-17
|
||||||
|
|
||||||
-- Sukchan Lee <acetcom@gmail.com> Mon, 06 Mar 2023 22:29:58 +0900
|
-- Sukchan Lee <acetcom@gmail.com> Wed, 08 Mar 2023 22:48:13 +0900
|
||||||
|
|
||||||
open5gs (2.6.0~kinetic) kinetic; urgency=medium
|
|
||||||
|
|
||||||
* Upgrade to Release-17
|
|
||||||
|
|
||||||
-- Sukchan Lee <acetcom@gmail.com> Mon, 06 Mar 2023 22:27:13 +0900
|
|
||||||
|
|
||||||
open5gs (2.6.0~jammy) jammy; urgency=medium
|
|
||||||
|
|
||||||
* Upgrade to Release-17
|
|
||||||
|
|
||||||
-- Sukchan Lee <acetcom@gmail.com> Mon, 06 Mar 2023 22:25:36 +0900
|
|
||||||
|
|
||||||
open5gs (2.6.0~focal) focal; urgency=medium
|
|
||||||
|
|
||||||
* Upgrade to Release-17
|
|
||||||
|
|
||||||
-- Sukchan Lee <acetcom@gmail.com> Mon, 06 Mar 2023 22:23:38 +0900
|
|
||||||
|
|
||||||
open5gs (2.6.0~bionic) bionic; urgency=medium
|
|
||||||
|
|
||||||
* Upgrade to Release-17
|
|
||||||
|
|
||||||
-- Sukchan Lee <acetcom@gmail.com> Mon, 06 Mar 2023 22:20:05 +0900
|
|
||||||
|
|
||||||
open5gs (2.5.6) unstable; urgency=medium
|
open5gs (2.5.6) unstable; urgency=medium
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
usr/lib/*/libogs*.so*
|
usr/lib/*/libogs*.so*
|
||||||
usr/lib/*/libfd*.so*
|
usr/lib/*/libfd*.so*
|
||||||
usr/lib/*/freeDiameter/*.fdx
|
usr/lib/*/freeDiameter/*.fdx
|
||||||
|
usr/lib/*/lib*prom*.so*
|
||||||
configs/open5gs/tls/ca.crt /etc/open5gs/tls
|
configs/open5gs/tls/ca.crt /etc/open5gs/tls
|
||||||
configs/logrotate/open5gs /etc/logrotate.d
|
configs/logrotate/open5gs /etc/logrotate.d
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
title: "v2.6.0 - Upgrade to Release-17"
|
title: "v2.6.1 - Upgrade to Release-17"
|
||||||
date: 2023-03-06 22:31:00 +0900
|
date: 2023-03-08 22:47:00 +0900
|
||||||
categories:
|
categories:
|
||||||
- Release
|
- Release
|
||||||
tags:
|
tags:
|
||||||
|
@ -17,7 +17,7 @@ head_inline: "<style> ul { padding-bottom: 1em; } .blue { color: blue; }</style>
|
||||||
- UPF High Availability (#2048)
|
- UPF High Availability (#2048)
|
||||||
- 5G SUCI Profile A/B Scheme (#1443)
|
- 5G SUCI Profile A/B Scheme (#1443)
|
||||||
|
|
||||||
See also [Release Note](https://github.com/open5gs/open5gs/releases/tag/v2.6.0)
|
See also [Release Note](https://github.com/open5gs/open5gs/releases/tag/v2.6.1)
|
||||||
|
|
||||||
Download -- [v2.6.0.tar.gz](https://github.com/open5gs/open5gs/archive/v2.6.0.tar.gz)
|
Download -- [v2.6.1.tar.gz](https://github.com/open5gs/open5gs/archive/v2.6.1.tar.gz)
|
||||||
{: .notice--info}
|
{: .notice--info}
|
|
@ -10,7 +10,7 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
PACKAGE="open5gs"
|
PACKAGE="open5gs"
|
||||||
VERSION="2.6.0"
|
VERSION="2.6.1"
|
||||||
|
|
||||||
print_status() {
|
print_status() {
|
||||||
echo
|
echo
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
|
* Copyright (C) 2022 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
|
||||||
|
* Copyright (C) 2023 by Sukchan Lee <acetcom@gmail.com>
|
||||||
*
|
*
|
||||||
* This file is part of Open5GS.
|
* This file is part of Open5GS.
|
||||||
*
|
*
|
||||||
|
@ -19,4 +20,239 @@
|
||||||
|
|
||||||
#include "ogs-metrics.h"
|
#include "ogs-metrics.h"
|
||||||
|
|
||||||
|
#define DEFAULT_PROMETHEUS_HTTP_PORT 9090
|
||||||
|
|
||||||
int __ogs_metrics_domain;
|
int __ogs_metrics_domain;
|
||||||
|
static ogs_metrics_context_t self;
|
||||||
|
static int context_initialized = 0;
|
||||||
|
|
||||||
|
void ogs_metrics_context_init(void)
|
||||||
|
{
|
||||||
|
ogs_assert(context_initialized == 0);
|
||||||
|
|
||||||
|
ogs_log_install_domain(&__ogs_metrics_domain, "metrics", ogs_core()->log.level);
|
||||||
|
|
||||||
|
/* Initialize METRICS context */
|
||||||
|
memset(&self, 0, sizeof(ogs_metrics_context_t));
|
||||||
|
|
||||||
|
ogs_metrics_spec_init(ogs_metrics_self());
|
||||||
|
ogs_metrics_server_init(ogs_metrics_self());
|
||||||
|
|
||||||
|
context_initialized = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ogs_metrics_context_open(ogs_metrics_context_t *ctx)
|
||||||
|
{
|
||||||
|
ogs_metrics_server_open(ctx);
|
||||||
|
}
|
||||||
|
void ogs_metrics_context_close(ogs_metrics_context_t *ctx)
|
||||||
|
{
|
||||||
|
ogs_metrics_server_close(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ogs_metrics_context_final(void)
|
||||||
|
{
|
||||||
|
ogs_assert(context_initialized == 1);
|
||||||
|
|
||||||
|
ogs_metrics_spec_final(ogs_metrics_self());
|
||||||
|
ogs_metrics_server_final(ogs_metrics_self());
|
||||||
|
|
||||||
|
context_initialized = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ogs_metrics_context_t *ogs_metrics_self(void)
|
||||||
|
{
|
||||||
|
return &self;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ogs_metrics_context_prepare(void)
|
||||||
|
{
|
||||||
|
self.metrics_port = DEFAULT_PROMETHEUS_HTTP_PORT;
|
||||||
|
|
||||||
|
return OGS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ogs_metrics_context_parse_config(const char *local)
|
||||||
|
{
|
||||||
|
int rv;
|
||||||
|
yaml_document_t *document = NULL;
|
||||||
|
ogs_yaml_iter_t root_iter;
|
||||||
|
|
||||||
|
document = ogs_app()->document;
|
||||||
|
ogs_assert(document);
|
||||||
|
|
||||||
|
rv = ogs_metrics_context_prepare();
|
||||||
|
if (rv != OGS_OK) return rv;
|
||||||
|
|
||||||
|
ogs_yaml_iter_init(&root_iter, document);
|
||||||
|
while (ogs_yaml_iter_next(&root_iter)) {
|
||||||
|
const char *root_key = ogs_yaml_iter_key(&root_iter);
|
||||||
|
ogs_assert(root_key);
|
||||||
|
if (local && !strcmp(root_key, local)) {
|
||||||
|
ogs_yaml_iter_t local_iter;
|
||||||
|
ogs_yaml_iter_recurse(&root_iter, &local_iter);
|
||||||
|
while (ogs_yaml_iter_next(&local_iter)) {
|
||||||
|
const char *local_key = ogs_yaml_iter_key(&local_iter);
|
||||||
|
ogs_assert(local_key);
|
||||||
|
if (!strcmp(local_key, "metrics")) {
|
||||||
|
ogs_list_t list, list6;
|
||||||
|
ogs_socknode_t *node = NULL, *node6 = NULL;
|
||||||
|
|
||||||
|
ogs_yaml_iter_t metrics_array, metrics_iter;
|
||||||
|
ogs_yaml_iter_recurse(&local_iter, &metrics_array);
|
||||||
|
do {
|
||||||
|
int i, family = AF_UNSPEC;
|
||||||
|
int num = 0;
|
||||||
|
const char *hostname[OGS_MAX_NUM_OF_HOSTNAME];
|
||||||
|
|
||||||
|
uint16_t port = self.metrics_port;
|
||||||
|
const char *dev = NULL;
|
||||||
|
ogs_sockaddr_t *addr = NULL;
|
||||||
|
|
||||||
|
ogs_sockopt_t option;
|
||||||
|
bool is_option = false;
|
||||||
|
|
||||||
|
if (ogs_yaml_iter_type(&metrics_array) ==
|
||||||
|
YAML_MAPPING_NODE) {
|
||||||
|
memcpy(&metrics_iter, &metrics_array,
|
||||||
|
sizeof(ogs_yaml_iter_t));
|
||||||
|
} else if (ogs_yaml_iter_type(&metrics_array) ==
|
||||||
|
YAML_SEQUENCE_NODE) {
|
||||||
|
if (!ogs_yaml_iter_next(&metrics_array))
|
||||||
|
break;
|
||||||
|
ogs_yaml_iter_recurse(
|
||||||
|
&metrics_array, &metrics_iter);
|
||||||
|
} else if (ogs_yaml_iter_type(&metrics_array) ==
|
||||||
|
YAML_SCALAR_NODE) {
|
||||||
|
break;
|
||||||
|
} else
|
||||||
|
ogs_assert_if_reached();
|
||||||
|
|
||||||
|
while (ogs_yaml_iter_next(&metrics_iter)) {
|
||||||
|
const char *metrics_key =
|
||||||
|
ogs_yaml_iter_key(&metrics_iter);
|
||||||
|
ogs_assert(metrics_key);
|
||||||
|
if (!strcmp(metrics_key, "family")) {
|
||||||
|
const char *v = ogs_yaml_iter_value(
|
||||||
|
&metrics_iter);
|
||||||
|
if (v) family = atoi(v);
|
||||||
|
if (family != AF_UNSPEC &&
|
||||||
|
family != AF_INET && family != AF_INET6) {
|
||||||
|
ogs_warn("Ignore family(%d) : "
|
||||||
|
"AF_UNSPEC(%d), "
|
||||||
|
"AF_INET(%d), AF_INET6(%d) ",
|
||||||
|
family, AF_UNSPEC, AF_INET, AF_INET6);
|
||||||
|
family = AF_UNSPEC;
|
||||||
|
}
|
||||||
|
} else if (!strcmp(metrics_key, "addr") ||
|
||||||
|
!strcmp(metrics_key, "name")) {
|
||||||
|
ogs_yaml_iter_t hostname_iter;
|
||||||
|
ogs_yaml_iter_recurse(&metrics_iter,
|
||||||
|
&hostname_iter);
|
||||||
|
ogs_assert(ogs_yaml_iter_type(&hostname_iter) !=
|
||||||
|
YAML_MAPPING_NODE);
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (ogs_yaml_iter_type(&hostname_iter) ==
|
||||||
|
YAML_SEQUENCE_NODE) {
|
||||||
|
if (!ogs_yaml_iter_next(
|
||||||
|
&hostname_iter))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ogs_assert(num < OGS_MAX_NUM_OF_HOSTNAME);
|
||||||
|
hostname[num++] =
|
||||||
|
ogs_yaml_iter_value(&hostname_iter);
|
||||||
|
} while (
|
||||||
|
ogs_yaml_iter_type(&hostname_iter) ==
|
||||||
|
YAML_SEQUENCE_NODE);
|
||||||
|
} else if (!strcmp(metrics_key, "port")) {
|
||||||
|
const char *v = ogs_yaml_iter_value(
|
||||||
|
&metrics_iter);
|
||||||
|
if (v)
|
||||||
|
port = atoi(v);
|
||||||
|
} else if (!strcmp(metrics_key, "dev")) {
|
||||||
|
dev = ogs_yaml_iter_value(&metrics_iter);
|
||||||
|
} else if (!strcmp(metrics_key, "option")) {
|
||||||
|
rv = ogs_app_config_parse_sockopt(
|
||||||
|
&metrics_iter, &option);
|
||||||
|
if (rv != OGS_OK) return rv;
|
||||||
|
is_option = true;
|
||||||
|
} else
|
||||||
|
ogs_warn("unknown key `%s`", metrics_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
addr = NULL;
|
||||||
|
for (i = 0; i < num; i++) {
|
||||||
|
rv = ogs_addaddrinfo(&addr,
|
||||||
|
family, hostname[i], port, 0);
|
||||||
|
ogs_assert(rv == OGS_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
ogs_list_init(&list);
|
||||||
|
ogs_list_init(&list6);
|
||||||
|
|
||||||
|
if (addr) {
|
||||||
|
if (ogs_app()->parameter.no_ipv4 == 0)
|
||||||
|
ogs_socknode_add(
|
||||||
|
&list, AF_INET, addr, NULL);
|
||||||
|
if (ogs_app()->parameter.no_ipv6 == 0)
|
||||||
|
ogs_socknode_add(
|
||||||
|
&list6, AF_INET6, addr, NULL);
|
||||||
|
ogs_freeaddrinfo(addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dev) {
|
||||||
|
rv = ogs_socknode_probe(
|
||||||
|
ogs_app()->parameter.no_ipv4 ? NULL : &list,
|
||||||
|
ogs_app()->parameter.no_ipv6 ? NULL : &list6,
|
||||||
|
dev, port, NULL);
|
||||||
|
ogs_assert(rv == OGS_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
node = ogs_list_first(&list);
|
||||||
|
if (node) {
|
||||||
|
ogs_metrics_server_t *server =
|
||||||
|
ogs_metrics_server_add(
|
||||||
|
node->addr, is_option ? &option : NULL);
|
||||||
|
ogs_assert(server);
|
||||||
|
}
|
||||||
|
node6 = ogs_list_first(&list6);
|
||||||
|
if (node6) {
|
||||||
|
ogs_metrics_server_t *server =
|
||||||
|
ogs_metrics_server_add(
|
||||||
|
node6->addr, is_option ? &option : NULL);
|
||||||
|
ogs_assert(server);
|
||||||
|
}
|
||||||
|
|
||||||
|
ogs_socknode_remove_all(&list);
|
||||||
|
ogs_socknode_remove_all(&list6);
|
||||||
|
|
||||||
|
} while (ogs_yaml_iter_type(&metrics_array) ==
|
||||||
|
YAML_SEQUENCE_NODE);
|
||||||
|
|
||||||
|
if (ogs_list_first(&self.server_list) == 0) {
|
||||||
|
ogs_list_init(&list);
|
||||||
|
ogs_list_init(&list6);
|
||||||
|
|
||||||
|
rv = ogs_socknode_probe(
|
||||||
|
ogs_app()->parameter.no_ipv4 ? NULL : &list,
|
||||||
|
ogs_app()->parameter.no_ipv6 ? NULL : &list6,
|
||||||
|
NULL, self.metrics_port, NULL);
|
||||||
|
ogs_assert(rv == OGS_OK);
|
||||||
|
|
||||||
|
node = ogs_list_first(&list);
|
||||||
|
if (node) ogs_metrics_server_add(node->addr, NULL);
|
||||||
|
node6 = ogs_list_first(&list6);
|
||||||
|
if (node6) ogs_metrics_server_add(node6->addr, NULL);
|
||||||
|
|
||||||
|
ogs_socknode_remove_all(&list);
|
||||||
|
ogs_socknode_remove_all(&list6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return OGS_OK;
|
||||||
|
}
|
||||||
|
|
|
@ -35,6 +35,13 @@ typedef enum ogs_metrics_metric_type_s {
|
||||||
OGS_METRICS_METRIC_TYPE_GAUGE,
|
OGS_METRICS_METRIC_TYPE_GAUGE,
|
||||||
} ogs_metrics_metric_type_t;
|
} 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;
|
||||||
|
} ogs_metrics_context_t;
|
||||||
|
|
||||||
typedef struct ogs_metrics_context_s ogs_metrics_context_t;
|
typedef struct ogs_metrics_context_s ogs_metrics_context_t;
|
||||||
void ogs_metrics_context_init(void);
|
void ogs_metrics_context_init(void);
|
||||||
void ogs_metrics_context_open(ogs_metrics_context_t *ctx);
|
void ogs_metrics_context_open(ogs_metrics_context_t *ctx);
|
||||||
|
@ -43,12 +50,18 @@ void ogs_metrics_context_final(void);
|
||||||
ogs_metrics_context_t *ogs_metrics_self(void);
|
ogs_metrics_context_t *ogs_metrics_self(void);
|
||||||
int ogs_metrics_context_parse_config(const char *local);
|
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_metrics_server_t *ogs_metrics_server_add(
|
||||||
ogs_sockaddr_t *addr, ogs_sockopt_t *option);
|
ogs_sockaddr_t *addr, ogs_sockopt_t *option);
|
||||||
void ogs_metrics_server_remove(ogs_metrics_server_t *server);
|
void ogs_metrics_server_remove(ogs_metrics_server_t *server);
|
||||||
void ogs_metrics_server_remove_all(void);
|
void ogs_metrics_server_remove_all(void);
|
||||||
|
|
||||||
typedef struct ogs_metrics_spec_s ogs_metrics_spec_t;
|
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_spec_t *ogs_metrics_spec_new(
|
||||||
ogs_metrics_context_t *ctx, ogs_metrics_metric_type_t type,
|
ogs_metrics_context_t *ctx, ogs_metrics_metric_type_t type,
|
||||||
const char *name, const char *description,
|
const char *name, const char *description,
|
||||||
|
|
|
@ -71,7 +71,25 @@ if meson.version().version_compare('>=0.51.0')
|
||||||
libmetrics_dependencies = libmetrics_dependencies + [libprom_dep, libmicrohttpd_dep]
|
libmetrics_dependencies = libmetrics_dependencies + [libprom_dep, libmicrohttpd_dep]
|
||||||
libmetrics_file_list = libmetrics_file_list + ' prometheus/context.c'
|
libmetrics_file_list = libmetrics_file_list + ' prometheus/context.c'
|
||||||
else
|
else
|
||||||
libmetrics_file_list = libmetrics_file_list + ' void/context.c'
|
libprom_sources = files('''
|
||||||
|
void/context.c
|
||||||
|
'''.split())
|
||||||
|
|
||||||
|
libprom_inc = include_directories('.')
|
||||||
|
|
||||||
|
libprom = library('void_prom',
|
||||||
|
sources : libprom_sources,
|
||||||
|
version : libogslib_version,
|
||||||
|
include_directories : [libprom_inc, libinc],
|
||||||
|
dependencies : libapp_dep,
|
||||||
|
install : true)
|
||||||
|
|
||||||
|
libprom_dep = declare_dependency(
|
||||||
|
link_with : libprom,
|
||||||
|
include_directories : [libprom_inc, libinc],
|
||||||
|
dependencies : libapp_dep)
|
||||||
|
|
||||||
|
libmetrics_dependencies = libmetrics_dependencies + [libprom_dep]
|
||||||
endif
|
endif
|
||||||
|
|
||||||
libmetrics_sources = files(libmetrics_file_list.split())
|
libmetrics_sources = files(libmetrics_file_list.split())
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
|
* Copyright (C) 2022 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
|
||||||
|
* Copyright (C) 2023 by Sukchan Lee <acetcom@gmail.com>
|
||||||
*
|
*
|
||||||
* This file is part of Open5GS.
|
* This file is part of Open5GS.
|
||||||
*
|
*
|
||||||
|
@ -23,16 +24,8 @@
|
||||||
#include "prom.h"
|
#include "prom.h"
|
||||||
#include "microhttpd.h"
|
#include "microhttpd.h"
|
||||||
|
|
||||||
#define DEFAULT_PROMETHEUS_HTTP_PORT 9090
|
|
||||||
#define MAX_LABELS 8
|
#define MAX_LABELS 8
|
||||||
|
|
||||||
typedef struct ogs_metrics_context_s {
|
|
||||||
ogs_list_t server_list;
|
|
||||||
ogs_list_t spec_list;
|
|
||||||
|
|
||||||
uint16_t metrics_port;
|
|
||||||
} ogs_metrics_context_t;
|
|
||||||
|
|
||||||
typedef struct ogs_metrics_server_s {
|
typedef struct ogs_metrics_server_s {
|
||||||
ogs_socknode_t node;
|
ogs_socknode_t node;
|
||||||
struct MHD_Daemon *mhd;
|
struct MHD_Daemon *mhd;
|
||||||
|
@ -58,243 +51,39 @@ typedef struct ogs_metrics_inst_s {
|
||||||
char *label_values[MAX_LABELS];
|
char *label_values[MAX_LABELS];
|
||||||
} ogs_metrics_inst_t;
|
} ogs_metrics_inst_t;
|
||||||
|
|
||||||
static ogs_metrics_context_t self;
|
|
||||||
static int context_initialized = 0;
|
|
||||||
static OGS_POOL(metrics_spec_pool, ogs_metrics_spec_t);
|
static OGS_POOL(metrics_spec_pool, ogs_metrics_spec_t);
|
||||||
static OGS_POOL(metrics_server_pool, ogs_metrics_server_t);
|
static OGS_POOL(metrics_server_pool, ogs_metrics_server_t);
|
||||||
|
|
||||||
void ogs_metrics_context_init(void)
|
static int ogs_metrics_context_server_start(ogs_metrics_server_t *server);
|
||||||
|
static int ogs_metrics_context_server_stop(ogs_metrics_server_t *server);
|
||||||
|
|
||||||
|
void ogs_metrics_server_init(ogs_metrics_context_t *ctx)
|
||||||
{
|
{
|
||||||
ogs_assert(context_initialized == 0);
|
ogs_list_init(&ctx->server_list);
|
||||||
|
|
||||||
ogs_log_install_domain(&__ogs_metrics_domain, "metrics", ogs_core()->log.level);
|
|
||||||
|
|
||||||
ogs_pool_init(&metrics_spec_pool, ogs_app()->metrics.max_specs);
|
|
||||||
|
|
||||||
/* Initialize METRICS context */
|
|
||||||
memset(&self, 0, sizeof(ogs_metrics_context_t));
|
|
||||||
ogs_list_init(&self.spec_list);
|
|
||||||
prom_collector_registry_default_init();
|
|
||||||
|
|
||||||
ogs_list_init(&self.server_list);
|
|
||||||
ogs_pool_init(&metrics_server_pool, ogs_app()->pool.nf);
|
ogs_pool_init(&metrics_server_pool, ogs_app()->pool.nf);
|
||||||
|
|
||||||
context_initialized = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ogs_metrics_context_final(void)
|
void ogs_metrics_server_open(ogs_metrics_context_t *ctx)
|
||||||
{
|
{
|
||||||
ogs_metrics_spec_t *spec = NULL, *next = NULL;
|
ogs_metrics_server_t *server = NULL;
|
||||||
ogs_assert(context_initialized == 1);
|
|
||||||
|
|
||||||
ogs_list_for_each_entry_safe(&self.spec_list, next, spec, entry) {
|
ogs_list_for_each(&ctx->server_list, server)
|
||||||
ogs_metrics_spec_free(spec);
|
ogs_metrics_context_server_start(server);
|
||||||
}
|
}
|
||||||
prom_collector_registry_destroy(PROM_COLLECTOR_REGISTRY_DEFAULT);
|
|
||||||
|
|
||||||
|
void ogs_metrics_server_close(ogs_metrics_context_t *ctx)
|
||||||
|
{
|
||||||
|
ogs_metrics_server_t *server = NULL, *next = NULL;
|
||||||
|
|
||||||
|
ogs_list_for_each_safe(&ctx->server_list, next, server)
|
||||||
|
ogs_metrics_context_server_stop(server);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ogs_metrics_server_final(ogs_metrics_context_t *ctx)
|
||||||
|
{
|
||||||
ogs_metrics_server_remove_all();
|
ogs_metrics_server_remove_all();
|
||||||
|
|
||||||
ogs_pool_final(&metrics_spec_pool);
|
|
||||||
ogs_pool_final(&metrics_server_pool);
|
ogs_pool_final(&metrics_server_pool);
|
||||||
|
|
||||||
context_initialized = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ogs_metrics_context_t *ogs_metrics_self(void)
|
|
||||||
{
|
|
||||||
return &self;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ogs_metrics_context_prepare(void)
|
|
||||||
{
|
|
||||||
self.metrics_port = DEFAULT_PROMETHEUS_HTTP_PORT;
|
|
||||||
|
|
||||||
return OGS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ogs_metrics_context_parse_config(const char *local)
|
|
||||||
{
|
|
||||||
int rv;
|
|
||||||
yaml_document_t *document = NULL;
|
|
||||||
ogs_yaml_iter_t root_iter;
|
|
||||||
|
|
||||||
document = ogs_app()->document;
|
|
||||||
ogs_assert(document);
|
|
||||||
|
|
||||||
rv = ogs_metrics_context_prepare();
|
|
||||||
if (rv != OGS_OK) return rv;
|
|
||||||
|
|
||||||
ogs_yaml_iter_init(&root_iter, document);
|
|
||||||
while (ogs_yaml_iter_next(&root_iter)) {
|
|
||||||
const char *root_key = ogs_yaml_iter_key(&root_iter);
|
|
||||||
ogs_assert(root_key);
|
|
||||||
if (local && !strcmp(root_key, local)) {
|
|
||||||
ogs_yaml_iter_t local_iter;
|
|
||||||
ogs_yaml_iter_recurse(&root_iter, &local_iter);
|
|
||||||
while (ogs_yaml_iter_next(&local_iter)) {
|
|
||||||
const char *local_key = ogs_yaml_iter_key(&local_iter);
|
|
||||||
ogs_assert(local_key);
|
|
||||||
if (!strcmp(local_key, "metrics")) {
|
|
||||||
ogs_list_t list, list6;
|
|
||||||
ogs_socknode_t *node = NULL, *node6 = NULL;
|
|
||||||
|
|
||||||
ogs_yaml_iter_t metrics_array, metrics_iter;
|
|
||||||
ogs_yaml_iter_recurse(&local_iter, &metrics_array);
|
|
||||||
do {
|
|
||||||
int i, family = AF_UNSPEC;
|
|
||||||
int num = 0;
|
|
||||||
const char *hostname[OGS_MAX_NUM_OF_HOSTNAME];
|
|
||||||
|
|
||||||
uint16_t port = self.metrics_port;
|
|
||||||
const char *dev = NULL;
|
|
||||||
ogs_sockaddr_t *addr = NULL;
|
|
||||||
|
|
||||||
ogs_sockopt_t option;
|
|
||||||
bool is_option = false;
|
|
||||||
|
|
||||||
if (ogs_yaml_iter_type(&metrics_array) ==
|
|
||||||
YAML_MAPPING_NODE) {
|
|
||||||
memcpy(&metrics_iter, &metrics_array,
|
|
||||||
sizeof(ogs_yaml_iter_t));
|
|
||||||
} else if (ogs_yaml_iter_type(&metrics_array) ==
|
|
||||||
YAML_SEQUENCE_NODE) {
|
|
||||||
if (!ogs_yaml_iter_next(&metrics_array))
|
|
||||||
break;
|
|
||||||
ogs_yaml_iter_recurse(
|
|
||||||
&metrics_array, &metrics_iter);
|
|
||||||
} else if (ogs_yaml_iter_type(&metrics_array) ==
|
|
||||||
YAML_SCALAR_NODE) {
|
|
||||||
break;
|
|
||||||
} else
|
|
||||||
ogs_assert_if_reached();
|
|
||||||
|
|
||||||
while (ogs_yaml_iter_next(&metrics_iter)) {
|
|
||||||
const char *metrics_key =
|
|
||||||
ogs_yaml_iter_key(&metrics_iter);
|
|
||||||
ogs_assert(metrics_key);
|
|
||||||
if (!strcmp(metrics_key, "family")) {
|
|
||||||
const char *v = ogs_yaml_iter_value(
|
|
||||||
&metrics_iter);
|
|
||||||
if (v) family = atoi(v);
|
|
||||||
if (family != AF_UNSPEC &&
|
|
||||||
family != AF_INET && family != AF_INET6) {
|
|
||||||
ogs_warn("Ignore family(%d) : "
|
|
||||||
"AF_UNSPEC(%d), "
|
|
||||||
"AF_INET(%d), AF_INET6(%d) ",
|
|
||||||
family, AF_UNSPEC, AF_INET, AF_INET6);
|
|
||||||
family = AF_UNSPEC;
|
|
||||||
}
|
|
||||||
} else if (!strcmp(metrics_key, "addr") ||
|
|
||||||
!strcmp(metrics_key, "name")) {
|
|
||||||
ogs_yaml_iter_t hostname_iter;
|
|
||||||
ogs_yaml_iter_recurse(&metrics_iter,
|
|
||||||
&hostname_iter);
|
|
||||||
ogs_assert(ogs_yaml_iter_type(&hostname_iter) !=
|
|
||||||
YAML_MAPPING_NODE);
|
|
||||||
|
|
||||||
do {
|
|
||||||
if (ogs_yaml_iter_type(&hostname_iter) ==
|
|
||||||
YAML_SEQUENCE_NODE) {
|
|
||||||
if (!ogs_yaml_iter_next(
|
|
||||||
&hostname_iter))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
ogs_assert(num < OGS_MAX_NUM_OF_HOSTNAME);
|
|
||||||
hostname[num++] =
|
|
||||||
ogs_yaml_iter_value(&hostname_iter);
|
|
||||||
} while (
|
|
||||||
ogs_yaml_iter_type(&hostname_iter) ==
|
|
||||||
YAML_SEQUENCE_NODE);
|
|
||||||
} else if (!strcmp(metrics_key, "port")) {
|
|
||||||
const char *v = ogs_yaml_iter_value(
|
|
||||||
&metrics_iter);
|
|
||||||
if (v)
|
|
||||||
port = atoi(v);
|
|
||||||
} else if (!strcmp(metrics_key, "dev")) {
|
|
||||||
dev = ogs_yaml_iter_value(&metrics_iter);
|
|
||||||
} else if (!strcmp(metrics_key, "option")) {
|
|
||||||
rv = ogs_app_config_parse_sockopt(
|
|
||||||
&metrics_iter, &option);
|
|
||||||
if (rv != OGS_OK) return rv;
|
|
||||||
is_option = true;
|
|
||||||
} else
|
|
||||||
ogs_warn("unknown key `%s`", metrics_key);
|
|
||||||
}
|
|
||||||
|
|
||||||
addr = NULL;
|
|
||||||
for (i = 0; i < num; i++) {
|
|
||||||
rv = ogs_addaddrinfo(&addr,
|
|
||||||
family, hostname[i], port, 0);
|
|
||||||
ogs_assert(rv == OGS_OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
ogs_list_init(&list);
|
|
||||||
ogs_list_init(&list6);
|
|
||||||
|
|
||||||
if (addr) {
|
|
||||||
if (ogs_app()->parameter.no_ipv4 == 0)
|
|
||||||
ogs_socknode_add(
|
|
||||||
&list, AF_INET, addr, NULL);
|
|
||||||
if (ogs_app()->parameter.no_ipv6 == 0)
|
|
||||||
ogs_socknode_add(
|
|
||||||
&list6, AF_INET6, addr, NULL);
|
|
||||||
ogs_freeaddrinfo(addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dev) {
|
|
||||||
rv = ogs_socknode_probe(
|
|
||||||
ogs_app()->parameter.no_ipv4 ? NULL : &list,
|
|
||||||
ogs_app()->parameter.no_ipv6 ? NULL : &list6,
|
|
||||||
dev, port, NULL);
|
|
||||||
ogs_assert(rv == OGS_OK);
|
|
||||||
}
|
|
||||||
|
|
||||||
node = ogs_list_first(&list);
|
|
||||||
if (node) {
|
|
||||||
ogs_metrics_server_t *server =
|
|
||||||
ogs_metrics_server_add(
|
|
||||||
node->addr, is_option ? &option : NULL);
|
|
||||||
ogs_assert(server);
|
|
||||||
}
|
|
||||||
node6 = ogs_list_first(&list6);
|
|
||||||
if (node6) {
|
|
||||||
ogs_metrics_server_t *server =
|
|
||||||
ogs_metrics_server_add(
|
|
||||||
node6->addr, is_option ? &option : NULL);
|
|
||||||
ogs_assert(server);
|
|
||||||
}
|
|
||||||
|
|
||||||
ogs_socknode_remove_all(&list);
|
|
||||||
ogs_socknode_remove_all(&list6);
|
|
||||||
|
|
||||||
} while (ogs_yaml_iter_type(&metrics_array) ==
|
|
||||||
YAML_SEQUENCE_NODE);
|
|
||||||
|
|
||||||
if (ogs_list_first(&self.server_list) == 0) {
|
|
||||||
ogs_list_init(&list);
|
|
||||||
ogs_list_init(&list6);
|
|
||||||
|
|
||||||
rv = ogs_socknode_probe(
|
|
||||||
ogs_app()->parameter.no_ipv4 ? NULL : &list,
|
|
||||||
ogs_app()->parameter.no_ipv6 ? NULL : &list6,
|
|
||||||
NULL, self.metrics_port, NULL);
|
|
||||||
ogs_assert(rv == OGS_OK);
|
|
||||||
|
|
||||||
node = ogs_list_first(&list);
|
|
||||||
if (node) ogs_metrics_server_add(node->addr, NULL);
|
|
||||||
node6 = ogs_list_first(&list6);
|
|
||||||
if (node6) ogs_metrics_server_add(node6->addr, NULL);
|
|
||||||
|
|
||||||
ogs_socknode_remove_all(&list);
|
|
||||||
ogs_socknode_remove_all(&list6);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return OGS_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ogs_metrics_server_t *ogs_metrics_server_add(
|
ogs_metrics_server_t *ogs_metrics_server_add(
|
||||||
|
@ -512,13 +301,6 @@ static int ogs_metrics_context_server_start(ogs_metrics_server_t *server)
|
||||||
|
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
void ogs_metrics_context_open(ogs_metrics_context_t *ctx)
|
|
||||||
{
|
|
||||||
ogs_metrics_server_t *server = NULL;
|
|
||||||
|
|
||||||
ogs_list_for_each(&ctx->server_list, server)
|
|
||||||
ogs_metrics_context_server_start(server);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ogs_metrics_context_server_stop(ogs_metrics_server_t *server)
|
static int ogs_metrics_context_server_stop(ogs_metrics_server_t *server)
|
||||||
{
|
{
|
||||||
|
@ -533,12 +315,25 @@ static int ogs_metrics_context_server_stop(ogs_metrics_server_t *server)
|
||||||
}
|
}
|
||||||
return OGS_OK;
|
return OGS_OK;
|
||||||
}
|
}
|
||||||
void ogs_metrics_context_close(ogs_metrics_context_t *ctx)
|
|
||||||
{
|
|
||||||
ogs_metrics_server_t *server = NULL, *next = NULL;
|
|
||||||
|
|
||||||
ogs_list_for_each_safe(&ctx->server_list, next, server)
|
void ogs_metrics_spec_init(ogs_metrics_context_t *ctx)
|
||||||
ogs_metrics_context_server_stop(server);
|
{
|
||||||
|
ogs_list_init(&ctx->spec_list);
|
||||||
|
ogs_pool_init(&metrics_spec_pool, ogs_app()->metrics.max_specs);
|
||||||
|
|
||||||
|
prom_collector_registry_default_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ogs_metrics_spec_final(ogs_metrics_context_t *ctx)
|
||||||
|
{
|
||||||
|
ogs_metrics_spec_t *spec = NULL, *next = NULL;
|
||||||
|
|
||||||
|
ogs_list_for_each_entry_safe(&ctx->spec_list, next, spec, entry) {
|
||||||
|
ogs_metrics_spec_free(spec);
|
||||||
|
}
|
||||||
|
prom_collector_registry_destroy(PROM_COLLECTOR_REGISTRY_DEFAULT);
|
||||||
|
|
||||||
|
ogs_pool_final(&metrics_spec_pool);
|
||||||
}
|
}
|
||||||
|
|
||||||
ogs_metrics_spec_t *ogs_metrics_spec_new(
|
ogs_metrics_spec_t *ogs_metrics_spec_new(
|
||||||
|
|
|
@ -19,9 +19,9 @@
|
||||||
|
|
||||||
#include "ogs-metrics.h"
|
#include "ogs-metrics.h"
|
||||||
|
|
||||||
typedef struct ogs_metrics_context_s {
|
typedef struct ogs_metrics_server_s {
|
||||||
int unused;
|
int unused;
|
||||||
} ogs_metrics_context_t;
|
} ogs_metrics_server_t;
|
||||||
typedef struct ogs_metrics_spec_s {
|
typedef struct ogs_metrics_spec_s {
|
||||||
int unused;
|
int unused;
|
||||||
} ogs_metrics_spec_t;
|
} ogs_metrics_spec_t;
|
||||||
|
@ -29,37 +29,41 @@ typedef struct ogs_metrics_inst_s {
|
||||||
int unused;
|
int unused;
|
||||||
} ogs_metrics_inst_t;
|
} ogs_metrics_inst_t;
|
||||||
|
|
||||||
static ogs_metrics_context_t self;
|
void ogs_metrics_server_init(ogs_metrics_context_t *ctx)
|
||||||
static int context_initialized = 0;
|
|
||||||
|
|
||||||
void ogs_metrics_context_init(void)
|
|
||||||
{
|
|
||||||
ogs_assert(context_initialized == 0);
|
|
||||||
ogs_log_install_domain(&__ogs_metrics_domain, "metrics", ogs_core()->log.level);
|
|
||||||
context_initialized = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ogs_metrics_context_final(void)
|
|
||||||
{
|
|
||||||
ogs_assert(context_initialized == 1);
|
|
||||||
context_initialized = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ogs_metrics_context_t *ogs_metrics_self(void)
|
|
||||||
{
|
|
||||||
return &self;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ogs_metrics_context_parse_config(const char *local)
|
|
||||||
{
|
|
||||||
return OGS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ogs_metrics_context_open(ogs_metrics_context_t *ctx)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void ogs_metrics_context_close(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)
|
||||||
|
{
|
||||||
|
return (ogs_metrics_server_t *)1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ogs_metrics_server_remove(ogs_metrics_server_t *server)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ogs_metrics_server_remove_all(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ogs_metrics_spec_init(ogs_metrics_context_t *ctx)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ogs_metrics_spec_final(ogs_metrics_context_t *ctx)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,7 +72,7 @@ ogs_metrics_spec_t *ogs_metrics_spec_new(
|
||||||
const char *name, const char *description,
|
const char *name, const char *description,
|
||||||
int initial_val, unsigned int num_labels, const char ** labels)
|
int initial_val, unsigned int num_labels, const char ** labels)
|
||||||
{
|
{
|
||||||
return (ogs_metrics_spec_t *)&self;
|
return (ogs_metrics_spec_t *)1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ogs_metrics_spec_free(ogs_metrics_spec_t *spec)
|
void ogs_metrics_spec_free(ogs_metrics_spec_t *spec)
|
||||||
|
@ -79,7 +83,7 @@ ogs_metrics_inst_t *ogs_metrics_inst_new(
|
||||||
ogs_metrics_spec_t *spec,
|
ogs_metrics_spec_t *spec,
|
||||||
unsigned int num_labels, const char **label_values)
|
unsigned int num_labels, const char **label_values)
|
||||||
{
|
{
|
||||||
return (ogs_metrics_inst_t *)&self;
|
return (ogs_metrics_inst_t *)1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ogs_metrics_inst_free(ogs_metrics_inst_t *inst)
|
void ogs_metrics_inst_free(ogs_metrics_inst_t *inst)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright (C) 2019 by Sukchan Lee <acetcom@gmail.com>
|
# Copyright (C) 2019-2023 by Sukchan Lee <acetcom@gmail.com>
|
||||||
|
|
||||||
# This file is part of Open5GS.
|
# This file is part of Open5GS.
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
project('open5gs', 'c', 'cpp',
|
project('open5gs', 'c', 'cpp',
|
||||||
version : '2.6.0',
|
version : '2.6.1',
|
||||||
license : 'AGPL-3.0-or-later',
|
license : 'AGPL-3.0-or-later',
|
||||||
meson_version : '>= 0.43.0',
|
meson_version : '>= 0.43.0',
|
||||||
default_options : [
|
default_options : [
|
||||||
|
@ -25,7 +25,7 @@ project('open5gs', 'c', 'cpp',
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
libogslib_version = '2.6.0'
|
libogslib_version = '2.6.1'
|
||||||
|
|
||||||
prefix = get_option('prefix')
|
prefix = get_option('prefix')
|
||||||
bindir = join_paths(prefix, get_option('bindir'))
|
bindir = join_paths(prefix, get_option('bindir'))
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "open5gs",
|
"name": "open5gs",
|
||||||
"version": "2.6.0",
|
"version": "2.6.1",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "open5gs",
|
"name": "open5gs",
|
||||||
"version": "2.6.0",
|
"version": "2.6.1",
|
||||||
"license": "AGPL-3.0",
|
"license": "AGPL-3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^0.27.2",
|
"axios": "^0.27.2",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "open5gs",
|
"name": "open5gs",
|
||||||
"version": "2.6.0",
|
"version": "2.6.1",
|
||||||
"description": "Open5gs",
|
"description": "Open5gs",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"repository": "https://github.com/open5gs/open5gs/webui",
|
"repository": "https://github.com/open5gs/open5gs/webui",
|
||||||
|
|
Loading…
Reference in New Issue