Gå til innhold

Observabilitet for produksjonsfeil

Gjør a.js:1:4523 nyttig igjen

Slik ble produksjonsfeil mulige å finne og rette med opplastede kildekart, en Sentry-tunnel på samme opprinnelse, kontekstuelle feil, filtrering og øktopptak.

4 min lesetidAv

To måter feilen kunne forsvinne på

Vi hadde to separate blindsoner. Feilene som kom frem, pekte på minifisert kode som a.js:1:4523 fordi kildekart manglet. Andre hendelser kom aldri frem fordi direkte forespørsler til sentry.io kunne blokkeres.

Dette var uavhengige feil. Kildekart avgjør om et mottatt stabelspor kan kobles tilbake til kildekoden. Transporten avgjør om hendelsen i det hele tatt når Sentry. Hvis bare én av dem rettes, forblir hendelsen enten uleselig eller usynlig.

Last opp kildekart uten å publisere dem

@sentry/nextjs pakket byggingen inn med withSentryConfig. CI leverte SENTRY_AUTH_TOKEN, SENTRY_ORG og SENTRY_PROJECT. Byggeprogramtillegget lastet opp kartene, utvidet opplastingen av klientfiler for å gi bedre spor og brukte deleteSourcemapsAfterUpload, slik at kartene ikke ble levert fra det offentlige byggeresultatet.

export default withSentryConfig(nextConfig, {
  org: process.env.SENTRY_ORG,
  project: process.env.SENTRY_PROJECT,
  authToken: process.env.SENTRY_AUTH_TOKEN,
  sourcemaps: {
    disable: process.env.NODE_ENV === 'development',
    deleteSourcemapsAfterUpload: true
  },
  widenClientFileUpload: true,
  disableLogger: true,
  tunnelRoute: '/t'
})

Dermed ble koblingen til kildekoden en del av den vanlige utrullingsbyggingen. Ingen utvikler måtte huske en separat opplastingskommando med sentry-cli etter utgivelsen.

Bruk samme opprinnelse som applikasjonen til transport

Det første endepunktet på samme opprinnelse var /monitoring, men blokkeringene traff det fremdeles. Jeg forkortet ruten til /t. Nettleserhendelsene brukte deretter applikasjonens opprinnelse som mål, og Next.js-tjeneren videresendte dem til Sentry.

Den opprinnelige utrullingen registrerte full feilfangst etter endringen. Det var et resultat fra dette utrullingsvinduet, ikke et løfte om at alle blokkeringer og nettverk alltid vil levere hver hendelse.

Et stille avvik i verktøykjeden krevde en egen rettelse

Next.js 15 flyttet nettleseroppsettet til instrumentation-client.ts. Med Turbopack aktivert ble prosjektet stående på Sentry v9, og opplastingen av kildekart stoppet uten en tydelig feil i applikasjonen. Oppgraderingen til Sentry v10 gjenopprettet en kompatibel opplastingsbane.

Applikasjonen initialiserte også Sentry i kjøretidene for nettleser, tjener og edge, og la til error boundaries på rutenivå og globalt. Kobling av stabelspor til kildekode var et byggeansvar. Fangst av feil i React, forespørsler og kjøretid var et eget applikasjonsansvar.

Lesbar betyr ikke automatisk nyttig

En beforeSend-hook la til sidebane, nettleserinformasjon, visningsområde og en tagg for applikasjonsversjon. Den kategoriserte API-feil, tidsavbrudd og nettverksfeil og filtrerte kjente Twilio-begrensninger for anrop før innsamling.

Session Replay tok utvalg fra 5 % av vanlige økter og alle feiløkter i produksjon. Sporing kjørte først på 100 % i staging og 10 % i produksjon, men ble slått av da den brukte for mye av kvoten. Utvalgsgraden er en driftsinnstilling, ikke en verdi som bør kopieres ukritisk.

  • Last opp private kildekart under byggingen.
  • Send nettleserhendelser gjennom en tunnel på samme opprinnelse.
  • Skill forventede produktrestriksjoner fra applikasjonsfeil.
  • Legg ved rute- og opptakskontekst, slik at et lesbart linjenummer også har kontekst fra brukerflyten.