Crash reports: self-hosted Sentry instead of Backtrace, and opt-in performance timings

Crash dumps now go to the project's own Sentry server. The launcher's
out-of-process helper is unchanged; only where it posts and what it expects
back are:

- The default endpoint is the Sentry project's minidump URL. Report
  attributes travel as Sentry tags, with the release as reskate@<version>.
- An upload counts as accepted when the server answers with an event ID.
- "backtrace" is "crash_report" throughout: the namespace, files, CMake
  targets, DINGOSDK_CRASH_REPORT_URL, DINGOSDK_BUILD_CRASH_REPORT_TESTS and
  the RESKATE_CRASH_REPORT_URL override.

Performance timings are new, and off unless "Send performance timings" is
ticked in the launcher's settings (RESKATE_TRACING=1). A small tracer
(Engine/Core/Debug/trace.h) posts each finished step to Sentry as a
transaction from a background thread; the launcher and the game it starts
share one trace. Timed: the update check, the Steam download, Thunderstore
installs, the mod merge, starting the game, the launch up to the first
playable level, each level load, joining a session, fetching the identity
lists, and the time spent in each level with its average frame rate and
long frames. Turning crash reports off turns timings off too.
This commit is contained in:
AyeZeeBB committed 2026-10-12 23:24:33 -05:00
1 parent 86aa8d38fb
commit 4ac1343b95
42 files changed
+675 -155

No files matched your search

@@ -1,6 +1,7 @@
#include "developer_identity.h"
#include "word_lists.h"
#include "Engine/Core/Log/logging.h"
#include "Engine/Core/Debug/trace.h"
#include "Engine/Vfs/https_download.h"
#include <Windows.h>
#include <atomic>
@@ -20,8 +21,10 @@ void fetch() noexcept {
bool ok{};
try {
https::Download download;
trace::Scope timing("backend.identity_lists", "http.client");
const auto answer = https::get_text(std::wstring(identity_lists_url.begin(), identity_lists_url.end()), max_bytes, 10,
L"ReSkate-Identity/1", &download);
if (!answer) timing.fail();
if (answer) {
auto lists = parse_identity_lists(*answer);
server_tokens_rule = parse_server_tokens_required(*answer);