I am using Next.js with AMP. That means my code runs only on the server. no client code.
I'm trying to integrate @sentry/node
However, while i'm adding this line alone to index.js
in /pages
const Sentry = require('@sentry/node');
the build fails with the following error:
[ wait ] compiling ...
[ error ] ./node_modules/@sentry/node/esm/integrations/console.js
Module not found: Can't resolve 'console' in '/Users/lirancohen/Projects/amp-app/node_modules/@sentry/node/esm/integrations'
I would appreciate any help to understand this issue. Using next 9.0.1 and sentry 5.0.5
Open your Sentry account and navigate to Settings > Integrations to enable the GitHub integration and add your backend-monitoring repository.
js Compiler introduced. The Next. js Compiler, written in Rust using SWC, allows Next. js to transform and minify your JavaScript code for production.
The DSN is not a secret, worst thing someone could do is sending events to your account. All “analytics” services have this problem. You can create just a new DSN and delete old ones. You can find this in your project settings -> Client Keys.
For people looking to implement Sentry with Next.js, make sure to check out https://github.com/UnlyEd/next-right-now
Most interesting parts are:
Disclaimer: I'm one of the project's contributors
Note the above links point to a fix commit to avoid breaking, but you should consider looking at a up-to-date version. Branch: https://github.com/UnlyEd/next-right-now/blob/v2-mst-aptd-at-lcz-sty/
utils/sentry.ts
import { NowRequest } from '@now/node/dist';
import * as Sentry from '@sentry/node';
import get from 'lodash.get';
import { isBrowser } from '@unly/utils';
/**
* Initialize Sentry and export it.
*
* Helper to avoid duplicating the init() call in every /pages/api file.
* Also used in pages/_app for the client side, which automatically applies it for all frontend pages.
*/
Sentry.init({
dsn: process.env.SENTRY_DSN,
enabled: process.env.NODE_ENV !== 'test',
environment: process.env.APP_STAGE,
release: process.env.APP_VERSION_RELEASE,
});
if (!process.env.SENTRY_DSN && process.env.NODE_ENV !== 'test') {
// eslint-disable-next-line no-console
console.error('Sentry DSN not defined');
}
// Scope configured by default, subsequent calls to "configureScope" will add additional data
Sentry.configureScope((scope) => { // See https://www.npmjs.com/package/@sentry/node
scope.setTag('nodejs', process.version);
scope.setTag('nodejsAWS', process.env.AWS_EXECUTION_ENV || null); // Optional - Available on production environment only
scope.setTag('memory', process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE || null); // Optional - Available on production environment only
scope.setTag('runtimeEngine', isBrowser() ? 'browser' : 'server');
scope.setTag('buildTime', process.env.BUILD_TIME);
});
/**
* Configure the Sentry scope by extracting useful tags and context from the given request.
*
* @param req
*/
export const configureReq = (req: NowRequest): void => {
Sentry.configureScope((scope) => {
scope.setTag('host', get(req, 'headers.host'));
scope.setTag('url', get(req, 'url'));
scope.setTag('method', get(req, 'method'));
scope.setContext('query', get(req, 'query'));
scope.setContext('cookies', get(req, 'cookies'));
scope.setContext('body', get(req, 'body'));
scope.setContext('headers', get(req, 'headers'));
});
};
export default Sentry;
Usage examples (pages/_app.tsx):
import * as Sentry from '@sentry/node';
import '../utils/sentry';
//...
Sentry.configureScope((scope) => { // See https://www.npmjs.com/package/@sentry/node
scope.setTag('customer', customerRef);
scope.setTag('userId', userSession.id);
scope.setContext('userSession', userSession);
scope.setContext('cookies', readonlyCookies);
});
Sentry.addBreadcrumb({ // See https://docs.sentry.io/enriching-error-data/breadcrumbs
category: fileLabel,
message: `Preparing app (${isBrowser() ? 'browser' : 'server'})`,
level: Sentry.Severity.Debug,
});
Webpack config (next.config.js)
webpack: (config, { isServer, buildId }) => {
// Fixes npm packages that depend on `fs` module
config.node = {
fs: 'empty',
};
// XXX See https://github.com/zeit/next.js/blob/canary/examples/with-sentry-simple/next.config.js
// In `pages/_app.js`, Sentry is imported from @sentry/node. While
// @sentry/browser will run in a Node.js environment, @sentry/node will use
// Node.js-only APIs to catch even more unhandled exceptions.
//
// This works well when Next.js is SSRing your page on a server with
// Node.js, but it is not what we want when your client-side bundle is being
// executed by a browser.
//
// Luckily, Next.js will call this webpack function twice, once for the
// server and once for the client. Read more:
// https://nextjs.org/docs#customizing-webpack-config
//
// So ask Webpack to replace @sentry/node imports with @sentry/browser when
// building the browser's bundle
if (!isServer) {
config.resolve.alias['@sentry/node'] = '@sentry/browser';
}
return config;
},
As an alternative, you don't need to use @sentry/node
. You can use @sentry/browser
also. Checkout this link to see a sample implementation.
Alternatively, here you can find a well documented with-sentry
option running with npx create-react-app
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With