summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMagnus Ahltorp <map@kth.se>2017-03-08 23:20:36 +0100
committerMagnus Ahltorp <map@kth.se>2017-03-08 23:23:13 +0100
commit27b809c9525a876ecde0a5346e0264643197d934 (patch)
tree31c916cd4905d9bfc0a7f31098c6cb44e3bb70fd /src
parent64daaf148cd59bf19942014bc754992b6bc6d86d (diff)
Added heartbeat service. Add source. Send better messages.
Diffstat (limited to 'src')
-rw-r--r--src/http_auth.erl3
-rw-r--r--src/statusreport.erl41
2 files changed, 36 insertions, 8 deletions
diff --git a/src/http_auth.erl b/src/http_auth.erl
index e083a2c..c8a8389 100644
--- a/src/http_auth.erl
+++ b/src/http_auth.erl
@@ -25,9 +25,8 @@ read_key_table() ->
none
end.
-
own_name() ->
- {_Key, KeyName} = own_key(),
+ {ok, {KeyName, _}} = application:get_env(plop, own_key),
KeyName.
own_key() ->
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}).