Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

More metrics 2 #412

Merged
merged 36 commits into from
May 4, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
d7ce95f
start reporting base metrics to graphite
michalwski Mar 6, 2015
e4eabb7
collect and report some vm specific metrics
michalwski Mar 16, 2015
b6a669f
make global metrics understandable by exometer reporter
michalwski Mar 17, 2015
37e8827
add histogram metrics for received data size
michalwski Mar 24, 2015
7d5c0af
remove dead code from ejabberd_socket
michalwski Mar 24, 2015
10d2872
reorganise data size metrics and add metrics for sent data
michalwski Mar 24, 2015
6ad9dd6
move data relate metrics to separated path
michalwski Mar 24, 2015
ab2d317
metrics subscription refactoring
michalwski Mar 25, 2015
6b47851
move all mam async writers under dedicated supervisor
michalwski Mar 25, 2015
6ab04cb
return db_type and db_ref from ODBC fsm
michalwski Mar 25, 2015
f45b7a1
return sent and recv stats for mysql workers
michalwski Mar 25, 2015
7310924
add gen_server call returing odbc connection to all mam async writers
michalwski Mar 26, 2015
dfd9afc
improve ODBC data stats
michalwski Mar 26, 2015
4ede73e
add support for postgres workers data stats
michalwski Mar 26, 2015
7106817
add support for odbc workers data stats
michalwski Mar 26, 2015
477a903
separate regular ODBC workers form MAM async
michalwski Mar 26, 2015
1239213
return distributed Erlang data stats
michalwski Mar 26, 2015
3205c30
rename xmpp data metrics
michalwski Mar 26, 2015
794058c
create exometer counters for data stats obtained from fun
michalwski Mar 26, 2015
945f750
allow modules to specify tracked operations
michalwski Mar 26, 2015
75de160
measure time of get and set backend opsin mod_private and mod_last
michalwski Mar 26, 2015
8a12ade
introduce mod_roster behaviour
michalwski Mar 27, 2015
87448a0
generate impl of behaviour functions in MOD_backend modules
michalwski Mar 27, 2015
58f419b
generate different body for tracked functions
michalwski Mar 27, 2015
d9e1524
simplify usage of tracked function in mod_private and mod_last
michalwski Mar 27, 2015
2a5236e
measure time of some operations in mod_privacy
michalwski Mar 27, 2015
5a866f1
measure execution time of some funcs in mod_vcard
michalwski Mar 27, 2015
7f2d61e
extend mod_offline behaviour and measure time of read and write
michalwski Mar 27, 2015
89871e9
measure time of some ops from mod_roster
michalwski Mar 27, 2015
69d4cec
add missing mod_roster callback
michalwski Mar 30, 2015
cd0794e
start mongoose via mongooseim module in `make quickrun`
michalwski Mar 30, 2015
dd93f54
allow to ask about any metric/pattern values
michalwski Mar 30, 2015
9247576
include and run mongooseim app instead of mongoose
michalwski Mar 31, 2015
d0cc432
fail tests if there are some auto skipped test cases
michalwski Mar 31, 2015
06eaeab
allow to specify graphite reporter options
michalwski Apr 17, 2015
8d4193f
use base module name for backend metrics
michalwski Apr 28, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ test_preset: test_deps
run: deps compile quickrun

quickrun: etc/ejabberd.cfg certs_priv
erl -sname mongooseim@localhost -setcookie ejabberd -pa deps/*/ebin apps/*/ebin -config rel/files/app.config -s ejabberd
erl -sname mongooseim@localhost -setcookie ejabberd -pa ebin deps/*/ebin apps/*/ebin -config rel/files/app.config -s mongooseim

etc/ejabberd.cfg:
@mkdir -p $(@D)
Expand Down
11 changes: 4 additions & 7 deletions apps/ejabberd/src/ejabberd_c2s.erl
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,6 @@ start_link(SockData, Opts) ->
?GEN_FSM:start_link(ejabberd_c2s, [SockData, Opts],
fsm_limit_opts(Opts) ++ ?FSMOPTS).


socket_type() ->
xml_stream.

Expand Down Expand Up @@ -1590,12 +1589,10 @@ change_shaper(StateData, JID) ->


-spec send_text(state(), Text :: binary()) -> any().
send_text(StateData, Text) when StateData#state.xml_socket ->
?DEBUG("Send Text on stream = ~p", [lists:flatten(Text)]),
(StateData#state.sockmod):send_xml(StateData#state.socket,
{xmlstreamraw, Text});
send_text(StateData, Text) ->
?DEBUG("Send XML on stream = ~p", [Text]),
Size = size(Text),
mongoose_metrics:update([data, xmpp, sent, xml_stanza_size], Size),
(StateData#state.sockmod):send(StateData#state.socket, Text).

-spec maybe_send_element_safe(state(), El :: jlib:xmlel()) -> any().
Expand Down Expand Up @@ -1657,11 +1654,11 @@ send_header(StateData, Server, Version, Lang) ->
"" -> "";
_ -> [" xml:lang='", Lang, "'"]
end,
Header = io_lib:format(?STREAM_HEADER,
Header = list_to_binary(io_lib:format(?STREAM_HEADER,
[StateData#state.streamid,
Server,
VersionStr,
LangStr]),
LangStr])),
send_text(StateData, Header).

-spec maybe_send_trailer_safe(State :: state()) -> any().
Expand Down
2 changes: 1 addition & 1 deletion apps/ejabberd/src/ejabberd_c2s.hrl
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@
"id='~s' from='~s'~s~s>"
).

-define(STREAM_TRAILER, "</stream:stream>").
-define(STREAM_TRAILER, <<"</stream:stream>">>).

-define(INVALID_NS_ERR, ?SERR_INVALID_NAMESPACE).
-define(INVALID_XML_ERR, ?SERR_XML_NOT_WELL_FORMED).
Expand Down
8 changes: 8 additions & 0 deletions apps/ejabberd/src/ejabberd_odbc.erl
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@
session_established/2,
session_established/3]).

%% internal usage
-export([get_db_info/1]).

-include("ejabberd.hrl").

-record(state, {db_ref,
Expand Down Expand Up @@ -168,6 +171,8 @@ keep_alive(PID) ->
?GEN_FSM:sync_send_event(PID, {sql_cmd, {sql_query, ?KEEPALIVE_QUERY}, now()},
?KEEPALIVE_TIMEOUT).

get_db_info(Pid) ->
?GEN_FSM:sync_send_all_state_event(Pid, get_db_info).
%% This function is intended to be used from inside an sql_transaction:
sql_query_t(Query) ->
QRes = sql_query_internal(Query),
Expand Down Expand Up @@ -379,6 +384,9 @@ session_established(Event, State) ->
handle_event(_Event, StateName, State) ->
{next_state, StateName, State}.

handle_sync_event(get_db_info, _, StateName,
#state{db_ref = DbRef, db_type = DbType} = State) ->
{reply, {ok, DbType, DbRef}, StateName, State};
handle_sync_event(_Event, _From, StateName, State) ->
{reply, {error, badarg}, StateName, State}.

Expand Down
8 changes: 6 additions & 2 deletions apps/ejabberd/src/ejabberd_receiver.erl
Original file line number Diff line number Diff line change
Expand Up @@ -216,9 +216,10 @@ handle_info({Tag, _TCPSocket, Data},
#state{socket = Socket,
c2s_pid = C2SPid,
sock_mod = SockMod} = State)
when (Tag == tcp) or (Tag == ssl) or (Tag == ejabberd_xml) ->
when (Tag == tcp) or (Tag == ssl) ->
case SockMod of
ejabberd_tls ->
mongoose_metrics:update([data, xmpp, received, encrypted_size], size(Data)),
case ejabberd_tls:recv_data(Socket, Data) of
{ok, TLSData} ->
{noreply, process_data(TLSData, State),
Expand All @@ -227,6 +228,7 @@ handle_info({Tag, _TCPSocket, Data},
{stop, normal, State}
end;
ejabberd_zlib ->
mongoose_metrics:update([data, xmpp, received, compressed_size], size(Data)),
case ejabberd_zlib:recv_data(Socket, Data) of
{ok, ZlibData} ->
{noreply, process_data(ZlibData, State),
Expand Down Expand Up @@ -334,8 +336,10 @@ process_data(Data,
shaper_state = ShaperState,
c2s_pid = C2SPid} = State) ->
?DEBUG("Received XML on stream = \"~s\"", [Data]),
Size = size(Data),
mongoose_metrics:update([data, xmpp, received, xml_stanza_size], Size),
XMLStreamState1 = xml_stream:parse(XMLStreamState, Data),
{NewShaperState, Pause} = shaper:update(ShaperState, size(Data)),
{NewShaperState, Pause} = shaper:update(ShaperState, Size),
if
C2SPid == undefined ->
ok;
Expand Down
11 changes: 0 additions & 11 deletions apps/ejabberd/src/ejabberd_socket.erl
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
connect/4,
starttls/2,
starttls/3,
compress/1,
compress/3,
reset_stream/1,
send/2,
Expand Down Expand Up @@ -171,16 +170,6 @@ starttls(SocketData, TLSOpts, Data) ->
send(SocketData, Data),
SocketData#socket_state{socket = TLSSocket, sockmod = ejabberd_tls}.


-spec compress(socket_state()) -> socket_state().
compress(SocketData) ->
{ok, ZlibSocket} = ejabberd_zlib:enable_zlib(
SocketData#socket_state.sockmod,
SocketData#socket_state.socket),
ejabberd_receiver:compress(SocketData#socket_state.receiver, ZlibSocket),
SocketData#socket_state{socket = ZlibSocket, sockmod = ejabberd_zlib}.


-spec compress(socket_state(), integer(), _) -> socket_state().
compress(SocketData, InflateSizeLimit, Data) ->
{ok, ZlibSocket} = ejabberd_zlib:enable_zlib(
Expand Down
7 changes: 6 additions & 1 deletion apps/ejabberd/src/ejabberd_sup.erl
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,10 @@ init([]) ->
brutal_kill,
worker,
[mod_muc_iq]},
MAM =
{mod_mam_sup,
{mod_mam_sup, start_link, []},
permanent, infinity, supervisor, [mod_mam_sup]},
ShaperSpecs = shaper_srv:child_specs(),

{ok, {{one_for_one, 10, 1},
Expand All @@ -190,4 +194,5 @@ init([]) ->
IQSupervisor,
STUNSupervisor,
Listener,
MucIQ]}}.
MucIQ,
MAM]}}.
1 change: 1 addition & 0 deletions apps/ejabberd/src/ejabberd_tls.erl
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ send(#tlssock{tcpsock = TCPSocket, tlsport = Port} = TLSSock, Packet) ->
%?PRINT("OUT: ~p~n", [{TCPSocket, lists:flatten(Packet)}]),
case port_control(Port, ?GET_ENCRYPTED_OUTPUT, []) of
<<0, Out/binary>> ->
mongoose_metrics:update([data, xmpp, sent, encrypted_size], size(Out)),
gen_tcp:send(TCPSocket, Out);
<<1, Error/binary>> ->
{error, binary_to_list(Error)}
Expand Down
1 change: 1 addition & 0 deletions apps/ejabberd/src/ejabberd_zlib.erl
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ send(#zlibsock{sockmod = SockMod, socket = Socket, zlibport = Port},
Packet) ->
case port_control(Port, ?DEFLATE, Packet) of
<<0, Out/binary>> ->
mongoose_metrics:update([data, xmpp, sent, compressed_size], size(Out)),
SockMod:send(Socket, Out);
<<1, Error/binary>> ->
{error, erlang:binary_to_existing_atom(Error, utf8)};
Expand Down
86 changes: 69 additions & 17 deletions apps/ejabberd/src/gen_mod.erl
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
-export([start/0,
start_module/3,
start_backend_module/2,
start_backend_module/3,
stop_module/2,
stop_module_keep_config/2,
reload_module/3,
Expand All @@ -44,6 +45,7 @@
loaded_modules_with_opts/1,
get_hosts/2,
get_module_proc/2,
backend_code/3,
is_loaded/2]).

-include("ejabberd.hrl").
Expand Down Expand Up @@ -107,24 +109,74 @@ start_module(Host, Module, Opts0) ->

-spec start_backend_module(module(), list()) -> no_return().
start_backend_module(Module, Opts) ->
ModuleStr = atom_to_list(Module),
BackendModuleStr = ModuleStr ++ "_backend",
start_backend_module(Module, Opts, []).

start_backend_module(Module, Opts, TrackedFuncs) ->
Backend = gen_mod:get_opt(backend, Opts, mnesia),
{Mod, Code} = dynamic_compile:from_string(backend_code(ModuleStr, Backend)),
code:load_binary(Mod, BackendModuleStr ++ ".erl", Code).

-spec backend_code(string(), atom()) -> string().
backend_code(Module, Backend) when is_atom(Backend) ->
BackendModule = Module ++ "_backend",
lists:flatten(
["-module(",BackendModule,").
-export([backend/0]).

-spec backend() -> atom().
backend() ->",
Module,"_",
atom_to_list(Backend),
".\n"]).
{BackendModuleStr, CodeString} = backend_code(Module, Backend, TrackedFuncs),
{Mod, Code} = dynamic_compile:from_string(CodeString),
code:load_binary(Mod, BackendModuleStr ++ ".erl", Code),
ensure_backend_metrics(Module, TrackedFuncs).

-spec backend_code(string(), atom(), list()) -> string().
backend_code(Module, Backend, TrackedFuncs) when is_atom(Backend) ->
Callbacks = Module:behaviour_info(callbacks),
ModuleStr = atom_to_list(Module),
BackendModuleName = ModuleStr ++ "_backend",
RealBackendModule = ModuleStr++"_"++atom_to_list(Backend),
BehaviourExports = [generate_export(F, A) || {F, A} <- Callbacks],

BehaviourImpl = [generate_fun(Module, RealBackendModule, F, A, TrackedFuncs) || {F, A} <- Callbacks],
Code = lists:flatten(
["-module(", BackendModuleName,").\n",
"-export([backend/0]).\n",
BehaviourExports,


"-spec backend() -> atom().\n",
"backend() ->", RealBackendModule,".\n",
BehaviourImpl
]),
{BackendModuleName, Code}.

generate_export(F, A) ->
"-export(["++atom_to_list(F)++"/"++integer_to_list(A)++"]).\n".

generate_fun(BaseModule, RealBackendModule, F, A, TrackedFuncs) ->
Args = string:join(["A"++integer_to_list(I) || I <- lists:seq(1, A)], ", "),
IsTracked = lists:member(F, TrackedFuncs),
[fun_header(F, Args)," ->\n",
generate_fun_body(IsTracked, BaseModule, RealBackendModule, F, Args)].

fun_header(F, Args) ->
[atom_to_list(F),"(",Args,")"].

-define(METRIC(Module, Op), [backends, Module, Op]).

generate_fun_body(false, _, RealBackendModule, F, Args) ->
[" ",RealBackendModule,":",fun_header(F, Args),".\n"];
generate_fun_body(true, BaseModule, RealBackendModule, F, Args) ->
FS = atom_to_list(F),
%% returned is the following
%% {Time, Result} = timer:tc(Backend, F, Args),
%% mongoose_metrics:update(?METRIC(Backend, F), Time),
%% Result.
[" {Time, Result} = timer:tc(",RealBackendModule,", ",FS,", [",Args,"]),\n",
" mongoose_metrics:update(",
io_lib:format("~p", [?METRIC(BaseModule, F)]),
", Time),\n",
" Result.\n"].

ensure_backend_metrics(Module, Ops) ->
EnsureFun = fun(Op) ->
case exometer:info(?METRIC(Module, Op), type) of
undefined ->
exometer:new(?METRIC(Module, Op), histogram);
_ ->
ok
end
end,
lists:foreach(EnsureFun, Ops).

-spec is_app_running(_) -> boolean().
is_app_running(AppName) ->
Expand Down
4 changes: 2 additions & 2 deletions apps/ejabberd/src/mod_last.erl
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
-include("mod_privacy.hrl").
-include("mod_last.hrl").

-define(BACKEND, (mod_last_backend:backend())).
-define(BACKEND, mod_last_backend).

%% ------------------------------------------------------------------
%% Backend callbacks
Expand Down Expand Up @@ -82,7 +82,7 @@
start(Host, Opts) ->
IQDisc = gen_mod:get_opt(iqdisc, Opts, one_queue),

gen_mod:start_backend_module(?MODULE, Opts),
gen_mod:start_backend_module(?MODULE, Opts, [get_last, set_last_info]),
?BACKEND:init(Host, Opts),

gen_iq_handler:add_iq_handler(ejabberd_local, Host,
Expand Down
8 changes: 5 additions & 3 deletions apps/ejabberd/src/mod_mam_muc_odbc_async_pool_writer.erl
Original file line number Diff line number Diff line change
Expand Up @@ -157,14 +157,14 @@ start_worker(WriterProc, N, Host) ->
5000,
worker,
[mod_mam_muc_odbc_async_writer]},
supervisor:start_child(ejabberd_sup, WriterChildSpec).
supervisor:start_child(mod_mam_sup, WriterChildSpec).


-spec stop_worker(atom()) -> 'ok'
| {'error','not_found' | 'restarting' | 'running' | 'simple_one_for_one'}.
stop_worker(Proc) ->
supervisor:terminate_child(ejabberd_sup, Proc),
supervisor:delete_child(ejabberd_sup, Proc).
supervisor:terminate_child(mod_mam_sup, Proc),
supervisor:delete_child(mod_mam_sup, Proc).


-spec start_link(atom(),_,_) -> 'ignore' | {'error',_} | {'ok',pid()}.
Expand Down Expand Up @@ -374,6 +374,8 @@ init([Host, N]) ->
%%--------------------------------------------------------------------
-spec handle_call('wait_flushing', _, state())
-> {'noreply', state()} | {'reply','ok',state()}.
handle_call(get_connection, _From, State=#state{conn = Conn}) ->
{reply, Conn, State};
handle_call(wait_flushing, _From, State=#state{acc=[]}) ->
{reply, ok, State};
handle_call(wait_flushing, From,
Expand Down
8 changes: 5 additions & 3 deletions apps/ejabberd/src/mod_mam_muc_odbc_async_writer.erl
Original file line number Diff line number Diff line change
Expand Up @@ -219,15 +219,15 @@ is_recent_entries_required(_End, _Now) ->
| {'ok','undefined' | pid(),_}.
start_server(Host) ->
WriterProc = srv_name(Host),
supervisor:start_child(ejabberd_sup, writer_child_spec(WriterProc, Host)).
supervisor:start_child(mod_mam_sup, writer_child_spec(WriterProc, Host)).


-spec stop_server(ejabberd:server()) -> 'ok'
| {'error','not_found' | 'restarting' | 'running' | 'simple_one_for_one'}.
stop_server(Host) ->
Proc = srv_name(Host),
supervisor:terminate_child(ejabberd_sup, Proc),
supervisor:delete_child(ejabberd_sup, Proc).
supervisor:terminate_child(mod_mam_sup, Proc),
supervisor:delete_child(mod_mam_sup, Proc).

writer_child_spec(WriterProc, Host) ->
{WriterProc,
Expand Down Expand Up @@ -282,6 +282,8 @@ init([Host]) ->
%%--------------------------------------------------------------------
-spec handle_call('wait_flushing',_, state()) -> {'noreply',state()}
| {'reply','ok',state()}.
handle_call(get_connection, _From, State=#state{conn = Conn}) ->
{reply, Conn, State};
handle_call(wait_flushing, _From, State=#state{acc=[]}) ->
{reply, ok, State};
handle_call(wait_flushing, From, State=#state{subscribers=Subs}) ->
Expand Down
8 changes: 5 additions & 3 deletions apps/ejabberd/src/mod_mam_odbc_async_pool_writer.erl
Original file line number Diff line number Diff line change
Expand Up @@ -175,11 +175,11 @@ start_worker(WriterProc, N, Host) ->
5000,
worker,
[mod_mam_odbc_async_writer]},
supervisor:start_child(ejabberd_sup, WriterChildSpec).
supervisor:start_child(mod_mam_sup, WriterChildSpec).

stop_worker(Proc) ->
supervisor:terminate_child(ejabberd_sup, Proc),
supervisor:delete_child(ejabberd_sup, Proc).
supervisor:terminate_child(mod_mam_sup, Proc),
supervisor:delete_child(mod_mam_sup, Proc).


start_link(ProcName, N, Host) ->
Expand Down Expand Up @@ -370,6 +370,8 @@ init([Host, N]) ->
%% {stop, Reason, State}
%% Description: Handling call messages
%%--------------------------------------------------------------------
handle_call(get_connection, _From, State=#state{conn = Conn}) ->
{reply, Conn, State};
handle_call(wait_flushing, _From, State=#state{acc=[]}) ->
{reply, ok, State};
handle_call(wait_flushing, From,
Expand Down
Loading