From e8b14bb8f83afd3b1468dc61e54a986aa455137f Mon Sep 17 00:00:00 2001 From: Artur Pata Date: Wed, 11 Mar 2026 17:21:39 +0200 Subject: [PATCH] Assert expected sentry context on conn timeout errors --- .../controllers/api/system_controller.ex | 13 ++++++++ lib/plausible_web/router.ex | 3 ++ test/plausible/stats/timeout_test.exs | 30 +++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 test/plausible/stats/timeout_test.exs diff --git a/lib/plausible_web/controllers/api/system_controller.ex b/lib/plausible_web/controllers/api/system_controller.ex index 4e5c75648217..814e63b89049 100644 --- a/lib/plausible_web/controllers/api/system_controller.ex +++ b/lib/plausible_web/controllers/api/system_controller.ex @@ -90,4 +90,17 @@ defmodule PlausibleWeb.Api.SystemController do sessions: sessions_health }) end + + def sentry(conn, _params) do + {:ok, _data} = + Ecto.Adapters.SQL.query( + Plausible.IngestRepo, + "SELECT count(*) FROM numbers(8000000000) WHERE sipHash64(number) % 1000000 = 0 SETTINGS max_execution_time=5", + [], timeout: 1000) + + put_status(conn, 200) + |> json(%{ + clickhouse: "ok" + }) + end end diff --git a/lib/plausible_web/router.ex b/lib/plausible_web/router.ex index d864985e87c1..481bdbb2203b 100644 --- a/lib/plausible_web/router.ex +++ b/lib/plausible_web/router.ex @@ -306,6 +306,9 @@ defmodule PlausibleWeb.Router do get "/:domain/operating-system-versions", StatsController, :operating_system_versions get "/:domain/screen-sizes", StatsController, :screen_sizes get "/:domain/conversions", StatsController, :conversions + + get "/:domain/sentry", SystemController, :sentry + get "/:domain/custom-prop-values/:prop_key", StatsController, :custom_prop_values get "/:domain/suggestions/:filter_name", StatsController, :filter_suggestions diff --git a/test/plausible/stats/timeout_test.exs b/test/plausible/stats/timeout_test.exs new file mode 100644 index 000000000000..e807a3df3167 --- /dev/null +++ b/test/plausible/stats/timeout_test.exs @@ -0,0 +1,30 @@ +defmodule Plausible.Stats.TimeoutTest do + use PlausibleWeb.ConnCase + + describe "fake endpoint" do + setup [:create_user, :log_in, :create_site] + + test "returns error and captures Sentry report when a query fails with timeout", %{ + test_pid: test_pid, + conn: conn, + site: site + } do + Plausible.Test.Support.Sentry.setup(test_pid) + + {status, _headers, _body} = + assert_error_sent(500, fn -> + get(conn, "/api/stats/#{site.domain}/sentry") + end) + + assert status == 500 + + assert [report] = Sentry.Test.pop_sentry_reports() + dbg(report) + # assert report.message.formatted == "traffic_for_site_ids: batch query failed" + # assert report.extra.batch_size == 3 + # assert report.extra.first_site_id == 1 + # assert report.extra.last_site_id == 3 + # assert is_binary(report.extra.error) + end + end +end