v151 · performance · reporting api

Journey recorder

The proposal asks the browser to record the same journey a page can capture today with PerformanceObserver — so this page does exactly that, live, and then assembles the explainer's application/reports+json payload from the entries it really observed and POSTs it to the real reporting endpoint.

Everything below runs the shipped APIs: PerformanceObserver with navigation, mark, measure, and visibility-state entry types, and a real POST to this site's Reporting-API-shaped endpoint. Only the final session-end entry is synthesized — it is the one entry today's JavaScript can never truly record for itself, which is the proposal's point. Switch tabs or minimise the window to watch real visibility-state entries arrive.

Live journey

Starting observers…

    Consolidated report

    Built from the entries above in the explainer's report format, with a synthesized session-end entry appended (clearly labelled — the browser cannot produce it today):

    No entries captured yet.
    Not delivered yet.

    code path

    const po = new PerformanceObserver((list) => render(list.getEntries()));
    po.observe({ type: 'mark', buffered: true });
    po.observe({ type: 'measure', buffered: true });
    po.observe({ type: 'navigation', buffered: true });
    po.observe({ type: 'visibility-state', buffered: true }); // Chrome 129+
    
    // the explainer's delivery format (application/reports+json)
    [{ type: 'performance-observer', age, url, user_agent,
       body: { entries: [ PerformanceNavigationTiming, PerformanceMark, …,
                          { entryType: 'session-end', … } ] } }]

    see also