File 2495-Add-System-statistics-limit-panel.patch of Package erlang

From c08a7d382812ec8873a78b3e8eee2cffabf8e982 Mon Sep 17 00:00:00 2001
From: Gabriele Santomaggio <gabriele.santomaggio@erlang-solutions.com>
Date: Fri, 7 Jul 2017 11:56:59 +0200
Subject: [PATCH] Add System statistics / limit panel

Show the statistics, limits and percentage for atoms, processes,ports and ETS.
Backward compatibility with old versions, In case the valuse is missing it shows
the string Not available.
---
 lib/observer/src/observer_lib.erl          |  2 ++
 lib/observer/src/observer_sys_wx.erl       | 55 ++++++++++++++++++++++++++----
 lib/runtime_tools/src/observer_backend.erl | 16 ++++++---
 3 files changed, 62 insertions(+), 11 deletions(-)

diff --git a/lib/observer/src/observer_lib.erl b/lib/observer/src/observer_lib.erl
index c7ee29471..8b6036f52 100644
--- a/lib/observer/src/observer_lib.erl
+++ b/lib/observer/src/observer_lib.erl
@@ -297,6 +297,8 @@ to_str(No) when is_integer(No) ->
     integer_to_list(No);
 to_str(Float) when is_float(Float) ->
     io_lib:format("~.3f", [Float]);
+to_str({trunc, Float}) when is_float(Float) ->
+    float_to_list(Float, [{decimals,0}]);
 to_str(Term) ->
     io_lib:format("~w", [Term]).
 
diff --git a/lib/observer/src/observer_sys_wx.erl b/lib/observer/src/observer_sys_wx.erl
index db86c05be..2e1af3ada 100644
--- a/lib/observer/src/observer_sys_wx.erl
+++ b/lib/observer/src/observer_sys_wx.erl
@@ -48,7 +48,7 @@ start_link(Notebook, Parent, Config) ->
 
 init([Notebook, Parent, Config]) ->
     SysInfo = observer_backend:sys_info(),
-    {Sys, Mem, Cpu, Stats} = info_fields(),
+    {Sys, Mem, Cpu, Stats, Limits} = info_fields(),
     Panel = wxPanel:new(Notebook),
     Sizer = wxBoxSizer:new(?wxVERTICAL),
     HSizer0 = wxBoxSizer:new(?wxHORIZONTAL),
@@ -63,17 +63,26 @@ init([Notebook, Parent, Config]) ->
     wxSizer:add(HSizer1, FPanel2, [{flag, ?wxEXPAND}, {proportion, 1}]),
     wxSizer:add(HSizer1, FPanel3, [{flag, ?wxEXPAND}, {proportion, 1}]),
 
+    HSizer2 = wxBoxSizer:new(?wxHORIZONTAL),
+    {FPanel4, _FSizer4, Fields4} = observer_lib:display_info(Panel, observer_lib:fill_info(Limits, SysInfo)),
+    wxSizer:add(HSizer2, FPanel4, [{flag, ?wxEXPAND}, {proportion, 1}]),
+
+
     BorderFlags = ?wxLEFT bor ?wxRIGHT,
     wxSizer:add(Sizer, HSizer0, [{flag, ?wxEXPAND bor BorderFlags bor ?wxTOP},
 				 {proportion, 0}, {border, 5}]),
     wxSizer:add(Sizer, HSizer1, [{flag, ?wxEXPAND bor BorderFlags bor ?wxBOTTOM},
 				 {proportion, 0}, {border, 5}]),
+    wxSizer:add(Sizer, HSizer2, [{flag, ?wxEXPAND bor BorderFlags bor ?wxBOTTOM},
+                                 {proportion, 0}, {border, 5}]),
+
     wxPanel:setSizer(Panel, Sizer),
     Timer = observer_lib:start_timer(Config, 10),
     {Panel, #sys_wx_state{parent=Parent,
 			  parent_notebook=Notebook,
 			  panel=Panel, sizer=Sizer,
-			  timer=Timer, fields=Fields0 ++ Fields1++Fields2++Fields3}}.
+			  timer=Timer, fields=Fields0 ++ Fields1++Fields2++Fields3++Fields4}}.
+
 
 create_sys_menu(Parent) ->
     View = {"View", [#create_menu{id = ?ID_REFRESH, text = "Refresh\tCtrl-R"},
@@ -83,14 +92,40 @@ create_sys_menu(Parent) ->
 update_syspage(#sys_wx_state{node = undefined}) -> ignore;
 update_syspage(#sys_wx_state{node = Node, fields=Fields, sizer=Sizer}) ->
     SysInfo = observer_wx:try_rpc(Node, observer_backend, sys_info, []),
-    {Sys, Mem, Cpu, Stats} = info_fields(),
+    {Sys, Mem, Cpu, Stats, Limits} = info_fields(),
     observer_lib:update_info(Fields,
 			     observer_lib:fill_info(Sys, SysInfo) ++
 				 observer_lib:fill_info(Mem, SysInfo) ++
 				 observer_lib:fill_info(Cpu, SysInfo) ++
-				 observer_lib:fill_info(Stats, SysInfo)),
+				 observer_lib:fill_info(Stats, SysInfo)++
+				 observer_lib:fill_info(Limits, SysInfo)),
+
     wxSizer:layout(Sizer).
 
+
+maybe_convert(undefined) -> "Not available";
+maybe_convert(V) -> observer_lib:to_str(V).
+
+get_dist_buf_busy_limit_info() ->
+    fun(Data) ->
+            maybe_convert(proplists:get_value(dist_buf_busy_limit, Data))
+    end.
+
+get_limit_count_info(Count, Limit) ->
+    fun(Data) ->
+            C = proplists:get_value(Count, Data),
+            L = proplists:get_value(Limit, Data),
+            lists:flatten(
+              io_lib:format("~s / ~s ~s",
+                            [maybe_convert(C), maybe_convert(L),
+                             if
+                                 C =:= undefined -> "";
+                                 L =:= undefined -> "";
+                                 true -> io_lib:format("(~s % used)",[observer_lib:to_str({trunc, (C / L) *100})])
+                             end]))
+    end.
+
+
 info_fields() ->
     Sys = [{"System and Architecture",
 	     [{"System Version", otp_release},
@@ -122,14 +157,20 @@ info_fields() ->
 	    ]}],
     Stats = [{"Statistics", right,
 	      [{"Up time", {time_ms, uptime}},
-	       {"Max Processes", process_limit},
-	       {"Processes", process_count},
 	       {"Run Queue", run_queue},
 	       {"IO Input",  {bytes, io_input}},
 	       {"IO Output", {bytes, io_output}}
 	      ]}
 	    ],
-    {Sys, Mem, Cpu, Stats}.
+    Limits = [{"System statistics / limit",
+               [{"Atoms", get_limit_count_info(atom_count, atom_limit)},
+                {"Processes", get_limit_count_info(process_count, process_limit)},
+                {"Ports", get_limit_count_info(port_count, port_limit)},
+                {"ETS", get_limit_count_info(ets_count, ets_limit)},
+                {"Distribution buffer busy limit", get_dist_buf_busy_limit_info()}
+               ]}],
+    {Sys, Mem, Cpu, Stats, Limits}.
+
 
 %%%%%%%%%%%%%%%%%%%%%%% Callbacks %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
diff --git a/lib/runtime_tools/src/observer_backend.erl b/lib/runtime_tools/src/observer_backend.erl
index d36af257c..7f0c1ac6e 100644
--- a/lib/runtime_tools/src/observer_backend.erl
+++ b/lib/runtime_tools/src/observer_backend.erl
@@ -63,9 +63,7 @@ sys_info() ->
 			  end,
 
     {{_,Input},{_,Output}} = erlang:statistics(io),
-    [{process_count, erlang:system_info(process_count)},
-     {process_limit, erlang:system_info(process_limit)},
-     {uptime, element(1, erlang:statistics(wall_clock))},
+    [{uptime, element(1, erlang:statistics(wall_clock))},
      {run_queue, erlang:statistics(run_queue)},
      {io_input, Input},
      {io_output,  Output},
@@ -86,7 +84,17 @@ sys_info() ->
      {thread_pool_size, erlang:system_info(thread_pool_size)},
      {wordsize_internal, erlang:system_info({wordsize, internal})},
      {wordsize_external, erlang:system_info({wordsize, external})},
-     {alloc_info, alloc_info()}
+     {alloc_info, alloc_info()},
+     {process_count, erlang:system_info(process_count)},
+     {atom_limit,  erlang:system_info(atom_limit)},
+     {atom_count, erlang:system_info(atom_count)},
+     {process_limit, erlang:system_info(process_limit)},
+     {process_count, erlang:system_info(process_count)},
+     {port_limit, erlang:system_info(port_limit)},
+     {port_count, erlang:system_info(port_count)},
+     {ets_limit,  erlang:system_info(ets_limit)},
+     {ets_count, length(ets:all())},
+     {dist_buf_busy_limit, erlang:system_info(dist_buf_busy_limit)}
      | MemInfo].
 
 alloc_info() ->
-- 
2.14.1

openSUSE Build Service is sponsored by