From 4875ff43fc5da55d7c85eef23c9804964502ba14 Mon Sep 17 00:00:00 2001 From: Jason Moggridge Date: Mon, 23 Mar 2026 09:11:51 -0400 Subject: [PATCH] BUILD: Add client monitoring with sentry.io --- .github/workflows/build.yml | 10 ++++ packages/frontend/.env.production | 2 + packages/frontend/.env.staging | 2 + packages/frontend/package.json | 1 + packages/frontend/pnpm-lock.yaml | 76 +++++++++++++++++++++++++++++++ packages/frontend/src/index.tsx | 10 ++++ 6 files changed, 101 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b2f0722e6..18d198760 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -125,6 +125,16 @@ jobs: # Uses env from packages/frontend/.env.production pnpm --filter ./packages/frontend run build + - name: Upload source maps to Sentry + if: github.event_name == 'release' || (github.event_name == 'push' && github.ref == 'refs/heads/main') + run: | + pnpm dlx @sentry/cli sourcemaps upload \ + --org topos-institute \ + --project catcolab \ + packages/frontend/dist + env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + - name: Report cache status run: | if [ "${{ github.event_name }}" = "release" ]; then diff --git a/packages/frontend/.env.production b/packages/frontend/.env.production index e78138948..79cde5097 100644 --- a/packages/frontend/.env.production +++ b/packages/frontend/.env.production @@ -1,4 +1,6 @@ VITE_APP_TITLE="CatColab" +VITE_SENTRY_DSN="https://1591d07f34c82ac5ead23171188c0b25@o4507942686883840.ingest.us.sentry.io/4511055002599424" +VITE_SENTRY_ENVIRONMENT="production" VITE_SERVER_URL=https://backend.catcolab.org VITE_AUTOMERGE_REPO_URL=wss://backend.catcolab.org/repo-ws diff --git a/packages/frontend/.env.staging b/packages/frontend/.env.staging index 1ae9751ba..b37a63897 100644 --- a/packages/frontend/.env.staging +++ b/packages/frontend/.env.staging @@ -1,4 +1,6 @@ VITE_APP_TITLE="CatColab [next]" +VITE_SENTRY_DSN="https://1591d07f34c82ac5ead23171188c0b25@o4507942686883840.ingest.us.sentry.io/4511055002599424" +VITE_SENTRY_ENVIRONMENT="staging" VITE_SERVER_URL=https://backend-next.catcolab.org VITE_AUTOMERGE_REPO_URL=wss://backend-next.catcolab.org/repo-ws diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 3bb132e6c..1c4431e19 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -38,6 +38,7 @@ "@mdx-js/rollup": "^3.1.0", "@modular-forms/solid": "^0.24.1", "@qubit-rs/client": "^0.4.5", + "@sentry/solid": "^10.43.0", "@solid-primitives/context": "^0.3.1", "@solid-primitives/destructure": "^0.2.1", "@solid-primitives/event-listener": "^2.4.3", diff --git a/packages/frontend/pnpm-lock.yaml b/packages/frontend/pnpm-lock.yaml index 3fafb76f6..bdb1620ca 100644 --- a/packages/frontend/pnpm-lock.yaml +++ b/packages/frontend/pnpm-lock.yaml @@ -53,6 +53,9 @@ importers: '@qubit-rs/client': specifier: ^0.4.5 version: 0.4.5 + '@sentry/solid': + specifier: ^10.43.0 + version: 10.43.0(@solidjs/router@0.15.3(solid-js@1.9.10))(solid-js@1.9.10) '@solid-primitives/context': specifier: ^0.3.1 version: 0.3.2(solid-js@1.9.10) @@ -1047,6 +1050,43 @@ packages: cpu: [x64] os: [win32] + '@sentry-internal/browser-utils@10.43.0': + resolution: {integrity: sha512-8zYTnzhAPvNkVH1Irs62wl0J/c+0QcJ62TonKnzpSFUUD3V5qz8YDZbjIDGfxy+1EB9fO0sxtddKCzwTHF/MbQ==} + engines: {node: '>=18'} + + '@sentry-internal/feedback@10.43.0': + resolution: {integrity: sha512-YoXuwluP6eOcQxTeTtaWb090++MrLyWOVsUTejzUQQ6LFL13Jwt+bDPF1kvBugMq4a7OHw/UNKQfd6//rZMn2g==} + engines: {node: '>=18'} + + '@sentry-internal/replay-canvas@10.43.0': + resolution: {integrity: sha512-ZIw1UNKOFXo1LbPCJPMAx9xv7D8TMZQusLDUgb6BsPQJj0igAuwd7KRGTkjjgnrwBp2O/sxcQFRhQhknWk7QPg==} + engines: {node: '>=18'} + + '@sentry-internal/replay@10.43.0': + resolution: {integrity: sha512-khCXlGrlH1IU7P5zCEAJFestMeH97zDVCekj8OsNNDtN/1BmCJ46k6Xi0EqAUzdJgrOLJeLdoYdgtiIjovZ8Sg==} + engines: {node: '>=18'} + + '@sentry/browser@10.43.0': + resolution: {integrity: sha512-2V3I3sXi3SMeiZpKixd9ztokSgK27cmvsD9J5oyOyjhGLTW/6QKCwHbKnluMgQMXq20nixQk5zN4wRjRUma3sg==} + engines: {node: '>=18'} + + '@sentry/core@10.43.0': + resolution: {integrity: sha512-l0SszQAPiQGWl/ferw8GP3ALyHXiGiRKJaOvNmhGO+PrTQyZTZ6OYyPnGijAFRg58dE1V3RCH/zw5d2xSUIiNg==} + engines: {node: '>=18'} + + '@sentry/solid@10.43.0': + resolution: {integrity: sha512-FpFwbm/vACalwXBxQ7VMxFbeOFa0zcz51Cp1vd1IOHZED8b6FFFErssLN1QLbxL4I3KHKYf2lfdoXMVT26SaYQ==} + engines: {node: '>=18'} + peerDependencies: + '@solidjs/router': ^0.13.4 || ^0.14.0 || ^0.15.0 + '@tanstack/solid-router': ^1.132.27 + solid-js: ^1.8.4 + peerDependenciesMeta: + '@solidjs/router': + optional: true + '@tanstack/solid-router': + optional: true + '@shikijs/core@1.21.0': resolution: {integrity: sha512-zAPMJdiGuqXpZQ+pWNezQAk5xhzRXBNiECFPcJLtUdsFM3f//G95Z15EHTnHchYycU8kIIysqGgxp8OVSj1SPQ==} @@ -4122,6 +4162,42 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.53.2': optional: true + '@sentry-internal/browser-utils@10.43.0': + dependencies: + '@sentry/core': 10.43.0 + + '@sentry-internal/feedback@10.43.0': + dependencies: + '@sentry/core': 10.43.0 + + '@sentry-internal/replay-canvas@10.43.0': + dependencies: + '@sentry-internal/replay': 10.43.0 + '@sentry/core': 10.43.0 + + '@sentry-internal/replay@10.43.0': + dependencies: + '@sentry-internal/browser-utils': 10.43.0 + '@sentry/core': 10.43.0 + + '@sentry/browser@10.43.0': + dependencies: + '@sentry-internal/browser-utils': 10.43.0 + '@sentry-internal/feedback': 10.43.0 + '@sentry-internal/replay': 10.43.0 + '@sentry-internal/replay-canvas': 10.43.0 + '@sentry/core': 10.43.0 + + '@sentry/core@10.43.0': {} + + '@sentry/solid@10.43.0(@solidjs/router@0.15.3(solid-js@1.9.10))(solid-js@1.9.10)': + dependencies: + '@sentry/browser': 10.43.0 + '@sentry/core': 10.43.0 + solid-js: 1.9.10 + optionalDependencies: + '@solidjs/router': 0.15.3(solid-js@1.9.10) + '@shikijs/core@1.21.0': dependencies: '@shikijs/engine-javascript': 1.21.0 diff --git a/packages/frontend/src/index.tsx b/packages/frontend/src/index.tsx index f0fe045c2..749ecc95c 100644 --- a/packages/frontend/src/index.tsx +++ b/packages/frontend/src/index.tsx @@ -1,5 +1,6 @@ /* @refresh reload */ +import * as Sentry from "@sentry/solid"; import { render } from "solid-js/web"; import * as catlog from "catlog-wasm"; @@ -11,6 +12,15 @@ import "katex/dist/katex.min.css"; // Set panic hook for nice tracebacks from Rust core. catlog.set_panic_hook(); +const sentryDsn = import.meta.env.VITE_SENTRY_DSN; +if (sentryDsn) { + Sentry.init({ + dsn: sentryDsn, + environment: import.meta.env.VITE_SENTRY_ENVIRONMENT, + tracesSampleRate: 1.0, + }); +} + const root = document.getElementById("root"); render(() => , root!);