diff --git a/config/config.exs b/config/config.exs index f11289c..f5b8b26 100644 --- a/config/config.exs +++ b/config/config.exs @@ -30,6 +30,8 @@ config :phoenix, :json_library, Jason config :logger, truncate: :infinity +config :frenzy, sentry_enabled: false + # Import environment specific config. This must remain at the bottom # of this file so it overrides the configuration defined above. import_config "#{Mix.env()}.exs" diff --git a/lib/frenzy.ex b/lib/frenzy.ex index bc16171..1fdc8cd 100644 --- a/lib/frenzy.ex +++ b/lib/frenzy.ex @@ -6,4 +6,8 @@ defmodule Frenzy do Contexts are also responsible for managing your data, regardless if it comes from the database, an external API or others. """ + + def sentry_enabled? do + Application.get_env(:frenzy, :sentry_enabled) + end end diff --git a/lib/frenzy/pipeline/scrape_stage.ex b/lib/frenzy/pipeline/scrape_stage.ex index a15434d..39b9e9b 100644 --- a/lib/frenzy/pipeline/scrape_stage.ex +++ b/lib/frenzy/pipeline/scrape_stage.ex @@ -100,6 +100,13 @@ defmodule Frenzy.Pipeline.ScrapeStage do Logger.error(Exception.format(:error, e, __STACKTRACE__)) + if Frenzy.sentry_enabled?() do + Sentry.capture_exception(e, + stacktrace: __STACKTRACE__, + extra: %{extractor: module_name, item_url: url} + ) + end + {:ok, Readability.article(body)} end end diff --git a/lib/frenzy/update_feeds.ex b/lib/frenzy/update_feeds.ex index 39dc773..6769e85 100644 --- a/lib/frenzy/update_feeds.ex +++ b/lib/frenzy/update_feeds.ex @@ -75,6 +75,13 @@ defmodule Frenzy.UpdateFeeds do Logger.warn( "Encountered error updating feed #{feed.id} #{feed.feed_url}: #{inspect(error)}" ) + + if Frenzy.sentry_enabled?() do + Sentry.capture_exception(error, + stacktrace: __STACKTRACE__, + extra: %{feed_id: feed.id, feed_url: feed.feed_url} + ) + end end end) end diff --git a/lib/frenzy_web/endpoint.ex b/lib/frenzy_web/endpoint.ex index e6798c7..99751fe 100644 --- a/lib/frenzy_web/endpoint.ex +++ b/lib/frenzy_web/endpoint.ex @@ -1,4 +1,8 @@ defmodule FrenzyWeb.Endpoint do + if Frenzy.sentry_enabled?() do + use Sentry.PlugCapture + end + use Phoenix.Endpoint, otp_app: :frenzy @session_options [ @@ -39,6 +43,10 @@ defmodule FrenzyWeb.Endpoint do pass: ["*/*"], json_decoder: Phoenix.json_library() + if Frenzy.sentry_enabled?() do + plug Sentry.PlugContext + end + plug Plug.MethodOverride plug Plug.Head diff --git a/mix.exs b/mix.exs index 34fef89..46158fb 100644 --- a/mix.exs +++ b/mix.exs @@ -56,7 +56,8 @@ defmodule Frenzy.MixProject do {:floki, "~> 0.23"}, {:phoenix_live_view, git: "https://github.com/phoenixframework/phoenix_live_view", branch: "master"}, - {:gemini, git: "https://git.shadowfacts.net/shadowfacts/gemini-ex.git", branch: "main"} + {:gemini, git: "https://git.shadowfacts.net/shadowfacts/gemini-ex.git", branch: "main"}, + {:sentry, "~> 8.0"} ] end @@ -70,7 +71,8 @@ defmodule Frenzy.MixProject do [ "ecto.setup": ["ecto.create", "ecto.migrate", "run priv/repo/seeds.exs"], "ecto.reset": ["ecto.drop", "ecto.setup"], - test: ["ecto.create --quiet", "ecto.migrate", "test"] + test: ["ecto.create --quiet", "ecto.migrate", "test"], + sentry_recompile: ["deps.compile sentry --force", "compile"] ] end end diff --git a/mix.lock b/mix.lock index 93dc7d0..695dad8 100644 --- a/mix.lock +++ b/mix.lock @@ -44,6 +44,7 @@ "ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm", "451d8527787df716d99dc36162fca05934915db0b6141bbdac2ea8d3c7afc7d7"}, "readability": {:git, "https://git.shadowfacts.net/shadowfacts/readability.git", "1538ca2a8c3c3b6b041c9e86b560f368c4547896", [branch: "master"]}, "saxy": {:hex, :saxy, "0.6.0", "cdb2f2fcd8133d1f3f8b0cf6a131ee1ca348dca613de266e9a239db850c4a093", [:mix], [], "hexpm"}, + "sentry": {:hex, :sentry, "8.0.5", "5ca922b9238a50c7258b52f47364b2d545beda5e436c7a43965b34577f1ef61f", [:mix], [{:hackney, "~> 1.8", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.6", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, "~> 2.3", [hex: :plug_cowboy, repo: "hexpm", optional: true]}], "hexpm", "4972839fdbf52e886d7b3e694c8adf421f764f2fa79036b88fb4742049bd4b7c"}, "socket": {:hex, :socket, "0.3.13", "98a2ab20ce17f95fb512c5cadddba32b57273e0d2dba2d2e5f976c5969d0c632", [:mix], [], "hexpm", "f82ea9833ef49dde272e6568ab8aac657a636acb4cf44a7de8a935acb8957c2e"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"}, "telemetry": {:hex, :telemetry, "0.4.2", "2808c992455e08d6177322f14d3bdb6b625fbcfd233a73505870d8738a2f4599", [:rebar3], [], "hexpm", "2d1419bd9dda6a206d7b5852179511722e2b18812310d304620c7bd92a13fcef"},