Skip to content

Commit 79da9b6

Browse files
authored
fix: stream metrics data (#1658)
1 parent 93ce90a commit 79da9b6

File tree

2 files changed

+20
-11
lines changed

2 files changed

+20
-11
lines changed

lib/realtime_web/controllers/metrics_controller.ex

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,32 @@ defmodule RealtimeWeb.MetricsController do
66

77
# We give more memory and time to collect metrics from all nodes as this is a lot of work
88
def index(conn, _) do
9-
{time, metrics} = :timer.tc(fn -> metrics([Node.self() | Node.list()]) end, :millisecond)
9+
conn =
10+
conn
11+
|> put_resp_content_type("text/plain")
12+
|> send_chunked(200)
13+
14+
{time, conn} = :timer.tc(fn -> metrics([Node.self() | Node.list()], conn) end, :millisecond)
1015
Logger.info("Collected cluster metrics in #{time} milliseconds")
1116

1217
conn
13-
|> put_resp_content_type("text/plain")
14-
|> send_resp(200, metrics)
1518
end
1619

1720
def region(conn, %{"region" => region}) do
21+
conn =
22+
conn
23+
|> put_resp_content_type("text/plain")
24+
|> send_chunked(200)
25+
1826
nodes = Realtime.Nodes.region_nodes(region)
19-
{time, metrics} = :timer.tc(fn -> metrics(nodes) end, :millisecond)
27+
28+
{time, conn} = :timer.tc(fn -> metrics(nodes, conn) end, :millisecond)
2029
Logger.info("Collected metrics for region #{region} in #{time} milliseconds")
2130

2231
conn
23-
|> put_resp_content_type("text/plain")
24-
|> send_resp(200, metrics)
2532
end
2633

27-
defp metrics(nodes) do
34+
defp metrics(nodes, conn) do
2835
bump_max_heap_size()
2936
timeout = Application.fetch_env!(:realtime, :metrics_rpc_timeout)
3037

@@ -35,14 +42,16 @@ defmodule RealtimeWeb.MetricsController do
3542
end,
3643
timeout: :infinity
3744
)
38-
|> Enum.reduce([], fn {_, {node, response}}, acc ->
45+
|> Enum.reduce(conn, fn {_, {node, response}}, acc_conn ->
3946
case response do
4047
{:error, :rpc_error, reason} ->
4148
Logger.error("Cannot fetch metrics from the node #{inspect(node)} because #{inspect(reason)}")
42-
acc
49+
acc_conn
4350

4451
metrics ->
45-
[metrics | acc]
52+
{:ok, acc_conn} = chunk(acc_conn, metrics)
53+
:erlang.garbage_collect()
54+
acc_conn
4655
end
4756
end)
4857
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.68.0",
7+
version: "2.68.1",
88
elixir: "~> 1.18",
99
elixirc_paths: elixirc_paths(Mix.env()),
1010
start_permanent: Mix.env() == :prod,

0 commit comments

Comments
 (0)