非常教程

Erlang 20参考手册

et

3. Description

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>}}

这实际上是对过程的模拟。EventsMnesia在本地表中写入记录的事务:

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只有一个过滤器,是活动的,所有跟踪EventsViewer获取从Collector将直通该过滤器。通过编写聪明的过滤器,可以自定义Events查看器中的外观。下面的过滤器et/examples/et_demo.erl替换参与者名称mnesia_tmmnesia_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 ViewerEvent。在Contents Viewer这里还有一个过滤器菜单,可以Event查看除查看器中选择的其他视图以外的其他视图。点击该按钮new_tid Event将会Contents Viewer弹出一个窗口,Eventmgr_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 选择saveload输入来加载。Viewers Fileet_collector
  • 通过使用Erlang仿真器中的内置跟踪支持,还可以对正在运行的系统执行实时跟踪。这些Erlang跟踪可以定向到文件或端口。请参阅参考手册erlang:trace/4erlang:trace_pattern/3dbgttb获取更多信息。

还有相应的跟踪客户端类型可以从这些文件或端口读取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节点上启动,以便自动将跟踪转发EventsCollector。设置布尔参数trace_global,以true供无论是et_collectoret_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-载入CollectorEvents从文件,并通知所有连接的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过程,但关闭所有其他Viewerswindowsconnected相同的Collector
  • Close all Viewers and the Collector-关闭Collector所有Viewers与它相连。查看菜单:
  • First-滚动this观众在第一EventCollector
  • Last-滚动this浏览到最后EventCollector
  • Prev- this向后滚动查看器一页。
  • Next- this向前滚动查看器一页。
  • Refresh-信息交换所this查看并重读其EventsCollector...
  • Up- Events向后滚动几个。
  • Down- Events向前滚动几个。
  • Display all actors.-重置隐藏和/或突出显示的行为者的设置。收集器菜单:
  • First-滚动all观众第一EventCollector
  • Last-滚动all观众到最后EventCollector
  • Prev- all向后滚动一页查看者。
  • Next- all向前滚动一页查看者。
  • Refresh-清除all浏览器和重新阅读他们EventsCollector

过滤器和缩放菜单:

  • 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-设置此事件是第一个EventViewer并改变其显示模式下进入反向搜索模式。这Event(从,到或两者)的演员将被添加到所选演员的列表中。观察,Events将以相反的顺序显示。
  • Abort search. Display all-切换Viewer展示一切Events不管是否正在进行搜查。中止搜索。
Erlang 20

Erlang 是一种通用的面向并发的编程语言,可应付大规模开发活动的程序设计语言和运行环境。

主页 https://www.erlang.org/
源码 https://github.com/erlang/otp
版本 20
发布版本 20.1