Sentry-javascript: Ereignis: Ablehnung von Nicht-Fehler-Versprechen erfasst mit Schlüsseln: currentTarget, isTrusted, target, type

Erstellt am 20. Apr. 2020  ·  21Kommentare  ·  Quelle: getsentry/sentry-javascript

Paket + Version

  • [x] @sentry/browser
  • [ ] @sentry/node
  • [ ] raven-js
  • [ ] raven-node _(Rabe für Knoten)_
  • [ ] andere:

Ausführung:

5.10.2

Beschreibung

Mein Projekt erwischt oft einen Fehler wie Event Non-Error-Versprechensablehnung, erfasst mit Schlüsseln: currentTarget, isTrusted, target, type,ohne irgendwelche nützlichen Informationen. Und eine zusätzliche Angabe ist

__serialized__ = {
    currentTarget: [object Null], 
    isTrusted: [Circular ~], 
    target: head > script[type="text/javascript"], 
    type: error
}

sieht aus wie eine Event-Instanz. Mit den begrenzten Informationen,Ich weiß nicht, wo dieser Fehler ausgelöst wird,ist jemand auf das gleiche Problem gestoßen?

Needs Information

Hilfreichster Kommentar

Dieser Fehler hat gerade meine Kontingentkapazität aufgebraucht.

Alle 21 Kommentare

Wir haben auch angefangen, diese in den letzten Wochen zu sehen. Ich habe gerade angefangen, mich damit zu befassen, daher habe ich keine weiteren Details zur Ursache.

Das gleiche hier, jetzt auf Sentry v5.15.5.

Kann jemand einen Link zu dieser Art von Ereignis bereitstellen, das in Sentry erfasst wurde? Es sieht aus wie ein Fehler beim Laden des Skripts (beachten Sie die target ,

@kamilogorek können Sie mir bitte Ihre Firmen-E-Mail senden? Ich kann Beispiele für die Ereignisse teilen.

Wenn Sie weitere Beispiele benötigen, kann ich Ihnen auch welche schicken @kamilogorek - lassen Sie es mich einfach wissen.

@sheelah ja, bitte

@sheelah, da können wir ehrlich onunhandledrejection (dasselbe gilt für onerror in der OP-Beschreibung).

https://developer.mozilla.org/en-US/docs/Web/API/Window/unhandledrejection_event

Es gibt jedoch nichts, was jemanden davon abhalten würde, irgendwelche zufälligen Dinge dort hineinzugeben.
Daher ist Code wie dieser Promise.reject("whatever") oder Promise.reject(jQueryBecauseWhyNot) absolut gültiger JS-Code.

Immer wenn wir auf etwas stoßen, das kein primitiver Wert ist, ein Objekt, das den Stack-Trace (zB Error ) oder eine interne DOM-Ausnahme enthält, müssen wir auf die einfache Objektserialisierung zurückgreifen und versuchen, alle Informationen zu extrahieren, die wir herausbekommen können davon. Sie können die Datei eventbuilder.ts für eine Liste möglicher Pfade sehen, die dieser "beliebige Zufallswert" nehmen kann, der an den Ereignishandler übergeben wird – https://github.com/getsentry/sentry-javascript/blob/master/packages/ browser/src/eventbuilder.ts#L17 -L80

Leider bin ich mir nicht sicher, ob wir es noch allgemeiner machen können, um mehr Eingabetypen zu verarbeiten.
Wenn jemand Feedback zu diesem Prozess hat, bin ich für Vorschläge völlig offen.

(beantwortet hier statt an Ihre E-Mail, um die Konversation für alle anderen öffentlich zu halten)

Aus meinen Beobachtungen:

  • Tritt nur in verschiedenen neueren Versionen von Safari auf Mobilgeräten oder Desktops auf;
  • Ich habe einige Bibliotheken in meiner Web-App installiert, z. B. ZXing und browser-image-compression , aber keine Tracking-Skripte von Drittanbietern.
  • Es scheint genau zur gleichen Zeit aufzutreten, in der ein API-Aufruf mit einem Netzwerkfehler (Code 0) fehlschlägt.
  • In meinem Fall ist es genauer gesagt ein ProgressEvent , nicht nur ein Ereignis - das ein Teil der HTTP-Anforderungsbibliothek zu sein scheint (ich verwende Axios).
ADDITIONAL DATA

__serialized__ | {
    currentTarget: [object Null],
    isTrusted: [Circular ~],
    target: [object FileReader],
    type: error}
-- | --

Ich habe auch gerade einen Bericht mit "Nicht-Fehler-Versprechensablehnung erfasst mit Wert: null" erhalten. Ähnlich wie bei @anton-bot hat der betroffene Benutzer Safari 13.1.2 unter Mac OS X 10.15.6 verwendet.

Ich habe in meinem kompilierten App-Code nach reject( Aufrufen gesucht, in denen ein möglicherweise null Objekt bereitgestellt wird, konnte aber keines finden, also habe ich mich gefragt, ob es eine Browsererweiterung oder eine 3. Party-Skript. Da es keine Stack-Trace oder Breadcrumbs gibt, ist es ziemlich schwer zu wissen, was genau passiert ist.

Beobachte das auch seit zwei Wochen. Auf unserer Website haben wir es nur auf Seiten gesehen, die die JavaScript-API von Google Maps verwenden, daher habe ich das Gefühl, dass es damit zusammenhängt. Sehen dies noch jemand bei URLs, die Google Maps verwenden?

Bearbeiten: Bisher haben wir das Problem auf iOS und Android gesehen

Bearbeiten: Zusätzliche Daten:

{
  currentTarget: [object Null], 
  isTrusted: [Circular ~], 
  target: head > script[type="text/javascript"], 
  type: error
}

@asbjornh nein, ich habe kein Google Maps auf meiner Seite

@kamilogorek Würden die zusätzlichen Daten von OP (und meine) durch so etwas verursacht werden Promise.reject(new Event("error")) ? Oder würden Sentry-Ereignisse für diese Situation immer Nutzlasten haben, die wie Browser-Ereignisse aussehen?

Ich bekomme auch den gleichen Fehler

Dieser Fehler hat gerade meine Kontingentkapazität aufgebraucht.

davon haben wir 289 Veranstaltungen in den letzten 24h - und unsere Seite ist noch nicht mal live ..

{
currentTarget: [object Null], 
isTrusted: [Circular ~], 
target: head > link, 
type: error
}

Wir verwenden next.js

das gleiche hier mit cra 😅

Es scheint, dass dieses Problem ungefähr so ​​​​verursacht wird:

new Promise((resolve, reject) => {
  const script = document.createElement('script');
  script.src = src;
  script.onload = resolve;
  script.onerror = reject;
  document.body.appendChild(script);
});

Der onerror Hook empfängt tatsächlich ein Event Objekt anstelle einer Error Instanz, die die oben genannten Probleme verursacht. Dies kann vermieden werden, indem das Event mit einem Error umschlossen wird, wie von https://developer.mozilla.org/de/docs/Web/API/HTMLScriptElement vorgeschlagen :

new Promise((resolve, reject) => {
  const script = document.createElement('script');
  script.src = src;
  script.onload = resolve;
  script.onerror = event => {
    reject(new Error(`Failed to load ${event.target.src}`));
  };
  document.body.appendChild(script);
});

In meinem Fall war es der 9.5.2 Prefetching-Mechanismus von Next.js, der es in Firefox verursachte, nur für den Fall, dass jemand einen ähnlichen Fall hat. (vielleicht hier? https://github.com/getsentry/sentry-javascript/issues/2546#issuecomment-697771381) Das ist das Problem: https://github.com/vercel/next.js/pull/16757 und kann durch ein Upgrade auf 9.5.3 oder Canary gelöst werden.

Der Fehler ist im Browser jedoch viel ausführlicher:

Uncaught (in promise) 
error
bubbles: false
...
...
as: "fetch"
assignedSlot: null
attributes: NamedNodeMap(3
0: href="/_next/data/wmQYPCwvbuBulJfEwTMRf/smartwatches/fitbit-ionic.json"
1: rel="prefetch"
2: as="fetch"
as: as="fetch"
href: href="/_next/data/wmQYPCwvbuBulJfEwTMRf/smartwatches/fitbit-ionic.json"
length: 3
rel: rel="prefetch"
...
...
​
isTrusted: true
originalTarget: <link href="/_next/data/wmQYPCwvbuBu…tches/fitbit-ionic.json" rel="prefetch" as="fetch">
returnValue: true
srcElement: <link href="/_next/data/wmQYPCwvbuBu…tches/fitbit-ionic.json" rel="prefetch" as="fetch">​
target: <link href="/_next/data/wmQYPCwvbuBu…tches/fitbit-ionic.json" rel="prefetch" as="fetch">
timeStmp: 25366
type: "error"
...

Wie können wir Sentry dazu bringen, diese Daten zu erfassen?

@ Turbo87 JA! Genau aus diesem Grund sehen wir es nur auf Seiten mit @googlemaps/js-api-loader . Sie tun genau das, was Sie beschreiben hier

Danke schön!!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen