Skip to content

Commit 76c7a0e

Browse files
authored
fix: ignore hidden nodes when collecting distributed metrics & fix gen_rpc server metrics (#1489)
1 parent 632b489 commit 76c7a0e

File tree

3 files changed

+22
-11
lines changed

3 files changed

+22
-11
lines changed

lib/realtime/monitoring/distributed_metrics.ex

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ defmodule Realtime.DistributedMetrics do
1010
# First check if Erlang distribution is started
1111
if :net_kernel.get_state()[:started] != :no do
1212
{:ok, nodes_info} = :net_kernel.nodes_info()
13+
# Ignore "hidden" nodes (remote shell)
14+
nodes_info = Enum.filter(nodes_info, fn {_k, v} -> v[:type] == :normal end)
1315

1416
port_addresses =
1517
:erlang.ports()

lib/realtime/monitoring/gen_rpc_metrics.ex

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,34 @@ defmodule Realtime.GenRpcMetrics do
1010
def info do
1111
if :net_kernel.get_state()[:started] != :no do
1212
{:ok, nodes_info} = :net_kernel.nodes_info()
13+
# Ignore "hidden" nodes (remote shell)
14+
nodes_info = Enum.filter(nodes_info, fn {_k, v} -> v[:type] == :normal end)
15+
1316
# All TCP server sockets are managed by gen_rpc_acceptor_sup supervisor
1417
# All TCP client sockets are managed by gen_rpc_client_sup supervisor
1518
# For each node gen_rpc might have multiple TCP sockets
1619

1720
# For client processes we use the remote address (peername)
18-
client_port_addresses = port_addresses(:gen_rpc_client_sup, &:inet.peername/1)
19-
# For server processes we use the local address (sockname)
20-
server_port_addresses = port_addresses(:gen_rpc_acceptor_sup, &:inet.sockname/1)
21+
client_port_addresses =
22+
port_addresses(:gen_rpc_client_sup)
23+
|> Enum.reduce(%{}, fn {address, port}, acc ->
24+
update_in(acc, [address], fn value -> [port | value || []] end)
25+
end)
26+
27+
# For server processes we use the ip address without the tcp port because it's randomly assigned
28+
server_port_addresses =
29+
port_addresses(:gen_rpc_acceptor_sup)
30+
|> Enum.reduce(%{}, fn {{ip_address, _tcp_port}, port}, acc ->
31+
update_in(acc, [ip_address], fn value -> [port | value || []] end)
32+
end)
33+
2134
Map.new(nodes_info, &info(&1, client_port_addresses, server_port_addresses))
2235
else
2336
%{}
2437
end
2538
end
2639

27-
defp port_addresses(supervisor, address_fn) do
40+
defp port_addresses(supervisor) do
2841
Supervisor.which_children(supervisor)
2942
|> Stream.flat_map(fn {_, pid, _, _} ->
3043
# We then grab the only linked port if available
@@ -39,15 +52,12 @@ defmodule Realtime.GenRpcMetrics do
3952
[]
4053
end
4154
end)
42-
|> Stream.map(&{address_fn.(&1), &1})
55+
|> Stream.map(&{:inet.peername(&1), &1})
4356
|> Stream.filter(fn
4457
{{:ok, _sockname}, _port} -> true
4558
_ -> false
4659
end)
4760
|> Stream.map(fn {{:ok, address}, port} -> {address, port} end)
48-
|> Enum.reduce(%{}, fn {address, port}, acc ->
49-
update_in(acc, [address], fn value -> [port | value || []] end)
50-
end)
5161
end
5262

5363
defp info({node, info}, client_port_addresses, server_port_addresses) do
@@ -62,10 +72,9 @@ defmodule Realtime.GenRpcMetrics do
6272

6373
defp info(node, client_port_addresses, server_port_addresses, {ip_address, _}) do
6474
{:tcp, client_tcp_port} = :gen_rpc_helper.get_client_config_per_node(node)
65-
server_tcp_port = Application.fetch_env!(:gen_rpc, :tcp_server_port)
6675

6776
gen_rpc_client_ports = Map.get(client_port_addresses, {ip_address, client_tcp_port}, [])
68-
gen_rpc_server_ports = Map.get(server_port_addresses, {ip_address, server_tcp_port}, [])
77+
gen_rpc_server_ports = Map.get(server_port_addresses, ip_address, [])
6978
gen_rpc_ports = gen_rpc_client_ports ++ gen_rpc_server_ports
7079

7180
if gen_rpc_ports != [] do

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.41.18",
7+
version: "2.41.19",
88
elixir: "~> 1.17.3",
99
elixirc_paths: elixirc_paths(Mix.env()),
1010
start_permanent: Mix.env() == :prod,

0 commit comments

Comments
 (0)