【问题标题】:collecting specific component statistics in ejabberd在 ejabberd 中收集特定组件的统计信息
【发布时间】:2013-02-06 23:03:35
【问题描述】:

我想在 ejabberd 中收集有用的统计数据。

假设我想知道有多少消息被发送到一个或多个特定的内部组件,您认为这两种解决方案之间的最佳解决方案是什么?

  1. 使用 filter_packet 钩子设置一个新组件(基于 gen_mod + gen_server),并在特定函数中处理指向上述组件的所有消息。为了不打扰消息转发,我可以生成一个函数来尽快路由消息,然后使用一些 ets/mnesia/mysql 表轻松记录该组件中的数据。
  2. 当我在感兴趣的组件中实际收到数据时记录数据。

你能告诉我哪种解决方案最好吗?

【问题讨论】:

    标签: erlang ejabberd


    【解决方案1】:

    如果目的是有一种机制来诊断生产中的系统,我认为您可以使用一个 gen_event 服务器,您可以永久或临时连接一个或多个事件处理程序。缺点是您必须在当前代码中生成事件。

    如果目的是分析/分析您的应用程序,您应该查看现有工具,例如观察者、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>
    ...
    

    【讨论】:

    • AFAIK 观察者和 pman 不是解决方案,因为它们无法提供有关 ejabberd 处理的 XMPP 数据包的信息。事件处理程序只是处理解析数据的另一种可能性,但这个 sata 来自解决方案 1 或解决方案 2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    相关资源
    最近更新 更多