Adopt @sentry/nextjs — real error monitoring (PR
Commitovi
a086f37690459aRETRACTED / SUPERSEDED 2026-07-22
Sentry uklonjen u potpunosti (PR #47). Vidi close-out
2026-07-22-06.
Ne koristi ove korake kao aktivan runbook.
Session 2026-07-20 — Adopt Sentry properly (PR #42, merged)
Kontekst
Nakon što je PR #41 stavio error-boundary-e na App Router, console.error
u ClientErrorBoundary.componentDidCatch je bio jedini trag production
crashova. src/lib/integrations/sentry.ts je već postojao kao status
poller, ali svi Sentry env vars (NEXT_PUBLIC_SENTRY_DSN,
SENTRY_AUTH_TOKEN, org/project slugs) bili su prazni — status card na
/admin je bio siv, ništa nije stvarno hvatalo greške.
User je zatražio potpunu adopciju Sentry-ja (opcija A iz plan mode
odluke). Sentry org već postoji: protoseschatos / project protosweb
(id 4511604980580432).
Što je napravljeno
-
Instaliran
@sentry/nextjs@10.67.0. -
Tri Sentry.init file-a + instrumentation — sve na repo root-u kako Next.js 15+ konvencija traži:
sentry.server.config.ts— Node runtime, DSN + tracesSampleRate 0.1sentry.edge.config.ts— Edge runtime (middleware, edge handlers)instrumentation-client.ts— browser +browserTracingIntegration()replayIntegration()s on-error only replay (session=0, onError=1) da quota ostane sitna
src/instrumentation.ts— dispatch poNEXT_RUNTIME, exportiraonRequestError = Sentry.captureRequestErrorza RSC/middleware greške
-
next.config.jswrappan uwithSentryConfigs:org: 'protoseschatos',project: 'protosweb'(slugovi safe za commit, nisu tajne)authToken: process.env.SENTRY_AUTH_TOKEN— build-time source-map uploadwidenClientFileUpload: true+hideSourceMaps: true— čitke stack trace u Sentry, korisnicima se ne šalje source-map fajltunnelRoute: '/monitoring'— same-origin proxy, izbjegava ad-blocker drop-ove i ne treba proširivati CSPconnect-srczaingest.sentry.iosilent: !process.env.CI— dev tišina lokalno, Vercel logovi zadržavaju bitne linijedisableLoggernamjerno izostavljen — deprecated u Sentry v10 i no-op pod Turbopack-om (Next 16 default)
-
ClientErrorBoundary(iz PR #41) proširen —componentDidCatchsad zoveSentry.captureExceptions tagovima{ boundary, label }i ReactcomponentStacku context-u.console.errorostaje kao first-line lokalni debug. -
Tri App Router
error.tsxboundary-a proširena —global-error.tsx,[locale]/error.tsx,[locale]/admin/error.tsxsvi imajuSentry.captureException(error)unutar postojećeguseEffect-a, tagovi po segmentu, digest kao extra. -
/api/admin/sentry-testroute (admin-guarded) — dva moda:?mode=capture(default) —captureException+Sentry.flush(2000)da event stigne prije nego serverless zatvori?mode=throw— throwa, vježbanjeonRequestError→ Sentry pipeline
-
.env.example+docs/SECRETS-INVENTORY.md— org/project slugovi pre-set (SENTRY_ORG_SLUG=protoseschatos,SENTRY_PROJECT_SLUG=protosweb); DSN + auth token dokumentirani s linkovima na gdje se generiraju.
Verifikacija
tsc --noEmitclean- ESLint na touched fajlovima clean
npm run buildpasses (jedan cosmetic Turbopack NFT warning od Sentry SDK-ovih dynamic require-ova — ne utječe na output)/api/admin/sentry-testregistrirana u route table- CI zeleno (Build, Cloudflare DNS, Supabase, Vercel preview)
Odluke i tradeoffi
- Session Replay on-error only, ne idle: video prije crasha je zlata vrijedan za React/R3F debugging, ali svaka sesija video = plaćeni storage. On-error zadržava zlatnu vrijednost bez računa.
tunnelRouteuključen: jedan API endpoint više na Vercelu, ali eliminira ad-blocker drop-ove (koji odbacuju ~15-30% error događaja za tech-savvy audience) i drži CSPconnect-srcuskim (bezsentry.io).- Neće se dirati postojeći status widget iz
src/lib/integrations/sentry.ts— samo počne raditi čim env vars stignu u Vercel. Additive-only pravilo (user je izričito rekao: ne brisati postojeći kod samo zato što je "in the way"). audit_eventsvs Sentry: audit ostaje source-of-truth za domain eventove (publish, upload, itd.); Sentry preuzima exceptions.- Source maps ON unatoč ~15s build overhead — odluka bez eksplicitnog user OK-a, pravilo "nema nečitljivih stack traceova".
- DSN javan pod
NEXT_PUBLIC_: to je Sentry default; DSN nije auth, samo tag koji Sentry koristi za projektnu asocijaciju.
Otvoreno / Sljedeći koraci
- [ ] User: postavi u Vercel (Production + Preview):
NEXT_PUBLIC_SENTRY_DSN— Sentry → Settings → Projects → protosweb → Client KeysSENTRY_AUTH_TOKEN— Sentry → Settings → Auth Tokens (scopes:project:read,project:releases,org:read)
- [ ] Post-deploy:
curl -H "Cookie: protos-admin-session=..." https://www.protosweb.eu/api/admin/sentry-test→ provjera u Sentry Issues - [ ] Wire Sentry MCP u Cursor sessions — jednom kad ima issue-a, MCP
search_issues+analyze_issue_with_seerpostaju korisni - [ ] Follow-up (nije blocker):
ClientErrorBoundary.onError→ dupli logging uaudit_events(Sentry-lite backup, compliance) - [ ] Follow-up: Slack/Telegram webhook iz Sentry projekta koristeći
postojeći
/admin/automationspattern
Reference
- PR: https://github.com/ProtosEschatos/Protos-Web/pull/42
- Merged commit: 690459a
- Branch commit: a086f37
- Predsjesija (PR #41 boundaries):
memory/sessions/2026-07-20-10-configurator-assets-crash-fix.md - Learning:
memory/learnings/protos-web-sentry-app-router-wiring.md - Sentry docs: https://docs.sentry.io/platforms/javascript/guides/nextjs/manual-setup/