aboutsummaryrefslogtreecommitdiffstats
path: root/lib/percept/src/percept_graph.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/percept/src/percept_graph.erl')
-rw-r--r--lib/percept/src/percept_graph.erl133
1 files changed, 133 insertions, 0 deletions
diff --git a/lib/percept/src/percept_graph.erl b/lib/percept/src/percept_graph.erl
new file mode 100644
index 0000000000..6f07948153
--- /dev/null
+++ b/lib/percept/src/percept_graph.erl
@@ -0,0 +1,133 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2007-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+
+%% @doc Interface for CGI request on graphs used by percept. The module exports two functions that are implementations for ESI callbacks used by the httpd server. See http://www.erlang.org//doc/apps/inets/index.html.
+
+-module(percept_graph).
+-export([proc_lifetime/3, graph/3, scheduler_graph/3, activity/3, percentage/3]).
+
+-include("percept.hrl").
+-include_lib("kernel/include/file.hrl").
+
+%% API
+
+%% graph
+%% @spec graph(SessionID, Env, Input) -> term()
+%% @doc An ESI callback implementation used by the httpd server.
+%%
+
+graph(SessionID, Env, Input) ->
+ mod_esi:deliver(SessionID, header()),
+ mod_esi:deliver(SessionID, binary_to_list(graph(Env, Input))).
+
+%% activity
+%% @spec activity(SessionID, Env, Input) -> term()
+%% @doc An ESI callback implementation used by the httpd server.
+
+activity(SessionID, Env, Input) ->
+ mod_esi:deliver(SessionID, header()),
+ mod_esi:deliver(SessionID, binary_to_list(activity_bar(Env, Input))).
+
+proc_lifetime(SessionID, Env, Input) ->
+ mod_esi:deliver(SessionID, header()),
+ mod_esi:deliver(SessionID, binary_to_list(proc_lifetime(Env, Input))).
+
+percentage(SessionID, Env, Input) ->
+ mod_esi:deliver(SessionID, header()),
+ mod_esi:deliver(SessionID, binary_to_list(percentage(Env,Input))).
+
+scheduler_graph(SessionID, Env, Input) ->
+ mod_esi:deliver(SessionID, header()),
+ mod_esi:deliver(SessionID, binary_to_list(scheduler_graph(Env, Input))).
+
+graph(_Env, Input) ->
+ Query = httpd:parse_query(Input),
+ RangeMin = percept_html:get_option_value("range_min", Query),
+ RangeMax = percept_html:get_option_value("range_max", Query),
+ Pids = percept_html:get_option_value("pids", Query),
+ Width = percept_html:get_option_value("width", Query),
+ Height = percept_html:get_option_value("height", Query),
+
+ % Convert Pids to id option list
+ IDs = [ {id, ID} || ID <- Pids],
+
+ % seconds2ts
+ StartTs = percept_db:select({system, start_ts}),
+ TsMin = percept_analyzer:seconds2ts(RangeMin, StartTs),
+ TsMax = percept_analyzer:seconds2ts(RangeMax, StartTs),
+
+ Options = [{ts_min, TsMin},{ts_max, TsMax} | IDs],
+
+ Acts = percept_db:select({activity, Options}),
+ Counts = case IDs of
+ [] -> percept_analyzer:activities2count(Acts, StartTs);
+ _ -> percept_analyzer:activities2count2(Acts, StartTs)
+ end,
+
+ percept_image:graph(Width, Height,Counts).
+
+scheduler_graph(_Env, Input) ->
+ Query = httpd:parse_query(Input),
+ RangeMin = percept_html:get_option_value("range_min", Query),
+ RangeMax = percept_html:get_option_value("range_max", Query),
+ Width = percept_html:get_option_value("width", Query),
+ Height = percept_html:get_option_value("height", Query),
+
+ StartTs = percept_db:select({system, start_ts}),
+ TsMin = percept_analyzer:seconds2ts(RangeMin, StartTs),
+ TsMax = percept_analyzer:seconds2ts(RangeMax, StartTs),
+
+
+ Acts = percept_db:select({scheduler, [{ts_min, TsMin}, {ts_max,TsMax}]}),
+
+ Counts = [{?seconds(Ts, StartTs), Scheds, 0} || #activity{where = Scheds, timestamp = Ts} <- Acts],
+
+ percept_image:graph(Width, Height, Counts).
+
+activity_bar(_Env, Input) ->
+ Query = httpd:parse_query(Input),
+ Pid = percept_html:get_option_value("pid", Query),
+ Min = percept_html:get_option_value("range_min", Query),
+ Max = percept_html:get_option_value("range_max", Query),
+ Width = percept_html:get_option_value("width", Query),
+ Height = percept_html:get_option_value("height", Query),
+
+ Data = percept_db:select({activity, [{id, Pid}]}),
+ StartTs = percept_db:select({system, start_ts}),
+ Activities = [{?seconds(Ts, StartTs), State} || #activity{timestamp = Ts, state = State} <- Data],
+
+ percept_image:activities(Width, Height, {Min,Max},Activities).
+
+proc_lifetime(_Env, Input) ->
+ Query = httpd:parse_query(Input),
+ ProfileTime = percept_html:get_option_value("profiletime", Query),
+ Start = percept_html:get_option_value("start", Query),
+ End = percept_html:get_option_value("end", Query),
+ Width = percept_html:get_option_value("width", Query),
+ Height = percept_html:get_option_value("height", Query),
+ percept_image:proc_lifetime(round(Width), round(Height), float(Start), float(End), float(ProfileTime)).
+
+percentage(_Env, Input) ->
+ Query = httpd:parse_query(Input),
+ Width = percept_html:get_option_value("width", Query),
+ Height = percept_html:get_option_value("height", Query),
+ Percentage = percept_html:get_option_value("percentage", Query),
+ percept_image:percentage(round(Width), round(Height), float(Percentage)).
+
+header() ->
+ "Content-Type: image/png\r\n\r\n".