3. Description
3.说明
3.1概览
该Event Tracer (ET)
工具的两个主要组件是图形序列图表查看器(et_viewer
)及其后备存储(et_collector
)。Collector
可以同时使用一个备份存储器,Viewers
其中每个可以显示相同跟踪数据的不同视图。
Collector
与其之间的接口Viewers
是公开的,以便启用其他类型的接口Viewers
。但是,在下面的文本中,我们将重点介绍使用et_viewer
。
主要启动功能是et_viewer:start/1
默认情况下,它将同时启动两个et_collector
和一个et_viewer
*
% erl -pa et/examples
Erlang R13B03 (erts-5.7.4) [64-bit] [smp:4:4] [rq:4] [async-threads:0] [kernel-poll:false]
Eshell V5.7.4 (abort with ^G)
1> {ok, Viewer} = et_viewer:start([]).
{ok,<0.40.0>}
阿Viewer
获取跟踪Events
从它Collector
定期轮询Events
展示。Events
例如,向Collector
带着et_collector:report_event/6
*
2> Collector = et_viewer:get_collector_pid(Viewer).
<0.39.0>
3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, start_outer,
3> "Start outer transaction"),
3> et_collector:report_event(Collector, 40, mnesia_tm, my_shell, new_tid,
3> "New transaction id is 4711"),
3> et_collector:report_event(Collector, 20, my_shell, mnesia_locker, try_write_lock,
3> "Acquire write lock for {my_tab, key}"),
3> et_collector:report_event(Collector, 10, mnesia_locker, my_shell, granted,
3> "You got the write lock for {my_tab, key}"),
3> et_collector:report_event(Collector, 60, my_shell, do_commit,
3> "Perform transaction commit"),
3> et_collector:report_event(Collector, 40, my_shell, mnesia_locker, release_tid,
3> "Release all locks for transaction 4711"),
3> et_collector:report_event(Collector, 60, my_shell, mnesia_tm, delete_transaction,
3> "End of outer transaction"),
3> et_collector:report_event(Collector, 20, my_shell, end_outer,
3> "Transaction returned {atomic, ok}").
{ok,{table_handle,<0.39.0>,16402,trace_ts,
#Fun<et_collector.0.62831470>}}
这实际上是对过程的模拟。Events
由Mnesia
在本地表中写入记录的事务:
mnesia:transaction(fun() -> mnesia:write{my_tab, key, val}) end).
在这个阶段我们有几个Events
的图形界面中显示它的外观。et_viewer
*
图3.1:一个模拟Mnesia事务,它写入一个记录
在序列图中,演员(象征性地执行过的Event
)被显示为命名的竖线。演员的顺序可以通过拖动(操作过程中按住鼠标按钮1)演员的姓名标签并将其放在其他位置来更改:
图3.2:两个角色已经切换了位置
一个Event
可能是由一个演员(蓝色文本标签)执行的动作,或者可能涉及两个演员,然后被描绘为从一个演员指向另一个演员的箭头(红色文本标签)。Event
可以通过在事件标签文本或箭头上单击(按下并释放鼠标按钮1)来显示详细信息。当这样做时会Contents Viewer
弹出一个窗口。它可能看起来像这样:
图3.3:写锁消息的详细信息
3.2过滤器和字典
这些Event Tracer (ET)
用途在各种情况下命名为过滤器。事件跟踪过滤器是一种Erlang fun
将一些跟踪数据作为输入并返回其可能的修改版本:
filter(TraceData) -> false | true | {true, NewEvent}
TraceData = Event | erlang_trace_data()
Event = #event{}
NewEvent = #event{}
过滤功能的界面与旧版过滤功能相同lists:filtermap/2
。如果过滤器返回,false
则意味着跟踪数据应该静默地被丢弃。true
意味着跟踪数据数据已经是一个Event Record
并且应该保持原样。true
意味着TraceData
已经是一个Event Record
并且它应该保持原样。{true, NewEvent}
意味着原始追踪数据应该被替换Event
。这提供了摆脱不必要的手段,Events
以及启用一个替代视图Event
。
跟踪数据暴露的第一个过滤器是Collector Filter
。当跟踪(或)发生的第一件事情Event
被报告时,是否将消息发送到进程以获取包含一些有用内容的句柄,例如和Ets表标识符。然后应用,如果它返回(或),则将被存储在Ets表中。作为优化,随后对函数的调用可以直接使用句柄而不是。et_collector:report/2et_collector:report_event/5,6CollectorCollector Filter FunCollector Filter Funtrue{true, NewEvent}Eventet_collector:reportCollector Pid
所有过滤器(注册在 Collector
或中Viewer
)必须能够处理Event record
输入。的Collector Filter
(即指定的过滤器all
)是一个有点特殊,因为它的输入也可以是原始Erlang Trace Data
该Collector
管理基于键/值字典,当过滤器存储。字典的更新传播到所有订阅进程。当a Viewer
开始时,它被注册为词典更新的订阅者。
在每个Viewer
只有一个过滤器,是活动的,所有跟踪Events
的Viewer
获取从Collector
将直通该过滤器。通过编写聪明的过滤器,可以自定义Events
查看器中的外观。下面的过滤器et/examples/et_demo.erl
替换参与者名称mnesia_tm
,mnesia_locker
并保留记录中的所有其他内容,如下所示:
mgr_actors(E) when is_record(E, event) ->
Actor = fun(A) ->
case A of
mnesia_tm -> trans_mgr;
mnesia_locker -> lock_mgr;
_ -> A
end
end,
{true, E#event{from = Actor(E#event.from),
to = Actor(E#event.to),
contents = [{orig_from, E#event.from},
{orig_to, E#event.to},
{orig_contents, E#event.contents}]}}.
如果我们现在将筛选器添加到运行的Collector
*
4> Fun = fun(E) -> et_demo:mgr_actors(E) end.
#Fun<erl_eval.6.13229925>
5> et_collector:dict_insert(Collector, {filter, mgr_actors}, Fun).
ok
你会看到Filter
所有观众的菜单中都有一个新的条目mgr_actors
。选择它,Viewer
会弹出一个新窗口:
图3.4:不同视图中相同的跟踪数据
为了能看到的细节问题详细信息Event
您可以点击Event
以开始Contents Viewer
为Event
。在Contents Viewer
这里还有一个过滤器菜单,可以Event
查看除查看器中选择的其他视图以外的其他视图。点击该按钮new_tid
Event
将会Contents Viewer
弹出一个窗口,Event
在mgr_actors
视图中显示:
图3.5:Mgr中的跟踪事件[医]行动者观
选择菜单中的all
条目,将会弹出Filters
一个新Contents Viewer window
窗口Event
,在收集器视图中显示相同的轨迹:
图3.6:收集器视图中的相同跟踪事件
3.3名追踪客户
如您所见,可以使用et_collector:report_event/5,6
函数显式。通过使用这些函数,您可以编写自己的跟踪客户端,该客户端可以从存储在任何格式的任何源中读取跟踪数据,只需向Collector
用它。您可以替换默认的Collector Filter
使用过滤器将新的令人兴奋的跟踪数据格式转换为Event Records
或者您可以将其转换为Event Record
在你调用et_collector:report/2
然后依赖于默认的Collector Filter
来处理新格式。
API中还有现有的函数可以读取各种来源和调用et_collector:report/2
:
Events
由该托管的跟踪Collector
可以被存储到文件中,并且随后可以通过在菜单中或通过API 选择save
和load
输入来加载。Viewers
Fileet_collector
- 通过使用Erlang仿真器中的内置跟踪支持,还可以对正在运行的系统执行实时跟踪。这些Erlang跟踪可以定向到文件或端口。请参阅参考手册
erlang:trace/4
,erlang:trace_pattern/3
,dbg
并ttb
获取更多信息。
还有相应的跟踪客户端类型可以从这些文件或端口读取Erlang跟踪数据格式。该et_collector:start_trace_client/3
函数使用这些Erlang跟踪客户端并将跟踪数据重定向到Collector
。
默认Collector Filter
将原始Erlang跟踪数据格式转换为Event Records
如果你想用不同的方式来做这件事,你当然可以自己写Collector Filter
从零开始。但是,如果您首先将默认的过滤器应用到et_selector:parse_event/2
在应用您自己对其输出的转换之前。
3.4 全局追踪
在一组节点上设置Erlang跟踪器并将跟踪客户端连接到这些跟踪器的端口并不直观。为了使这更容易,Event Tracer
有一个全球追踪的概念。在使用时,该et_collector
进程将监视Erlang节点,并且当连接时,将在新连接的节点上自动启动Erlang跟踪器。相应的跟踪客户端也将在Collector
节点上启动,以便自动将跟踪转发Events
给Collector
。设置布尔参数trace_global
,以true
供无论是et_collector
或et_viewer
,以激活全球跟踪。对可以拥有多少个并发(匿名)收集器没有限制,但是您的名称只能在其中注册一个全局
Collectorglobal
.
为了进一步简化跟踪,您可以使用这些et:trace_me/4,5
功能。这些函数旨在Events
在需要突出显示的应用程序中有趣时从其他应用程序调用。这些功能非常轻巧,因为除了返回一个原子之外,它们什么也不做。这些功能专门用于追踪。由于调用者明确提供了Event Record
字段的值,所以默认情况下Collector Filter
能够自动提供定制,Event Record
而不需要任何用户定义的过滤器函数。
在正常操作中,et:trace_me/4,5
通话几乎是免费的。当需要跟踪时,您可以明确地激活对这些功能的跟踪。或者你可以结合使用trace_global
和使用trace_pattern
。设置后,trace_pattern
将自动在所有连接的节点上激活。
与此相关的一个好处trace_pattern
是,它提供了一种非常简单的方法,通过允许您显式控制跟踪的详细级别来最小化生成的跟踪数据量。正如你可能已经看到et_viewer
有一个叫滑块的滑块"Detail Level"
,它允许你控制在中Events
显示的轨迹的细节级别Viewer
。另一方面,如果你在中设置了一个较低的细节级别trace_pattern
,很多跟踪数据将永远不会生成,因此不会通过套接字发送到跟踪客户端并存储在Collector
。
3.5查看器窗口
几乎所有可用的功能et_viewer都可以通过快捷方式获得。显示与选择菜单条目具有相同效果的关键字显示在括号内。例如,按下键r就相当于选择菜单条目Viewer->Refresh。
文件菜单:
Clear all events in the Collector
- 删除所有Events
存储在Collector
并通知所有连接Viewers
有关此。
Load events to the Collector from file
-载入Collector
与Events
从文件,并通知所有连接的Viewers
这个问题。
Save all events in the Collector to file
- 保存所有Events
存储在Collector
文件中。
Print setup
- 可以编辑打印机设置,如纸张和版面。
Print current page
- 在当前页面上打印事件。页面大小取决于选定的纸张类型。
Print all pages
-打印所有事件。页面大小取决于选定的纸张类型。
Close this Viewer
- 关闭此Viewer
窗口,但保留所有其他Viewers
窗口和Collector
过程。
Close other Viewers, but this
-保持此Viewer
窗口及其Collector
过程,但关闭所有其他Viewers
windowsconnected相同的Collector
。
Close all Viewers and the Collector
-关闭Collector
所有Viewers
与它相连。查看菜单:
First
-滚动this
观众在第一Event
的Collector
。
Last
-滚动this
浏览到最后Event
的Collector
。
Prev
-this
向后滚动查看器一页。
Next
-this
向前滚动查看器一页。
Refresh
-信息交换所this
查看并重读其Events
从Collector
...
Up
-Events
向后滚动几个。
Down
-Events
向前滚动几个。
Display all actors.
-重置隐藏和/或突出显示的行为者的设置。收集器菜单:
First
-滚动all
观众第一Event
的Collector
。
Last
-滚动all
观众到最后Event
的Collector
。
Prev
-all
向后滚动一页查看者。
Next
-all
向前滚动一页查看者。
Refresh
-清除all
浏览器和重新阅读他们Events
从Collector
。
过滤器和缩放菜单:
ActiveFilter (=)
-开始一个新的Viewer
窗口具有与当前窗口相同的活动过滤器和缩放。
ActiveFilter (+)
-开始一个新的Viewer
窗口具有相同的有源滤波器,但比当前的窗口更大。
ActiveFilter (-)
-开始一个新的Viewer
窗口具有相同的有源过滤器,但比当前的窗口小。
all (0)
-开始一个新的Viewer
带着Collector Filter
作为有源滤波器。它将导致查看收集器中的所有事件。
AnotherFilter (2)
-如果在字典中插入更多筛选器,这些过滤器将在此处显示为Filters
菜单。第二个过滤器将得到快捷方式2,下一个数字3等。名称是排序的。滑块和单选按钮:
Hide From=To
-如果是真的,这意味着Viewer
会隐藏一切Events
其中,从演员等于它的演员。这些事件有时被称为行动。
Hide (excluded actors)
- 当为真时,这意味着该Viewer
意志将隐藏所有Events
被标记为排除的角色。排除在外的演员通常会在括号内加上圆括号Viewer
。
Detail level
- 这个滑块控制的分辨率Viewer
。仅显示比选定Events
的细节级别smaller
(默认值= 100 =最大)的细节级别。
其他特点:
Vertical scroll
-使用鼠标滚轮和上下箭头滚动小。使用页面向上/向下和家庭/结束按钮滚动更多。
Display details of an event
- 鼠标左键单击事件标签或箭头,Contents Viewer
将弹出一个新窗口,显示一个Event
。的内容。
Highlight actor (toggle)
-鼠标左键单击“演员名称”标签。参与者名称将被括在方括号中。[]
当突出显示一个或多个行为体时,只显示与这些行为体相关的事件。其他人都藏起来了。
Exclude actor (toggle)
- 右键单击actor名称标签。演员姓名将被括在圆括号中()
。当一个演员被排除在外时,与该演员相关的所有事件都将被隐藏。如果复选框Hide (excluded actors)
被选中,即使被排除的演员的名称标签和相应的垂直线也将被隐藏。
Move actor
鼠标左键拖放演员姓名标签。首先单击参与者名称,在将光标移动到新位置时按下按钮,然后释放参与者应该移动到的按钮,从而移动参与者。
Display all actors
- 按下'a'按钮。重置隐藏和/或突出显示的演员的设置。
3.6配置
将Event Records
在ETS表是由他们的时间戳排序。应该使用哪个时间戳通过event_order
参数进行控制。默认值是trace_ts
指生成跟踪数据的时间。event_ts
意味着跟踪数据被解析(转换为Event Record
)的时间。
3.7内容查看器窗口
文件菜单:
Close
-关上这扇窗户
Save
-将此窗口的内容保存到文件中。
过滤器菜单:
ActiveFilter
-重新开始Contents Viewer window
用同样的有源滤波器。
AnotherFilter (2)
-如果在字典中插入更多筛选器,这些过滤器将在此处显示为Filters
菜单。第二个过滤器是2号,下一个是3号等等。名称是排序的。
隐藏菜单:
Hide actor in viewer
- 已知的演员在Viewer
窗口中显示为命名的竖线。通过隐藏演员,其垂直条将被移除并且Viewer
将被刷新。Hiding the actor
只有max_actors
在达到阈值时才有用,因为它意味着“隐藏”的演员将会像以前一样显示出来"UNKNOWN"
。如果max_actors
没有达到阈值,演员将会重新显示为竖线Viewer
。
Show actor in viewer
-这意味着演员将作为已知的演员加入Viewer
有它自己的垂直条。
搜索菜单:
Forward from this event
- 将此事件设置为查看器中的第一个事件,并将其显示模式更改为正向搜索模式。此事件的演员(从,到或两个)将被添加到选定演员的列表中。
Reverse from this event
-设置此事件是第一个Event
在Viewer
并改变其显示模式下进入反向搜索模式。这Event
(从,到或两者)的演员将被添加到所选演员的列表中。观察,Events
将以相反的顺序显示。
Abort search. Display all
-切换Viewer
展示一切Events
不管是否正在进行搜查。中止搜索。