The Erlang code for running the simulated Mnesia transaction example
in the previous chapter is included in the
If you invoke the
mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).
And the viewer window will look like:
et_demo:sim_trans().
{ok,{table_handle,<0.30.0>,11,trace_ts,#Fun}}
2>
]]>
The
The
The
In order to simplify the startup of an
A simple one-liner starts the tool:
erl -pa ../examples -s et_demo
The filters are included by the following parameters:
The following piece of code
The
Now we run the
erl -pa ../examples -s et_demo live_trans
Erlang (BEAM) emulator version 2002.10.08 [source]
Eshell V2002.10.08 (abort with ^G)
1>
Please, explore the different filters in order to see how the traced transaction can be seen from different point of views:
The Event Tracer (ET) tool was initially written in order to demonstrate how messages where sent over the Megaco protocol. This were back in the old days before the standard bodies of IETF and ITU had approved Megaco (also called H.248) as an international standard.
In the Megaco application of Erlang/OTP, the code is carefully
instrumented with calls to
The
-module(megaco_filter).
-export([start/0]).
start() ->
Options =
[{event_order, event_ts},
{scale, 3},
{max_actors, infinity},
{trace_pattern, {megaco, max}},
{trace_global, true},
{dict_insert, {filter, megaco_filter}, fun filter/1},
{active_filter, megaco_filter},
{title, "Megaco tracer - Erlang/OTP"}],
et_viewer:start(Options).
First we start an Erlang node with the a global collector and
its viewer. The
erl -sname observer -s megaco_filter
Erlang (BEAM) emulator version 2002.10.08 [source]
Eshell V2002.10.08 (abort with ^G)
(observer@amrod)1> et_viewer: search for: [] ++ ["gateway_tt"]
Secondly we start another Erlang node which we connect the observer node, before we start the application that we want to trace. In this case we start a Media Gateway Controller that listens for both TCP and UDP on the text and binary ports for Megaco:
erl -sname mgc -pa ../../megaco/examples/simple
Erlang (BEAM) emulator version 2002.10.08 [source]
Eshell V2002.10.08 (abort with ^G)
(mgc@amrod)1> net:ping(observer@amrod).
pong
(mgc@amrod)2> megaco:start().
ok
(mgc@amrod)3> megaco_simple_mgc:start().
{ok,[{ok,2944,
{megaco_receive_handle,{deviceName,"controller"},
megaco_pretty_text_encoder,
[],
megaco_tcp}},
{ok,2944,
{megaco_receive_handle,{deviceName,"controller"},
megaco_pretty_text_encoder,
[],
megaco_udp}},
{ok,2945,
{megaco_receive_handle,{deviceName,"controller"},
megaco_binary_encoder,
[],
megaco_tcp}},
{ok,2945,
{megaco_receive_handle,{deviceName,"controller"},
megaco_binary_encoder,
[],
megaco_udp}}]}
(mgc@amrod)4>
And finally we start an Erlang node for the Media Gateways and connect to the observer node. Each Media Gateway connects to the controller and sends an initial Service Change message. The controller accepts the gateways and sends a reply to each one using the same transport mechanism and message encoding according to the preference of each gateway. That is all combinations of TCP/IP transport, UDP/IP transport, text encoding and ASN.1 BER encoding:
erl -sname mg -pa ../../megaco/examples/simple
Erlang (BEAM) emulator version 2002.10.08 [source]
Eshell V2002.10.08 (abort with ^G)
(mg@amrod)1> net:ping(observer@amrod).
pong
(mg@amrod)2> megaco_simple_mg:start().
[{{deviceName,"gateway_tt"},{error,{start_user,megaco_not_started}}},
{{deviceName,"gateway_tb"},{error,{start_user,megaco_not_started}}},
{{deviceName,"gateway_ut"},{error,{start_user,megaco_not_started}}},
{{deviceName,"gateway_ub"},{error,{start_user,megaco_not_started}}}]
(mg@amrod)3> megaco:start().
ok
(mg@amrod)4> megaco_simple_mg:start().
[{{deviceName,"gateway_tt"},
{1,
{ok,[{'ActionReply',0,
asn1_NOVALUE,
asn1_NOVALUE,
[{serviceChangeReply,
{'ServiceChangeReply',
[{megaco_term_id,false,["root"]}],
{serviceChangeResParms,
{'ServiceChangeResParm',
{deviceName|...},
asn1_NOVALUE|...}}}}]}]}}},
{{deviceName,"gateway_tb"},
{1,
{ok,[{'ActionReply',0,
asn1_NOVALUE,
asn1_NOVALUE,
[{serviceChangeReply,
{'ServiceChangeReply',
[{megaco_term_id,false,["root"]}],
{serviceChangeResParms,
{'ServiceChangeResParm',
{...}|...}}}}]}]}}},
{{deviceName,"gateway_ut"},
{1,
{ok,[{'ActionReply',0,
asn1_NOVALUE,
asn1_NOVALUE,
[{serviceChangeReply,
{'ServiceChangeReply',
[{megaco_term_id,false,["root"]}],
{serviceChangeResParms,
{'ServiceChangeResParm',{...}|...}}}}]}]}}},
{{deviceName,"gateway_ub"},
{1,
{ok,[{'ActionReply',0,
asn1_NOVALUE,
asn1_NOVALUE,
[{serviceChangeReply,
{'ServiceChangeReply',
[{megaco_term_id,false,["root"]}],
{serviceChangeResParms,
{'ServiceChangeResParm'|...}}}}]}]}}}]
(mg@amrod)5>
The Megaco adopted viewer looks like this, when we have clicked on the "gateway_tt" actor name in order to only display the events regarding that actor:
A pretty printed Megaco message looks like this:
And the corresponding internal form for the same Megaco message looks like this: