@@ -7,25 +7,17 @@ defmodule Commanded.OpenTelemetry.EventHandler do
77 alias OpenTelemetry.SemConv.Incubating.MessagingAttributes
88 alias OpenTelemetry.Span
99
10- @ default_tracer_id __MODULE__
10+ @ tracer_id __MODULE__
1111
12- @ typedoc "Span relationship configuration"
13- @ type span_relationship :: :link | :child | :none
14-
15- @ typedoc "Setup options"
16- @ type setup_opts :: [ tracer_name: atom ( ) , span_relationship: span_relationship ( ) ]
17-
18- @ typedoc "Handler configuration stored in telemetry handler config"
19- @ type handler_config :: % { tracer_id: atom ( ) , span_relationship: span_relationship ( ) }
20-
21- @ doc false
22- @ spec setup ( setup_opts ( ) ) :: :ok | { :error , :already_exists }
2312 def setup ( opts \\ [ ] ) do
24- tracer_name = opts [ :tracer_name ] || @ default_tracer_id
25- span_relationship = opts [ :span_relationship ] || :link
26- config = % { tracer_id: tracer_name , span_relationship: span_relationship }
13+ span_relationship = Keyword . get ( opts , :span_relationship , :link )
14+ config = % { span_relationship: span_relationship }
15+
16+ :ok = attach_handle_handlers ( config )
17+ :ok = attach_batch_handlers ( config )
18+ end
2719
28- # Single event handlers
20+ defp attach_handle_handlers ( config ) do
2921 :telemetry . attach_many (
3022 { __MODULE__ , :handle } ,
3123 [
@@ -36,8 +28,9 @@ defmodule Commanded.OpenTelemetry.EventHandler do
3628 & __MODULE__ . handle_telemetry_event / 4 ,
3729 config
3830 )
31+ end
3932
40- # Batch event handlers
33+ defp attach_batch_handlers ( config ) do
4134 :telemetry . attach_many (
4235 { __MODULE__ , :batch } ,
4336 [
@@ -50,22 +43,6 @@ defmodule Commanded.OpenTelemetry.EventHandler do
5043 )
5144 end
5245
53- @ doc false
54- @ spec detach ( ) :: :ok
55- def detach do
56- :telemetry . detach ( { __MODULE__ , :handle } )
57- :telemetry . detach ( { __MODULE__ , :batch } )
58- :ok
59- end
60-
61- # Single event handler dispatcher
62- @ doc false
63- @ spec handle_telemetry_event (
64- :telemetry . event_name ( ) ,
65- :telemetry . event_measurements ( ) ,
66- :telemetry . event_metadata ( ) ,
67- handler_config ( )
68- ) :: OpenTelemetry . span_ctx ( ) | :ok
6946 def handle_telemetry_event ( [ :commanded , :event , :handle , :start ] , measurements , meta , config ) ,
7047 do: handle_start ( measurements , meta , config )
7148
@@ -80,14 +57,6 @@ defmodule Commanded.OpenTelemetry.EventHandler do
8057 ) ,
8158 do: handle_exception ( measurements , meta , config )
8259
83- # Batch event handler dispatcher
84- @ doc false
85- @ spec batch_telemetry_event (
86- :telemetry . event_name ( ) ,
87- :telemetry . event_measurements ( ) ,
88- :telemetry . event_metadata ( ) ,
89- handler_config ( )
90- ) :: OpenTelemetry . span_ctx ( ) | :ok
9160 def batch_telemetry_event ( [ :commanded , :event , :batch , :start ] , measurements , meta , config ) ,
9261 do: batch_start ( measurements , meta , config )
9362
@@ -158,8 +127,6 @@ defmodule Commanded.OpenTelemetry.EventHandler do
158127 # TODO: Add last_seen_event attribute when available in Commanded telemetry
159128 # "event.last_seen": meta.last_seen_event
160129
161- tracer_id = config . tracer_id
162-
163130 span_opts = % {
164131 kind: :consumer ,
165132 attributes: attributes
@@ -173,31 +140,29 @@ defmodule Commanded.OpenTelemetry.EventHandler do
173140 end
174141
175142 OpentelemetryTelemetry . start_telemetry_span (
176- tracer_id ,
143+ @ tracer_id ,
177144 "commanded.event.handle" ,
178145 meta ,
179146 span_opts
180147 )
181148 end
182149
183- defp handle_stop ( _measurements , meta , config ) do
184- tracer_id = config . tracer_id
185- ctx = OpentelemetryTelemetry . set_current_telemetry_span ( tracer_id , meta )
150+ defp handle_stop ( _measurements , meta , _config ) do
151+ ctx = OpentelemetryTelemetry . set_current_telemetry_span ( @ tracer_id , meta )
186152
187153 if error = meta [ :error ] do
188154 Span . set_status ( ctx , OpenTelemetry . status ( :error , inspect ( error ) ) )
189155 end
190156
191- OpentelemetryTelemetry . end_telemetry_span ( tracer_id , meta )
157+ OpentelemetryTelemetry . end_telemetry_span ( @ tracer_id , meta )
192158 end
193159
194160 defp handle_exception (
195161 _measurements ,
196162 % { kind: kind , reason: reason , stacktrace: stacktrace } = meta ,
197- config
163+ _config
198164 ) do
199- tracer_id = config . tracer_id
200- ctx = OpentelemetryTelemetry . set_current_telemetry_span ( tracer_id , meta )
165+ ctx = OpentelemetryTelemetry . set_current_telemetry_span ( @ tracer_id , meta )
201166
202167 # Add exception kind as attribute for better debugging
203168 Span . set_attribute ( ctx , :"exception.kind" , kind )
@@ -209,12 +174,12 @@ defmodule Commanded.OpenTelemetry.EventHandler do
209174 Span . record_exception ( ctx , exception , stacktrace )
210175 Span . set_status ( ctx , OpenTelemetry . status ( :error , inspect ( reason ) ) )
211176
212- OpentelemetryTelemetry . end_telemetry_span ( tracer_id , meta )
177+ OpentelemetryTelemetry . end_telemetry_span ( @ tracer_id , meta )
213178 end
214179
215180 # Batch event handlers
216181
217- defp batch_start ( _measurements , meta , config ) do
182+ defp batch_start ( _measurements , meta , _config ) do
218183 # Note: Batch telemetry metadata does not include individual recorded_events,
219184 # only first_event_id, last_event_id, and event_count. Therefore, we cannot
220185 # create span links to individual command dispatch traces for batch events.
@@ -247,39 +212,35 @@ defmodule Commanded.OpenTelemetry.EventHandler do
247212 { CommandedAttributes . commanded_batch_last_event_id ( ) , meta . last_event_id }
248213 ]
249214
250- tracer_id = config . tracer_id
251-
252215 span_opts = % {
253216 kind: :consumer ,
254217 attributes: attributes
255218 }
256219
257220 OpentelemetryTelemetry . start_telemetry_span (
258- tracer_id ,
221+ @ tracer_id ,
259222 "commanded.event.batch" ,
260223 meta ,
261224 span_opts
262225 )
263226 end
264227
265- defp batch_stop ( _measurements , meta , config ) do
266- tracer_id = config . tracer_id
267- ctx = OpentelemetryTelemetry . set_current_telemetry_span ( tracer_id , meta )
228+ defp batch_stop ( _measurements , meta , _config ) do
229+ ctx = OpentelemetryTelemetry . set_current_telemetry_span ( @ tracer_id , meta )
268230
269231 if error = meta [ :error ] do
270232 Span . set_status ( ctx , OpenTelemetry . status ( :error , inspect ( error ) ) )
271233 end
272234
273- OpentelemetryTelemetry . end_telemetry_span ( tracer_id , meta )
235+ OpentelemetryTelemetry . end_telemetry_span ( @ tracer_id , meta )
274236 end
275237
276238 defp batch_exception (
277239 _measurements ,
278240 % { kind: kind , reason: reason , stacktrace: stacktrace } = meta ,
279- config
241+ _config
280242 ) do
281- tracer_id = config . tracer_id
282- ctx = OpentelemetryTelemetry . set_current_telemetry_span ( tracer_id , meta )
243+ ctx = OpentelemetryTelemetry . set_current_telemetry_span ( @ tracer_id , meta )
283244
284245 # Add exception kind as attribute for better debugging
285246 Span . set_attribute ( ctx , :"exception.kind" , kind )
@@ -291,6 +252,6 @@ defmodule Commanded.OpenTelemetry.EventHandler do
291252 Span . record_exception ( ctx , exception , stacktrace )
292253 Span . set_status ( ctx , OpenTelemetry . status ( :error , inspect ( reason ) ) )
293254
294- OpentelemetryTelemetry . end_telemetry_span ( tracer_id , meta )
255+ OpentelemetryTelemetry . end_telemetry_span ( @ tracer_id , meta )
295256 end
296257end
0 commit comments