The number of reported reasons a page was not restored from the back/forward cache on a back/forward navigation. 0 when the browser reported no reasons (e.g. non-Chromium browsers).
{
"key": "browser.bfcache.not_restored_reason_count",
"brief": "The number of reported reasons a page was not restored from the back/forward cache on a back/forward navigation. 0 when the browser reported no reasons (e.g. non-Chromium browsers).",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
2
],
"changelog": [
{
"version": "0.19.0",
"prs": [
513
],
"description": "Added browser.bfcache.not_restored_reason_count attribute"
}
]
}
Whether a back/forward navigation was restored from the browser's back/forward cache (bfcache). 'hit' means the page was restored; 'miss' means it was reloaded.
A browser-reported reason a page was not restored from the back/forward cache on a back/forward navigation, taken from the notRestoredReasons API. Reported per reason (a single miss can have several). Currently Chromium-only.
{
"key": "browser.bfcache.reason",
"brief": "A browser-reported reason a page was not restored from the back/forward cache on a back/forward navigation, taken from the notRestoredReasons API. Reported per reason (a single miss can have several). Currently Chromium-only.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"unload-listener",
"websocket",
"idbversionchangeevent",
"response-cache-control-no-store"
],
"changelog": [
{
"version": "0.19.0",
"prs": [
513
],
"description": "Added browser.bfcache.reason attribute"
}
]
}
The identifier of the navigation the measurement belongs to, incremented by the browser for each navigation within a page's lifetime.
Examples130
Additional Context
Sourced from PerformanceEntry.navigationId, defined by the Soft Navigations spec. Despite its origin it is not soft-navigation specific: the field is set on the PerformanceNavigationTiming entry of a hard navigation too.
The value starts at 1 for the initial page load and increments for each subsequent navigation. It is only unique within a single page lifetime, not globally.
A value of 0 is a fallback rather than a real navigation id: web-vitals reports 0 when the browser does not expose PerformanceEntry.navigationId, so 0 means the id is unknown.
Pairs with browser.navigation.type: the type says how the browser arrived at the page, the id says which navigation of that page a measurement belongs to.
Not to be confused with the Navigation API's NavigationHistoryEntry.id, which is an opaque string identifying a history entry rather than a counter, and is not interchangeable with this value.
Also distinct from the router.navigation.* attributes, which describe the client-side router's own view of a navigation. Those come from the framework, this one comes from the browser, and both can be set on the same span.
Changelog
v0.24.0#640Document 0 as the fallback value when the browser does not support navigationId
{
"key": "browser.navigation.id",
"brief": "The identifier of the navigation the measurement belongs to, incremented by the browser for each navigation within a page's lifetime.",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
1,
3,
0
],
"additional_context": [
"Sourced from `PerformanceEntry.navigationId`, defined by the Soft Navigations spec. Despite its origin it is not soft-navigation specific: the field is set on the `PerformanceNavigationTiming` entry of a hard navigation too.",
"The value starts at 1 for the initial page load and increments for each subsequent navigation. It is only unique within a single page lifetime, not globally.",
"A value of 0 is a fallback rather than a real navigation id: web-vitals reports 0 when the browser does not expose `PerformanceEntry.navigationId`, so 0 means the id is unknown.",
"Pairs with `browser.navigation.type`: the type says how the browser arrived at the page, the id says which navigation of that page a measurement belongs to.",
"Not to be confused with the Navigation API's `NavigationHistoryEntry.id`, which is an opaque string identifying a history entry rather than a counter, and is not interchangeable with this value.",
"Also distinct from the `router.navigation.*` attributes, which describe the client-side router's own view of a navigation. Those come from the framework, this one comes from the browser, and both can be set on the same span."
],
"changelog": [
{
"version": "0.24.0",
"prs": [
640
],
"description": "Document 0 as the fallback value when the browser does not support `navigationId`"
},
{
"version": "0.22.0",
"prs": [
634
],
"description": "Added browser.navigation.id attribute"
}
]
}
Carries the navigationType value reported by the web-vitals library verbatim. web-vitals hyphenates the Navigation Timing PerformanceNavigationTiming.type value (back_forward becomes back-forward) and adds states that API does not cover: back-forward-cache for a restore from the back/forward cache, prerender, restore for a discarded tab being reloaded, and soft-navigation.
back-forward-cache is only set when the page was actually restored from the back/forward cache. A back/forward navigation that missed the cache is a full document load and reports back-forward. Use the browser.bfcache.* attributes to diagnose misses.
prerender pages finish painting before activation, so their paint timings are offset by browser.performance.navigation.activation_start. Keep them separate when aggregating web vitals.
Not to be confused with router.navigation.type, which holds the client-side router's own vocabulary (link, goto, router.push). The two are independent and can both be set on the same span.
Changelog
v0.24.0#640Use the web-vitals navigation types as-is: bfcache is now back-forward-cache, and back-forward and restore are no longer reported as navigate
{
"key": "browser.navigation.type",
"brief": "The type of navigation the browser performed to arrive at the page the metrics were measured on.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"navigate",
"reload",
"back-forward",
"back-forward-cache",
"prerender",
"restore",
"soft-navigation"
],
"additional_context": [
"Carries the `navigationType` value reported by the web-vitals library verbatim. web-vitals hyphenates the Navigation Timing `PerformanceNavigationTiming.type` value (`back_forward` becomes `back-forward`) and adds states that API does not cover: `back-forward-cache` for a restore from the back/forward cache, `prerender`, `restore` for a discarded tab being reloaded, and `soft-navigation`.",
"`back-forward-cache` is only set when the page was actually restored from the back/forward cache. A back/forward navigation that missed the cache is a full document load and reports `back-forward`. Use the `browser.bfcache.*` attributes to diagnose misses.",
"`prerender` pages finish painting before activation, so their paint timings are offset by `browser.performance.navigation.activation_start`. Keep them separate when aggregating web vitals.",
"Not to be confused with `router.navigation.type`, which holds the client-side router's own vocabulary (`link`, `goto`, `router.push`). The two are independent and can both be set on the same span."
],
"changelog": [
{
"version": "0.24.0",
"prs": [
640
],
"description": "Use the web-vitals navigation types as-is: `bfcache` is now `back-forward-cache`, and `back-forward` and `restore` are no longer reported as `navigate`"
},
{
"version": "0.22.0",
"prs": [
600
],
"description": "Added browser.navigation.type attribute"
}
]
}
{
"key": "browser.web_vital.fcp.value",
"brief": "The time it takes for the browser to render the first piece of meaningful content on the screen",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 547.6951,
"alias": [
"fcp"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
235
]
}
]
}
{
"key": "browser.web_vital.fp.value",
"brief": "The time in milliseconds it takes for the browser to render the first pixel on the screen",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 477.1926,
"alias": [
"fp"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
235
]
}
]
}
One of click, hover, drag or press, derived from the DOM event name of the Event Timing entry: pointer, mouse and touch events map to click, mouseover and similar to hover, drag and drop events to drag, and keyboard and input events to press. The same value forms the suffix of the span's ui.interaction.* op.
Not to be confused with the interactionType of the web-vitals attribution build, which only distinguishes pointer and keyboard.
Omitted when INP is reported without an interaction to attribute it to, see browser.web_vital.inp.target. The op of such a span still falls into ui.interaction.click so that it stays within the interaction span family, which makes this attribute, not the op, the way to tell a real click from a value with no interaction.
{
"key": "browser.web_vital.inp.interaction_type",
"brief": "The kind of user interaction INP was reported on",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"click",
"hover",
"drag",
"press"
],
"additional_context": [
"One of `click`, `hover`, `drag` or `press`, derived from the DOM event name of the Event Timing entry: pointer, mouse and touch events map to `click`, `mouseover` and similar to `hover`, drag and drop events to `drag`, and keyboard and `input` events to `press`. The same value forms the suffix of the span's `ui.interaction.*` op.",
"Not to be confused with the `interactionType` of the web-vitals attribution build, which only distinguishes `pointer` and `keyboard`.",
"Omitted when INP is reported without an interaction to attribute it to, see `browser.web_vital.inp.target`. The op of such a span still falls into `ui.interaction.click` so that it stays within the interaction span family, which makes this attribute, not the op, the way to tell a real click from a value with no interaction."
],
"changelog": [
{
"version": "0.24.0",
"prs": [
641
],
"description": "Added browser.web_vital.inp.interaction_type attribute"
}
]
}
Named after PerformanceEventTiming.target, the way browser.web_vital.lcp.element is named after LargestContentfulPaint.element. The value uses the same format as that attribute.
Omitted when INP is reported without an interaction to attribute it to. web-vitals reports such a value for a soft navigation whose interactions all stayed below the Event Timing duration threshold, so there is no element to name. The span is still named and still carries browser.web_vital.inp.value.
{
"key": "browser.web_vital.inp.target",
"brief": "The HTML element selector or component name of the element the user interacted with, for the interaction INP was reported on",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"body > div#app > button.submit",
"SubmitButton"
],
"additional_context": [
"Named after `PerformanceEventTiming.target`, the way `browser.web_vital.lcp.element` is named after `LargestContentfulPaint.element`. The value uses the same format as that attribute.",
"Omitted when INP is reported without an interaction to attribute it to. web-vitals reports such a value for a soft navigation whose interactions all stayed below the Event Timing duration threshold, so there is no element to name. The span is still named and still carries `browser.web_vital.inp.value`."
],
"changelog": [
{
"version": "0.24.0",
"prs": [
641
],
"description": "Added browser.web_vital.inp.target attribute"
}
]
}
{
"key": "browser.web_vital.lcp.id",
"brief": "The id of the dom element responsible for the largest contentful paint",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "#gero",
"alias": [
"lcp.id"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
233
]
}
]
}
{
"key": "browser.web_vital.lcp.load_time",
"brief": "The time it took for the LCP element to be loaded",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 1402,
"alias": [
"lcp.loadTime"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
233
]
}
]
}
{
"key": "browser.web_vital.lcp.render_time",
"brief": "The time it took for the LCP element to be rendered",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 1685,
"alias": [
"lcp.renderTime"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
233
]
}
]
}
{
"key": "browser.web_vital.ttfb.request_time",
"brief": "The time it takes for the server to process the initial request and send the first byte of a response to the user's browser",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 1554.5814,
"alias": [
"ttfb.requestTime"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
235
]
}
]
}
{
"key": "browser.web_vital.ttfb.value",
"brief": "The value of the recorded Time To First Byte (TTFB) web vital in Milliseconds",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 194.3322,
"alias": [
"ttfb"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
235
]
}
]
}
Deprecated Attributes
These attributes are deprecated and should not be used in new code. See each attribute for migration guidance.
The event that caused the SDK to report CLS (pagehide or navigation)
Examplenavigation
No replacement available at this time.
The JavaScript SDK stopped setting this in v11. With per-navigation web vitals, web-vitals decides when the CLS value is final, so there is no report event to record. No replacement.
Changelog
v0.24.0#642Deprecated browser.web_vital.cls.report_event, which has no replacement
{
"key": "browser.web_vital.cls.report_event",
"brief": "The event that caused the SDK to report CLS (pagehide or navigation)",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "navigation",
"deprecation": {
"reason": "The JavaScript SDK stopped setting this in v11. With per-navigation web vitals, web-vitals decides when the CLS value is final, so there is no report event to record. No replacement.",
"_status": null
},
"changelog": [
{
"version": "0.24.0",
"prs": [
642
],
"description": "Deprecated browser.web_vital.cls.report_event, which has no replacement"
},
{
"version": "0.5.0",
"prs": [
319
],
"description": "Added browser.web_vital.cls.report_event attribute"
}
]
}
The event that caused the SDK to report LCP (pagehide or navigation)
Examplepagehide
No replacement available at this time.
The JavaScript SDK stopped setting this in v11. With per-navigation web vitals, web-vitals decides when the LCP value is final, so there is no report event to record. No replacement.
Changelog
v0.24.0#642Deprecated browser.web_vital.lcp.report_event, which has no replacement
{
"key": "browser.web_vital.lcp.report_event",
"brief": "The event that caused the SDK to report LCP (pagehide or navigation)",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "pagehide",
"deprecation": {
"reason": "The JavaScript SDK stopped setting this in v11. With per-navigation web vitals, web-vitals decides when the LCP value is final, so there is no report event to record. No replacement.",
"_status": null
},
"changelog": [
{
"version": "0.24.0",
"prs": [
642
],
"description": "Deprecated browser.web_vital.lcp.report_event, which has no replacement"
},
{
"version": "0.5.0",
"prs": [
319
],
"description": "Added browser.web_vital.lcp.report_event attribute"
}
]
}