Introduction
Sentry est la référence en observabilité applicative, surpassant les logs basiques par sa capacité à capturer erreurs, ralentissements et flux utilisateur en temps réel. En 2026, avec les apps fullstack comme Next.js 15+, intégrer Sentry n'est plus optionnel : c'est essentiel pour déboguer en production sans downtime. Ce tutoriel avancé vous guide pas à pas pour une implémentation complète – frontend, backend, tracing distribué et métriques custom. Imaginez : un utilisateur clique, une erreur surgit, Sentry capture le stacktrace, le contexte session et les performances API en un dashboard intuitif. Pour un dev senior, cela signifie réduction de 70% du MTTR (Mean Time To Resolution). Nous couvrons configs TypeScript natives, instrumentation auto et optimisations SEO-friendly pour vos issues. Prêt à transformer vos alertes en insights actionnables ? (128 mots)
Prérequis
- Node.js 20+ et npm/yarn/pnpm
- Next.js 15+ avec App Router (TypeScript)
- Compte Sentry.io gratuit (ou self-hosted)
- Connaissances avancées en React Server Components et middleware
- Vercel ou serveur Node pour déploiement
Création du projet et installation du SDK
npx create-next-app@latest sentry-app --typescript --tailwind --eslint --app --src-dir --import-alias "@/*"
cd sentry-app
npm install @sentry/nextjs@latest
npm install --save-dev @sentry/webpack-plugin@latest
npm run devCette commande initialise un projet Next.js moderne et installe le SDK Sentry officiel, optimisé pour App Router. Le plugin Webpack assure l'upload automatique des sourcemaps en build. Lancez dev pour tester ; évitez les versions outdated qui cassent le tree-shaking.
Configuration de base du projet
Créez un projet Sentry via l'interface (Organization > New Project > Next.js). Récupérez votre DSN (Data Source Name) et authToken. Ajoutez ces variables d'environnement dans .env.local : NEXT_PUBLIC_SENTRY_DSN=votre_dsn et SENTRY_AUTH_TOKEN=votre_token. Cela active l'instrumentation auto pour erreurs client/serveur. Pour l'advanced, préparez release pour corréler builds et erreurs.
Configuration Next.js avec plugin Sentry
const { withSentryConfig } = require('@sentry/nextjs');
const nextConfig = {
experimental: {
ppr: true,
},
transpilePackages: [],
};
const sentryWebpackPluginOptions = {
silent: true,
org: "votre-org",
project: "votre-projet",
};
module.exports = withSentryConfig(nextConfig, sentryWebpackPluginOptions);Ce next.config.js intègre le plugin Sentry pour sourcemaps et releases auto en build (npm run build). Remplacez org et project par vos valeurs Sentry. Piège : sans silent: true, les logs polluent ; activez PPR (Partial Prerendering) pour perf 2026 sans conflit.
Config client Sentry (erreurs browser)
import * as Sentry from '@sentry/nextjs';
Sentry.init({
dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
tracesSampleRate: 1.0,
// Capture 20% des transactions pour performance
profilesSampleRate: 0.2,
// Ajout de contexte custom
integrations: [
Sentry.browserProfilingIntegration(),
Sentry.replayIntegration({
maskAllText: false,
blockAllMedia: true,
}),
],
// Set tracesSampleRate to 1.0 to capture 100%
// of transactions for tracing
beforeSendTransaction: (event) => {
// Modifiez tags avant envoi
event.tags = { ...event.tags, env: 'prod' };
return event;
},
});Initialise Sentry côté client avec profiling et session replay. tracesSampleRate: 1.0 trace tout en dev ; baissez en prod. beforeSendTransaction customise events pour filtrage/tagging. Évitez maskAllText: true si vous avez besoin de text pour debug.
Instrumentation serveur et middleware
Important : Importez ces configs dans layout.tsx : import './sentry.client.config'; import './sentry.server.config';. Pour le tracing distribué, un middleware capture spans API. Cela propage traces de client à serveur, idéal pour microservices.
Config serveur Sentry et middleware tracing
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
import * as Sentry from '@sentry/nextjs';
Sentry.init({
dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
tracesSampleRate: 1.0,
});
export function middleware(request: NextRequest) {
// Capture performance API
return Sentry.withServerSpan(
{ op: 'http.server', name: request.nextUrl.pathname },
() => {
const response = NextResponse.next();
Sentry.getCurrentHub()
?.getScope()
?.setTransactionName(request.nextUrl.pathname);
return response;
}
);
}
export const config = {
matcher: '/((?!_next/static|_next/image|favicon.ico|.*pdf|.*svg).*)',
};Ce middleware wrappe requests en spans Sentry pour tracing end-to-end. withServerSpan auto-capture timings ; matcher exclut assets statiques. Piège : oubliez getCurrentHub et les traces se perdent. Parfait pour analyser bottlenecks API.
Config serveur dédiée
import * as Sentry from '@sentry/nextjs';
Sentry.init({
dsn: process.env.NEXT_PUBLIC_SENTRY_DSN,
tracesSampleRate: 1.0,
// Auto-instrument Next.js
integrations: [
new Sentry.Integrations.ServerRuntimeDetection(),
new Sentry.Integrations.Modules(),
new Sentry.Integrations.Http({ tracing: true }),
new Sentry.Integrations.ContextLines(),
new Sentry.Integrations.LocalVariables(),
],
// Patch Node globals
integrations: [new Sentry.Integrations.Otel()],
beforeSend(event) {
// Filtre PII
if (event.exception) {
event.exception.values?.forEach((exc) => {
exc.stacktrace?.frames?.forEach((frame) => {
frame.filename = frame.filename?.replace(/auth_token=[^\s]+/, 'auth_token=***');
});
});
}
return event;
},
});Active OpenTelemetry et HTTP tracing côté serveur. beforeSend scrubbe données sensibles comme tokens. Ajoutez LocalVariables pour vars debug en prod (limité). Évitez overload : tracesSampleRate <0.5 en high-traffic.
Ajout de contexte utilisateur et breadcrumbs
Pour contextualiser erreurs, utilisez Sentry.setUser et addBreadcrumb dans components. Cela lie issues à sessions réelles, boostant résolution x3.
Exemple d'usage avec contexte dans une page
import * as Sentry from '@sentry/nextjs';
import { headers } from 'next/headers';
export default async function Home() {
'use server';
const userId = headers().get('x-user-id') || 'anonymous';
// Contexte utilisateur
Sentry.setUser({ id: userId, ip_address: 'auto' });
Sentry.setTag('feature', 'dashboard');
// Breadcrumb pour actions
Sentry.addBreadcrumb({
category: 'auth',
message: 'User login attempt',
level: Sentry.Severity.Info,
});
// Simule erreur pour test
if (Math.random() < 0.1) {
throw new Error('Test Sentry capture');
}
return <div>Bienvenue ! Erreurs monitorées par Sentry.</div>;
}Injecte user context et breadcrumbs dans RSC. 'use server' assure exécution serveur. Testez avec erreur random ; en prod, wrappez async ops. Piège : oubliez headers() dynamique, context se perd en SSR.
Bonnes pratiques
- Sampling intelligent :
tracesSampleRate: 0.1en prod, 1.0 en staging ; utilisezbeforeSendpour filtrer noise. - Releases & Sourcemaps : Toujours tagger builds (
sentry-cli releases new v1.0) pour stacktraces originaux. - Alertes custom : Configurez Slack/Teams via Sentry UI sur metrics clés (LCP >2s).
- PII Scrubbing : Activez globalement + custom
beforeSendpour GDPR. - Profiling : Limitez à 20% (
profilesSampleRate) pour éviter quota exceed.
Erreurs courantes à éviter
- DSN mal placée :
NEXT_PUBLIC_seulement pour client ; serveur utilise sans prefix. - Pas de sourcemaps : Build sans plugin → stacktraces minifiés illisibles.
- Tracing incomplet : Oubli middleware → spans client/serveur déconnectés.
- Over-sampling : 100% traces en prod sature quota (500k events/mois gratuit).
- Ignore dev errors : Ajoutez
debug: falseetenvironment: process.env.NODE_ENV.
Pour aller plus loin
Approfondissez avec OpenTelemetry + Sentry pour microservices. Intégrez Prometheus/Grafana pour metrics hybrides. Découvrez nos formations Learni sur l'observabilité : Next.js Expert et DevOps Avancé. Rejoignez la communauté Discord Learni pour Q&A live.