The two major components of the Event Tracer (ET)
tool is a graphical sequence chart viewer (
The interface between the collector and its viewers
is public in order to enable other types of viewers.
However in the following text we will focus on usage
of the
The main start function is
{ok, Viewer} = et_viewer:start([]).
{ok,<0.31.0>}
]]>
A viewer gets trace events from its collector
by polling it regularly for more events to display.
Trace events are for example reported to the collector with
Collector = et_viewer:get_collector_pid(Viewer).
<0.30.0>
3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, start_outer,
"Start outer transaction"),
3> et_collector:report_event(Collector, 40, mnesia_tm, my_shell, new_tid,
"New transaction id is 4711"),
3> et_collector:report_event(Collector, 20, my_shell, mnesia_locker, try_write_lock,
"Acquire write lock for {my_tab, key}"),
3> et_collector:report_event(Collector, 10, mnesia_locker, my_shell, granted,
"You got the write lock for {my_tab, key}"),
3> et_collector:report_event(Collector, 60, my_shell, do_commit,
"Perform transaction commit"),
3> et_collector:report_event(Collector, 40, my_shell, mnesia_locker, release_tid,
"Release all locks for transaction 4711"),
3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, delete_transaction,
"End of outer transaction"),
3> et_collector:report_event(Collector, 20, my_shell, end_outer,
"Transaction returned {atomic, ok}").
{ok,{table_handle,<0.30.0>,11,trace_ts,#Fun}}
4>
]]>
This is a simulation of the process events caused by a Mnesia transaction that writes a record in a local table:
mnesia:transaction(fun() -> mnesia:write({my_tab, key, val}) end).
At this stage when we have a couple of events, it is time to
show how it looks like in the graphical interface of
In the sequence chart, the actors (which symbolically has performed the traced event) are shown as named vertical bars. The order of the actors may be altered by dragging (hold mouse button 1 pressed during the operation) the name tag of an actor and drop it elsewhere:
An event may be an action performed by one single actor (blue text label) or it may involve two actors and is then depicted as an arrow directed from one actor to another (red text label). Details of an event can be shown by clicking (press and release the mouse button 1) on the event label text or on the arrow:
The Event Tracer (ET) uses named filters in various
contexts. An Event Trace filter is an
filter(TraceData) -> true | {true, NewEvent} | false
TraceData = NewEvent | term()
NewEvent = record(event)
The interface of the filter function is the same as the the
filter functions for the good old
The first filter that the trace data is exposed for is
the collector filter. When a trace event is reported with
The collector filter (that is the filter named
The collector manages a key/value based dictionary, where the filters are stored. Updates of the dictionary is propagated to all subscribing processes. When a viewer is started it is registered as a subscriber of dictionary updates.
In a viewer there is only one filter that is active
and all trace events that the viewer gets from the
collector will pass thru that filter. By writing clever
filters it is possible to customize how the events
looks like in the viewer. The following filter replaces
the actor names
If we now add the filter to the running collector:
Fun = fun(E) -> et_demo:mgr_actors(E) end.
#Fun
5> et_collector:dict_insert(Collector, {filter, mgr_actors}, Fun).
ok
6>
]]>
you will see that the
In order to see the nitty gritty details of an event
you may click on the event in order to start a contents
viewer for that event. In the contents viewer there is
also a filter menu in order to enable inspection of the
event from other views than the one selected in the viewer.
A click on the
Select the
As you have seen it is possible to use the
There are also existing functions in the API that reads from
various sources and calls
The trace events that are hosted by the collector may be
stored to file and later be loaded by selecting
It is also possible to perform live tracing of a running
system by making use of the built-in trace support in
the Erlang emulator. These Erlang traces can be directed
to files or to ports. See the reference manual for
There are also corresponding trace client types that can
read the Erlang trace data format from such files or ports.
The
The default collector filter converts the Erlang trace data
format into event-records.If you want to perform this
differently you can of course write your own collector
filter from scratch. But it may probably save you some
efforts if you first apply the default filter in
Setting up an Erlang tracer on a set of nodes and connecting
trace clients to the ports of these tracers is not intuitive. In order
to make this it easier the Event Tracer as a notion of global
tracing. When used, the
In order to further simplify the tracing you can make use of the
In normal operation the
One nice thing with the
Almost all functionality available in the
File menu:
Close Collector and all Viewers - Close the collector and all viewers connected to that collector.
Close other Viewers, but keep Collector - Keep this viewer and its collector, but close all other viewers connected to this collector.
Close this Viewer, but keep Collector - Close this viewer, but all other viewers and the collector.
Save Collector to file - Save all events stored in the collector to file.
Load Collector from file - Load the collector with events from a file.
Viewer menu:
First - Scroll
Prev - Scroll
Next - Scroll
Last - Scroll
Refresh - Clear
Up 5 - Scroll 5 events backwards.
Down 5 - Scroll 5 events forward.
Abort search. Display all. - Switch the display mode to show all events regardless of any ongoing searches. Abort the searches.
Collector menu:
First - Scroll
Prev - Scroll
Next - Scroll
Last - Scroll
Refresh - Clear
Filters menu:
ActiveFilter (=) - Start a new viewer window with the same active filter and scale as the current one.
ActiveFilter (+) - Start a new viewer window with the same active filter but a larger scale than the current one.
ActiveFilter (-) - Start a new viewer window with the same active filter but a smaller scale than the current one.
collector (0) - Start a new viewer with the collector filter as active filter.
AnotherFilter (2) - If more filters are inserted into
the dictionary, these will turn up here as entries
in the
Slider and radio buttons:
Freeze - When true, this means that the viewer will not read more events from the collector until set to false.
Hide From=To - When true, this means that the viewer will hide all events where the from-actor equals to its to-actor.
Hide Unknown - When true, this means that the viewer
will hide all events where either of the from-actor or
to-actor is
Detail level - This slider controls the resolution
of the viewer. Only events with a detail level
Other features:
Display details of an event - Click on the event name and a new window will pop up, displaying the contents of an event.
Toggle actor search - Normally the viewer will be in a display mode where all events are shown. By clicking on an actor name the tool will switch display mode to only show events with selected actors.
Click on an actor and only events with that actor will be displayed. Click on another actor to include that actor to the selected ones. Clicking on an already selected actor will remove it from the collections of selected actors. When the collection of selected actors becomes empty the normal mode where all actors are shown will be entered again.
Abort actor search with the
Move actor - Drag and drop an actor by first clicking on the actor name, keeping the button pressed while moving the cursor to a new location and release the button where the actor should be moved to.
The event-records in the ets-table are ordered by their timestamp.
Which timestamp that should be used is controlled via the
File menu:
Close - Close this window.
Save - Save the contents of this window to file.
Filters menu:
ActiveFilter - Start a new contents viewer window with the same active filter.
AnotherFilter (2) - If more filters are inserted into
the dictionary, these will turn up here as entries
in the
Hide menu:
Hide actor in viewer - Known actors are shown as a named vertical bars in the viewer window. By hiding the actor, its vertical bar will be removed and the viewer will be refreshed.
Hiding the actor is only useful if the
Show actor in viewer - This implies that the actor will be added as a known actor in the viewer with its own vertical bar.
Search menu:
Forward from this event - Set this event to be the first event in the viewer and change its display mode to be enter forward search mode. The actor of this event (from, to or both) will be added to the list of selected actors.
Reverse from this event - Set this event to be the first event in the viewer and change its display mode to be enter reverse search mode. The actor of this event (from, to or both) will be added to the list of selected actors. Observe, that the events will be shown in reverse order.
Abort search. Display all - Switch the display mode of the viewer to show all events regardless of any ongoing searches. Abort the searches.