He estado tratando de configurar los datos del usuario en el alcance de Sentry a nivel mundial, por lo que cada vez que hay un error o evento, se le pasa la información del usuario.
Mi aplicación está integrada en Next.js, así que, naturalmente, agregué la configuración tal como está en la documentación de Sentry para Next.js.
No tengo la idea de dónde agregar el método Sentry.setUser({id: user.Id}) para que configure al usuario globalmente.
Hasta ahora lo he agregado al archivo _error.js de Sentry, dentro del método getInitialProps:
import NextErrorComponent from 'next/error'; import * as Sentry from '@sentry/nextjs'; import { getUser } from '../lib/session'; const MyError = ({ statusCode, hasGetInitialPropsRun, err }) => { if (!hasGetInitialPropsRun && err) { Sentry.captureException(err); } return <NextErrorComponent statusCode={statusCode} />; }; MyError.getInitialProps = async (context) => { const errorInitialProps = await NextErrorComponent.getInitialProps(context); const { req, res, err, asPath } = context; errorInitialProps.hasGetInitialPropsRun = true; const user = await getUser(req, res); // Set user information if (user) { console.log('Setting user'); Sentry.setUser({ id: user.Id }); } else { console.log('Removing user'); Sentry.configureScope(scope => scope.setUser(null)); } if (res?.statusCode === 404) { return errorInitialProps; } if (err) { Sentry.captureException(err); await Sentry.flush(2000); return errorInitialProps; } Sentry.captureException( new Error(`_error.js getInitialProps missing data at path: ${asPath}`), ); await Sentry.flush(2000); return errorInitialProps; }; export default MyError;
Pero al intentar registrar errores, la información del usuario no se muestra en Sentry, solo la IP de usuario predeterminada:
También intenté configurar el usuario después de un inicio de sesión exitoso, y todavía nada.
Se agradece la ayuda!!
Sugeriría usar el controlador de devolución de llamada para configurar el contexto de usuario de Sentry.
import { handleAuth, handleLogin, handleCallback } from "@auth0/nextjs-auth0"; import * as Sentry from "@sentry/nextjs"; import { NextApiHandler } from "next"; const afterCallback = (_req, _res, session, _state) => { Sentry.setUser({ id: session.user.sub, email: session.user.email, username: session.user.nickname, name: session.user.name, avatar: session.user.picture, }); return session; }; const handler: NextApiHandler = handleAuth({ async login(req, res) { await handleLogin(req, res, { returnTo: "/dashboard", }); }, async callback(req, res) { try { await handleCallback(req, res, { afterCallback }); } catch (error) { res.status(error.status || 500).end(error.message); } }, }); export default Sentry.withSentry(handler);
Puede configurar el usuario en Sentry justo después de iniciar sesión correctamente
const handleLogin = { try { const res = await axios.post("/login", {"john@example.com", "password"}) if (res && res?.data) { // Do other stuff Sentry.setUser({ email: "john@example.com" }); } } }
Además, puede borrar el usuario al cerrar la sesión
const handleLogout = { // Do othe stuff Sentry.configureScope(scope => scope.setUser(null)); }