fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/40831?usp=email )
Change subject: enb_uptime: track eNB uptime ......................................................................
enb_uptime: track eNB uptime
Change-Id: Ie8a06fafa2ce3e7a5aec1eb8e71af3053599cf24 Related: SYS#7594 --- M include/s1gw_metrics.hrl A src/enb_uptime.erl M src/s1ap_proxy.erl 3 files changed, 107 insertions(+), 4 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-s1gw refs/changes/31/40831/1
diff --git a/include/s1gw_metrics.hrl b/include/s1gw_metrics.hrl index db087c5..83ec768 100644 --- a/include/s1gw_metrics.hrl +++ b/include/s1gw_metrics.hrl @@ -37,9 +37,10 @@ -define(S1GW_CTR_S1AP_PROXY_OUT_PKT_REPLY_ALL, [ctr, s1ap, proxy, out_pkt, reply, all]). -define(S1GW_CTR_S1AP_PROXY_OUT_PKT_REPLY_ERAB_SETUP_RSP, [ctr, s1ap, proxy, out_pkt, reply, erab_setup_rsp]).
-%% GTP-U (traffic) related counters +%% per-eNB counters %% NOTE: these counters shall not be listed in ?S1GW_COUNTERS, %% but created dynamically for each connecting eNB. +-define(S1GW_CTR_ENB_UPTIME(ENBId), [ctr, enb, ENBId, uptime]). -define(S1GW_CTR_GTPU_PACKETS(ENBId, UDL), [ctr, enb, ENBId, gtpu, packets, UDL]). -define(S1GW_CTR_GTPU_BYTES_UE(ENBId, UDL), [ctr, enb, ENBId, gtpu, bytes, ue, UDL]). -define(S1GW_CTR_GTPU_BYTES_TOTAL(ENBId, UDL), [ctr, enb, ENBId, gtpu, bytes, total, UDL]). diff --git a/src/enb_uptime.erl b/src/enb_uptime.erl new file mode 100644 index 0000000..4c6f76a --- /dev/null +++ b/src/enb_uptime.erl @@ -0,0 +1,99 @@ +%% Copyright (C) 2025 by sysmocom - s.f.m.c. GmbH info@sysmocom.de +%% Author: Vadim Yanitskiy vyanitskiy@sysmocom.de +%% +%% All Rights Reserved +%% +%% SPDX-License-Identifier: AGPL-3.0-or-later +%% +%% 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 Affero General Public License +%% along with this program. If not, see https://www.gnu.org/licenses/. +%% +%% Additional Permission under GNU AGPL version 3 section 7: +%% +%% If you modify this Program, or any covered work, by linking or +%% combining it with runtime libraries of Erlang/OTP as released by +%% Ericsson on https://www.erlang.org (or a modified version of these +%% libraries), containing parts covered by the terms of the Erlang Public +%% License (https://www.erlang.org/EPLICENSE), the licensors of this +%% Program grant you additional permission to convey the resulting work +%% without the need to license the runtime libraries of Erlang/OTP under +%% the GNU Affero General Public License. Corresponding Source for a +%% non-source form of such a combination shall include the source code +%% for the parts of the runtime libraries of Erlang/OTP used as well as +%% that of the covered work. + +-module(enb_uptime). + +-export([start_link/0, + genb_id_ind/2, + shutdown/1]). + +-include_lib("kernel/include/logger.hrl"). + +-include("s1gw_metrics.hrl"). + +-define(INTERVAL, 5_000). + + +%% ------------------------------------------------------------------ +%% public API +%% ------------------------------------------------------------------ + +-spec start_link() -> pid(). +start_link() -> + T0 = erlang:monotonic_time(), + spawn_link(fun() -> loop(#{time => T0}) end). + + +-spec genb_id_ind(pid(), string()) -> ok. +genb_id_ind(Pid, GlobalENBId) -> + Pid ! {?FUNCTION_NAME, GlobalENBId}, + ok. + + +-spec shutdown(pid()) -> ok. +shutdown(Pid) -> + Pid ! stop, + ok. + + +%% ------------------------------------------------------------------ +%% private API +%% ------------------------------------------------------------------ + +loop(#{genb_id := GlobalENBId, time := T0} = S) -> + receive + stop -> + s1gw_metrics:ctr_reset(?S1GW_CTR_ENB_UPTIME(GlobalENBId)), + ok; + Event -> + ?LOG_ERROR("Rx unexpected event: ~p", [Event]) + after ?INTERVAL -> + T1 = erlang:monotonic_time(), + Diff = erlang:convert_time_unit(T1 - T0, native, second), + s1gw_metrics:ctr_inc(?S1GW_CTR_ENB_UPTIME(GlobalENBId), Diff), + ?LOG_INFO("Td ~p second(s)", [Diff]), + loop(S#{time => T1}) + end; + +loop(#{} = S) -> + receive + {genb_id_ind, GlobalENBId} -> + catch exometer:new(?S1GW_CTR_ENB_UPTIME(GlobalENBId), counter), + loop(S#{genb_id => GlobalENBId}); + Event -> + ?LOG_ERROR("Rx unexpected event: ~p", [Event]) + end. + + +%% vim:set ts=4 sw=4 et: diff --git a/src/s1ap_proxy.erl b/src/s1ap_proxy.erl index 06e5302..813a8d1 100644 --- a/src/s1ap_proxy.erl +++ b/src/s1ap_proxy.erl @@ -78,7 +78,8 @@ mme_ue_id :: undefined | mme_ue_id(), enb_ue_id :: undefined | enb_ue_id(), erab_id :: undefined | erab_id(), - path :: [s1ap_ie_id()] + path :: [s1ap_ie_id()], + enb_uptime :: pid() }).
-type proxy_state() :: #proxy_state{}. @@ -127,7 +128,8 @@
init([ConnInfo]) -> process_flag(trap_exit, true), - {ok, #proxy_state{conn_info = ConnInfo, + {ok, #proxy_state{enb_uptime = enb_uptime:start_link(), + conn_info = ConnInfo, erabs = dict:new(), path = []}}.
@@ -167,7 +169,8 @@ {noreply, S}.
-terminate(Reason, #proxy_state{}) -> +terminate(Reason, #proxy_state{} = S) -> + enb_uptime:shutdown(S#proxy_state.enb_uptime), ?LOG_NOTICE("Terminating, reason ~p", [Reason]), ok.