From 44b99f310e6e2c5a8d9d5fbe17634fa1521ac6b4 Mon Sep 17 00:00:00 2001 From: Abdelrahman Awad Date: Tue, 13 Oct 2026 11:34:37 -0400 Subject: [PATCH 1/4] feat(attributes): Add LCP and INP subpart attributes --- .../sentry-conventions/src/attributes.ts | 254 ++++++++++++++++++ javascript/sentry-conventions/src/search.ts | 76 ++++++ .../browser__web_vital__inp__input_delay.json | 22 ++ ...r__web_vital__inp__presentation_delay.json | 22 ++ ...__web_vital__inp__processing_duration.json | 22 ++ ..._web_vital__lcp__element_render_delay.json | 21 ++ ...__web_vital__lcp__resource_load_delay.json | 22 ++ ...eb_vital__lcp__resource_load_duration.json | 21 ++ python/src/sentry_conventions/attributes.py | 208 ++++++++++++++ 9 files changed, 668 insertions(+) create mode 100644 model/attributes/browser/browser__web_vital__inp__input_delay.json create mode 100644 model/attributes/browser/browser__web_vital__inp__presentation_delay.json create mode 100644 model/attributes/browser/browser__web_vital__inp__processing_duration.json create mode 100644 model/attributes/browser/browser__web_vital__lcp__element_render_delay.json create mode 100644 model/attributes/browser/browser__web_vital__lcp__resource_load_delay.json create mode 100644 model/attributes/browser/browser__web_vital__lcp__resource_load_duration.json diff --git a/javascript/sentry-conventions/src/attributes.ts b/javascript/sentry-conventions/src/attributes.ts index f5a668e72..71fa97c1b 100644 --- a/javascript/sentry-conventions/src/attributes.ts +++ b/javascript/sentry-conventions/src/attributes.ts @@ -3778,6 +3778,27 @@ export const BROWSER_WEB_VITAL_FP_VALUE = 'browser.web_vital.fp.value'; */ export type BROWSER_WEB_VITAL_FP_VALUE_TYPE = number; +// Path: model/attributes/browser/browser__web_vital__inp__input_delay.json + +/** + * The time between the user interacting with the page and the browser starting to run the event handlers, for the interaction INP was reported on, in milliseconds `browser.web_vital.inp.input_delay` + * + * Attribute Value Type: `number` {@link BROWSER_WEB_VITAL_INP_INPUT_DELAY_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 120 + */ +export const BROWSER_WEB_VITAL_INP_INPUT_DELAY = 'browser.web_vital.inp.input_delay'; + +/** + * Type for {@link BROWSER_WEB_VITAL_INP_INPUT_DELAY} browser.web_vital.inp.input_delay + */ +export type BROWSER_WEB_VITAL_INP_INPUT_DELAY_TYPE = number; + // Path: model/attributes/browser/browser__web_vital__inp__interaction_type.json /** @@ -3802,6 +3823,48 @@ export const BROWSER_WEB_VITAL_INP_INTERACTION_TYPE = 'browser.web_vital.inp.int */ export type BROWSER_WEB_VITAL_INP_INTERACTION_TYPE_TYPE = string; +// Path: model/attributes/browser/browser__web_vital__inp__presentation_delay.json + +/** + * The time between the event handlers finishing and the browser presenting the next frame, for the interaction INP was reported on, in milliseconds `browser.web_vital.inp.presentation_delay` + * + * Attribute Value Type: `number` {@link BROWSER_WEB_VITAL_INP_PRESENTATION_DELAY_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 100 + */ +export const BROWSER_WEB_VITAL_INP_PRESENTATION_DELAY = 'browser.web_vital.inp.presentation_delay'; + +/** + * Type for {@link BROWSER_WEB_VITAL_INP_PRESENTATION_DELAY} browser.web_vital.inp.presentation_delay + */ +export type BROWSER_WEB_VITAL_INP_PRESENTATION_DELAY_TYPE = number; + +// Path: model/attributes/browser/browser__web_vital__inp__processing_duration.json + +/** + * The time it took the event handlers to run, for the interaction INP was reported on, in milliseconds `browser.web_vital.inp.processing_duration` + * + * Attribute Value Type: `number` {@link BROWSER_WEB_VITAL_INP_PROCESSING_DURATION_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 140 + */ +export const BROWSER_WEB_VITAL_INP_PROCESSING_DURATION = 'browser.web_vital.inp.processing_duration'; + +/** + * Type for {@link BROWSER_WEB_VITAL_INP_PROCESSING_DURATION} browser.web_vital.inp.processing_duration + */ +export type BROWSER_WEB_VITAL_INP_PROCESSING_DURATION_TYPE = number; + // Path: model/attributes/browser/browser__web_vital__inp__target.json /** @@ -3870,6 +3933,27 @@ export const BROWSER_WEB_VITAL_LCP_ELEMENT = 'browser.web_vital.lcp.element'; */ export type BROWSER_WEB_VITAL_LCP_ELEMENT_TYPE = string; +// Path: model/attributes/browser/browser__web_vital__lcp__element_render_delay.json + +/** + * The time between the Largest Contentful Paint (LCP) resource finishing loading and the LCP element being rendered, in milliseconds `browser.web_vital.lcp.element_render_delay` + * + * Attribute Value Type: `number` {@link BROWSER_WEB_VITAL_LCP_ELEMENT_RENDER_DELAY_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 410 + */ +export const BROWSER_WEB_VITAL_LCP_ELEMENT_RENDER_DELAY = 'browser.web_vital.lcp.element_render_delay'; + +/** + * Type for {@link BROWSER_WEB_VITAL_LCP_ELEMENT_RENDER_DELAY} browser.web_vital.lcp.element_render_delay + */ +export type BROWSER_WEB_VITAL_LCP_ELEMENT_RENDER_DELAY_TYPE = number; + // Path: model/attributes/browser/browser__web_vital__lcp__id.json /** @@ -3961,6 +4045,48 @@ export const BROWSER_WEB_VITAL_LCP_REPORT_EVENT = 'browser.web_vital.lcp.report_ */ export type BROWSER_WEB_VITAL_LCP_REPORT_EVENT_TYPE = string; +// Path: model/attributes/browser/browser__web_vital__lcp__resource_load_delay.json + +/** + * The time between the first byte of the document arriving and the browser starting to load the Largest Contentful Paint (LCP) resource, in milliseconds `browser.web_vital.lcp.resource_load_delay` + * + * Attribute Value Type: `number` {@link BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DELAY_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 320.5 + */ +export const BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DELAY = 'browser.web_vital.lcp.resource_load_delay'; + +/** + * Type for {@link BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DELAY} browser.web_vital.lcp.resource_load_delay + */ +export type BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DELAY_TYPE = number; + +// Path: model/attributes/browser/browser__web_vital__lcp__resource_load_duration.json + +/** + * The time it took to load the Largest Contentful Paint (LCP) resource, in milliseconds `browser.web_vital.lcp.resource_load_duration` + * + * Attribute Value Type: `number` {@link BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DURATION_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 780.2 + */ +export const BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DURATION = 'browser.web_vital.lcp.resource_load_duration'; + +/** + * Type for {@link BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DURATION} browser.web_vital.lcp.resource_load_duration + */ +export type BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DURATION_TYPE = number; + // Path: model/attributes/browser/browser__web_vital__lcp__size.json /** @@ -20610,14 +20736,20 @@ export const ATTRIBUTE_TYPE: Record = { 'browser.web_vital.cls.value': 'double', 'browser.web_vital.fcp.value': 'double', 'browser.web_vital.fp.value': 'double', + 'browser.web_vital.inp.input_delay': 'double', 'browser.web_vital.inp.interaction_type': 'string', + 'browser.web_vital.inp.presentation_delay': 'double', + 'browser.web_vital.inp.processing_duration': 'double', 'browser.web_vital.inp.target': 'string', 'browser.web_vital.inp.value': 'double', 'browser.web_vital.lcp.element': 'string', + 'browser.web_vital.lcp.element_render_delay': 'double', 'browser.web_vital.lcp.id': 'string', 'browser.web_vital.lcp.load_time': 'integer', 'browser.web_vital.lcp.render_time': 'integer', 'browser.web_vital.lcp.report_event': 'string', + 'browser.web_vital.lcp.resource_load_delay': 'double', + 'browser.web_vital.lcp.resource_load_duration': 'double', 'browser.web_vital.lcp.size': 'integer', 'browser.web_vital.lcp.url': 'string', 'browser.web_vital.lcp.value': 'double', @@ -21519,14 +21651,20 @@ export type AttributeName = | typeof BROWSER_WEB_VITAL_CLS_VALUE | typeof BROWSER_WEB_VITAL_FCP_VALUE | typeof BROWSER_WEB_VITAL_FP_VALUE + | typeof BROWSER_WEB_VITAL_INP_INPUT_DELAY | typeof BROWSER_WEB_VITAL_INP_INTERACTION_TYPE + | typeof BROWSER_WEB_VITAL_INP_PRESENTATION_DELAY + | typeof BROWSER_WEB_VITAL_INP_PROCESSING_DURATION | typeof BROWSER_WEB_VITAL_INP_TARGET | typeof BROWSER_WEB_VITAL_INP_VALUE | typeof BROWSER_WEB_VITAL_LCP_ELEMENT + | typeof BROWSER_WEB_VITAL_LCP_ELEMENT_RENDER_DELAY | typeof BROWSER_WEB_VITAL_LCP_ID | typeof BROWSER_WEB_VITAL_LCP_LOAD_TIME | typeof BROWSER_WEB_VITAL_LCP_RENDER_TIME | typeof BROWSER_WEB_VITAL_LCP_REPORT_EVENT + | typeof BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DELAY + | typeof BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DURATION | typeof BROWSER_WEB_VITAL_LCP_SIZE | typeof BROWSER_WEB_VITAL_LCP_URL | typeof BROWSER_WEB_VITAL_LCP_VALUE @@ -24980,6 +25118,25 @@ export const ATTRIBUTE_METADATA: Record = { aliases: ['fp'], changelog: [{ version: '0.5.0', prs: [235] }], }, + 'browser.web_vital.inp.input_delay': { + brief: + 'The time between the user interacting with the page and the browser starting to run the event handlers, for the interaction INP was reported on, in milliseconds', + type: 'double', + keys: ['browser.web_vital.inp.input_delay'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 120, + examples: [120], + changelog: [{ version: 'next', description: 'Added browser.web_vital.inp.input_delay attribute' }], + additionalContext: [ + 'One of the three INP subparts, which add up to `browser.web_vital.inp.value`: input delay, processing duration and presentation delay. Named after `inputDelay` in the web-vitals attribution build.', + "Measured from the interaction's `PerformanceEventTiming` entry as `processingStart` minus `startTime`.", + 'Omitted when INP is reported without an interaction to attribute it to, like `browser.web_vital.inp.target`.', + ], + }, 'browser.web_vital.inp.interaction_type': { brief: 'The kind of user interaction INP was reported on', type: 'string', @@ -25000,6 +25157,43 @@ export const ATTRIBUTE_METADATA: Record = { '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.', ], }, + 'browser.web_vital.inp.presentation_delay': { + brief: + 'The time between the event handlers finishing and the browser presenting the next frame, for the interaction INP was reported on, in milliseconds', + type: 'double', + keys: ['browser.web_vital.inp.presentation_delay'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 100, + examples: [100], + changelog: [{ version: 'next', description: 'Added browser.web_vital.inp.presentation_delay attribute' }], + additionalContext: [ + 'One of the three INP subparts, which add up to `browser.web_vital.inp.value`. Named after `presentationDelay` in the web-vitals attribution build.', + "Measured from the interaction's `PerformanceEventTiming` entry as `startTime` plus `duration` minus `processingEnd`.", + 'Omitted when INP is reported without an interaction to attribute it to, like `browser.web_vital.inp.target`.', + ], + }, + 'browser.web_vital.inp.processing_duration': { + brief: 'The time it took the event handlers to run, for the interaction INP was reported on, in milliseconds', + type: 'double', + keys: ['browser.web_vital.inp.processing_duration'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 140, + examples: [140], + changelog: [{ version: 'next', description: 'Added browser.web_vital.inp.processing_duration attribute' }], + additionalContext: [ + 'One of the three INP subparts, which add up to `browser.web_vital.inp.value`. Named after `processingDuration` in the web-vitals attribution build.', + "Measured from the interaction's `PerformanceEventTiming` entry as `processingEnd` minus `processingStart`.", + 'Omitted when INP is reported without an interaction to attribute it to, like `browser.web_vital.inp.target`.', + ], + }, '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', @@ -25044,6 +25238,24 @@ export const ATTRIBUTE_METADATA: Record = { aliases: ['lcp.element'], changelog: [{ version: '0.5.0', prs: [233] }], }, + 'browser.web_vital.lcp.element_render_delay': { + brief: + 'The time between the Largest Contentful Paint (LCP) resource finishing loading and the LCP element being rendered, in milliseconds', + type: 'double', + keys: ['browser.web_vital.lcp.element_render_delay'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 410, + examples: [410], + changelog: [{ version: 'next', description: 'Added browser.web_vital.lcp.element_render_delay attribute' }], + additionalContext: [ + 'One of the four LCP subparts, which add up to `browser.web_vital.lcp.value`. Named after `elementRenderDelay` in the web-vitals attribution build.', + "Measured as the LCP value minus the LCP resource's `responseEnd`. When the LCP element is text, it covers all time after TTFB.", + ], + }, 'browser.web_vital.lcp.id': { brief: 'The id of the dom element responsible for the largest contentful paint', type: 'string', @@ -25106,6 +25318,42 @@ export const ATTRIBUTE_METADATA: Record = { { version: '0.5.0', prs: [319], description: 'Added browser.web_vital.lcp.report_event attribute' }, ], }, + 'browser.web_vital.lcp.resource_load_delay': { + brief: + 'The time between the first byte of the document arriving and the browser starting to load the Largest Contentful Paint (LCP) resource, in milliseconds', + type: 'double', + keys: ['browser.web_vital.lcp.resource_load_delay'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 320.5, + examples: [320.5], + changelog: [{ version: 'next', description: 'Added browser.web_vital.lcp.resource_load_delay attribute' }], + additionalContext: [ + 'One of the four LCP subparts, which add up to `browser.web_vital.lcp.value`: TTFB (`browser.web_vital.ttfb.value`), resource load delay, resource load duration and element render delay. Named after `resourceLoadDelay` in the web-vitals attribution build.', + "Measured as the LCP resource's `requestStart` (or `startTime` when `requestStart` is not exposed) minus TTFB. It is 0 when the LCP element is text, since no resource is loaded.", + 'For a prerendered page, timestamps are measured from `activationStart`.', + ], + }, + 'browser.web_vital.lcp.resource_load_duration': { + brief: 'The time it took to load the Largest Contentful Paint (LCP) resource, in milliseconds', + type: 'double', + keys: ['browser.web_vital.lcp.resource_load_duration'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 780.2, + examples: [780.2], + changelog: [{ version: 'next', description: 'Added browser.web_vital.lcp.resource_load_duration attribute' }], + additionalContext: [ + 'One of the four LCP subparts, which add up to `browser.web_vital.lcp.value`. Named after `resourceLoadDuration` in the web-vitals attribution build.', + "Measured as the LCP resource's `responseEnd` minus its `requestStart`. It is 0 when the LCP element is text, since no resource is loaded.", + ], + }, 'browser.web_vital.lcp.size': { brief: 'The size of the largest contentful paint element', type: 'integer', @@ -37376,14 +37624,20 @@ export type Attributes = { [BROWSER_WEB_VITAL_CLS_VALUE]?: BROWSER_WEB_VITAL_CLS_VALUE_TYPE; [BROWSER_WEB_VITAL_FCP_VALUE]?: BROWSER_WEB_VITAL_FCP_VALUE_TYPE; [BROWSER_WEB_VITAL_FP_VALUE]?: BROWSER_WEB_VITAL_FP_VALUE_TYPE; + [BROWSER_WEB_VITAL_INP_INPUT_DELAY]?: BROWSER_WEB_VITAL_INP_INPUT_DELAY_TYPE; [BROWSER_WEB_VITAL_INP_INTERACTION_TYPE]?: BROWSER_WEB_VITAL_INP_INTERACTION_TYPE_TYPE; + [BROWSER_WEB_VITAL_INP_PRESENTATION_DELAY]?: BROWSER_WEB_VITAL_INP_PRESENTATION_DELAY_TYPE; + [BROWSER_WEB_VITAL_INP_PROCESSING_DURATION]?: BROWSER_WEB_VITAL_INP_PROCESSING_DURATION_TYPE; [BROWSER_WEB_VITAL_INP_TARGET]?: BROWSER_WEB_VITAL_INP_TARGET_TYPE; [BROWSER_WEB_VITAL_INP_VALUE]?: BROWSER_WEB_VITAL_INP_VALUE_TYPE; [BROWSER_WEB_VITAL_LCP_ELEMENT]?: BROWSER_WEB_VITAL_LCP_ELEMENT_TYPE; + [BROWSER_WEB_VITAL_LCP_ELEMENT_RENDER_DELAY]?: BROWSER_WEB_VITAL_LCP_ELEMENT_RENDER_DELAY_TYPE; [BROWSER_WEB_VITAL_LCP_ID]?: BROWSER_WEB_VITAL_LCP_ID_TYPE; [BROWSER_WEB_VITAL_LCP_LOAD_TIME]?: BROWSER_WEB_VITAL_LCP_LOAD_TIME_TYPE; [BROWSER_WEB_VITAL_LCP_RENDER_TIME]?: BROWSER_WEB_VITAL_LCP_RENDER_TIME_TYPE; [BROWSER_WEB_VITAL_LCP_REPORT_EVENT]?: BROWSER_WEB_VITAL_LCP_REPORT_EVENT_TYPE; + [BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DELAY]?: BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DELAY_TYPE; + [BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DURATION]?: BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DURATION_TYPE; [BROWSER_WEB_VITAL_LCP_SIZE]?: BROWSER_WEB_VITAL_LCP_SIZE_TYPE; [BROWSER_WEB_VITAL_LCP_URL]?: BROWSER_WEB_VITAL_LCP_URL_TYPE; [BROWSER_WEB_VITAL_LCP_VALUE]?: BROWSER_WEB_VITAL_LCP_VALUE_TYPE; diff --git a/javascript/sentry-conventions/src/search.ts b/javascript/sentry-conventions/src/search.ts index 663e145e5..3af4b069b 100644 --- a/javascript/sentry-conventions/src/search.ts +++ b/javascript/sentry-conventions/src/search.ts @@ -1006,11 +1006,26 @@ export const SEARCH_BROWSER__WEB_VITAL__FCP__VALUE = 'browser.web_vital.fcp.valu */ export const SEARCH_BROWSER__WEB_VITAL__FP__VALUE = 'browser.web_vital.fp.value'; +/** + * Search name for {@link attributes.BROWSER_WEB_VITAL_INP_INPUT_DELAY}. `browser.web_vital.inp.input_delay` + */ +export const SEARCH_BROWSER__WEB_VITAL__INP__INPUT_DELAY = 'browser.web_vital.inp.input_delay'; + /** * Search name for {@link attributes.BROWSER_WEB_VITAL_INP_INTERACTION_TYPE}. `browser.web_vital.inp.interaction_type` */ export const SEARCH_BROWSER__WEB_VITAL__INP__INTERACTION_TYPE = 'browser.web_vital.inp.interaction_type'; +/** + * Search name for {@link attributes.BROWSER_WEB_VITAL_INP_PRESENTATION_DELAY}. `browser.web_vital.inp.presentation_delay` + */ +export const SEARCH_BROWSER__WEB_VITAL__INP__PRESENTATION_DELAY = 'browser.web_vital.inp.presentation_delay'; + +/** + * Search name for {@link attributes.BROWSER_WEB_VITAL_INP_PROCESSING_DURATION}. `browser.web_vital.inp.processing_duration` + */ +export const SEARCH_BROWSER__WEB_VITAL__INP__PROCESSING_DURATION = 'browser.web_vital.inp.processing_duration'; + /** * Search name for {@link attributes.BROWSER_WEB_VITAL_INP_TARGET}. `browser.web_vital.inp.target` */ @@ -1026,6 +1041,11 @@ export const SEARCH_BROWSER__WEB_VITAL__INP__VALUE = 'browser.web_vital.inp.valu */ export const SEARCH_BROWSER__WEB_VITAL__LCP__ELEMENT = 'browser.web_vital.lcp.element'; +/** + * Search name for {@link attributes.BROWSER_WEB_VITAL_LCP_ELEMENT_RENDER_DELAY}. `browser.web_vital.lcp.element_render_delay` + */ +export const SEARCH_BROWSER__WEB_VITAL__LCP__ELEMENT_RENDER_DELAY = 'browser.web_vital.lcp.element_render_delay'; + /** * Search name for {@link attributes.BROWSER_WEB_VITAL_LCP_ID}. `browser.web_vital.lcp.id` */ @@ -1048,6 +1068,16 @@ export const SEARCH_BROWSER__WEB_VITAL__LCP__RENDER_TIME = 'browser.web_vital.lc */ export const SEARCH_BROWSER__WEB_VITAL__LCP__REPORT_EVENT = 'browser.web_vital.lcp.report_event'; +/** + * Search name for {@link attributes.BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DELAY}. `browser.web_vital.lcp.resource_load_delay` + */ +export const SEARCH_BROWSER__WEB_VITAL__LCP__RESOURCE_LOAD_DELAY = 'browser.web_vital.lcp.resource_load_delay'; + +/** + * Search name for {@link attributes.BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DURATION}. `browser.web_vital.lcp.resource_load_duration` + */ +export const SEARCH_BROWSER__WEB_VITAL__LCP__RESOURCE_LOAD_DURATION = 'browser.web_vital.lcp.resource_load_duration'; + /** * Search name for {@link attributes.BROWSER_WEB_VITAL_LCP_SIZE}. `browser.web_vital.lcp.size` */ @@ -5424,14 +5454,20 @@ export type AttributeSearchName = | typeof SEARCH_BROWSER__WEB_VITAL__CLS__VALUE | typeof SEARCH_BROWSER__WEB_VITAL__FCP__VALUE | typeof SEARCH_BROWSER__WEB_VITAL__FP__VALUE + | typeof SEARCH_BROWSER__WEB_VITAL__INP__INPUT_DELAY | typeof SEARCH_BROWSER__WEB_VITAL__INP__INTERACTION_TYPE + | typeof SEARCH_BROWSER__WEB_VITAL__INP__PRESENTATION_DELAY + | typeof SEARCH_BROWSER__WEB_VITAL__INP__PROCESSING_DURATION | typeof SEARCH_BROWSER__WEB_VITAL__INP__TARGET | typeof SEARCH_BROWSER__WEB_VITAL__INP__VALUE | typeof SEARCH_BROWSER__WEB_VITAL__LCP__ELEMENT + | typeof SEARCH_BROWSER__WEB_VITAL__LCP__ELEMENT_RENDER_DELAY | typeof SEARCH_BROWSER__WEB_VITAL__LCP__ID | typeof SEARCH_BROWSER__WEB_VITAL__LCP__LOAD_TIME | typeof SEARCH_BROWSER__WEB_VITAL__LCP__RENDER_TIME | typeof SEARCH_BROWSER__WEB_VITAL__LCP__REPORT_EVENT + | typeof SEARCH_BROWSER__WEB_VITAL__LCP__RESOURCE_LOAD_DELAY + | typeof SEARCH_BROWSER__WEB_VITAL__LCP__RESOURCE_LOAD_DURATION | typeof SEARCH_BROWSER__WEB_VITAL__LCP__SIZE | typeof SEARCH_BROWSER__WEB_VITAL__LCP__URL | typeof SEARCH_BROWSER__WEB_VITAL__LCP__VALUE @@ -7323,12 +7359,32 @@ export const ATTRIBUTE_SEARCH_METADATA: Record brief: 'The time in milliseconds it takes for the browser to render the first pixel on the screen', deprecationChain: ['browser.web_vital.fp.value', 'fp'], }, + 'browser.web_vital.inp.input_delay': { + canonicalName: 'browser.web_vital.inp.input_delay', + type: 'double', + brief: + 'The time between the user interacting with the page and the browser starting to run the event handlers, for the interaction INP was reported on, in milliseconds', + deprecationChain: ['browser.web_vital.inp.input_delay'], + }, 'browser.web_vital.inp.interaction_type': { canonicalName: 'browser.web_vital.inp.interaction_type', type: 'string', brief: 'The kind of user interaction INP was reported on', deprecationChain: ['browser.web_vital.inp.interaction_type'], }, + 'browser.web_vital.inp.presentation_delay': { + canonicalName: 'browser.web_vital.inp.presentation_delay', + type: 'double', + brief: + 'The time between the event handlers finishing and the browser presenting the next frame, for the interaction INP was reported on, in milliseconds', + deprecationChain: ['browser.web_vital.inp.presentation_delay'], + }, + 'browser.web_vital.inp.processing_duration': { + canonicalName: 'browser.web_vital.inp.processing_duration', + type: 'double', + brief: 'The time it took the event handlers to run, for the interaction INP was reported on, in milliseconds', + deprecationChain: ['browser.web_vital.inp.processing_duration'], + }, 'browser.web_vital.inp.target': { canonicalName: 'browser.web_vital.inp.target', type: 'string', @@ -7348,6 +7404,13 @@ export const ATTRIBUTE_SEARCH_METADATA: Record brief: 'The HTML element selector or component name for which LCP was reported', deprecationChain: ['browser.web_vital.lcp.element', 'lcp.element'], }, + 'browser.web_vital.lcp.element_render_delay': { + canonicalName: 'browser.web_vital.lcp.element_render_delay', + type: 'double', + brief: + 'The time between the Largest Contentful Paint (LCP) resource finishing loading and the LCP element being rendered, in milliseconds', + deprecationChain: ['browser.web_vital.lcp.element_render_delay'], + }, 'browser.web_vital.lcp.id': { canonicalName: 'browser.web_vital.lcp.id', type: 'string', @@ -7373,6 +7436,19 @@ export const ATTRIBUTE_SEARCH_METADATA: Record deprecated: true, deprecationChain: ['browser.web_vital.lcp.report_event'], }, + 'browser.web_vital.lcp.resource_load_delay': { + canonicalName: 'browser.web_vital.lcp.resource_load_delay', + type: 'double', + brief: + 'The time between the first byte of the document arriving and the browser starting to load the Largest Contentful Paint (LCP) resource, in milliseconds', + deprecationChain: ['browser.web_vital.lcp.resource_load_delay'], + }, + 'browser.web_vital.lcp.resource_load_duration': { + canonicalName: 'browser.web_vital.lcp.resource_load_duration', + type: 'double', + brief: 'The time it took to load the Largest Contentful Paint (LCP) resource, in milliseconds', + deprecationChain: ['browser.web_vital.lcp.resource_load_duration'], + }, 'browser.web_vital.lcp.size': { canonicalName: 'browser.web_vital.lcp.size', type: 'integer', diff --git a/model/attributes/browser/browser__web_vital__inp__input_delay.json b/model/attributes/browser/browser__web_vital__inp__input_delay.json new file mode 100644 index 000000000..0eeff2a68 --- /dev/null +++ b/model/attributes/browser/browser__web_vital__inp__input_delay.json @@ -0,0 +1,22 @@ +{ + "key": "browser.web_vital.inp.input_delay", + "brief": "The time between the user interacting with the page and the browser starting to run the event handlers, for the interaction INP was reported on, in milliseconds", + "type": "double", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": [120.0], + "additional_context": [ + "One of the three INP subparts, which add up to `browser.web_vital.inp.value`: input delay, processing duration and presentation delay. Named after `inputDelay` in the web-vitals attribution build.", + "Measured from the interaction's `PerformanceEventTiming` entry as `processingStart` minus `startTime`.", + "Omitted when INP is reported without an interaction to attribute it to, like `browser.web_vital.inp.target`." + ], + "changelog": [ + { + "version": "next", + "description": "Added browser.web_vital.inp.input_delay attribute" + } + ] +} diff --git a/model/attributes/browser/browser__web_vital__inp__presentation_delay.json b/model/attributes/browser/browser__web_vital__inp__presentation_delay.json new file mode 100644 index 000000000..bc4d0db57 --- /dev/null +++ b/model/attributes/browser/browser__web_vital__inp__presentation_delay.json @@ -0,0 +1,22 @@ +{ + "key": "browser.web_vital.inp.presentation_delay", + "brief": "The time between the event handlers finishing and the browser presenting the next frame, for the interaction INP was reported on, in milliseconds", + "type": "double", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": [100.0], + "additional_context": [ + "One of the three INP subparts, which add up to `browser.web_vital.inp.value`. Named after `presentationDelay` in the web-vitals attribution build.", + "Measured from the interaction's `PerformanceEventTiming` entry as `startTime` plus `duration` minus `processingEnd`.", + "Omitted when INP is reported without an interaction to attribute it to, like `browser.web_vital.inp.target`." + ], + "changelog": [ + { + "version": "next", + "description": "Added browser.web_vital.inp.presentation_delay attribute" + } + ] +} diff --git a/model/attributes/browser/browser__web_vital__inp__processing_duration.json b/model/attributes/browser/browser__web_vital__inp__processing_duration.json new file mode 100644 index 000000000..0ef73123c --- /dev/null +++ b/model/attributes/browser/browser__web_vital__inp__processing_duration.json @@ -0,0 +1,22 @@ +{ + "key": "browser.web_vital.inp.processing_duration", + "brief": "The time it took the event handlers to run, for the interaction INP was reported on, in milliseconds", + "type": "double", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": [140.0], + "additional_context": [ + "One of the three INP subparts, which add up to `browser.web_vital.inp.value`. Named after `processingDuration` in the web-vitals attribution build.", + "Measured from the interaction's `PerformanceEventTiming` entry as `processingEnd` minus `processingStart`.", + "Omitted when INP is reported without an interaction to attribute it to, like `browser.web_vital.inp.target`." + ], + "changelog": [ + { + "version": "next", + "description": "Added browser.web_vital.inp.processing_duration attribute" + } + ] +} diff --git a/model/attributes/browser/browser__web_vital__lcp__element_render_delay.json b/model/attributes/browser/browser__web_vital__lcp__element_render_delay.json new file mode 100644 index 000000000..a8e43c258 --- /dev/null +++ b/model/attributes/browser/browser__web_vital__lcp__element_render_delay.json @@ -0,0 +1,21 @@ +{ + "key": "browser.web_vital.lcp.element_render_delay", + "brief": "The time between the Largest Contentful Paint (LCP) resource finishing loading and the LCP element being rendered, in milliseconds", + "type": "double", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": [410.0], + "additional_context": [ + "One of the four LCP subparts, which add up to `browser.web_vital.lcp.value`. Named after `elementRenderDelay` in the web-vitals attribution build.", + "Measured as the LCP value minus the LCP resource's `responseEnd`. When the LCP element is text, it covers all time after TTFB." + ], + "changelog": [ + { + "version": "next", + "description": "Added browser.web_vital.lcp.element_render_delay attribute" + } + ] +} diff --git a/model/attributes/browser/browser__web_vital__lcp__resource_load_delay.json b/model/attributes/browser/browser__web_vital__lcp__resource_load_delay.json new file mode 100644 index 000000000..a04437a68 --- /dev/null +++ b/model/attributes/browser/browser__web_vital__lcp__resource_load_delay.json @@ -0,0 +1,22 @@ +{ + "key": "browser.web_vital.lcp.resource_load_delay", + "brief": "The time between the first byte of the document arriving and the browser starting to load the Largest Contentful Paint (LCP) resource, in milliseconds", + "type": "double", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": [320.5], + "additional_context": [ + "One of the four LCP subparts, which add up to `browser.web_vital.lcp.value`: TTFB (`browser.web_vital.ttfb.value`), resource load delay, resource load duration and element render delay. Named after `resourceLoadDelay` in the web-vitals attribution build.", + "Measured as the LCP resource's `requestStart` (or `startTime` when `requestStart` is not exposed) minus TTFB. It is 0 when the LCP element is text, since no resource is loaded.", + "For a prerendered page, timestamps are measured from `activationStart`." + ], + "changelog": [ + { + "version": "next", + "description": "Added browser.web_vital.lcp.resource_load_delay attribute" + } + ] +} diff --git a/model/attributes/browser/browser__web_vital__lcp__resource_load_duration.json b/model/attributes/browser/browser__web_vital__lcp__resource_load_duration.json new file mode 100644 index 000000000..cd70ea8a5 --- /dev/null +++ b/model/attributes/browser/browser__web_vital__lcp__resource_load_duration.json @@ -0,0 +1,21 @@ +{ + "key": "browser.web_vital.lcp.resource_load_duration", + "brief": "The time it took to load the Largest Contentful Paint (LCP) resource, in milliseconds", + "type": "double", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": [780.2], + "additional_context": [ + "One of the four LCP subparts, which add up to `browser.web_vital.lcp.value`. Named after `resourceLoadDuration` in the web-vitals attribution build.", + "Measured as the LCP resource's `responseEnd` minus its `requestStart`. It is 0 when the LCP element is text, since no resource is loaded." + ], + "changelog": [ + { + "version": "next", + "description": "Added browser.web_vital.lcp.resource_load_duration attribute" + } + ] +} diff --git a/python/src/sentry_conventions/attributes.py b/python/src/sentry_conventions/attributes.py index bc1cf32ce..6e540a782 100644 --- a/python/src/sentry_conventions/attributes.py +++ b/python/src/sentry_conventions/attributes.py @@ -2590,6 +2590,19 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: 477.1926 """ + # Path: model/attributes/browser/browser__web_vital__inp__input_delay.json + BROWSER_WEB_VITAL_INP_INPUT_DELAY: Literal["browser.web_vital.inp.input_delay"] = ( + "browser.web_vital.inp.input_delay" + ) + """The time between the user interacting with the page and the browser starting to run the event handlers, for the interaction INP was reported on, in milliseconds + + Type: float + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: 120 + """ + # Path: model/attributes/browser/browser__web_vital__inp__interaction_type.json BROWSER_WEB_VITAL_INP_INTERACTION_TYPE: Literal[ "browser.web_vital.inp.interaction_type" @@ -2606,6 +2619,32 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: "press" """ + # Path: model/attributes/browser/browser__web_vital__inp__presentation_delay.json + BROWSER_WEB_VITAL_INP_PRESENTATION_DELAY: Literal[ + "browser.web_vital.inp.presentation_delay" + ] = "browser.web_vital.inp.presentation_delay" + """The time between the event handlers finishing and the browser presenting the next frame, for the interaction INP was reported on, in milliseconds + + Type: float + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: 100 + """ + + # Path: model/attributes/browser/browser__web_vital__inp__processing_duration.json + BROWSER_WEB_VITAL_INP_PROCESSING_DURATION: Literal[ + "browser.web_vital.inp.processing_duration" + ] = "browser.web_vital.inp.processing_duration" + """The time it took the event handlers to run, for the interaction INP was reported on, in milliseconds + + Type: float + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: 140 + """ + # Path: model/attributes/browser/browser__web_vital__inp__target.json BROWSER_WEB_VITAL_INP_TARGET: Literal["browser.web_vital.inp.target"] = ( "browser.web_vital.inp.target" @@ -2648,6 +2687,19 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: "body > div#app > div#container > div" """ + # Path: model/attributes/browser/browser__web_vital__lcp__element_render_delay.json + BROWSER_WEB_VITAL_LCP_ELEMENT_RENDER_DELAY: Literal[ + "browser.web_vital.lcp.element_render_delay" + ] = "browser.web_vital.lcp.element_render_delay" + """The time between the Largest Contentful Paint (LCP) resource finishing loading and the LCP element being rendered, in milliseconds + + Type: float + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: 410 + """ + # Path: model/attributes/browser/browser__web_vital__lcp__id.json BROWSER_WEB_VITAL_LCP_ID: Literal["browser.web_vital.lcp.id"] = ( "browser.web_vital.lcp.id" @@ -2704,6 +2756,32 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: "pagehide" """ + # Path: model/attributes/browser/browser__web_vital__lcp__resource_load_delay.json + BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DELAY: Literal[ + "browser.web_vital.lcp.resource_load_delay" + ] = "browser.web_vital.lcp.resource_load_delay" + """The time between the first byte of the document arriving and the browser starting to load the Largest Contentful Paint (LCP) resource, in milliseconds + + Type: float + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: 320.5 + """ + + # Path: model/attributes/browser/browser__web_vital__lcp__resource_load_duration.json + BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DURATION: Literal[ + "browser.web_vital.lcp.resource_load_duration" + ] = "browser.web_vital.lcp.resource_load_duration" + """The time it took to load the Largest Contentful Paint (LCP) resource, in milliseconds + + Type: float + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: 780.2 + """ + # Path: model/attributes/browser/browser__web_vital__lcp__size.json BROWSER_WEB_VITAL_LCP_SIZE: Literal["browser.web_vital.lcp.size"] = ( "browser.web_vital.lcp.size" @@ -15260,6 +15338,27 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ChangelogEntry(version="0.5.0", prs=[235]), ], ), + "browser.web_vital.inp.input_delay": AttributeMetadata( + brief="The time between the user interacting with the page and the browser starting to run the event handlers, for the interaction INP was reported on, in milliseconds", + type=AttributeType.DOUBLE, + keys=("browser.web_vital.inp.input_delay",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=120, + examples=[120], + changelog=[ + ChangelogEntry( + version="next", + description="Added browser.web_vital.inp.input_delay attribute", + ), + ], + additional_context=[ + "One of the three INP subparts, which add up to `browser.web_vital.inp.value`: input delay, processing duration and presentation delay. Named after `inputDelay` in the web-vitals attribution build.", + "Measured from the interaction's `PerformanceEventTiming` entry as `processingStart` minus `startTime`.", + "Omitted when INP is reported without an interaction to attribute it to, like `browser.web_vital.inp.target`.", + ], + ), "browser.web_vital.inp.interaction_type": AttributeMetadata( brief="The kind of user interaction INP was reported on", type=AttributeType.STRING, @@ -15282,6 +15381,48 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "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.", ], ), + "browser.web_vital.inp.presentation_delay": AttributeMetadata( + brief="The time between the event handlers finishing and the browser presenting the next frame, for the interaction INP was reported on, in milliseconds", + type=AttributeType.DOUBLE, + keys=("browser.web_vital.inp.presentation_delay",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=100, + examples=[100], + changelog=[ + ChangelogEntry( + version="next", + description="Added browser.web_vital.inp.presentation_delay attribute", + ), + ], + additional_context=[ + "One of the three INP subparts, which add up to `browser.web_vital.inp.value`. Named after `presentationDelay` in the web-vitals attribution build.", + "Measured from the interaction's `PerformanceEventTiming` entry as `startTime` plus `duration` minus `processingEnd`.", + "Omitted when INP is reported without an interaction to attribute it to, like `browser.web_vital.inp.target`.", + ], + ), + "browser.web_vital.inp.processing_duration": AttributeMetadata( + brief="The time it took the event handlers to run, for the interaction INP was reported on, in milliseconds", + type=AttributeType.DOUBLE, + keys=("browser.web_vital.inp.processing_duration",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=140, + examples=[140], + changelog=[ + ChangelogEntry( + version="next", + description="Added browser.web_vital.inp.processing_duration attribute", + ), + ], + additional_context=[ + "One of the three INP subparts, which add up to `browser.web_vital.inp.value`. Named after `processingDuration` in the web-vitals attribution build.", + "Measured from the interaction's `PerformanceEventTiming` entry as `processingEnd` minus `processingStart`.", + "Omitted when INP is reported without an interaction to attribute it to, like `browser.web_vital.inp.target`.", + ], + ), "browser.web_vital.inp.target": AttributeMetadata( brief="The HTML element selector or component name of the element the user interacted with, for the interaction INP was reported on", type=AttributeType.STRING, @@ -15339,6 +15480,26 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ChangelogEntry(version="0.5.0", prs=[233]), ], ), + "browser.web_vital.lcp.element_render_delay": AttributeMetadata( + brief="The time between the Largest Contentful Paint (LCP) resource finishing loading and the LCP element being rendered, in milliseconds", + type=AttributeType.DOUBLE, + keys=("browser.web_vital.lcp.element_render_delay",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=410, + examples=[410], + changelog=[ + ChangelogEntry( + version="next", + description="Added browser.web_vital.lcp.element_render_delay attribute", + ), + ], + additional_context=[ + "One of the four LCP subparts, which add up to `browser.web_vital.lcp.value`. Named after `elementRenderDelay` in the web-vitals attribution build.", + "Measured as the LCP value minus the LCP resource's `responseEnd`. When the LCP element is text, it covers all time after TTFB.", + ], + ), "browser.web_vital.lcp.id": AttributeMetadata( brief="The id of the dom element responsible for the largest contentful paint", type=AttributeType.STRING, @@ -15411,6 +15572,47 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ), ], ), + "browser.web_vital.lcp.resource_load_delay": AttributeMetadata( + brief="The time between the first byte of the document arriving and the browser starting to load the Largest Contentful Paint (LCP) resource, in milliseconds", + type=AttributeType.DOUBLE, + keys=("browser.web_vital.lcp.resource_load_delay",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=320.5, + examples=[320.5], + changelog=[ + ChangelogEntry( + version="next", + description="Added browser.web_vital.lcp.resource_load_delay attribute", + ), + ], + additional_context=[ + "One of the four LCP subparts, which add up to `browser.web_vital.lcp.value`: TTFB (`browser.web_vital.ttfb.value`), resource load delay, resource load duration and element render delay. Named after `resourceLoadDelay` in the web-vitals attribution build.", + "Measured as the LCP resource's `requestStart` (or `startTime` when `requestStart` is not exposed) minus TTFB. It is 0 when the LCP element is text, since no resource is loaded.", + "For a prerendered page, timestamps are measured from `activationStart`.", + ], + ), + "browser.web_vital.lcp.resource_load_duration": AttributeMetadata( + brief="The time it took to load the Largest Contentful Paint (LCP) resource, in milliseconds", + type=AttributeType.DOUBLE, + keys=("browser.web_vital.lcp.resource_load_duration",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=780.2, + examples=[780.2], + changelog=[ + ChangelogEntry( + version="next", + description="Added browser.web_vital.lcp.resource_load_duration attribute", + ), + ], + additional_context=[ + "One of the four LCP subparts, which add up to `browser.web_vital.lcp.value`. Named after `resourceLoadDuration` in the web-vitals attribution build.", + "Measured as the LCP resource's `responseEnd` minus its `requestStart`. It is 0 when the LCP element is text, since no resource is loaded.", + ], + ), "browser.web_vital.lcp.size": AttributeMetadata( brief="The size of the largest contentful paint element", type=AttributeType.INTEGER, @@ -29409,14 +29611,20 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "browser.web_vital.cls.value": float, "browser.web_vital.fcp.value": float, "browser.web_vital.fp.value": float, + "browser.web_vital.inp.input_delay": float, "browser.web_vital.inp.interaction_type": str, + "browser.web_vital.inp.presentation_delay": float, + "browser.web_vital.inp.processing_duration": float, "browser.web_vital.inp.target": str, "browser.web_vital.inp.value": float, "browser.web_vital.lcp.element": str, + "browser.web_vital.lcp.element_render_delay": float, "browser.web_vital.lcp.id": str, "browser.web_vital.lcp.load_time": int, "browser.web_vital.lcp.render_time": int, "browser.web_vital.lcp.report_event": str, + "browser.web_vital.lcp.resource_load_delay": float, + "browser.web_vital.lcp.resource_load_duration": float, "browser.web_vital.lcp.size": int, "browser.web_vital.lcp.url": str, "browser.web_vital.lcp.value": float, From d41e6cbd49c72d5187c712f5b7907f02beaad058 Mon Sep 17 00:00:00 2001 From: Abdelrahman Awad Date: Tue, 13 Oct 2026 11:35:10 -0400 Subject: [PATCH 2/4] chore: Reference the PR in the changelog entries --- .../sentry-conventions/src/attributes.ts | 22 ++++++++++++++----- .../browser__web_vital__inp__input_delay.json | 1 + ...r__web_vital__inp__presentation_delay.json | 1 + ...__web_vital__inp__processing_duration.json | 1 + ..._web_vital__lcp__element_render_delay.json | 1 + ...__web_vital__lcp__resource_load_delay.json | 1 + ...eb_vital__lcp__resource_load_duration.json | 1 + python/src/sentry_conventions/attributes.py | 6 +++++ 8 files changed, 28 insertions(+), 6 deletions(-) diff --git a/javascript/sentry-conventions/src/attributes.ts b/javascript/sentry-conventions/src/attributes.ts index 71fa97c1b..dfaed7a0b 100644 --- a/javascript/sentry-conventions/src/attributes.ts +++ b/javascript/sentry-conventions/src/attributes.ts @@ -25130,7 +25130,7 @@ export const ATTRIBUTE_METADATA: Record = { visibility: 'public', example: 120, examples: [120], - changelog: [{ version: 'next', description: 'Added browser.web_vital.inp.input_delay attribute' }], + changelog: [{ version: 'next', prs: [712], description: 'Added browser.web_vital.inp.input_delay attribute' }], additionalContext: [ 'One of the three INP subparts, which add up to `browser.web_vital.inp.value`: input delay, processing duration and presentation delay. Named after `inputDelay` in the web-vitals attribution build.', "Measured from the interaction's `PerformanceEventTiming` entry as `processingStart` minus `startTime`.", @@ -25169,7 +25169,9 @@ export const ATTRIBUTE_METADATA: Record = { visibility: 'public', example: 100, examples: [100], - changelog: [{ version: 'next', description: 'Added browser.web_vital.inp.presentation_delay attribute' }], + changelog: [ + { version: 'next', prs: [712], description: 'Added browser.web_vital.inp.presentation_delay attribute' }, + ], additionalContext: [ 'One of the three INP subparts, which add up to `browser.web_vital.inp.value`. Named after `presentationDelay` in the web-vitals attribution build.', "Measured from the interaction's `PerformanceEventTiming` entry as `startTime` plus `duration` minus `processingEnd`.", @@ -25187,7 +25189,9 @@ export const ATTRIBUTE_METADATA: Record = { visibility: 'public', example: 140, examples: [140], - changelog: [{ version: 'next', description: 'Added browser.web_vital.inp.processing_duration attribute' }], + changelog: [ + { version: 'next', prs: [712], description: 'Added browser.web_vital.inp.processing_duration attribute' }, + ], additionalContext: [ 'One of the three INP subparts, which add up to `browser.web_vital.inp.value`. Named after `processingDuration` in the web-vitals attribution build.', "Measured from the interaction's `PerformanceEventTiming` entry as `processingEnd` minus `processingStart`.", @@ -25250,7 +25254,9 @@ export const ATTRIBUTE_METADATA: Record = { visibility: 'public', example: 410, examples: [410], - changelog: [{ version: 'next', description: 'Added browser.web_vital.lcp.element_render_delay attribute' }], + changelog: [ + { version: 'next', prs: [712], description: 'Added browser.web_vital.lcp.element_render_delay attribute' }, + ], additionalContext: [ 'One of the four LCP subparts, which add up to `browser.web_vital.lcp.value`. Named after `elementRenderDelay` in the web-vitals attribution build.', "Measured as the LCP value minus the LCP resource's `responseEnd`. When the LCP element is text, it covers all time after TTFB.", @@ -25330,7 +25336,9 @@ export const ATTRIBUTE_METADATA: Record = { visibility: 'public', example: 320.5, examples: [320.5], - changelog: [{ version: 'next', description: 'Added browser.web_vital.lcp.resource_load_delay attribute' }], + changelog: [ + { version: 'next', prs: [712], description: 'Added browser.web_vital.lcp.resource_load_delay attribute' }, + ], additionalContext: [ 'One of the four LCP subparts, which add up to `browser.web_vital.lcp.value`: TTFB (`browser.web_vital.ttfb.value`), resource load delay, resource load duration and element render delay. Named after `resourceLoadDelay` in the web-vitals attribution build.', "Measured as the LCP resource's `requestStart` (or `startTime` when `requestStart` is not exposed) minus TTFB. It is 0 when the LCP element is text, since no resource is loaded.", @@ -25348,7 +25356,9 @@ export const ATTRIBUTE_METADATA: Record = { visibility: 'public', example: 780.2, examples: [780.2], - changelog: [{ version: 'next', description: 'Added browser.web_vital.lcp.resource_load_duration attribute' }], + changelog: [ + { version: 'next', prs: [712], description: 'Added browser.web_vital.lcp.resource_load_duration attribute' }, + ], additionalContext: [ 'One of the four LCP subparts, which add up to `browser.web_vital.lcp.value`. Named after `resourceLoadDuration` in the web-vitals attribution build.', "Measured as the LCP resource's `responseEnd` minus its `requestStart`. It is 0 when the LCP element is text, since no resource is loaded.", diff --git a/model/attributes/browser/browser__web_vital__inp__input_delay.json b/model/attributes/browser/browser__web_vital__inp__input_delay.json index 0eeff2a68..4fd33706b 100644 --- a/model/attributes/browser/browser__web_vital__inp__input_delay.json +++ b/model/attributes/browser/browser__web_vital__inp__input_delay.json @@ -16,6 +16,7 @@ "changelog": [ { "version": "next", + "prs": [712], "description": "Added browser.web_vital.inp.input_delay attribute" } ] diff --git a/model/attributes/browser/browser__web_vital__inp__presentation_delay.json b/model/attributes/browser/browser__web_vital__inp__presentation_delay.json index bc4d0db57..a68280bbe 100644 --- a/model/attributes/browser/browser__web_vital__inp__presentation_delay.json +++ b/model/attributes/browser/browser__web_vital__inp__presentation_delay.json @@ -16,6 +16,7 @@ "changelog": [ { "version": "next", + "prs": [712], "description": "Added browser.web_vital.inp.presentation_delay attribute" } ] diff --git a/model/attributes/browser/browser__web_vital__inp__processing_duration.json b/model/attributes/browser/browser__web_vital__inp__processing_duration.json index 0ef73123c..1b0dfb76f 100644 --- a/model/attributes/browser/browser__web_vital__inp__processing_duration.json +++ b/model/attributes/browser/browser__web_vital__inp__processing_duration.json @@ -16,6 +16,7 @@ "changelog": [ { "version": "next", + "prs": [712], "description": "Added browser.web_vital.inp.processing_duration attribute" } ] diff --git a/model/attributes/browser/browser__web_vital__lcp__element_render_delay.json b/model/attributes/browser/browser__web_vital__lcp__element_render_delay.json index a8e43c258..4e080eda8 100644 --- a/model/attributes/browser/browser__web_vital__lcp__element_render_delay.json +++ b/model/attributes/browser/browser__web_vital__lcp__element_render_delay.json @@ -15,6 +15,7 @@ "changelog": [ { "version": "next", + "prs": [712], "description": "Added browser.web_vital.lcp.element_render_delay attribute" } ] diff --git a/model/attributes/browser/browser__web_vital__lcp__resource_load_delay.json b/model/attributes/browser/browser__web_vital__lcp__resource_load_delay.json index a04437a68..cce7de6f3 100644 --- a/model/attributes/browser/browser__web_vital__lcp__resource_load_delay.json +++ b/model/attributes/browser/browser__web_vital__lcp__resource_load_delay.json @@ -16,6 +16,7 @@ "changelog": [ { "version": "next", + "prs": [712], "description": "Added browser.web_vital.lcp.resource_load_delay attribute" } ] diff --git a/model/attributes/browser/browser__web_vital__lcp__resource_load_duration.json b/model/attributes/browser/browser__web_vital__lcp__resource_load_duration.json index cd70ea8a5..3b32d9d13 100644 --- a/model/attributes/browser/browser__web_vital__lcp__resource_load_duration.json +++ b/model/attributes/browser/browser__web_vital__lcp__resource_load_duration.json @@ -15,6 +15,7 @@ "changelog": [ { "version": "next", + "prs": [712], "description": "Added browser.web_vital.lcp.resource_load_duration attribute" } ] diff --git a/python/src/sentry_conventions/attributes.py b/python/src/sentry_conventions/attributes.py index 6e540a782..7ecd6a4f3 100644 --- a/python/src/sentry_conventions/attributes.py +++ b/python/src/sentry_conventions/attributes.py @@ -15350,6 +15350,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): changelog=[ ChangelogEntry( version="next", + prs=[712], description="Added browser.web_vital.inp.input_delay attribute", ), ], @@ -15393,6 +15394,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): changelog=[ ChangelogEntry( version="next", + prs=[712], description="Added browser.web_vital.inp.presentation_delay attribute", ), ], @@ -15414,6 +15416,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): changelog=[ ChangelogEntry( version="next", + prs=[712], description="Added browser.web_vital.inp.processing_duration attribute", ), ], @@ -15492,6 +15495,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): changelog=[ ChangelogEntry( version="next", + prs=[712], description="Added browser.web_vital.lcp.element_render_delay attribute", ), ], @@ -15584,6 +15588,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): changelog=[ ChangelogEntry( version="next", + prs=[712], description="Added browser.web_vital.lcp.resource_load_delay attribute", ), ], @@ -15605,6 +15610,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): changelog=[ ChangelogEntry( version="next", + prs=[712], description="Added browser.web_vital.lcp.resource_load_duration attribute", ), ], From 3ec92a5e3f17ab231512cf38d5ade409225167f1 Mon Sep 17 00:00:00 2001 From: Abdelrahman Awad Date: Wed, 14 Oct 2026 10:38:20 -0400 Subject: [PATCH 3/4] fix(attributes): Apply prerender and requestStart notes to every LCP subpart --- javascript/sentry-conventions/src/attributes.ts | 4 +++- .../browser__web_vital__lcp__element_render_delay.json | 3 ++- .../browser__web_vital__lcp__resource_load_duration.json | 3 ++- python/src/sentry_conventions/attributes.py | 4 +++- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/javascript/sentry-conventions/src/attributes.ts b/javascript/sentry-conventions/src/attributes.ts index dfaed7a0b..7bd3e4695 100644 --- a/javascript/sentry-conventions/src/attributes.ts +++ b/javascript/sentry-conventions/src/attributes.ts @@ -25260,6 +25260,7 @@ export const ATTRIBUTE_METADATA: Record = { additionalContext: [ 'One of the four LCP subparts, which add up to `browser.web_vital.lcp.value`. Named after `elementRenderDelay` in the web-vitals attribution build.', "Measured as the LCP value minus the LCP resource's `responseEnd`. When the LCP element is text, it covers all time after TTFB.", + 'For a prerendered page, timestamps are measured from `activationStart`.', ], }, 'browser.web_vital.lcp.id': { @@ -25361,7 +25362,8 @@ export const ATTRIBUTE_METADATA: Record = { ], additionalContext: [ 'One of the four LCP subparts, which add up to `browser.web_vital.lcp.value`. Named after `resourceLoadDuration` in the web-vitals attribution build.', - "Measured as the LCP resource's `responseEnd` minus its `requestStart`. It is 0 when the LCP element is text, since no resource is loaded.", + "Measured as the LCP resource's `responseEnd` minus its `requestStart` (or `startTime` when `requestStart` is not exposed). It is 0 when the LCP element is text, since no resource is loaded.", + 'For a prerendered page, timestamps are measured from `activationStart`.', ], }, 'browser.web_vital.lcp.size': { diff --git a/model/attributes/browser/browser__web_vital__lcp__element_render_delay.json b/model/attributes/browser/browser__web_vital__lcp__element_render_delay.json index 4e080eda8..179ee91b8 100644 --- a/model/attributes/browser/browser__web_vital__lcp__element_render_delay.json +++ b/model/attributes/browser/browser__web_vital__lcp__element_render_delay.json @@ -10,7 +10,8 @@ "examples": [410.0], "additional_context": [ "One of the four LCP subparts, which add up to `browser.web_vital.lcp.value`. Named after `elementRenderDelay` in the web-vitals attribution build.", - "Measured as the LCP value minus the LCP resource's `responseEnd`. When the LCP element is text, it covers all time after TTFB." + "Measured as the LCP value minus the LCP resource's `responseEnd`. When the LCP element is text, it covers all time after TTFB.", + "For a prerendered page, timestamps are measured from `activationStart`." ], "changelog": [ { diff --git a/model/attributes/browser/browser__web_vital__lcp__resource_load_duration.json b/model/attributes/browser/browser__web_vital__lcp__resource_load_duration.json index 3b32d9d13..18d37295b 100644 --- a/model/attributes/browser/browser__web_vital__lcp__resource_load_duration.json +++ b/model/attributes/browser/browser__web_vital__lcp__resource_load_duration.json @@ -10,7 +10,8 @@ "examples": [780.2], "additional_context": [ "One of the four LCP subparts, which add up to `browser.web_vital.lcp.value`. Named after `resourceLoadDuration` in the web-vitals attribution build.", - "Measured as the LCP resource's `responseEnd` minus its `requestStart`. It is 0 when the LCP element is text, since no resource is loaded." + "Measured as the LCP resource's `responseEnd` minus its `requestStart` (or `startTime` when `requestStart` is not exposed). It is 0 when the LCP element is text, since no resource is loaded.", + "For a prerendered page, timestamps are measured from `activationStart`." ], "changelog": [ { diff --git a/python/src/sentry_conventions/attributes.py b/python/src/sentry_conventions/attributes.py index 7ecd6a4f3..e0baa8d9e 100644 --- a/python/src/sentry_conventions/attributes.py +++ b/python/src/sentry_conventions/attributes.py @@ -15502,6 +15502,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): additional_context=[ "One of the four LCP subparts, which add up to `browser.web_vital.lcp.value`. Named after `elementRenderDelay` in the web-vitals attribution build.", "Measured as the LCP value minus the LCP resource's `responseEnd`. When the LCP element is text, it covers all time after TTFB.", + "For a prerendered page, timestamps are measured from `activationStart`.", ], ), "browser.web_vital.lcp.id": AttributeMetadata( @@ -15616,7 +15617,8 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ], additional_context=[ "One of the four LCP subparts, which add up to `browser.web_vital.lcp.value`. Named after `resourceLoadDuration` in the web-vitals attribution build.", - "Measured as the LCP resource's `responseEnd` minus its `requestStart`. It is 0 when the LCP element is text, since no resource is loaded.", + "Measured as the LCP resource's `responseEnd` minus its `requestStart` (or `startTime` when `requestStart` is not exposed). It is 0 when the LCP element is text, since no resource is loaded.", + "For a prerendered page, timestamps are measured from `activationStart`.", ], ), "browser.web_vital.lcp.size": AttributeMetadata( From 4158ed5005d30a8353ab3a914623ca86f2b17622 Mon Sep 17 00:00:00 2001 From: Abdelrahman Awad Date: Wed, 14 Oct 2026 10:41:51 -0400 Subject: [PATCH 4/4] fix(attributes): Shorten LCP in subpart briefs to match sibling attributes --- javascript/sentry-conventions/src/attributes.ts | 13 ++++++------- javascript/sentry-conventions/src/search.ts | 7 +++---- ...owser__web_vital__lcp__element_render_delay.json | 2 +- ...rowser__web_vital__lcp__resource_load_delay.json | 2 +- ...ser__web_vital__lcp__resource_load_duration.json | 2 +- python/src/sentry_conventions/attributes.py | 12 ++++++------ 6 files changed, 18 insertions(+), 20 deletions(-) diff --git a/javascript/sentry-conventions/src/attributes.ts b/javascript/sentry-conventions/src/attributes.ts index 7bd3e4695..9a36713c1 100644 --- a/javascript/sentry-conventions/src/attributes.ts +++ b/javascript/sentry-conventions/src/attributes.ts @@ -3936,7 +3936,7 @@ export type BROWSER_WEB_VITAL_LCP_ELEMENT_TYPE = string; // Path: model/attributes/browser/browser__web_vital__lcp__element_render_delay.json /** - * The time between the Largest Contentful Paint (LCP) resource finishing loading and the LCP element being rendered, in milliseconds `browser.web_vital.lcp.element_render_delay` + * The time between the LCP resource finishing loading and the LCP element being rendered, in milliseconds `browser.web_vital.lcp.element_render_delay` * * Attribute Value Type: `number` {@link BROWSER_WEB_VITAL_LCP_ELEMENT_RENDER_DELAY_TYPE} * @@ -4048,7 +4048,7 @@ export type BROWSER_WEB_VITAL_LCP_REPORT_EVENT_TYPE = string; // Path: model/attributes/browser/browser__web_vital__lcp__resource_load_delay.json /** - * The time between the first byte of the document arriving and the browser starting to load the Largest Contentful Paint (LCP) resource, in milliseconds `browser.web_vital.lcp.resource_load_delay` + * The time between the first byte of the document arriving and the browser starting to load the LCP resource, in milliseconds `browser.web_vital.lcp.resource_load_delay` * * Attribute Value Type: `number` {@link BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DELAY_TYPE} * @@ -4069,7 +4069,7 @@ export type BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DELAY_TYPE = number; // Path: model/attributes/browser/browser__web_vital__lcp__resource_load_duration.json /** - * The time it took to load the Largest Contentful Paint (LCP) resource, in milliseconds `browser.web_vital.lcp.resource_load_duration` + * The time it took to load the LCP resource, in milliseconds `browser.web_vital.lcp.resource_load_duration` * * Attribute Value Type: `number` {@link BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DURATION_TYPE} * @@ -25243,8 +25243,7 @@ export const ATTRIBUTE_METADATA: Record = { changelog: [{ version: '0.5.0', prs: [233] }], }, 'browser.web_vital.lcp.element_render_delay': { - brief: - 'The time between the Largest Contentful Paint (LCP) resource finishing loading and the LCP element being rendered, in milliseconds', + brief: 'The time between the LCP resource finishing loading and the LCP element being rendered, in milliseconds', type: 'double', keys: ['browser.web_vital.lcp.element_render_delay'], applyScrubbing: { @@ -25327,7 +25326,7 @@ export const ATTRIBUTE_METADATA: Record = { }, 'browser.web_vital.lcp.resource_load_delay': { brief: - 'The time between the first byte of the document arriving and the browser starting to load the Largest Contentful Paint (LCP) resource, in milliseconds', + 'The time between the first byte of the document arriving and the browser starting to load the LCP resource, in milliseconds', type: 'double', keys: ['browser.web_vital.lcp.resource_load_delay'], applyScrubbing: { @@ -25347,7 +25346,7 @@ export const ATTRIBUTE_METADATA: Record = { ], }, 'browser.web_vital.lcp.resource_load_duration': { - brief: 'The time it took to load the Largest Contentful Paint (LCP) resource, in milliseconds', + brief: 'The time it took to load the LCP resource, in milliseconds', type: 'double', keys: ['browser.web_vital.lcp.resource_load_duration'], applyScrubbing: { diff --git a/javascript/sentry-conventions/src/search.ts b/javascript/sentry-conventions/src/search.ts index 3af4b069b..ad0ebc70e 100644 --- a/javascript/sentry-conventions/src/search.ts +++ b/javascript/sentry-conventions/src/search.ts @@ -7407,8 +7407,7 @@ export const ATTRIBUTE_SEARCH_METADATA: Record 'browser.web_vital.lcp.element_render_delay': { canonicalName: 'browser.web_vital.lcp.element_render_delay', type: 'double', - brief: - 'The time between the Largest Contentful Paint (LCP) resource finishing loading and the LCP element being rendered, in milliseconds', + brief: 'The time between the LCP resource finishing loading and the LCP element being rendered, in milliseconds', deprecationChain: ['browser.web_vital.lcp.element_render_delay'], }, 'browser.web_vital.lcp.id': { @@ -7440,13 +7439,13 @@ export const ATTRIBUTE_SEARCH_METADATA: Record canonicalName: 'browser.web_vital.lcp.resource_load_delay', type: 'double', brief: - 'The time between the first byte of the document arriving and the browser starting to load the Largest Contentful Paint (LCP) resource, in milliseconds', + 'The time between the first byte of the document arriving and the browser starting to load the LCP resource, in milliseconds', deprecationChain: ['browser.web_vital.lcp.resource_load_delay'], }, 'browser.web_vital.lcp.resource_load_duration': { canonicalName: 'browser.web_vital.lcp.resource_load_duration', type: 'double', - brief: 'The time it took to load the Largest Contentful Paint (LCP) resource, in milliseconds', + brief: 'The time it took to load the LCP resource, in milliseconds', deprecationChain: ['browser.web_vital.lcp.resource_load_duration'], }, 'browser.web_vital.lcp.size': { diff --git a/model/attributes/browser/browser__web_vital__lcp__element_render_delay.json b/model/attributes/browser/browser__web_vital__lcp__element_render_delay.json index 179ee91b8..5948b2059 100644 --- a/model/attributes/browser/browser__web_vital__lcp__element_render_delay.json +++ b/model/attributes/browser/browser__web_vital__lcp__element_render_delay.json @@ -1,6 +1,6 @@ { "key": "browser.web_vital.lcp.element_render_delay", - "brief": "The time between the Largest Contentful Paint (LCP) resource finishing loading and the LCP element being rendered, in milliseconds", + "brief": "The time between the LCP resource finishing loading and the LCP element being rendered, in milliseconds", "type": "double", "apply_scrubbing": { "key": "manual" diff --git a/model/attributes/browser/browser__web_vital__lcp__resource_load_delay.json b/model/attributes/browser/browser__web_vital__lcp__resource_load_delay.json index cce7de6f3..4cf59c760 100644 --- a/model/attributes/browser/browser__web_vital__lcp__resource_load_delay.json +++ b/model/attributes/browser/browser__web_vital__lcp__resource_load_delay.json @@ -1,6 +1,6 @@ { "key": "browser.web_vital.lcp.resource_load_delay", - "brief": "The time between the first byte of the document arriving and the browser starting to load the Largest Contentful Paint (LCP) resource, in milliseconds", + "brief": "The time between the first byte of the document arriving and the browser starting to load the LCP resource, in milliseconds", "type": "double", "apply_scrubbing": { "key": "manual" diff --git a/model/attributes/browser/browser__web_vital__lcp__resource_load_duration.json b/model/attributes/browser/browser__web_vital__lcp__resource_load_duration.json index 18d37295b..f320cf1e6 100644 --- a/model/attributes/browser/browser__web_vital__lcp__resource_load_duration.json +++ b/model/attributes/browser/browser__web_vital__lcp__resource_load_duration.json @@ -1,6 +1,6 @@ { "key": "browser.web_vital.lcp.resource_load_duration", - "brief": "The time it took to load the Largest Contentful Paint (LCP) resource, in milliseconds", + "brief": "The time it took to load the LCP resource, in milliseconds", "type": "double", "apply_scrubbing": { "key": "manual" diff --git a/python/src/sentry_conventions/attributes.py b/python/src/sentry_conventions/attributes.py index e0baa8d9e..c8205e21c 100644 --- a/python/src/sentry_conventions/attributes.py +++ b/python/src/sentry_conventions/attributes.py @@ -2691,7 +2691,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): BROWSER_WEB_VITAL_LCP_ELEMENT_RENDER_DELAY: Literal[ "browser.web_vital.lcp.element_render_delay" ] = "browser.web_vital.lcp.element_render_delay" - """The time between the Largest Contentful Paint (LCP) resource finishing loading and the LCP element being rendered, in milliseconds + """The time between the LCP resource finishing loading and the LCP element being rendered, in milliseconds Type: float Apply Scrubbing: manual @@ -2760,7 +2760,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DELAY: Literal[ "browser.web_vital.lcp.resource_load_delay" ] = "browser.web_vital.lcp.resource_load_delay" - """The time between the first byte of the document arriving and the browser starting to load the Largest Contentful Paint (LCP) resource, in milliseconds + """The time between the first byte of the document arriving and the browser starting to load the LCP resource, in milliseconds Type: float Apply Scrubbing: manual @@ -2773,7 +2773,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): BROWSER_WEB_VITAL_LCP_RESOURCE_LOAD_DURATION: Literal[ "browser.web_vital.lcp.resource_load_duration" ] = "browser.web_vital.lcp.resource_load_duration" - """The time it took to load the Largest Contentful Paint (LCP) resource, in milliseconds + """The time it took to load the LCP resource, in milliseconds Type: float Apply Scrubbing: manual @@ -15484,7 +15484,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ], ), "browser.web_vital.lcp.element_render_delay": AttributeMetadata( - brief="The time between the Largest Contentful Paint (LCP) resource finishing loading and the LCP element being rendered, in milliseconds", + brief="The time between the LCP resource finishing loading and the LCP element being rendered, in milliseconds", type=AttributeType.DOUBLE, keys=("browser.web_vital.lcp.element_render_delay",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), @@ -15578,7 +15578,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ], ), "browser.web_vital.lcp.resource_load_delay": AttributeMetadata( - brief="The time between the first byte of the document arriving and the browser starting to load the Largest Contentful Paint (LCP) resource, in milliseconds", + brief="The time between the first byte of the document arriving and the browser starting to load the LCP resource, in milliseconds", type=AttributeType.DOUBLE, keys=("browser.web_vital.lcp.resource_load_delay",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), @@ -15600,7 +15600,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ], ), "browser.web_vital.lcp.resource_load_duration": AttributeMetadata( - brief="The time it took to load the Largest Contentful Paint (LCP) resource, in milliseconds", + brief="The time it took to load the LCP resource, in milliseconds", type=AttributeType.DOUBLE, keys=("browser.web_vital.lcp.resource_load_duration",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL),