@sentry/node
4.6.3
Ich versuche, das neue Sentry-SDK in unsere serverlose Architektur zu integrieren. Wir haben einen allgemeinen Try-Catch um jeden Handler, der captureException aufruft. Kurz gesagt, so sieht unser Code aus (ich habe unsere Geschäftslogik und viele Hilfsmethoden weggelassen).
Sentry.init({
dsn: process.env.sentryUrl,
environment: process.env.NODE_ENV,
// debugging issue where we only get an event once
beforeSend: (event, _) => { console.log(event.exception); return event }
});
async function wrapper(...) {
try {
handler(...)
} catch(error) {
Sentry.configureScope(scope => {
scope.setTag("test", "Hello, world")
})
const eventId = Sentry.captureException(error)
// debugging, log event id to see if captureException works
console.log(eventId)
const flushResult = await Sentry.flush(1000)
console.log(flushResult) // see if flush succeeded
}
}
Ich habe dafür gesorgt, dass der Handler immer einen Fehler ausgibt. Wenn ich die erste Anfrage mache, landet alles gut in Sentry. Bei der zweiten Anfrage passiert nichts. Wenn ich in CloudWatch nachschaue, finde ich das. Der Einfachheit halber habe ich Kommentare hinzugefügt.
/// the eventId from captureException
2019-02-26T13:47:22.584Z: 8cf83e38081a4672841a6f795ce8105a
/// the middleware defined in Sentry.init
2019-02-26T13:47:23.153Z: { values: [ { stacktrace: [Object], type: 'Error', value: 'This is an error' } ] }
/// result of Sentry.flush
2019-02-26T13:47:23.294Z: true
/// the eventId from captureException
2019-02-26T13:47:24.761Z fbc2c8b2a4d5447380a0f92dd87896f6
/// result of Sentry.flush
2019-02-26T13:47:24.963Z: true
Wie Sie sehen, trifft es beforeSend
der zweiten Anfrage nie auf die
Ich sollte beachten, dass, wenn ich Sentry.getCurrentHub().getClient().captureException(error)
mache, die Ausnahme jedes Mal an Sentry gesendet wird, aber der in Sentry.configureScope
konfigurierte Bereich wird nie auf das Ereignis angewendet.
Ich habe versucht, dies lokal zu reproduzieren, aber es passiert nur, wenn es auf AWS Lambda bereitgestellt wird.
Es besteht die Möglichkeit, dass es dedupliziert wird.
Sie können debug: true
in Ihrem init
Aufruf verwenden, um zu sehen, was los ist.
Wenn es tatsächlich dedupliziert wird, können Sie diese Integration mit folgenden Schritten entfernen:
Sentry.init({
integrations: integrations => {
return integrations.filter(integration => integration.name !== 'Dedupe');
}
});
Interessant. Habe dies auf der Suche nach einem ähnlichen Problem gefunden. Die Deduplizierung zum Entfernen hat es für mich behoben.
Schließe dies, da es kein Fehler ist.
Außerdem macht die nächste Hauptversion Dedupe
optional, was bedeutet, dass standardmäßig keine Deduplizierung stattfindet.
Hilfreichster Kommentar
Es besteht die Möglichkeit, dass es dedupliziert wird.
Sie können
debug: true
in Ihreminit
Aufruf verwenden, um zu sehen, was los ist.Wenn es tatsächlich dedupliziert wird, können Sie diese Integration mit folgenden Schritten entfernen:
https://docs.sentry.io/platforms/node/default-integrations/