Skip to content

Commit eb99f08

Browse files
committed
Adding node name information into the metric table key
1 parent 6d72249 commit eb99f08

File tree

2 files changed

+30
-22
lines changed

2 files changed

+30
-22
lines changed

lib/observer_web/telemetry/storage.ex

+13-11
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ defmodule ObserverWeb.Telemetry.Storage do
1111
@behaviour ObserverWeb.Telemetry.Adapter
1212

1313
@metric_keys "metric-keys"
14-
@metric_table :observer_web_metrics
1514

1615
@one_minute_in_milliseconds 60_000
1716
@retention_data_delete_interval :timer.minutes(1)
@@ -28,10 +27,11 @@ defmodule ObserverWeb.Telemetry.Storage do
2827
@impl true
2928
def init(_args) do
3029
node = Node.self()
30+
metric_table = metric_table(node)
3131

3232
# Create metric tables for the node
33-
:ets.new(@metric_table, [:set, :protected, :named_table])
34-
:ets.insert(@metric_table, {@metric_keys, []})
33+
:ets.new(metric_table, [:set, :protected, :named_table])
34+
:ets.insert(metric_table, {@metric_keys, []})
3535

3636
persist_data? =
3737
if data_retention_period() do
@@ -41,14 +41,14 @@ defmodule ObserverWeb.Telemetry.Storage do
4141
false
4242
end
4343

44-
{:ok, %{node: node, persist_data?: persist_data?}}
44+
{:ok, %{node: node, persist_data?: persist_data?, metric_table: metric_table}}
4545
end
4646

4747
@impl true
4848
def handle_cast(
4949
{:observer_web_telemetry,
5050
%{metrics: metrics, reporter: reporter, measurements: measurements}},
51-
%{node: node, persist_data?: persist_data?} = state
51+
%{node: node, persist_data?: persist_data?, metric_table: metric_table} = state
5252
)
5353
when reporter in [node] do
5454
now = System.os_time(:millisecond)
@@ -63,12 +63,12 @@ defmodule ObserverWeb.Telemetry.Storage do
6363
# credo:disable-for-lines:3
6464
if persist_data? do
6565
current_data =
66-
case :ets.lookup(@metric_table, timed_key) do
66+
case :ets.lookup(metric_table, timed_key) do
6767
[{_, current_list_data}] -> [data | current_list_data]
6868
_ -> [data]
6969
end
7070

71-
:ets.insert(@metric_table, {timed_key, current_data})
71+
:ets.insert(metric_table, {timed_key, current_data})
7272
end
7373

7474
Phoenix.PubSub.broadcast(
@@ -85,7 +85,7 @@ defmodule ObserverWeb.Telemetry.Storage do
8585
end)
8686

8787
if new_keys != [] do
88-
:ets.insert(@metric_table, {@metric_keys, new_keys ++ keys})
88+
:ets.insert(metric_table, {@metric_keys, new_keys ++ keys})
8989

9090
Phoenix.PubSub.broadcast(
9191
ObserverWeb.PubSub,
@@ -106,7 +106,7 @@ defmodule ObserverWeb.Telemetry.Storage do
106106

107107
prune_keys = fn key ->
108108
Enum.each(deletion_period_from..deletion_period_to, fn timestamp ->
109-
:ets.delete(@metric_table, metric_key(key, timestamp))
109+
:ets.delete(state.metric_table, metric_key(key, timestamp))
110110
end)
111111
end
112112

@@ -162,7 +162,7 @@ defmodule ObserverWeb.Telemetry.Storage do
162162
node,
163163
:ets,
164164
:lookup,
165-
[@metric_table, metric_key(key, minute)],
165+
[metric_table(node), metric_key(key, minute)],
166166
:infinity
167167
) do
168168
[{_, value}] ->
@@ -180,7 +180,7 @@ defmodule ObserverWeb.Telemetry.Storage do
180180
def get_keys_by_node(nil), do: []
181181

182182
def get_keys_by_node(node) do
183-
case Rpc.call(node, :ets, :lookup, [@metric_table, @metric_keys], :infinity) do
183+
case Rpc.call(node, :ets, :lookup, [metric_table(node), @metric_keys], :infinity) do
184184
[{_, value}] ->
185185
value
186186

@@ -201,6 +201,8 @@ defmodule ObserverWeb.Telemetry.Storage do
201201
defp data_retention_period, do: :timer.minutes(1)
202202
end
203203

204+
defp metric_table(node), do: String.to_atom("#{node}::observer-web-metrics")
205+
204206
defp metric_key(metric, timestamp), do: "#{metric}|#{timestamp}"
205207

206208
defp unix_to_minutes(time \\ System.os_time(:millisecond)),

test/observer_web/telemetry_storage_test.exs

+17-11
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,15 @@ defmodule ObserverWeb.TelemetryStorageTest do
1010
setup [
1111
:set_mox_global,
1212
:verify_on_exit!,
13-
:create_consumer
13+
:create_consumer,
14+
:metric_table
1415
]
1516

16-
test "[un]subscribe_for_new_keys/0", %{node: node} do
17+
test "[un]subscribe_for_new_keys/0", %{node: node, metric_table: metric_table} do
1718
Storage.subscribe_for_new_keys()
1819

1920
ObserverWeb.RpcMock
20-
|> stub(:call, fn ^node, :ets, :lookup, [:observer_web_metrics, "metric-keys"], :infinity ->
21+
|> stub(:call, fn ^node, :ets, :lookup, [^metric_table, "metric-keys"], :infinity ->
2122
[{"metric-keys", []}]
2223
end)
2324

@@ -28,11 +29,11 @@ defmodule ObserverWeb.TelemetryStorageTest do
2829
assert_receive {:metrics_new_keys, ^node, ["vm.memory.total"]}, 1_000
2930
end
3031

31-
test "[un]subscribe_for_new_data/0", %{node: node} do
32+
test "[un]subscribe_for_new_data/0", %{node: node, metric_table: metric_table} do
3233
Storage.subscribe_for_new_data(node, "vm.memory.total")
3334

3435
ObserverWeb.RpcMock
35-
|> stub(:call, fn ^node, :ets, :lookup, [:observer_web_metrics, "metric-keys"], :infinity ->
36+
|> stub(:call, fn ^node, :ets, :lookup, [^metric_table, "metric-keys"], :infinity ->
3637
[{"metric-keys", []}]
3738
end)
3839

@@ -48,12 +49,12 @@ defmodule ObserverWeb.TelemetryStorageTest do
4849
Storage.unsubscribe_for_new_data(node, "vm.memory.total")
4950
end
5051

51-
test "get_keys_by_node/1 valid node", %{node: node} do
52+
test "get_keys_by_node/1 valid node", %{node: node, metric_table: metric_table} do
5253
Storage.subscribe_for_new_data(node, "vm.memory.total")
5354
test_pid = self()
5455

5556
ObserverWeb.RpcMock
56-
|> stub(:call, fn ^node, :ets, :lookup, [:observer_web_metrics, "metric-keys"], :infinity ->
57+
|> stub(:call, fn ^node, :ets, :lookup, [^metric_table, "metric-keys"], :infinity ->
5758
if test_pid != self() do
5859
# GenServer Cast
5960
[{"metric-keys", []}]
@@ -78,7 +79,7 @@ defmodule ObserverWeb.TelemetryStorageTest do
7879
assert [] == Storage.get_keys_by_node(nil)
7980
end
8081

81-
test "list_data_by_node_key/3", %{node: node} do
82+
test "list_data_by_node_key/3", %{node: node, metric_table: metric_table} do
8283
key_name = "test.phoenix"
8384

8485
Storage.subscribe_for_new_data(node, key_name)
@@ -87,7 +88,7 @@ defmodule ObserverWeb.TelemetryStorageTest do
8788
|> stub(
8889
:call,
8990
fn
90-
^node, :ets, :lookup, [:observer_web_metrics, "metric-keys"], :infinity ->
91+
^node, :ets, :lookup, [^metric_table, "metric-keys"], :infinity ->
9192
# First time: Empty keys
9293
# Second time: Added key
9394
called = Process.get("ets_lookup", 0)
@@ -134,7 +135,7 @@ defmodule ObserverWeb.TelemetryStorageTest do
134135
] = Storage.list_data_by_node_key(node |> to_string(), key_name)
135136
end
136137

137-
test "Pruning expiring entries", %{node: node, pid: pid} do
138+
test "Pruning expiring entries", %{node: node, pid: pid, metric_table: metric_table} do
138139
key_name = "test.phoenix"
139140

140141
now = System.os_time(:millisecond)
@@ -145,7 +146,7 @@ defmodule ObserverWeb.TelemetryStorageTest do
145146
|> stub(
146147
:call,
147148
fn
148-
^node, :ets, :lookup, [:observer_web_metrics, "metric-keys"], :infinity ->
149+
^node, :ets, :lookup, [^metric_table, "metric-keys"], :infinity ->
149150
# First time: Empty keys
150151
# Second time: Added key
151152
called = Process.get("ets_lookup", 0)
@@ -208,4 +209,9 @@ defmodule ObserverWeb.TelemetryStorageTest do
208209
|> Map.put(:node, node)
209210
|> Map.put(:pid, pid)
210211
end
212+
213+
defp metric_table(context) do
214+
node = Node.self()
215+
Map.put(context, :metric_table, String.to_atom("#{node}::observer-web-metrics"))
216+
end
211217
end

0 commit comments

Comments
 (0)