获取Erlang / Elixir中的消息队列总大小

时间:2017-08-24 15:46:42

标签: erlang elixir

我正在为Elixir应用程序构建一些监控功能,并希望跟踪流程的总长度'消息队列 - 如果它们超过任何合理的值,则意味着系统不能跟上。

如何在现实系统中进行查询? :erlang.system_info/1似乎没有提供它,您只能从:erlang.process_info/1获取每个进程的信息。我不喜欢使用后者并手动聚合消息队列长度的想法,因为可能有数千个相关的GenServer进程并且检测它们感觉就像是不必要的开销。

我似乎记得Wombat OAM有这个功能让我认为这是可能的,但我可能会弄错。

2 个答案:

答案 0 :(得分:3)

在Erlang中:

所有信息::erlang.process_info(self())

只是消息队列长度::erlang.process_info(self(), :message_queue_len)#=> {:message_queue_len, 2}

只是消息::erlang.process_info(self(), :messages)#=> {:messages, [:hello, :world]}

在Elixir:

所有信息:Process.info(self())

只是消息队列长度:Process.info(self(), :message_queue_len)

只是消息:Process.info(self(), :messages)

两者都提供相同的输出,包括

答案 1 :(得分:1)

对于Erlang,我建议您使用recon

在Elixir中,有一个包装器:tap

我还建议阅读 Stuff Goes Bad Erlang in Anger