summaryrefslogtreecommitdiff
path: root/src/statusreport.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/statusreport.erl')
-rw-r--r--src/statusreport.erl41
1 files changed, 35 insertions, 6 deletions
diff --git a/src/statusreport.erl b/src/statusreport.erl
index 63414cd..f0b7503 100644
--- a/src/statusreport.erl
+++ b/src/statusreport.erl
@@ -24,7 +24,8 @@ init([]) ->
process_flag(trap_exit, true),
ReportInterval = application:get_env(plop, status_report_interval, 1000),
lager:info("~p: starting", [?MODULE]),
- %Timer = erlang:start_timer(1000, self(), dist),
+ HeartbeatInterval = application:get_env(plop, heartbeat_interval, 1000),
+ erlang:start_timer(HeartbeatInterval, self(), heartbeat),
{ok, #state{timer = none,
nodename = http_auth:own_name(),
statusreports = dict:new(),
@@ -49,6 +50,20 @@ store_multi_status(State, Service, Target, Variable, Status) ->
State#state.statusreports),
State#state{statusreports = Statusreports}.
+store_set_status(State, Service, Target, Variable, Statuses) ->
+ Statusreports = dict:store({Service, Target, Variable},
+ {multi, Statuses},
+ State#state.statusreports),
+ State#state{statusreports = Statusreports}.
+
+heartbeat(State) ->
+ {ok, ConfigVersion} = plopconfig:get_env(version),
+ RunningApps = [atom_to_list(App) ++ " " ++ Vsn || {App, _Desc, Vsn} <- application:which_applications()],
+
+ NewState1 = store_status(State, "heartbeat", "", "configversion", ConfigVersion),
+ NewState2 = store_set_status(NewState1, "heartbeat", "", "applications", sets:from_list(RunningApps)),
+ NewState2.
+
handle_call(_, _From, State) ->
{noreply, State}.
@@ -61,7 +76,14 @@ handle_cast({report_multi, Service, Target, Variable, Status}, State) ->
handle_info({timeout, _Timer, force_send}, State) ->
lager:debug("statusreport timer timeout"),
- {noreply, force_send(State)}.
+ {noreply, force_send(State)};
+
+handle_info({timeout, _Timer, heartbeat}, State) ->
+ lager:debug("statusreport timer timeout"),
+ HeartbeatInterval = application:get_env(plop, heartbeat_interval, 1000),
+ erlang:start_timer(HeartbeatInterval, self(), heartbeat),
+ NewState = heartbeat(State),
+ {noreply, try_send(NewState)}.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
@@ -105,10 +127,17 @@ group_by_service(Statusreports) ->
dict:append(Service, {Target, Variable, Status}, Acc)
end, dict:new(), dict:to_list(Statusreports))).
-encode_status({single, Status}) ->
+encode_one_status(Status) when is_number(Status) ->
Status;
+encode_one_status(Status) when is_list(Status) ->
+ list_to_binary(Status);
+encode_one_status(Status) when is_binary(Status) ->
+ Status.
+
+encode_status({single, Status}) ->
+ encode_one_status(Status);
encode_status({multi, Statuses}) ->
- sets:to_list(Statuses).
+ lists:map(fun encode_one_status/1, sets:to_list(Statuses)).
send(Service, Statusreports, Nodename) ->
lager:debug("reporting status to ~p: ~p", [Service, Statusreports]),
@@ -160,10 +189,10 @@ try_send(State) ->
force_send(State)
end.
-report(Service, Target, Variable, Status) ->
+report(Service, Target, Variable, Status) when is_number(Status); is_list(Status); is_binary(Status) ->
lager:debug("reporting status ~p ~p ~p ~p", [Service, Target, Variable, Status]),
gen_server:cast(?MODULE, {report, Service, Target, Variable, Status}).
-report_multi(Service, Target, Variable, Status) ->
+report_multi(Service, Target, Variable, Status) when is_number(Status); is_list(Status); is_binary(Status) ->
lager:debug("reporting multi status ~p ~p ~p ~p", [Service, Target, Variable, Status]),
gen_server:cast(?MODULE, {report_multi, Service, Target, Variable, Status}).