From 2e73384b24f8d0d0fe077ddaad3d4357dc3f92d9 Mon Sep 17 00:00:00 2001 From: Stephane Bourque Date: Thu, 10 Dec 2020 11:35:28 -0800 Subject: [PATCH] Change from start to offset --- Makefile | 2 +- include/statistics.hrl | 23 ++++++++++++++++++ src/mqtt_client.erl | 10 ++++---- src/simnode.erl | 48 +++++++++++++++++++++++++++++++------- src/stat_os_report.erl | 21 +++++++++++++++++ src/statistics.erl | 14 +++++++++++ src/utils.erl | 1 - src/web_socket_handler.erl | 8 ++++++- 8 files changed, 110 insertions(+), 17 deletions(-) create mode 100644 src/stat_os_report.erl diff --git a/Makefile b/Makefile index 7adb989..387de68 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ PROJECT = owls PROJECT_DESCRIPTION = OpenWiFi Load Simulator (OWLS) PROJECT_VERSION = 0.1.0 -DEPS = lager gpb jiffy cowlib ranch gun cowboy rec2json uuid yamerl +DEPS = lager gpb jiffy cowlib ranch gun cowboy rec2json uuid yamerl jsx ERLC_OPTS += -I deps/gpb/include ERLC_OPTS += +'{parse_transform, lager_transform}' diff --git a/include/statistics.hrl b/include/statistics.hrl index 2bf82b8..1142073 100644 --- a/include/statistics.hrl +++ b/include/statistics.hrl @@ -19,6 +19,29 @@ report = #{} :: #{} }). +-record( stat_os_report, { + cpu_avg1 :: number(), + cpu_avg5 :: number(), + cpu_avg15:: number(), + number_of_processes :: number(), + sysmem_high_watermark :: number(), + procmem_high_watermark :: number(), + cpu_utilization :: number(), + mem_check_interval :: number(), + mem_helper_timeout :: number(), + disk_check_interval :: number(), + memory_data = [] :: [ { atom(), number()} ], + number_of_cpus :: number(), + kernel_utilization :: number(), + nice_user :: number(), + user :: number(), + idle :: number(), + disk_almost_full_threshold :: number(), + disk_details :: [{string(),number()}], + system_memory_data :: [{ atom() , number() }], + cpu_details :: [ [ { string(), number() }]] +}). + -type stat_report() :: #stat_report{}. -export_type([stat_report/0]). diff --git a/src/mqtt_client.erl b/src/mqtt_client.erl index 16e1c4e..2f5a7fa 100644 --- a/src/mqtt_client.erl +++ b/src/mqtt_client.erl @@ -80,10 +80,10 @@ full_start(State)-> -spec run_client(Socket::ssl:sslsocket(),CS::#client_state{}) -> #client_state{}. run_client(Socket,CS)-> %% "/ap/sim1-1-000050_SIM1000050/opensync" - RealSerial = case string:tokens(binary_to_list(CS#client_state.topics),"/") of - [_,Serial,_] -> list_to_binary(Serial); - _ -> CS#client_state.details#client_info.serial - end, + %%RealSerial = case string:tokens(binary_to_list(CS#client_state.topics),"/") of + %% [_,Serial,_] -> list_to_binary(Serial); + %% _ -> CS#client_state.details#client_info.serial + %% end, C = #mqtt_connect_variable_header{ protocol_version = ?MQTT_PROTOCOL_VERSION_3_11, @@ -93,7 +93,7 @@ run_client(Socket,CS)-> will_qos_flag = 0, will_flag = 0 , clean_start_flag = 1, - client_identifier = RealSerial, + client_identifier = CS#client_state.details#client_info.serial, keep_alive = 180 }, M = #mqtt_msg{ variable_header = C}, ConnectMessage = mqtt_message:encode(M), diff --git a/src/simnode.erl b/src/simnode.erl index b81c9c3..d6a9eae 100644 --- a/src/simnode.erl +++ b/src/simnode.erl @@ -12,6 +12,7 @@ -include("../include/common.hrl"). -include("../include/inventory.hrl"). -include("../include/sim_commands.hrl"). +-include("../include/statistics.hrl"). -compile({parse_transform, lager_transform}). -dialyzer(no_match). @@ -30,7 +31,7 @@ set_configuration/1,reset_configuration/1, get_configuration/0,set_configuration/2,get_configuration/1, update_stats/3,send_os_stats/0, - start/2,restart/2,pause/2,cancel/2,stop/2]). + start/2,restart/2,pause/2,cancel/2,stop/2,create_os_stats_report/0]). %% gen_server callbacks -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, @@ -299,15 +300,44 @@ try_connecting(NodeName,State)-> end end. +volumes_to_tuples([],A)-> + A; +volumes_to_tuples([{Name,Size,_}|T],A)-> + volumes_to_tuples(T,[{Name,Size}|A]). + +cpu_details_to_tuples([],A)-> + A; +cpu_details_to_tuples([{Cpu,Busy,Idle,_}|T],A)-> + cpu_details_to_tuples(T,[[{"CPU",Cpu},{"Busy",Busy},{"Idle",Idle}]|A]). + create_os_stats_report() -> - CpuSup = #{ avg1 => cpu_sup:avg1() , avg5 => cpu_sup:avg5(), avg15 => cpu_sup:avg15(), - nprocs => cpu_sup:nprocs(), util => cpu_sup:util(), detailed => cpu_sup:util([detailed]), per_cpu => cpu_sup:util([per_cpu])}, - DiskSup = #{ disk_data => disksup:get_disk_data(), check_interval => disksup:get_check_interval(), - almost_full_threshold => disksup:get_almost_full_threshold()}, - MemSup = #{ check_interval => memsup:get_check_interval(), procmem_high_watermark => memsup:get_procmem_high_watermark(), - sysmem_high_watermark => memsup:get_sysmem_high_watermark(), memory_data => memsup:get_memory_data(), - helper_timeout => memsup:get_helper_timeout(), system_memory_data => memsup:get_system_memory_data()}, - #{ cpu_sup => CpuSup,disk_sup => DiskSup, memsup => MemSup}. + {X1,X2,{_,X3}} = memsup:get_memory_data(), + MemoryData = [ {total,X1}, {allocated,X2},{biggest,X3}], + { Cpus, DetailCpu, NonBusy, _ } = cpu_sup:util([detailed]), + + Report = #stat_os_report{ + cpu_avg1 = cpu_sup:avg1(), + cpu_avg5 = cpu_sup:avg5(), + cpu_avg15= cpu_sup:avg15(), + number_of_processes = cpu_sup:nprocs(), + sysmem_high_watermark = memsup:get_sysmem_high_watermark(), + procmem_high_watermark = memsup:get_procmem_high_watermark(), + mem_check_interval = memsup:get_check_interval(), + mem_helper_timeout = memsup:get_helper_timeout(), + disk_check_interval = disksup:get_check_interval(), + system_memory_data = memsup:get_system_memory_data(), + memory_data = MemoryData, + cpu_utilization = cpu_sup:util(), + number_of_cpus = length(Cpus), + kernel_utilization = proplists:get_value(kernel,DetailCpu,0.0), + nice_user = proplists:get_value(nice_user,DetailCpu,0.0), + user = proplists:get_value(user,DetailCpu,0.0), + idle = proplists:get_value(idle,NonBusy,0.0), + disk_almost_full_threshold = disksup:get_almost_full_threshold(), + disk_details = volumes_to_tuples(disksup:get_disk_data(),[]), + cpu_details = cpu_details_to_tuples(cpu_sup:util([per_cpu]),[]) + }, + Report. safe_execute(undefined,_F,_A)-> ok; diff --git a/src/stat_os_report.erl b/src/stat_os_report.erl new file mode 100644 index 0000000..61aa7a5 --- /dev/null +++ b/src/stat_os_report.erl @@ -0,0 +1,21 @@ +%%%------------------------------------------------------------------- +%%% @author stephb +%%% @copyright (C) 2020, Arilia Wireless Inc. +%%% @doc +%%% +%%% @end +%%% Created : 10. Dec 2020 11:28 a.m. +%%%------------------------------------------------------------------- +-module(stat_os_report). +-author("stephb"). + +-include("../include/statistics.hrl"). + +-compile([{parse_transform, rec2json}]). + +%% +%% Place holder for all functions generated by rec2json for record processor in/out +%% + +%% API +-export([]). \ No newline at end of file diff --git a/src/statistics.erl b/src/statistics.erl index 8d485a7..e2cce7a 100644 --- a/src/statistics.erl +++ b/src/statistics.erl @@ -130,4 +130,18 @@ add_new_report(Node,Type,Report)-> type = Type, report = Report }) end ), + try + JSON = case Type of + os_details -> + jiffy:encode(stat_os_report:to_json(Report)); + _ -> + jiffy:encode(Report) + end, + web_socket_handler:send_frame( JSON ), + io:format("Good report: ~p~n",[Type]) + catch + _:_ -> + io:format("FAILED REPORT: ~p~n",[Report]), + ok + end, ok. diff --git a/src/utils.erl b/src/utils.erl index 0e5ba77..6debcd7 100644 --- a/src/utils.erl +++ b/src/utils.erl @@ -282,4 +282,3 @@ search_replace(InFile,OutFile,Elements)-> { ok , InData } = file:read_file(safe_list(InFile)), NewData = replace_data(binary_to_list(InData),Elements), file:write_file(safe_list(OutFile),list_to_binary(NewData)). - diff --git a/src/web_socket_handler.erl b/src/web_socket_handler.erl index 1c5ee4f..4c3e2ec 100644 --- a/src/web_socket_handler.erl +++ b/src/web_socket_handler.erl @@ -21,6 +21,8 @@ | {stop, ws_state()}. -type ws_state() :: any(). +-record( conn_state, { pid, keep_alive :: timer:tref() }). + -spec init( Req :: cowboy_req:req(), State ::ws_state() ) -> { cowboy_websocket, cowboy_req:req(), State::ws_state() }. init(Req, State) -> %% io:format("Web socket init.~p..~n",[self()]), @@ -31,8 +33,9 @@ websocket_init(State)-> Pids = persistent_term:get(web_socket_pids,sets:new()), NewPids = sets:add_element(self(),Pids), persistent_term:put(web_socket_pids,NewPids), + {ok,TRef} = timer:send_interval(5000,ping), %% io:format("Web socket starting. ~p..~n",[self()]), - {ok,State}. + {ok,State#conn_state{ pid = self(), keep_alive = TRef }}. -spec websocket_handle(InFrame :: in_frame(),State::ws_state())-> call_result(). websocket_handle(InFrame,State)-> @@ -43,6 +46,9 @@ websocket_handle(InFrame,State)-> websocket_info({frame,Format,Data},State)-> %% io:format("Web socket message.~p..2~n",[self()]), {reply,{Format,Data},State}; +websocket_info(ping,State)-> + %% io:format("Web socket message.~p..2~n",[self()]), + {reply,ping,State}; websocket_info(_Info,State)-> %% io:format("Web socket starting: ~p..3.~n",[self()]), {ok,State}.