Skip to content

Commit e32e392

Browse files
committed
initial refactor with ETS for span storage
1 parent 52fb607 commit e32e392

File tree

1 file changed

+48
-44
lines changed

1 file changed

+48
-44
lines changed
Lines changed: 48 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,82 @@
11
defmodule Sentry.Opentelemetry.SpanStorage do
22
@moduledoc false
33

4-
@root_spans_table :sentry_root_spans
5-
@child_spans_table :sentry_child_spans
4+
@table :span_storage
65

7-
def setup do
8-
case :ets.whereis(@root_spans_table) do
9-
:undefined ->
10-
:ets.new(@root_spans_table, [:set, :public, :named_table])
11-
12-
_ ->
13-
:ok
14-
end
6+
@spec start_link(keyword()) :: GenServer.on_start()
7+
def start_link(opts \\ []) do
8+
name = Keyword.get(opts, :name, __MODULE__)
9+
GenServer.start_link(__MODULE__, nil, name: name)
10+
end
1511

16-
case :ets.whereis(@child_spans_table) do
17-
:undefined ->
18-
:ets.new(@child_spans_table, [:bag, :public, :named_table])
12+
# start ets table on initialization
13+
@impl true
14+
def init(nil) do
15+
_table =
16+
if :ets.whereis(@table) == :undefined do
17+
:ets.new(@table, [:named_table, :public, :bag])
18+
end
1919

20-
_ ->
21-
:ok
22-
end
20+
{:ok, :no_state}
21+
end
2322

24-
:ok
23+
def store_span(span_data) when span_data.parent_span_id == nil do
24+
_ = :ets.insert(@table, {{:root_span, span_data.span_id}, span_data})
2525
end
2626

2727
def store_span(span_data) do
28-
if span_data.parent_span_id == nil do
29-
:ets.insert(@root_spans_table, {span_data.span_id, span_data})
30-
else
31-
:ets.insert(@child_spans_table, {span_data.parent_span_id, span_data})
32-
end
33-
34-
:ok
28+
_ = :ets.insert(@table, {span_data.parent_span_id, span_data})
3529
end
3630

3731
def get_root_span(span_id) do
38-
case :ets.lookup(@root_spans_table, span_id) do
39-
[{^span_id, span}] -> span
32+
case :ets.lookup(@table, {:root_span, span_id}) do
33+
[{{:root_span, ^span_id}, span}] -> span
34+
# how do we handle if span cannot be found?
4035
[] -> nil
4136
end
4237
end
4338

4439
def get_child_spans(parent_span_id) do
45-
:ets.lookup(@child_spans_table, parent_span_id)
46-
|> Enum.map(fn {_parent_id, span} -> span end)
47-
end
40+
child_spans = :ets.lookup(@table, parent_span_id)
4841

49-
def update_span(span_data) do
50-
if span_data.parent_span_id == nil do
51-
:ets.insert(@root_spans_table, {span_data.span_id, span_data})
42+
if child_spans == [] do
43+
nil
5244
else
53-
existing_spans = :ets.lookup(@child_spans_table, span_data.parent_span_id)
54-
55-
:ets.delete(@child_spans_table, span_data.parent_span_id)
45+
Enum.map(child_spans, fn {parent_span_id, span} -> span end)
46+
end
47+
end
5648

57-
Enum.each(existing_spans, fn {parent_id, span} ->
58-
if span.span_id != span_data.span_id do
59-
:ets.insert(@child_spans_table, {parent_id, span})
60-
end
61-
end)
49+
def update_span(span_data) when span_data.parent_span_id == nil do
50+
case :ets.lookup(@table, {:root_span, span_data.span_id}) do
51+
[] ->
52+
:ets.insert(@table, {{:root_span, span_data.span_id}, span_data})
6253

63-
:ets.insert(@child_spans_table, {span_data.parent_span_id, span_data})
54+
[{{:root_span, span_data.span_id}, span}] ->
55+
:ets.delete(@table, {:root_span, span_data.span_id})
56+
:ets.insert(@table, {{:root_span, span_data.span_id}, span_data})
6457
end
58+
end
6559

66-
:ok
60+
def update_span(span_data) do
61+
existing_spans = :ets.lookup(@table, span_data.parent_span_id)
62+
63+
:ets.delete(@table, span_data.parent_span_id)
64+
65+
Enum.each(existing_spans, fn {parent_span_id, span} ->
66+
if span.span_id == span_data.span_id do
67+
:ets.delete_object(@table, span)
68+
:ets.insert(@table, {parent_span_id, span_data})
69+
end
70+
end)
6771
end
6872

6973
def remove_span(span_id) do
70-
:ets.delete(@root_spans_table, span_id)
74+
:ets.delete(@table, {:root_span, span_id})
7175
:ok
7276
end
7377

7478
def remove_child_spans(parent_span_id) do
75-
:ets.delete(@child_spans_table, parent_span_id)
79+
:ets.delete(@table, parent_span_id)
7680
:ok
7781
end
7882
end

0 commit comments

Comments
 (0)