@@ -7,7 +7,7 @@ defmodule ElixirScope.Foundation.Telemetry do
77 """
88
99 require Logger
10- alias ElixirScope.Foundation . { Utils , Error , ErrorContext }
10+ alias ElixirScope.Foundation . { Utils } # , Error} # , ErrorContext}
1111
1212 @ telemetry_events [
1313 # Configuration events
@@ -39,26 +39,34 @@ defmodule ElixirScope.Foundation.Telemetry do
3939
4040 @ spec measure_event ( [ atom ( ) , ... ] , map ( ) , ( ( ) -> t ) ) :: t when t: var
4141 def measure_event ( event_name , metadata \\ % { } , fun ) when is_function ( fun , 0 ) do
42- context = ErrorContext . new ( __MODULE__ , :measure_event ,
43- metadata: % { event_name: event_name , metadata: metadata } )
44-
4542 start_time = Utils . monotonic_timestamp ( )
4643
47- result = ErrorContext . with_context ( context , fun )
44+ # Don't wrap in ErrorContext - let exceptions propagate
45+ try do
46+ result = fun . ( )
4847
49- end_time = Utils . monotonic_timestamp ( )
50- duration = end_time - start_time
48+ end_time = Utils . monotonic_timestamp ( )
49+ duration = end_time - start_time
5150
52- measurements = % { duration: duration , timestamp: end_time }
53- :telemetry . execute ( event_name , measurements , metadata )
51+ measurements = % { duration: duration , timestamp: end_time }
52+ :telemetry . execute ( event_name , measurements , metadata )
53+
54+ result
55+ rescue
56+ exception ->
57+ # Still measure the duration even if it failed
58+ end_time = Utils . monotonic_timestamp ( )
59+ duration = end_time - start_time
60+
61+ measurements = % { duration: duration , timestamp: end_time }
62+ error_metadata = Map . put ( metadata , :exception , exception )
63+
64+ # Emit both the normal event and an error event
65+ :telemetry . execute ( event_name , measurements , error_metadata )
66+ emit_error_event ( event_name , metadata , { :error , exception } )
5467
55- # If there was an error in the function, we still measured it
56- case result do
57- { :error , _ } = error ->
58- emit_error_event ( event_name , metadata , error )
59- error
60- other ->
61- other
68+ # Re-raise the exception so the test can catch it
69+ reraise exception , __STACKTRACE__
6270 end
6371 end
6472
@@ -125,19 +133,18 @@ defmodule ElixirScope.Foundation.Telemetry do
125133 """ )
126134 end
127135
128- @ spec emit_error_event ( [ atom ( ) , ... ] , map ( ) , { :error , term ( ) } ) :: :ok
129- defp emit_error_event ( event_name , metadata , error ) do
130- error_metadata = case error do
131- { :error , % Error { } = err } ->
132- Map . merge ( metadata , % {
133- error_code: err . code ,
134- error_message: err . message
135- } )
136- { :error , reason } ->
137- Map . merge ( metadata , % {
138- error_type: :external_error ,
139- error_message: inspect ( reason )
140- } )
136+ @ spec emit_error_event ( [ atom ( ) , ... ] , map ( ) , { :error , struct ( ) } ) :: :ok
137+ defp emit_error_event ( event_name , metadata , { :error , err } ) do
138+ error_metadata = if err . __struct__ == ElixirScope.Foundation.Error do
139+ Map . merge ( metadata , % {
140+ error_code: err . code ,
141+ error_message: err . message
142+ } )
143+ else
144+ Map . merge ( metadata , % {
145+ error_type: :external_error ,
146+ error_message: inspect ( err )
147+ } )
141148 end
142149
143150 measurements = % { error_count: 1 , timestamp: Utils . monotonic_timestamp ( ) }
0 commit comments