Start · Sprachen · JavaScript · Referenz · ReportingObserver.observe()

ReportingObserver.observe()

Methode

Weist einen <code>ReportingObserver</code> an, Berichte (z. B. Deprecation- oder Intervention-Reports) zu sammeln und an seinen Callback zu übergeben.

seit JavaScript Chrome/Edge 69+, Firefox 110+ (Safari 16.4+ teilwe Kategorie: webapi

Signatur

ReportingObserver.prototype.observe()

Beschreibung

Mit observe() startest du einen zuvor mit new ReportingObserver(callback, options) erzeugten Observer. Erst nach dem Aufruf landen neu erzeugte Berichte in der Berichts-Warteschlange des Observers und werden gebündelt an den Callback übergeben. Welche Berichtstypen gesammelt werden, legst du im Konstruktor fest, nicht in observe(). Die Methode selbst nimmt keine Argumente.

Solche Berichte erzeugt der Browser zum Beispiel, wenn deine Seite veraltete APIs nutzt (deprecation), wenn er aus Sicherheits- oder Performancegründen eingreift (intervention), bei Absturzberichten (crash, nur über den Reporting-Endpunkt) oder bei Verstößen gegen die Content Security Policy (csp-violation). Damit kannst du Probleme aus echten Nutzersitzungen einsammeln und etwa per navigator.sendBeacon() an dein Monitoring schicken.

Hast du im Konstruktor buffered: true gesetzt, bekommst du nach observe() auch Berichte, die schon vor dem Erzeugen des Observers entstanden sind. Mit disconnect() beendest du die Beobachtung. takeRecords() leert die Warteschlange sofort und gibt die noch nicht zugestellten Berichte zurück.

Rückgabewert

Typ
void
Beschreibung
Kein Rückgabewert (undefined).

Beispiele

Deprecation-Berichte beobachten

const observer = new ReportingObserver((reports, obs) => {
  for (const report of reports) {
    console.log(report.type, report.body.id, report.body.message);
  }
}, { types: ['deprecation'], buffered: true });

// Ab jetzt werden Berichte gesammelt (inkl. bereits gepufferter)
observer.observe();
deprecation <id> <Meldungstext des Browsers>

Berichte an ein Monitoring-Backend senden

const sendReports = (reports) => {
  const payload = reports.map((r) => ({
    type: r.type,
    url: r.url,
    body: r.body?.toJSON ? r.body.toJSON() : r.body
  }));
  navigator.sendBeacon('/api/browser-reports', JSON.stringify(payload));
};

const observer = new ReportingObserver(sendReports, {
  types: ['deprecation', 'intervention'],
  buffered: true
});
observer.observe();

// Beim Verlassen der Seite noch offene Berichte mitschicken
addEventListener('pagehide', () => {
  const pending = observer.takeRecords();
  if (pending.length) sendReports(pending);
});

Feature-Erkennung und Beenden der Beobachtung

if ('ReportingObserver' in window) {
  const observer = new ReportingObserver((reports) => {
    console.warn(`${reports.length} Bericht(e) erhalten`);
  });
  observer.observe();

  // Nach 30 Sekunden nicht mehr beobachten
  setTimeout(() => observer.disconnect(), 30_000);
} else {
  console.info('ReportingObserver wird nicht unterstützt');
}
1 Bericht(e) erhalten

// Wichtig · Fallstricke

  • Keine Argumente: Berichtstypen (types) und buffered werden im Konstruktor gesetzt. Übergibst du Optionen an observe(), werden sie ignoriert.
  • Asynchrone Zustellung: Der Callback wird nicht sofort bei jedem Bericht aufgerufen, sondern gebündelt und mit Verzögerung. Brauchst du die Berichte sofort (z. B. beim Entladen der Seite), nutze takeRecords().
  • Nicht alle Typen sind beobachtbar: crash-Berichte und bestimmte Netzwerkberichte gibt es nur über den HTTP-Header Reporting-Endpoints, nicht über den JavaScript-Observer.
  • Browser-Kompatibilität: Chromium-Browser unterstützen die API seit Version 69, Firefox seit 110, Safari nur teilweise. Prüfe vorher mit 'ReportingObserver' in window, ob die API vorhanden ist. Welche Berichtstypen tatsächlich erzeugt werden, hängt vom Browser ab.
  • Datenschutz: Berichte können URLs und Quelltext-Positionen enthalten. Prüfe deshalb, welche Daten du an Dritte weitergibst.