Adds a new diagnostics page under Config menu to monitor and manage Oban job queues. Helps troubleshoot stuck or failed jobs without needing to query the database directly. Features: - System overview (pending downloads, total media, sources, db size) - Queue health status with running/available/scheduled/retryable counts - Stuck jobs detection (executing > 30 min) with reset/cancel actions - Failed jobs list with error details and bulk reset option
53 lines
1.5 KiB
Elixir
53 lines
1.5 KiB
Elixir
defmodule PinchflatWeb.Settings.DiagnosticsController do
|
|
use PinchflatWeb, :controller
|
|
|
|
alias Pinchflat.Diagnostics.QueueDiagnostics
|
|
|
|
def show(conn, _params) do
|
|
render(conn, "show.html")
|
|
end
|
|
|
|
def reset_stuck_jobs(conn, _params) do
|
|
count = QueueDiagnostics.reset_stuck_jobs()
|
|
|
|
conn
|
|
|> put_flash(:info, "Reset #{count} stuck job(s). The queue will restart processing shortly.")
|
|
|> redirect(to: ~p"/diagnostics")
|
|
end
|
|
|
|
def reset_retryable_jobs(conn, _params) do
|
|
count = QueueDiagnostics.reset_retryable_jobs()
|
|
|
|
conn
|
|
|> put_flash(:info, "Reset #{count} retryable job(s). They will be retried shortly.")
|
|
|> redirect(to: ~p"/diagnostics")
|
|
end
|
|
|
|
def reset_job(conn, %{"id" => job_id}) do
|
|
case QueueDiagnostics.reset_job(String.to_integer(job_id)) do
|
|
1 ->
|
|
conn
|
|
|> put_flash(:info, "Job ##{job_id} has been reset and will retry shortly.")
|
|
|> redirect(to: ~p"/diagnostics")
|
|
|
|
0 ->
|
|
conn
|
|
|> put_flash(:error, "Job ##{job_id} could not be reset. It may have already completed or been cancelled.")
|
|
|> redirect(to: ~p"/diagnostics")
|
|
end
|
|
end
|
|
|
|
def cancel_job(conn, %{"id" => job_id}) do
|
|
case QueueDiagnostics.cancel_job(String.to_integer(job_id)) do
|
|
{:ok, :cancelled} ->
|
|
conn
|
|
|> put_flash(:info, "Job ##{job_id} has been cancelled.")
|
|
|> redirect(to: ~p"/diagnostics")
|
|
|
|
{:error, _reason} ->
|
|
conn
|
|
|> put_flash(:error, "Job ##{job_id} could not be cancelled.")
|
|
|> redirect(to: ~p"/diagnostics")
|
|
end
|
|
end
|
|
end
|