0

ejabberd で有用な統計を収集したいと考えています。

1 つまたは複数の特定の内部コンポーネントに送信されたメッセージの数を知りたいとしましょう。これら 2 つのソリューションの中で何が最善だと思いますか?

  1. filter_packet フックを使用して新しいコンポーネント (gen_mod + gen_server に基づく) をセットアップし、前述のコンポーネントに向けられたすべてのメッセージを特定の関数で処理します。メッセージ転送に煩わされないようにするために、メッセージをできるだけ早くルーティングする関数を生成し、ets/mnesia/mysql テーブルを使用してこのコンポーネントのデータを簡単にログに記録することができます。
  2. 対象のコンポーネントで実際にデータを受信したときにデータをログに記録します。

どのソリューションが最適か教えていただけますか?

4

1 に答える 1

0

本番環境でシステムを診断するメカニズムを持つことが目的である場合、永続的または一時的に 1 つまたは複数のイベント ハンドラーに接続できる gen_event サーバーを使用できると思います。欠点は、現在のコードでイベントを生成する必要があることです。

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>
...
于 2013-02-06T10:30:44.510 に答える