From 8b721368df6bf18e8cf2c1189eded86876a17a7c Mon Sep 17 00:00:00 2001 From: crbelaus Date: Thu, 7 Nov 2024 16:51:25 +0100 Subject: [PATCH] Store bread crumbs in error context Some frameworks such as Ash provide bread crumbs in their errors. This commit records those breadcrumbs and stores them in the occurrence context. --- lib/error_tracker.ex | 13 +++++++++++++ test/error_tracker_test.exs | 15 +++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/lib/error_tracker.ex b/lib/error_tracker.ex index 09f176b..0c5d09f 100644 --- a/lib/error_tracker.ex +++ b/lib/error_tracker.ex @@ -120,6 +120,11 @@ defmodule ErrorTracker do {:ok, error} = Error.new(kind, reason, stacktrace) context = Map.merge(get_context(), given_context) + context = + if bread_crumbs = bread_crumbs(exception), + do: Map.put(context, "bread_crumbs", bread_crumbs), + else: context + if enabled?() && !ignored?(error, context) do sanitized_context = sanitize_context(context) {_error, occurrence} = upsert_error!(error, stacktrace, sanitized_context, reason) @@ -232,6 +237,14 @@ defmodule ErrorTracker do end end + defp bread_crumbs(exception) do + case exception do + {_kind, exception} -> bread_crumbs(exception) + %{bread_crumbs: bread_crumbs} -> bread_crumbs + _other -> nil + end + end + defp upsert_error!(error, stacktrace, context, reason) do existing_status = Repo.one(from e in Error, where: [fingerprint: ^error.fingerprint], select: e.status) diff --git a/test/error_tracker_test.exs b/test/error_tracker_test.exs index 8d9ea79..aacf7b2 100644 --- a/test/error_tracker_test.exs +++ b/test/error_tracker_test.exs @@ -99,6 +99,17 @@ defmodule ErrorTrackerTest do test "with enabled flag to false it does not store the exception" do assert report_error(fn -> raise "Sample error" end) == :noop end + + test "includes bread crumbs in the context if present" do + bread_crumbs = ["bread crumb 1", "bread crumb 2"] + + occurrence = + report_error(fn -> + raise ErrorWithBreadcrumbs, message: "test", bread_crumbs: bread_crumbs + end) + + assert occurrence.context["bread_crumbs"] == bread_crumbs + end end describe inspect(&ErrorTracker.resolve/1) do @@ -119,3 +130,7 @@ defmodule ErrorTrackerTest do end end end + +defmodule ErrorWithBreadcrumbs do + defexception [:message, :bread_crumbs] +end