查看源代码 et_collector (et v1.7.1)
收集跟踪事件并提供适合迭代的后备存储
事件跟踪 (ET) 应用程序的接口模块
摘要
函数
在所有跟踪节点上全局更改活动的跟踪模式。
清除事件表。
删除字典条目并向所有注册的订阅者发送一个 {et, {dict_delete, Key}} 元组。
插入一个字典条目并向所有注册的订阅者发送一个 {et, {dict_insert, Key, Val}}
元组。
查找字典条目并返回零个或一个值。
匹配一些字典条目
返回全局注册的收集器的标识(如果有的话)。
迭代当前存储的事件。
从事件记录或旧密钥生成密钥。
向所有注册的订阅者发送消息。
启动一个收集器进程。
从文件、端口或进程加载原始 Erlang 跟踪。
停止一个收集器进程。
类型
-type actor() :: term().
-type collector_fun() :: trace_filter_fun() | event_filter_fun().
-type dbg_match_spec() :: [tuple()].
-type dbg_trace_parameters() :: file:filename() | integer() | {string(), integer()}.
-type dbg_trace_type() :: ip | file | follow_file.
-type ets_match_object_pattern() :: 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()}.
函数
-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().
清除事件表。
删除字典条目并向所有注册的订阅者发送一个 {et, {dict_delete, Key}} 元组。
如果删除的条目是注册的订阅者,则表示该订阅者进程将被取消注册为订阅者,并且会收到其最终消息。
-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 一样。
查找字典条目并返回零个或一个值。
-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().
返回全局注册的收集器的标识(如果有的话)。
-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().
-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))。
-spec make_key(Handle, Stuff) -> Key when Handle :: table_handle() | trace_ts | event_ts, Stuff :: event() | Key, Key :: event_ts() | trace_ts().
从事件记录或旧密钥生成密钥。
向所有注册的订阅者发送消息。
-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
。
-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
。
-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 作为报告句柄,而后续调用应使用表句柄。
-spec save_event_file(CollectorPid, FileName, [Option]) -> ok | {error, term()} when CollectorPid :: pid(), FileName :: file:filename(), Option :: existing | write | append | keep | clear.
将事件保存到文件。
默认情况下,当前存储的事件(现有)被写入一个全新的文件(写入),并且在写入文件后保留(保持)这些事件。
除了在写入文件后保留事件之外,还可以在成功写入文件后删除所有存储的事件(清除)。
选项默认为现有、写入和保持。
启动一个收集器进程。
收集器收集跟踪事件并按其时间戳对其进行排序。时间戳可以反映实际生成跟踪数据的时间 (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。
-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.
停止一个收集器进程。