我想在ejabberd收集有用的统计数据。
假设我想知道有多少消息被发送到一个或多个特定内部组件,您认为这两种解决方案之间最好的是什么?
你能告诉我哪种解决方案最好吗?
答案 0 :(得分:0)
如果目的是有一个机制来诊断生产中的系统,我认为您可以使用gen_event服务器,您可以永久或临时连接一个或多个事件处理程序。缺点是您必须在当前代码中生成事件。
如果目的是剖析/分析您的应用程序,您应该查看现有的工具,例如observer,pman ......
编辑:
gen_event的兴趣在于它是一种现成的行为,允许按需连接多个事件处理程序。
pman允许您查看进程发送的所有消息,消息接收和函数调用。它们默认情况下给出如下,我没有检查是否可以添加其他信息,如时间戳,以及可以过滤的内容。
...
<0.60.0>: call erlang:spawn_link(erlang, apply, [#Fun<util.3.13553350>,[]])
{trace,<0.60.0>,spawn,<0.180.0>,{erlang,apply,[#Fun<util.3.13553350>,[]]}}
<0.60.0>: link <0.180.0>
<0.60.0>: call erlang:now()
<0.60.0>: call gen_event:notify(plc1, {store, t5_plc1, running, 1360156073108})
<0.60.0>: call gen_event:send(plc1, {notify, {store, t5_plc1, running, 1360156073108}})
<0.60.0>: ! To: plc1 Msg: {notify, {store, t5_plc1, running, 1360156073108}}
<0.60.0>: call erlang:setelement(12, {state, t5_plc1, #Fun<testmngr.9.27375888>, #Fun<testmngr.10.27375888>, 46, forever, 0, 1, run, undefined, undefined, <0.179.0>, plc1}, <0.180.0>)
<0.180.0>: call erlang:apply(#Fun<util.3.13553350>, [])
<0.180.0>: rec timeout
<0.180.0>: call gen_server:cast(manager_plc1, {complete, t5_plc1})
<0.180.0>: call gen_server:do_cast(manager_plc1, {complete, t5_plc1})
<0.180.0>: call gen_server:cast_msg({complete, t5_plc1})
<0.180.0>: call gen_server:do_send(manager_plc1, {'$gen_cast', {complete, t5_plc1}})
<0.180.0>: call erlang:send(manager_plc1, {'$gen_cast', {complete, t5_plc1}}, [noconnect])
<0.180.0>: ! To: manager_plc1 Msg: {'$gen_cast', {complete, t5_plc1}}
<0.180.0>: ! To: <0.60.0> Msg: {'$gen_event', {complete, 47}}
<0.60.0>: rec {'$gen_event', {complete, 47}}
<0.180.0>: exit normal
<0.60.0>: getting_unlinked <0.180.0>
...