Skip to content

Commit

Permalink
fix: improve rpc metric; remove ecto metric (#1308)
Browse files Browse the repository at this point in the history
  • Loading branch information
filipecabaco authored Feb 21, 2025
1 parent 5192428 commit 51b2b0a
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 17 deletions.
3 changes: 1 addition & 2 deletions lib/realtime/monitoring/prom_ex.ex
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,7 @@ defmodule Realtime.PromEx do
{OsMon, poll_rate: poll_rate},
{Tenants, poll_rate: poll_rate},
{Tenant, poll_rate: poll_rate},
{Channels, poll_rate: poll_rate},
{PromEx.Plugins.Ecto, otp_app: :realtime, poll_rate: poll_rate, metric_prefix: [:ecto]}
{Channels, poll_rate: poll_rate}
]
end

Expand Down
3 changes: 2 additions & 1 deletion lib/realtime/monitoring/prom_ex/plugins/tenants.ex
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ defmodule Realtime.PromEx.Plugins.Tenants do
description: "Latency of rpc calls triggered by a tenant action",
measurement: :latency,
unit: {:microsecond, :millisecond},
reporter_options: [buckets: [10, 50, 250, 1500, 15_000]]
tags: [:success],
reporter_options: [buckets: [10, 250, 5000, 15_000]]
)
])
end
Expand Down
12 changes: 6 additions & 6 deletions lib/realtime/rpc.ex
Original file line number Diff line number Diff line change
Expand Up @@ -35,17 +35,17 @@ defmodule Realtime.Rpc do
{:ok, _} ->
Telemetry.execute(
[:realtime, :rpc],
%{latency: latency, success?: true},
%{mod: mod, func: func, target_node: node, origin_node: node()}
%{latency: latency},
%{mod: mod, func: func, target_node: node, origin_node: node(), success: true}
)

response

{:error, response} ->
Telemetry.execute(
[:realtime, :rpc],
%{latency: latency, success?: false},
%{mod: mod, func: func, target_node: node, origin_node: node()}
%{latency: latency},
%{mod: mod, func: func, target_node: node, origin_node: node(), success: false}
)

{:error, response}
Expand All @@ -55,8 +55,8 @@ defmodule Realtime.Rpc do
kind, reason ->
Telemetry.execute(
[:realtime, :rpc],
%{latency: 0, success?: false},
%{mod: mod, func: func, target_node: node, origin_node: node()}
%{latency: 0},
%{mod: mod, func: func, target_node: node, origin_node: node(), success: false}
)

log_error(
Expand Down
2 changes: 1 addition & 1 deletion mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ defmodule Realtime.MixProject do
def project do
[
app: :realtime,
version: "2.34.30",
version: "2.34.31",
elixir: "~> 1.17.3",
elixirc_paths: elixirc_paths(Mix.env()),
start_permanent: Mix.env() == :prod,
Expand Down
54 changes: 47 additions & 7 deletions test/realtime/rpc_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ defmodule Realtime.RpcTest do
def test_success, do: {:ok, "success"}
end

def handle_telemetry(event, metadata, _, pid: pid), do: send(pid, {event, metadata})
def handle_telemetry(event, measurements, metadata, pid: pid), do: send(pid, {event, measurements, metadata})

setup do
:telemetry.attach(__MODULE__, [:realtime, :rpc], &__MODULE__.handle_telemetry/4, pid: self())
Expand All @@ -22,7 +22,14 @@ defmodule Realtime.RpcTest do
describe "call/5" do
test "successful RPC call returns exactly what the original function returns" do
assert {:ok, "success"} = Rpc.call(node(), TestRpc, :test_success, [])
assert_receive {[:realtime, :rpc], %{latency: _}}

assert_receive {[:realtime, :rpc], %{latency: _},
%{
mod: Realtime.RpcTest.TestRpc,
func: :test_success,
origin_node: :nonode@nohost,
target_node: :nonode@nohost
}}
end

test "raised exceptions are properly caught and logged" do
Expand All @@ -35,21 +42,41 @@ defmodule Realtime.RpcTest do
]}}} =
Rpc.call(node(), TestRpc, :test_raise, [])

assert_receive {[:realtime, :rpc], %{latency: _}}
assert_receive {[:realtime, :rpc], %{latency: _},
%{
mod: Realtime.RpcTest.TestRpc,
func: :test_raise,
origin_node: :nonode@nohost,
target_node: :nonode@nohost
}}
end

test "timeouts are properly caught and logged" do
assert {:badrpc, :timeout} =
Rpc.call(node(), TestRpc, :test_timeout, [], timeout: 100)

assert_receive {[:realtime, :rpc], %{latency: _}}
assert_receive {[:realtime, :rpc], %{latency: _},
%{
mod: Realtime.RpcTest.TestRpc,
func: :test_timeout,
origin_node: :nonode@nohost,
target_node: :nonode@nohost
}}
end
end

describe "enhanced_call/5" do
test "successful RPC call returns exactly what the original function returns" do
assert {:ok, "success"} = Rpc.enhanced_call(node(), TestRpc, :test_success)
assert_receive {[:realtime, :rpc], %{latency: _, success?: true}}

assert_receive {[:realtime, :rpc], %{latency: _},
%{
mod: Realtime.RpcTest.TestRpc,
func: :test_success,
origin_node: :nonode@nohost,
target_node: :nonode@nohost,
success: true
}}
end

test "raised exceptions are properly caught and logged" do
Expand All @@ -58,7 +85,14 @@ defmodule Realtime.RpcTest do
Rpc.enhanced_call(node(), TestRpc, :test_raise)
end) =~ "ErrorOnRpcCall"

assert_receive {[:realtime, :rpc], %{latency: _, success?: false}}
assert_receive {[:realtime, :rpc], %{latency: _},
%{
mod: Realtime.RpcTest.TestRpc,
func: :test_raise,
origin_node: :nonode@nohost,
target_node: :nonode@nohost,
success: false
}}
end

test "timeouts are properly caught and logged" do
Expand All @@ -67,7 +101,13 @@ defmodule Realtime.RpcTest do
Rpc.enhanced_call(node(), TestRpc, :test_timeout, [], timeout: 100)
end) =~ "ErrorOnRpcCall"

assert_receive {[:realtime, :rpc], %{latency: 0, success?: false}}
assert_receive {[:realtime, :rpc], %{latency: 0},
%{
mod: Realtime.RpcTest.TestRpc,
func: :test_timeout,
origin_node: :nonode@nohost,
target_node: :nonode@nohost
}}
end
end
end

0 comments on commit 51b2b0a

Please sign in to comment.