Skip to content

Commit a7decb8

Browse files
authored
Merge pull request #72 from esl/update-escalus
Extract common parts to helper modules
2 parents fe1ded4 + 2b66c40 commit a7decb8

8 files changed

+156
-252
lines changed

scenarios/mongoose_mam_read_and_send_msgs_with_metrics.erl

Lines changed: 9 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -29,22 +29,17 @@
2929
-export([start/1]).
3030
-export([init/0]).
3131

32-
-define(MESSAGES_CT, [amoc, counters, messages_sent]).
33-
-define(MESSAGE_TTD_CT, [amoc, times, message_ttd]).
34-
-define(MAM_READ_CT, [amoc, times, mam_last_10_read]).
32+
-define(MAM_READ_CT, mam_last_10_read).
3533

3634
-type binjid() :: binary().
3735

3836

3937
-spec init() -> ok.
4038
init() ->
41-
lager:info("init some metrics"),
42-
exometer:new(?MESSAGES_CT, spiral),
43-
exometer_report:subscribe(exometer_report_graphite, ?MESSAGES_CT, [one, count], 10000),
44-
exometer:new(?MESSAGE_TTD_CT, histogram),
45-
exometer_report:subscribe(exometer_report_graphite, ?MESSAGE_TTD_CT, [mean, min, max, median, 95, 99, 999], 10000),
46-
exometer:new(?MAM_READ_CT, histogram),
47-
exometer_report:subscribe(exometer_report_graphite, ?MAM_READ_CT, [mean, min, max, median, 95, 99, 999], 10000),
39+
lager:info("init metrics"),
40+
amoc_metrics:init(counters, amoc_metrics:messages_spiral_name()),
41+
amoc_metrics:init(times, amoc_metrics:message_ttd_histogram_name()),
42+
amoc_metrics:init(times, ?MAM_READ_CT),
4843
ok.
4944

5045
-spec user_spec(binary(), binary(), binary()) -> escalus_users:user_spec().
@@ -56,7 +51,8 @@ user_spec(ProfileId, Password, Res) ->
5651
{carbons, false},
5752
{stream_management, false},
5853
{resource, Res},
59-
{received_stanza_handlers, [fun measure_ttd/3]}
54+
{received_stanza_handlers, [fun amoc_xmpp_handlers:measure_ttd/3]},
55+
{sent_stanza_handlers, [fun amoc_xmpp_handlers:measure_sent_messages/2]}
6056
].
6157

6258
-spec make_user(amoc_scenario:user_id(), binary()) -> escalus_users:user_spec().
@@ -69,21 +65,9 @@ make_user(Id, R) ->
6965
-spec start(amoc_scenario:user_id()) -> any().
7066
start(MyId) ->
7167
Cfg = make_user(MyId, <<"res1">>),
68+
{ok, Client, _} = amoc_xmpp:connect_or_exit(Cfg),
7269

7370
IsChecker = MyId rem ?CHECKER_SESSIONS_INDICATOR == 0,
74-
75-
{ConnectionTime, ConnectionResult} = timer:tc(escalus_connection, start, [Cfg]),
76-
Client = case ConnectionResult of
77-
{ok, ConnectedClient, _} ->
78-
exometer:update([amoc, counters, connections], 1),
79-
exometer:update([amoc, times, connection], ConnectionTime),
80-
ConnectedClient;
81-
Error ->
82-
exometer:update([amoc, counters, connection_failures], 1),
83-
lager:error("Could not connect user=~p, reason=~p", [Cfg, Error]),
84-
exit(connection_failed)
85-
end,
86-
8771
do(IsChecker, MyId, Client),
8872

8973
timer:sleep(?SLEEP_TIME_AFTER_SCENARIO),
@@ -111,22 +95,6 @@ do(_Other, _MyId, Client) ->
11195
escalus_connection:set_filter_predicate(Client, fun escalus_pred:is_message/1),
11296
escalus_connection:wait_forever(Client).
11397

114-
measure_ttd(_Client, Stanza, Metadata) ->
115-
case Stanza of
116-
#xmlel{name = <<"message">>, attrs=Attrs} ->
117-
case lists:keyfind(<<"timestamp">>, 1, Attrs) of
118-
{_, Sent} ->
119-
Now = maps:get(recv_timestamp, Metadata),
120-
TTD = (Now - binary_to_integer(Sent)),
121-
exometer:update(?MESSAGE_TTD_CT, TTD);
122-
_ ->
123-
ok
124-
end;
125-
_ ->
126-
ok
127-
end,
128-
true.
129-
13098
-spec read_archive(escalus:client()) -> any().
13199
read_archive(Client) ->
132100
Payload = [#xmlel{name = <<"set">>,
@@ -143,7 +111,7 @@ read_archive(Client) ->
143111
Start = os:timestamp(),
144112
_IQResult = escalus_connection:get_stanza(Client, mam_result, 30000),
145113
Diff = timer:now_diff(os:timestamp(), Start),
146-
exometer:update(?MAM_READ_CT, Diff).
114+
amoc_metrics:update_time(?MAM_READ_CT, Diff).
147115

148116

149117
-spec send_presence_available(escalus:client()) -> ok.
@@ -173,7 +141,6 @@ send_message(Client, ToId, SleepTime) ->
173141
MsgIn = make_message(ToId),
174142
TimeStamp = integer_to_binary(usec:from_now(os:timestamp())),
175143
escalus_connection:send(Client, escalus_stanza:setattr(MsgIn, <<"timestamp">>, TimeStamp)),
176-
exometer:update([amoc, counters, messages_sent], 1),
177144
timer:sleep(SleepTime).
178145

179146
-spec make_message(binjid()) -> exml:element().

scenarios/mongoose_pubsub_docker.erl

Lines changed: 13 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,18 @@
2020
-define(WAIT_FOR_STANZA_TIMEOUT, 10000).
2121
-define(PUBSUB_ADDR, <<"pubsub.localhost">>).
2222

23-
-define(PUBSUB_NODES_CT, [amoc, counters, pubsub_nodes]).
24-
-define(SUBSCRIPTIONS_CT, [amoc, counters, subscriptions]).
25-
-define(ITEMS_SENT_CT, [amoc, counters, items_sent]).
26-
-define(ITEMS_RECEIVED_CT, [amoc, counters, items_received]).
23+
-define(PUBSUB_NODES_CT, pubsub_nodes).
24+
-define(SUBSCRIPTIONS_CT, subscriptions).
25+
-define(ITEMS_SENT_CT, items_sent).
26+
-define(ITEMS_RECEIVED_CT, items_received).
2727

2828
-spec init() -> ok.
2929
init() ->
3030
set_env_interarrival(),
31-
exometer:new(?PUBSUB_NODES_CT, counter),
32-
exometer_report:subscribe(exometer_report_graphite, ?PUBSUB_NODES_CT, [value], 10000),
33-
exometer:new(?SUBSCRIPTIONS_CT, counter),
34-
exometer_report:subscribe(exometer_report_graphite, ?SUBSCRIPTIONS_CT, [value], 10000),
35-
exometer:new(?ITEMS_SENT_CT, spiral),
36-
exometer_report:subscribe(exometer_report_graphite, ?ITEMS_SENT_CT, [one, count], 10000),
37-
exometer:new(?ITEMS_RECEIVED_CT, spiral),
38-
exometer_report:subscribe(exometer_report_graphite, ?ITEMS_RECEIVED_CT, [one, count], 10000),
31+
amoc_metrics:init(counters, ?PUBSUB_NODES_CT),
32+
amoc_metrics:init(counters, ?SUBSCRIPTIONS_CT),
33+
amoc_metrics:init(counters, ?ITEMS_SENT_CT),
34+
amoc_metrics:init(counters, ?ITEMS_RECEIVED_CT),
3935
ok.
4036

4137
-spec start(amoc_scenario:user_id()) -> no_return().
@@ -79,22 +75,22 @@ verify_item_notification(MyId, Stanza) ->
7975
{element, <<"items">>},
8076
{element, <<"item">>},
8177
{element, <<"entry">>}]),
82-
exometer:update(?ITEMS_RECEIVED_CT, 1).
78+
amoc_metrics:update_counter(?ITEMS_RECEIVED_CT, 1).
8379

8480
verify_subscribe_response(MyId, Stanza) ->
8581
lager:debug("Subscriber ~p got subscription response.", [MyId]),
8682
<<"subscribed">> = exml_query:path(Stanza, [{element, <<"pubsub">>},
8783
{element, <<"subscription">>},
8884
{attr, <<"subscription">>}]),
89-
exometer:update(?SUBSCRIPTIONS_CT, 1).
85+
amoc_metrics:update_counter(?SUBSCRIPTIONS_CT, 1).
9086

9187
create_pubsub_node(Client, Node) ->
9288
Id = id(Client, Node, <<"create">>),
9389
Request = escalus_pubsub_stanza:create_node(Client, Id, Node, []),
9490
escalus:send(Client, Request),
9591
Response = escalus:wait_for_stanza(Client, ?WAIT_FOR_STANZA_TIMEOUT),
9692
true = escalus_pred:is_iq_result(Response),
97-
exometer:update(?PUBSUB_NODES_CT, 1).
93+
amoc_metrics:update_counter(?PUBSUB_NODES_CT, 1).
9894

9995
%% delete_pubsub_node(Client, Node) ->
10096
%% Id = id(Client, Node, <<"delete">>),
@@ -109,7 +105,7 @@ publish(Client, ItemId, Node) ->
109105
escalus:send(Client, Request),
110106
Response = escalus:wait_for_stanza(Client, ?WAIT_FOR_STANZA_TIMEOUT),
111107
true = escalus_pred:is_iq_result(Response),
112-
exometer:update(?ITEMS_SENT_CT, 1).
108+
amoc_metrics:update_counter(?ITEMS_SENT_CT, 1).
113109

114110
item_content() ->
115111
#xmlel{name = <<"entry">>,
@@ -150,17 +146,7 @@ id(Client, {NodeAddr, NodeName}, Suffix) ->
150146

151147
connect_amoc_user(MyId) ->
152148
User = make_user(MyId, <<"res1">>),
153-
{ConnectionTime, ConnectionResult} = timer:tc(escalus_connection, start, [User]),
154-
Client0 = case ConnectionResult of
155-
{ok, ConnectedClient, _, _} ->
156-
exometer:update([amoc, counters, connections], 1),
157-
exometer:update([amoc, times, connection], ConnectionTime),
158-
ConnectedClient;
159-
Error ->
160-
exometer:update([amoc, counters, connection_failures], 1),
161-
lager:error("Could not connect user=~p, reason=~p", [User, Error]),
162-
exit(connection_failed)
163-
end,
149+
{ok, Client0, _} = amoc_xmpp:connect_or_exit(User),
164150
Client = Client0#client{jid = make_jid(MyId)},
165151
send_presence_available(Client),
166152
receive_presence(Client, Client),

scenarios/mongoose_simple_docker.erl

Lines changed: 6 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,13 @@
2626
-export([start/1]).
2727
-export([init/0]).
2828

29-
-define(MESSAGES_CT, [amoc, counters, messages_sent]).
30-
-define(MESSAGE_TTD_CT, [amoc, times, message_ttd]).
31-
3229
-type binjid() :: binary().
3330

3431
-spec init() -> ok.
3532
init() ->
36-
lager:info("init some metrics"),
37-
exometer:new(?MESSAGES_CT, spiral),
38-
exometer_report:subscribe(exometer_report_graphite, ?MESSAGES_CT, [one, count], 10000),
39-
exometer:new(?MESSAGE_TTD_CT, histogram),
40-
exometer_report:subscribe(exometer_report_graphite, ?MESSAGE_TTD_CT, [mean, min, max, median, 95, 99, 999], 10000),
33+
lager:info("init metrics"),
34+
amoc_metrics:init(counters, amoc_metrics:messages_spiral_name()),
35+
amoc_metrics:init(times, amoc_metrics:message_ttd_histogram_name()),
4136
ok.
4237

4338
-spec user_spec(binary(), binary(), binary()) -> escalus_users:user_spec().
@@ -49,7 +44,8 @@ user_spec(ProfileId, Password, Res) ->
4944
{carbons, false},
5045
{stream_management, false},
5146
{resource, Res},
52-
{received_stanza_handlers, [fun measure_ttd/3]}
47+
{received_stanza_handlers, [fun amoc_xmpp_handlers:measure_ttd/3]},
48+
{sent_stanza_handlers, [fun amoc_xmpp_handlers:measure_sent_messages/2]}
5349
].
5450

5551
-spec make_user(amoc_scenario:user_id(), binary()) -> escalus_users:user_spec().
@@ -62,21 +58,9 @@ make_user(Id, R) ->
6258
-spec start(amoc_scenario:user_id()) -> any().
6359
start(MyId) ->
6460
Cfg = make_user(MyId, <<"res1">>),
61+
{ok, Client, _} = amoc_xmpp:connect_or_exit(Cfg),
6562

6663
IsChecker = MyId rem ?CHECKER_SESSIONS_INDICATOR == 0,
67-
68-
{ConnectionTime, ConnectionResult} = timer:tc(escalus_connection, start, [Cfg]),
69-
Client = case ConnectionResult of
70-
{ok, ConnectedClient, _} ->
71-
exometer:update([amoc, counters, connections], 1),
72-
exometer:update([amoc, times, connection], ConnectionTime),
73-
ConnectedClient;
74-
Error ->
75-
exometer:update([amoc, counters, connection_failures], 1),
76-
lager:error("Could not connect user=~p, reason=~p", [Cfg, Error]),
77-
exit(connection_failed)
78-
end,
79-
8064
do(IsChecker, MyId, Client),
8165

8266
timer:sleep(?SLEEP_TIME_AFTER_SCENARIO),
@@ -98,24 +82,6 @@ do(_Other, _MyId, Client) ->
9882
send_presence_available(Client),
9983
escalus_connection:wait_forever(Client).
10084

101-
102-
measure_ttd(_Client, Stanza, Metadata) ->
103-
case Stanza of
104-
#xmlel{name = <<"message">>, attrs=Attrs} ->
105-
case lists:keyfind(<<"timestamp">>, 1, Attrs) of
106-
{_, Sent} ->
107-
Now = maps:get(recv_timestamp, Metadata),
108-
TTD = (Now - binary_to_integer(Sent)),
109-
exometer:update(?MESSAGE_TTD_CT, TTD);
110-
_ ->
111-
ok
112-
end;
113-
_ ->
114-
ok
115-
end,
116-
true.
117-
118-
11985
-spec send_presence_available(escalus:client()) -> ok.
12086
send_presence_available(Client) ->
12187
Pres = escalus_stanza:presence(<<"available">>),
@@ -144,7 +110,6 @@ send_message(Client, ToId, SleepTime) ->
144110
MsgIn = make_message(ToId),
145111
TimeStamp = integer_to_binary(usec:from_now(os:timestamp())),
146112
escalus_connection:send(Client, escalus_stanza:setattr(MsgIn, <<"timestamp">>, TimeStamp)),
147-
exometer:update([amoc, counters, messages_sent], 1),
148113
timer:sleep(SleepTime).
149114

150115
-spec make_message(binjid()) -> exml:element().

scenarios/mongoose_simple_reconnect.erl

Lines changed: 11 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -29,21 +29,16 @@
2929
-export([start/1]).
3030
-export([init/0]).
3131

32-
-define(MESSAGES_CT, [amoc, counters, messages_sent]).
33-
-define(RECONNECTS_CT, [amoc, counters, reconnects]).
34-
-define(MESSAGE_TTD_CT, [amoc, times, message_ttd]).
32+
-define(RECONNECTS_CT, reconnects).
3533

3634
-type binjid() :: binary().
3735

3836
-spec init() -> ok.
3937
init() ->
40-
lager:info("init some metrics"),
41-
exometer:new(?MESSAGES_CT, spiral),
42-
exometer_report:subscribe(exometer_report_graphite, ?MESSAGES_CT, [one, count], 10000),
43-
exometer:new(?RECONNECTS_CT, spiral),
44-
exometer_report:subscribe(exometer_report_graphite, ?RECONNECTS_CT, [one, count], 10000),
45-
exometer:new(?MESSAGE_TTD_CT, histogram),
46-
exometer_report:subscribe(exometer_report_graphite, ?MESSAGE_TTD_CT, [mean, min, max, median, 95, 99, 999], 10000),
38+
lager:info("init metrics"),
39+
amoc_metrics:init(counters, amoc_metrics:messages_spiral_name()),
40+
amoc_metrics:init(times, amoc_metrics:message_ttd_histogram_name()),
41+
amoc_metrics:init(counters, ?RECONNECTS_CT),
4742
ok.
4843

4944
-spec user_spec(binary(), binary(), binary()) -> escalus_users:user_spec().
@@ -54,7 +49,9 @@ user_spec(ProfileId, Password, Res) ->
5449
{password, Password},
5550
{carbons, false},
5651
{stream_management, false},
57-
{resource, Res}
52+
{resource, Res},
53+
{received_stanza_handlers, [fun amoc_xmpp_handlers:measure_ttd/3]},
54+
{sent_stanza_handlers, [fun amoc_xmpp_handlers:measure_sent_messages/2]}
5855
].
5956

6057
-spec make_user(amoc_scenario:user_id(), binary()) -> escalus_users:user_spec().
@@ -72,7 +69,7 @@ start(MyId) ->
7269
exit(shutdown);
7370
Exit:Reason ->
7471
lager:error("reconnection due to ~p ~p", [Exit, Reason]),
75-
exometer:update(?RECONNECTS_CT, 1),
72+
amoc_metrics:update_counter(?RECONNECTS_CT),
7673
timer:sleep(?SLEEP_TIME_BEFORE_RECONNECT),
7774
start(MyId)
7875
end.
@@ -84,17 +81,7 @@ session(MyId) ->
8481

8582
IsChecker = MyId rem ?CHECKER_SESSIONS_INDICATOR == 0,
8683

87-
{ConnectionTime, ConnectionResult} = timer:tc(escalus_connection, start, [Cfg]),
88-
Client = case ConnectionResult of
89-
{ok, ConnectedClient, _, _} ->
90-
exometer:update([amoc, counters, connections], 1),
91-
exometer:update([amoc, times, connection], ConnectionTime),
92-
ConnectedClient;
93-
Error ->
94-
exometer:update([amoc, counters, connection_failures], 1),
95-
lager:error("Could not connect user=~p, reason=~p", [Cfg, Error]),
96-
exit(connection_failed)
97-
end,
84+
{ok, Client, _} = amoc_xmpp:connect_or_exit(Cfg),
9885

9986
do(IsChecker, MyId, Client),
10087

@@ -115,32 +102,7 @@ do(false, MyId, Client) ->
115102
do(_Other, _MyId, Client) ->
116103
lager:info("checker"),
117104
send_presence_available(Client),
118-
process_flag(trap_exit, true),
119-
receive_forever(Client).
120-
121-
-spec receive_forever(escalus:client()) -> no_return().
122-
receive_forever(#client{rcv_pid = Pid}=Client) ->
123-
receive
124-
{stanza, Client, Stanza} ->
125-
Now = usec:from_now(os:timestamp()),
126-
case Stanza of
127-
#xmlel{name = <<"message">>, attrs=Attrs} ->
128-
case lists:keyfind(<<"timestamp">>, 1, Attrs) of
129-
{_, Sent} ->
130-
TTD = (Now - binary_to_integer(Sent)),
131-
exometer:update(?MESSAGE_TTD_CT, TTD);
132-
_ ->
133-
ok
134-
end;
135-
_ ->
136-
ok
137-
end;
138-
{'EXIT', Pid, normal} ->
139-
exit(connection_died);
140-
{'EXIT', _, shutdown} ->
141-
exit(shutdown)
142-
end,
143-
receive_forever(Client).
105+
escalus_connection:wait_forever(Client).
144106

145107
-spec send_presence_available(escalus:client()) -> ok.
146108
send_presence_available(Client) ->
@@ -170,7 +132,6 @@ send_message(Client, ToId, SleepTime) ->
170132
MsgIn = make_message(ToId),
171133
TimeStamp = integer_to_binary(usec:from_now(os:timestamp())),
172134
escalus_connection:send(Client, escalus_stanza:setattr(MsgIn, <<"timestamp">>, TimeStamp)),
173-
exometer:update([amoc, counters, messages_sent], 1),
174135
timer:sleep(SleepTime).
175136

176137
-spec make_message(binjid()) -> exml:element().

0 commit comments

Comments
 (0)