Skip to content

Commit 9a21897

Browse files
authored
fix: improve ErlSysMon logging for processes (#1540)
Include initial_call, ancestors, registered_name, message_queue_len and total_heap_size Also bump long_schedule and long_gc
1 parent 1df809e commit 9a21897

File tree

3 files changed

+50
-13
lines changed

3 files changed

+50
-13
lines changed

lib/realtime/monitoring/erl_sys_mon.ex

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ defmodule Realtime.ErlSysMon do
1010
@defaults [
1111
:busy_dist_port,
1212
:busy_port,
13-
{:long_gc, 250},
14-
{:long_schedule, 100},
13+
{:long_gc, 500},
14+
{:long_schedule, 500},
1515
{:long_message_queue, {0, 1_000}}
1616
]
1717

@@ -24,8 +24,36 @@ defmodule Realtime.ErlSysMon do
2424
{:ok, []}
2525
end
2626

27+
def handle_info({:monitor, pid, _type, _meta} = msg, state) when is_pid(pid) do
28+
log_process_info(msg, pid)
29+
{:noreply, state}
30+
end
31+
2732
def handle_info(msg, state) do
28-
Logger.error("#{__MODULE__} message: " <> inspect(msg))
33+
Logger.warning("#{__MODULE__} message: " <> inspect(msg))
2934
{:noreply, state}
3035
end
36+
37+
defp log_process_info(msg, pid) do
38+
pid_info =
39+
pid
40+
|> Process.info(:dictionary)
41+
|> case do
42+
{:dictionary, dict} when is_list(dict) ->
43+
{List.keyfind(dict, :"$initial_call", 0), List.keyfind(dict, :"$ancestors", 0)}
44+
45+
other ->
46+
other
47+
end
48+
49+
extra_info = Process.info(pid, [:registered_name, :message_queue_len, :total_heap_size])
50+
51+
Logger.warning(
52+
"#{__MODULE__} message: " <>
53+
inspect(msg) <> "|\n process info: #{inspect(pid_info)} #{inspect(extra_info)}"
54+
)
55+
rescue
56+
_ ->
57+
Logger.warning("#{__MODULE__} message: " <> inspect(msg))
58+
end
3159
end

mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ defmodule Realtime.MixProject do
44
def project do
55
[
66
app: :realtime,
7-
version: "2.51.1",
7+
version: "2.51.2",
88
elixir: "~> 1.17.3",
99
elixirc_paths: elixirc_paths(Mix.env()),
1010
start_permanent: Mix.env() == :prod,

test/realtime/monitoring/erl_sys_mon_test.exs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,25 @@ defmodule Realtime.Monitoring.ErlSysMonTest do
55

66
describe "system monitoring" do
77
test "logs system monitor events" do
8-
start_supervised!({ErlSysMon, config: [{:long_message_queue, {1, 10}}]})
8+
start_supervised!({ErlSysMon, config: [{:long_message_queue, {1, 100}}]})
99

10-
assert capture_log(fn ->
11-
Task.async(fn ->
12-
Enum.map(1..1000, &send(self(), &1))
13-
# Wait for ErlSysMon to notice
14-
Process.sleep(4000)
15-
end)
16-
|> Task.await()
17-
end) =~ "Realtime.ErlSysMon message:"
10+
log =
11+
capture_log(fn ->
12+
Task.async(fn ->
13+
Process.register(self(), TestProcess)
14+
Enum.map(1..1000, &send(self(), &1))
15+
# Wait for ErlSysMon to notice
16+
Process.sleep(4000)
17+
end)
18+
|> Task.await()
19+
end)
20+
21+
assert log =~ "Realtime.ErlSysMon message:"
22+
assert log =~ "$initial_call\", {Realtime.Monitoring.ErlSysMonTest"
23+
assert log =~ "ancestors\", [#{inspect(self())}]"
24+
assert log =~ "registered_name: TestProcess"
25+
assert log =~ "message_queue_len: "
26+
assert log =~ "total_heap_size: "
1827
end
1928
end
2029
end

0 commit comments

Comments
 (0)