fixeria has uploaded this change for review.

View Change

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.


To view, visit change 40831. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: newchange
Gerrit-Project: erlang/osmo-s1gw
Gerrit-Branch: master
Gerrit-Change-Id: Ie8a06fafa2ce3e7a5aec1eb8e71af3053599cf24
Gerrit-Change-Number: 40831
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de>