11defmodule Sentry.Opentelemetry.SpanStorage do
22 @ moduledoc false
3+ use GenServer
34
45 @ table :span_storage
56
@@ -9,7 +10,6 @@ defmodule Sentry.Opentelemetry.SpanStorage do
910 GenServer . start_link ( __MODULE__ , nil , name: name )
1011 end
1112
12- # start ets table on initialization
1313 @ impl true
1414 def init ( nil ) do
1515 _table =
@@ -21,7 +21,10 @@ defmodule Sentry.Opentelemetry.SpanStorage do
2121 end
2222
2323 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 } )
24+ case :ets . lookup ( @ table , { :root_span , span_data . span_id } ) do
25+ [ ] -> :ets . insert ( @ table , { { :root_span , span_data . span_id } , span_data } )
26+ _ -> :ok
27+ end
2528 end
2629
2730 def store_span ( span_data ) do
@@ -31,43 +34,37 @@ defmodule Sentry.Opentelemetry.SpanStorage do
3134 def get_root_span ( span_id ) do
3235 case :ets . lookup ( @ table , { :root_span , span_id } ) do
3336 [ { { :root_span , ^ span_id } , span } ] -> span
34- # how do we handle if span cannot be found?
3537 [ ] -> nil
3638 end
3739 end
3840
3941 def get_child_spans ( parent_span_id ) do
40- child_spans = :ets . lookup ( @ table , parent_span_id )
41-
42- if child_spans == [ ] do
43- nil
44- else
45- Enum . map ( child_spans , fn { parent_span_id , span } -> span end )
46- end
47- end
48-
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 } )
53-
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 } )
57- end
42+ :ets . lookup ( @ table , parent_span_id )
43+ |> Enum . map ( fn { _parent_id , span } -> span end )
5844 end
5945
6046 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 } )
47+ if span_data . parent_span_id == nil do
48+ case :ets . lookup ( @ table , { :root_span , span_data . parent_span_id } ) do
49+ [ ] ->
50+ :ets . insert ( @ table , { { :root_span , span_data . parent_span_id } , span_data } )
51+
52+ _ ->
53+ :ets . delete ( @ table , { :root_span , span_data . parent_span_id } )
54+ :ets . insert ( @ table , { { :root_span , span_data . parent_span_id } , span_data } )
6955 end
70- end )
56+ else
57+ existing_spans = :ets . lookup ( @ table , span_data . parent_span_id )
58+
59+ Enum . each ( existing_spans , fn { parent_id , span } ->
60+ if span . span_id == span_data . span_id do
61+ :ets . delete_object ( @ table , { parent_id , span } )
62+ :ets . insert ( @ table , { span_data . parent_span_id , span_data } )
63+ end
64+ end )
65+ end
66+
67+ :ok
7168 end
7269
7370 def remove_span ( span_id ) do
@@ -79,4 +76,6 @@ defmodule Sentry.Opentelemetry.SpanStorage do
7976 :ets . delete ( @ table , parent_span_id )
8077 :ok
8178 end
79+
80+ # need to ad in sweep for any leftover spans. Should we initiate a sweep on_end or add a ttl or both?
8281end
0 commit comments