@@ -119,15 +119,14 @@ defmodule ErrorTracker do
119119 { :ok , stacktrace } = ErrorTracker.Stacktrace . new ( stacktrace )
120120 { :ok , error } = Error . new ( kind , reason , stacktrace )
121121 context = Map . merge ( get_context ( ) , given_context )
122-
123- context =
124- if bread_crumbs = bread_crumbs ( exception ) ,
125- do: Map . put ( context , "bread_crumbs" , bread_crumbs ) ,
126- else: context
122+ bread_crumbs = exception_bread_crumbs ( exception ) ++ get_bread_crumbs ( )
127123
128124 if enabled? ( ) && ! ignored? ( error , context ) do
129125 sanitized_context = sanitize_context ( context )
130- { _error , occurrence } = upsert_error! ( error , stacktrace , sanitized_context , reason )
126+
127+ { _error , occurrence } =
128+ upsert_error! ( error , stacktrace , sanitized_context , bread_crumbs , reason )
129+
131130 occurrence
132131 else
133132 :noop
@@ -205,6 +204,24 @@ defmodule ErrorTracker do
205204 Process . get ( :error_tracker_context , % { } )
206205 end
207206
207+ @ spec set_context ( String . t ( ) ) :: list ( String . t ( ) )
208+ def add_bread_crumb ( bread_crumb ) when is_binary ( bread_crumb ) do
209+ current_bread_crumbs = Process . get ( :error_tracker_bread_crumbs , [ ] )
210+ new_bread_crumbs = current_bread_crumbs ++ [ bread_crumb ]
211+
212+ Process . put ( :error_tracker_bread_crumbs , new_bread_crumbs )
213+
214+ new_bread_crumbs
215+ end
216+
217+ @ doc """
218+ Obtain the context of the current process.
219+ """
220+ @ spec get_bread_crumbs ( ) :: list ( String . t ( ) )
221+ def get_bread_crumbs do
222+ Process . get ( :error_tracker_bread_crumbs , [ ] )
223+ end
224+
208225 defp enabled? do
209226 ! ! Application . get_env ( :error_tracker , :enabled , true )
210227 end
@@ -237,15 +254,15 @@ defmodule ErrorTracker do
237254 end
238255 end
239256
240- defp bread_crumbs ( exception ) do
257+ defp exception_bread_crumbs ( exception ) do
241258 case exception do
242- { _kind , exception } -> bread_crumbs ( exception )
243- % { bread_crumbs: bread_crumbs } -> bread_crumbs
244- _other -> nil
259+ { _kind , exception } -> exception_bread_crumbs ( exception )
260+ % { bread_crumbs: bread_crumbs } -> [ bread_crumbs ]
261+ _other -> [ ]
245262 end
246263 end
247264
248- defp upsert_error! ( error , stacktrace , context , reason ) do
265+ defp upsert_error! ( error , stacktrace , context , bread_crumbs , reason ) do
249266 existing_status =
250267 Repo . one ( from e in Error , where: [ fingerprint: ^ error . fingerprint ] , select: e . status )
251268
@@ -271,6 +288,7 @@ defmodule ErrorTracker do
271288 |> Occurrence . changeset ( % {
272289 stacktrace: stacktrace ,
273290 context: context ,
291+ bread_crumbs: bread_crumbs ,
274292 reason: reason
275293 } )
276294 |> Repo . insert! ( )
0 commit comments