v151 · performance · http header

Header anatomy

Compose a real Performance-Observer header from the explainer's four directives, send it from this server, and read the actual negotiated response headers back — with the entry-types list seeded from what this browser's performance timeline really supports.

Pre-incubation proposal: the header this server sends is real and syntactically valid, but no shipping Chrome acts on it yet. There is no chrome://flags entry, Blink runtime feature, or origin trial to enable — when one exists, this page's round-trip becomes a live end-to-end test.

Build the header

entry-types (from this browser's PerformanceObserver.supportedEntryTypes)

Reading supported entry types…

include-user-timing allowlist

capture-early-failures

Header preview (built locally):

Performance-Observer: report-to="telemetry"
No request sent yet. The response's real Performance-Observer and Reporting-Endpoints headers will appear here.

The proposal activates at navigation time, not on a subresource fetch — so you can also open a real document navigation that carries this exact header pair on its response:

Open a navigation response carrying this header ↗

code path

// server response (real, sent by this site's Deno server)
Performance-Observer: report-to="telemetry",
  entry-types=("navigation" "mark" "visibility-state"),
  include-user-timing=("hero-image-loaded" "next-link-clicked"),
  capture-early-failures=?1
Reporting-Endpoints: telemetry="<origin>/v151/declarative-performance-observer/report"

// client: read the negotiated headers off the same-origin response
const res = await fetch('../header-echo?entry=navigation,mark&mark=hero-image-loaded&early=1');
res.headers.get('performance-observer');

see also