查看源代码 et_collector (et v1.7.1)

收集跟踪事件并提供适合迭代的后备存储

事件跟踪 (ET) 应用程序的接口模块

摘要

函数

在所有跟踪节点上全局更改活动的跟踪模式。

清除事件表。

删除字典条目并向所有注册的订阅者发送一个 {et, {dict_delete, Key}} 元组。

插入一个字典条目并向所有注册的订阅者发送一个 {et, {dict_insert, Key, Val}} 元组。

查找字典条目并返回零个或一个值。

匹配一些字典条目

返回全局注册的收集器的标识(如果有的话)。

迭代当前存储的事件。

从事件记录或旧密钥生成密钥。

向所有注册的订阅者发送消息。

启动一个收集器进程。

从文件、端口或进程加载原始 Erlang 跟踪。

停止一个收集器进程。

类型

-type actor() :: term().
链接到此类型

collector_fun()

查看源代码 (未导出)
-type collector_fun() :: trace_filter_fun() | event_filter_fun().
链接到此类型

dbg_match_spec()

查看源代码 (未导出)
-type dbg_match_spec() :: [tuple()].
链接到此类型

dbg_trace_parameters()

查看源代码 (未导出)
-type dbg_trace_parameters() :: file:filename() | integer() | {string(), integer()}.
链接到此类型

dbg_trace_type()

查看源代码 (未导出)
-type dbg_trace_type() :: ip | file | follow_file.
链接到此类型

ets_match_object_pattern()

查看源代码 (未导出)
-type ets_match_object_pattern() :: term().
-type event() ::
          #event{detail_level :: term(),
                 trace_ts :: term(),
                 event_ts :: term(),
                 from :: term(),
                 to :: term(),
                 label :: term(),
                 contents :: term()}.
链接到此类型

event_filter_fun()

查看源代码 (未导出)
-type event_filter_fun() :: fun((Event :: event()) -> boolean() | {true, event()}).
-type event_ts() :: #event_ts{event_ts :: term(), trace_ts :: term()}.
-type level() :: 0..100.
-type option() ::
          {parent_pid, pid() | undefined} |
          {event_order, trace_ts | event_ts} |
          {dict_insert, {filter, all}, collector_fun()} |
          {dict_insert, {filter, EventFilterName :: atom()}, event_filter_fun()} |
          {dict_insert, {subscriber, pid()}, Val :: term()} |
          {dict_insert, Key :: term(), Val :: term()} |
          {dict_delete, Key :: term()} |
          {trace_client, {event_file, file:filename()} | {dbg_trace_type(), dbg_trace_parameters()}} |
          {trace_global, boolean()} |
          {trace_pattern, {module() | undefined, Level :: level() | dbg_match_spec()} | undefined} |
          {trace_port, integer()} |
          {trace_max_queue, integer()}.
链接到此类型

table_handle()

查看源代码 (未导出)
-type table_handle() ::
          #table_handle{collector_pid :: term(),
                        event_tab :: term(),
                        event_order :: term(),
                        filter :: term()}.
链接到此类型

trace_filter_fun()

查看源代码 (未导出)
-type trace_filter_fun() :: fun((TraceData :: tuple()) -> boolean() | {true, event()}).
-type trace_ts() :: #trace_ts{trace_ts :: term(), event_ts :: term()}.

函数

链接到此函数

change_pattern(CollectorPid, RawPattern)

查看源代码
-spec change_pattern(CollectorPid, RawPattern) -> {old_pattern, TracePattern}
                        when
                            CollectorPid :: pid(),
                            RawPattern :: {module(), min | max | level()},
                            TracePattern :: [{[term()] | '_' | atom(), [term()], [term()]}].

在所有跟踪节点上全局更改活动的跟踪模式。

-spec clear_table(Handle) -> ok when Handle :: CollectorPid | table_handle(), CollectorPid :: pid().

清除事件表。

链接到此函数

dict_delete(CollectorPid, Key)

查看源代码
-spec dict_delete(CollectorPid :: pid(), Key :: term()) -> ok.

删除字典条目并向所有注册的订阅者发送一个 {et, {dict_delete, Key}} 元组。

如果删除的条目是注册的订阅者,则表示该订阅者进程将被取消注册为订阅者,并且会收到其最终消息。

链接到此函数

dict_insert(CollectorPid, What, Value)

查看源代码
-spec dict_insert(CollectorPid, What, Value) -> ok
                     when
                         CollectorPid :: pid(),
                         What :: {filter, atom()} | {subscriber, pid()} | Key,
                         Key :: term(),
                         Value :: collector_fun() | term().

插入一个字典条目并向所有注册的订阅者发送一个 {et, {dict_insert, Key, Val}} 元组。

如果该条目是新的订阅者,则表示新的订阅者进程首先会收到每个已存储字典条目的一条消息,然后它和所有旧订阅者都会收到此特定条目。收集器进程会链接到订阅者进程并对其进行监督。如果订阅者进程死亡,则表示它会被取消注册,就像使用普通的 dict_delete/2 一样。

链接到此函数

dict_lookup(CollectorPid, Key)

查看源代码
-spec dict_lookup(CollectorPid :: pid(), Key :: term()) -> [Val :: term()].

查找字典条目并返回零个或一个值。

链接到此函数

dict_match(CollectorPid, Pattern)

查看源代码
-spec dict_match(CollectorPid :: pid(), {KeyPattern, ValPattern}) -> [Match]
                    when
                        KeyPattern :: ets_match_object_pattern(),
                        ValPattern :: ets_match_object_pattern(),
                        Match :: {Key :: term(), Val :: term()}.

匹配一些字典条目

-spec get_global_pid() -> CollectorPid :: pid().

返回全局注册的收集器的标识(如果有的话)。

链接到此函数

iterate(Handle, Prev, Limit)

查看源代码
-spec iterate(Handle, Prev, Limit) -> NewAcc
                 when
                     Handle :: CollectorPid | table_handle(),
                     CollectorPid :: pid(),
                     Prev :: first | last | term(),
                     Limit :: Done | Forward | Backward,
                     Done :: 0,
                     Forward :: pos_integer(),
                     Backward :: neg_integer(),
                     NewAcc :: term().

等效于 iterate(Handle, Prev, Limit, undefined, Prev)

链接到此函数

iterate(Handle, Prev, Limit, Fun, Acc)

查看源代码
-spec iterate(Handle, Prev, Limit, Fun, Acc) -> NewAcc
                 when
                     Handle :: CollectorPid | table_handle(),
                     CollectorPid :: pid(),
                     Prev :: first | last | term(),
                     Limit :: Done | Forward | Backward,
                     Done :: 0,
                     Forward :: pos_integer() | infinity,
                     Backward :: neg_integer() | '-infinity',
                     Fun :: fun((event(), Acc) -> NewAcc) | undefined,
                     Acc :: term(),
                     NewAcc :: term().

迭代当前存储的事件。

迭代当前存储的事件并为每个事件应用一个函数。迭代可以向前或向后执行,并且可以限制为最大事件数 (abs(Limit))。

链接到此函数

make_key(Handle, Stuff)

查看源代码
-spec make_key(Handle, Stuff) -> Key
                  when
                      Handle :: table_handle() | trace_ts | event_ts,
                      Stuff :: event() | Key,
                      Key :: event_ts() | trace_ts().

从事件记录或旧密钥生成密钥。

链接到此函数

multicast(CollectorPid, Msg)

查看源代码
-spec multicast(CollectorPid :: pid(), Msg :: term()) -> ok.

向所有注册的订阅者发送消息。

链接到此函数

report(Handle, TraceOrEvent)

查看源代码
-spec report(Handle, TraceOrEvent) -> {ok, Continuation}
                when
                    Handle :: table_handle() | (CollectorPid :: pid()),
                    TraceOrEvent :: event() | TraceData | end_of_trace,
                    TraceData :: tuple(),
                    Continuation :: table_handle().

等效于 report_event/6

链接到此函数

report_event(Handle, DetailLevel, FromTo, Label, Contents)

查看源代码
-spec report_event(Handle, DetailLevel, FromTo, Label, Contents) -> {ok, Continuation}
                      when
                          Handle :: CollectorPid :: pid() | table_handle(),
                          DetailLevel :: level(),
                          FromTo :: actor(),
                          Label :: term(),
                          Contents :: [{Key :: term(), Value :: term()}] | term(),
                          Continuation :: table_handle().

等效于 report_event/6

链接到此函数

report_event(Handle, DetailLevel, From, To, Label, Contents)

查看源代码
-spec report_event(Handle, DetailLevel, From, To, Label, Contents) -> {ok, Continuation}
                      when
                          Handle :: CollectorPid :: pid() | table_handle(),
                          DetailLevel :: level(),
                          From :: actor(),
                          To :: actor(),
                          Label :: term(),
                          Contents :: [{Key :: term(), Value :: term()}] | term(),
                          Continuation :: table_handle().

向收集器报告一个事件。

所有事件都通过收集器过滤器进行过滤,该过滤器可以选择转换或丢弃事件。第一次调用应使用收集器进程的 pid 作为报告句柄,而后续调用应使用表句柄。

链接到此函数

save_event_file(CollectorPid, FileName, Options)

查看源代码
-spec save_event_file(CollectorPid, FileName, [Option]) -> ok | {error, term()}
                         when
                             CollectorPid :: pid(),
                             FileName :: file:filename(),
                             Option :: existing | write | append | keep | clear.

将事件保存到文件。

默认情况下,当前存储的事件(现有)被写入一个全新的文件(写入),并且在写入文件后保留(保持)这些事件。

除了在写入文件后保留事件之外,还可以在成功写入文件后删除所有存储的事件(清除)。

选项默认为现有、写入和保持。

-spec start_link(Options) -> {ok, Pid :: pid()} | {error, term()} when Options :: [option()].

启动一个收集器进程。

收集器收集跟踪事件并按其时间戳对其进行排序。时间戳可以反映实际生成跟踪数据的时间 (trace_ts) 或将跟踪数据转换为事件记录的时间 (event_ts)。如果跟踪数据中缺少时间戳(erlang:trace/4 的 missing timestamp 选项),则 trace_ts 将设置为 event_ts。

事件通过 report 函数直接报告给收集器,或者通过一个或多个跟踪客户端间接报告给收集器。所有报告的事件首先通过收集器过滤器进行过滤,然后由收集器存储。通过将默认收集器过滤器替换为自定义的过滤器,可以允许任何跟踪数据作为输入。收集器过滤器是一个字典条目,具有预定义的键 {filter, collector},其值是一个 arity 为 1 的 fun。有关接口详细信息,请参阅 et_selector:make_event/1,例如接受哪些 erlang:trace/1 元组。

收集器具有内置的字典服务。任何术语都可以作为值存储在字典中,并绑定到唯一的键。当使用现有键插入新值时,新值将覆盖现有值。进程可以使用 {subscriber, pid()} 作为字典键来订阅字典更新。所有字典更新都将传播到与模式 {{subscriber, ''}, ''} 匹配的订阅者进程,其中第一个 '_' 被解释为 pid()。

在全局跟踪模式下,收集器将自动开始在所有连接的 Erlang 节点上进行跟踪。当节点连接时,将在该节点上启动端口跟踪器,并在收集器节点上启动相应的跟踪客户端。

默认值

  • parent_pid - self()。
  • event_order - trace_ts。
  • trace_global - false。
  • trace_pattern - undefined。
  • trace_port - 4711。
  • trace_max_queue - 50。
链接到此函数

start_trace_client(CollectorPid, Type, Parameter)

查看源代码
-spec start_trace_client(CollectorPid, Type, Parameter) -> file_loaded | {trace_client_pid, pid()}
                            when
                                CollectorPid :: pid(),
                                Type :: event_file | dbg_trace_type(),
                                Parameter :: dbg_trace_parameters().

从文件、端口或进程加载原始 Erlang 跟踪。

-spec stop(pid()) -> ok.

停止一个收集器进程。