Files
prowler/ui/sentry/sentry.server.config.ts

86 lines
2.4 KiB
TypeScript

import * as Sentry from "@sentry/nextjs";
const SENTRY_DSN = process.env.SENTRY_DSN;
// Only initialize Sentry if DSN is configured
if (SENTRY_DSN) {
const isProduction = process.env.SENTRY_ENVIRONMENT === "pro";
/**
* Server-side Sentry configuration
*
* This setup includes:
* - Performance monitoring for server-side operations
* - Error tracking for API routes and server actions
* - beforeSend hook to filter noise and add context
*/
Sentry.init({
// 📍 DSN - Data Source Name (identifies your Sentry project)
dsn: SENTRY_DSN,
// 🌍 Environment configuration
environment: process.env.SENTRY_ENVIRONMENT || "local",
// 📦 Release tracking
release: process.env.SENTRY_RELEASE,
// 📊 Sample Rates - Performance monitoring
// 100% in dev (test everything), 50% in production (balance visibility with costs)
tracesSampleRate: isProduction ? 0.5 : 1.0,
profilesSampleRate: isProduction ? 0.5 : 1.0,
// 🔌 Integrations
integrations: [
Sentry.extraErrorDataIntegration({
depth: 5, // Include up to 5 levels of nested objects
}),
],
// 🎣 Filter expected errors - Don't send noise to Sentry
ignoreErrors: [
// NextAuth redirect errors - Expected behavior
"NEXT_REDIRECT",
"NEXT_NOT_FOUND",
// Expected HTTP errors - Expected when users lack permissions
"401", // Unauthorized
"403", // Forbidden
"404", // Not Found
],
beforeSend(event, hint) {
// Add server context and tag errors appropriately
if (event.exception) {
const error = hint.originalException;
// Tag API errors for better filtering in Sentry dashboard
if (
error &&
typeof error === "object" &&
"message" in error &&
typeof error.message === "string"
) {
if (error.message.includes("Server error")) {
event.tags = {
...event.tags,
error_type: "server_error",
severity: "high",
};
} else if (error.message.includes("Request failed")) {
event.tags = {
...event.tags,
error_type: "api_error",
};
}
// Don't send NextAuth expected errors
if (error.message.includes("NEXT_REDIRECT")) {
return null;
}
}
}
return event;
},
});
}