From a61b7a45b6a9514700d0efbef502c4ff704d1e8f Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Fri, 23 Jan 2026 10:02:03 +0100 Subject: [PATCH 1/7] feat(attributes): Add `browser.web_vital.lcp.element` attribute --- generated/attributes/all.md | 3 +- generated/attributes/browser.md | 13 +++++++ .../sentry-conventions/src/attributes.ts | 36 +++++++++++++++++++ .../browser__web_vital__lcp__element.json | 12 +++++++ python/src/sentry_conventions/attributes.py | 23 ++++++++++++ 5 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 model/attributes/browser/browser__web_vital__lcp__element.json diff --git a/generated/attributes/all.md b/generated/attributes/all.md index 42516ff1..53916353 100644 --- a/generated/attributes/all.md +++ b/generated/attributes/all.md @@ -4,7 +4,7 @@ This page lists all available attributes across all categories. -Total attributes: 422 +Total attributes: 423 ## Stable Attributes @@ -31,6 +31,7 @@ Total attributes: 422 | [`browser.script.invoker_type`](./browser.md#browserscriptinvoker_type) | Browser script entry point type. | | [`browser.script.source_char_position`](./browser.md#browserscriptsource_char_position) | A number representing the script character position of the script. | | [`browser.version`](./browser.md#browserversion) | The version of the browser. | +| [`browser.web_vital.lcp.element`](./browser.md#browserweb_vitallcpelement) | The HTML element selector or component name for which LCP was reported | | [`cache.hit`](./cache.md#cachehit) | If the cache was hit during this span. | | [`cache.item_size`](./cache.md#cacheitem_size) | The size of the requested item in the cache. In bytes. | | [`cache.key`](./cache.md#cachekey) | The key of the cache accessed. | diff --git a/generated/attributes/browser.md b/generated/attributes/browser.md index 2295102b..21d6b146 100644 --- a/generated/attributes/browser.md +++ b/generated/attributes/browser.md @@ -9,6 +9,7 @@ - [browser.script.invoker_type](#browserscriptinvoker_type) - [browser.script.source_char_position](#browserscriptsource_char_position) - [browser.version](#browserversion) + - [browser.web_vital.lcp.element](#browserweb_vitallcpelement) ## Stable Attributes @@ -80,3 +81,15 @@ The version of the browser. | Example | `120.0.6099.130` | | Aliases | `sentry.browser.version` | +### browser.web_vital.lcp.element + +The HTML element selector or component name for which LCP was reported + +| Property | Value | +| --- | --- | +| Type | `string` | +| Has PII | false | +| Exists in OpenTelemetry | No | +| Example | `body > div#app > div#container > div` | +| Aliases | `lcp.element` | + diff --git a/javascript/sentry-conventions/src/attributes.ts b/javascript/sentry-conventions/src/attributes.ts index 7a5c8756..6fb49369 100644 --- a/javascript/sentry-conventions/src/attributes.ts +++ b/javascript/sentry-conventions/src/attributes.ts @@ -878,6 +878,28 @@ export const BROWSER_VERSION = 'browser.version'; */ export type BROWSER_VERSION_TYPE = string; +// Path: model/attributes/browser/browser__web_vital__lcp__element.json + +/** + * The HTML element selector or component name for which LCP was reported `browser.web_vital.lcp.element` + * + * Attribute Value Type: `string` {@link BROWSER_WEB_VITAL_LCP_ELEMENT_TYPE} + * + * Contains PII: false + * + * Attribute defined in OTEL: No + * + * Aliases: {@link LCP_ELEMENT} `lcp.element` + * + * @example "body > div#app > div#container > div" + */ +export const BROWSER_WEB_VITAL_LCP_ELEMENT = 'browser.web_vital.lcp.element'; + +/** + * Type for {@link BROWSER_WEB_VITAL_LCP_ELEMENT} browser.web_vital.lcp.element + */ +export type BROWSER_WEB_VITAL_LCP_ELEMENT_TYPE = string; + // Path: model/attributes/cache/cache__hit.json /** @@ -8849,6 +8871,7 @@ export const ATTRIBUTE_TYPE: Record = { [BROWSER_SCRIPT_INVOKER_TYPE]: 'string', [BROWSER_SCRIPT_SOURCE_CHAR_POSITION]: 'integer', [BROWSER_VERSION]: 'string', + [BROWSER_WEB_VITAL_LCP_ELEMENT]: 'string', [CACHE_HIT]: 'boolean', [CACHE_ITEM_SIZE]: 'integer', [CACHE_KEY]: 'string[]', @@ -9274,6 +9297,7 @@ export type AttributeName = | typeof BROWSER_SCRIPT_INVOKER_TYPE | typeof BROWSER_SCRIPT_SOURCE_CHAR_POSITION | typeof BROWSER_VERSION + | typeof BROWSER_WEB_VITAL_LCP_ELEMENT | typeof CACHE_HIT | typeof CACHE_ITEM_SIZE | typeof CACHE_KEY @@ -10122,6 +10146,17 @@ export const ATTRIBUTE_METADATA: Record = { example: '120.0.6099.130', aliases: [SENTRY_BROWSER_VERSION], }, + [BROWSER_WEB_VITAL_LCP_ELEMENT]: { + brief: 'The HTML element selector or component name for which LCP was reported', + type: 'string', + pii: { + isPii: 'false', + }, + isInOtel: false, + example: 'body > div#app > div#container > div', + aliases: [LCP_ELEMENT], + sdks: ['javascript-browser'], + }, [CACHE_HIT]: { brief: 'If the cache was hit during this span.', type: 'boolean', @@ -14026,6 +14061,7 @@ export type Attributes = { [BROWSER_SCRIPT_INVOKER_TYPE]?: BROWSER_SCRIPT_INVOKER_TYPE_TYPE; [BROWSER_SCRIPT_SOURCE_CHAR_POSITION]?: BROWSER_SCRIPT_SOURCE_CHAR_POSITION_TYPE; [BROWSER_VERSION]?: BROWSER_VERSION_TYPE; + [BROWSER_WEB_VITAL_LCP_ELEMENT]?: BROWSER_WEB_VITAL_LCP_ELEMENT_TYPE; [CACHE_HIT]?: CACHE_HIT_TYPE; [CACHE_ITEM_SIZE]?: CACHE_ITEM_SIZE_TYPE; [CACHE_KEY]?: CACHE_KEY_TYPE; diff --git a/model/attributes/browser/browser__web_vital__lcp__element.json b/model/attributes/browser/browser__web_vital__lcp__element.json new file mode 100644 index 00000000..a99513de --- /dev/null +++ b/model/attributes/browser/browser__web_vital__lcp__element.json @@ -0,0 +1,12 @@ +{ + "key": "browser.web_vital.lcp.element", + "brief": "The HTML element selector or component name for which LCP was reported", + "type": "string", + "pii": { + "key": "false" + }, + "is_in_otel": false, + "example": "body > div#app > div#container > div", + "alias": ["lcp.element"], + "sdks": ["javascript-browser"] +} diff --git a/python/src/sentry_conventions/attributes.py b/python/src/sentry_conventions/attributes.py index a1678932..890e9694 100644 --- a/python/src/sentry_conventions/attributes.py +++ b/python/src/sentry_conventions/attributes.py @@ -635,6 +635,19 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: "120.0.6099.130" """ + # Path: model/attributes/browser/browser__web_vital__lcp__element.json + BROWSER_WEB_VITAL_LCP_ELEMENT: Literal["browser.web_vital.lcp.element"] = ( + "browser.web_vital.lcp.element" + ) + """The HTML element selector or component name for which LCP was reported + + Type: str + Contains PII: false + Defined in OTEL: No + Aliases: lcp.element + Example: "body > div#app > div#container > div" + """ + # Path: model/attributes/cache/cache__hit.json CACHE_HIT: Literal["cache.hit"] = "cache.hit" """If the cache was hit during this span. @@ -5155,6 +5168,15 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): example="120.0.6099.130", aliases=["sentry.browser.version"], ), + "browser.web_vital.lcp.element": AttributeMetadata( + brief="The HTML element selector or component name for which LCP was reported", + type=AttributeType.STRING, + pii=PiiInfo(isPii=IsPii.FALSE), + is_in_otel=False, + example="body > div#app > div#container > div", + aliases=["lcp.element"], + sdks=["javascript-browser"], + ), "cache.hit": AttributeMetadata( brief="If the cache was hit during this span.", type=AttributeType.BOOLEAN, @@ -8156,6 +8178,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "browser.script.invoker_type": str, "browser.script.source_char_position": int, "browser.version": str, + "browser.web_vital.lcp.element": str, "cache.hit": bool, "cache.item_size": int, "cache.key": List[str], From be65fb4ae4cf175af858e9365cec29703651818f Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Fri, 23 Jan 2026 10:04:13 +0100 Subject: [PATCH 2/7] feat(attributes): Deprecate `lcp.element` --- generated/attributes/all.md | 2 +- generated/attributes/browser.md | 2 +- generated/attributes/lcp.md | 32 ++++++++++++------- .../sentry-conventions/src/attributes.ts | 12 +++++-- .../browser__web_vital__lcp__element.json | 2 +- model/attributes/lcp/lcp__element.json | 8 ++++- python/src/sentry_conventions/attributes.py | 13 ++++++-- shared/deprecated_attributes.json | 16 ++++++++++ 8 files changed, 67 insertions(+), 20 deletions(-) diff --git a/generated/attributes/all.md b/generated/attributes/all.md index 53916353..f587d56c 100644 --- a/generated/attributes/all.md +++ b/generated/attributes/all.md @@ -152,7 +152,6 @@ Total attributes: 423 | [`jvm.memory.type`](./jvm.md#jvmmemorytype) | Name of the memory pool. | | [`jvm.thread.daemon`](./jvm.md#jvmthreaddaemon) | Whether the thread is daemon or not. | | [`jvm.thread.state`](./jvm.md#jvmthreadstate) | State of the thread. | -| [`lcp.element`](./lcp.md#lcpelement) | The dom element responsible for the largest contentful paint. | | [`lcp.id`](./lcp.md#lcpid) | The id of the dom element responsible for the largest contentful paint. | | [`lcp.size`](./lcp.md#lcpsize) | The size of the largest contentful paint element. | | [`lcp.url`](./lcp.md#lcpurl) | The url of the dom element responsible for the largest contentful paint. | @@ -411,6 +410,7 @@ Total attributes: 423 | [`http.target`](./http.md#httptarget) | [`url.path`](./url.md#urlpath) | | [`http.url`](./http.md#httpurl) | [`url.full`](./url.md#urlfull) | | [`http.user_agent`](./http.md#httpuser_agent) | [`user_agent.original`](./user_agent.md#user_agentoriginal) | +| [`lcp.element`](./lcp.md#lcpelement) | [`browser.web_vital.lcp.element`](./browser.md#browserweb_vitallcpelement) | | [`method`](./general.md#method) | [`http.request.method`](./http.md#httprequestmethod) | | [`net.host.ip`](./net.md#nethostip) | [`network.local.address`](./network.md#networklocaladdress) | | [`net.host.name`](./net.md#nethostname) | [`server.address`](./server.md#serveraddress) | diff --git a/generated/attributes/browser.md b/generated/attributes/browser.md index 21d6b146..85f195d7 100644 --- a/generated/attributes/browser.md +++ b/generated/attributes/browser.md @@ -88,7 +88,7 @@ The HTML element selector or component name for which LCP was reported | Property | Value | | --- | --- | | Type | `string` | -| Has PII | false | +| Has PII | maybe | | Exists in OpenTelemetry | No | | Example | `body > div#app > div#container > div` | | Aliases | `lcp.element` | diff --git a/generated/attributes/lcp.md b/generated/attributes/lcp.md index d4cf58dd..711d297f 100644 --- a/generated/attributes/lcp.md +++ b/generated/attributes/lcp.md @@ -3,24 +3,14 @@ # Lcp Attributes - [Stable Attributes](#stable-attributes) - - [lcp.element](#lcpelement) - [lcp.id](#lcpid) - [lcp.size](#lcpsize) - [lcp.url](#lcpurl) +- [Deprecated Attributes](#deprecated-attributes) + - [lcp.element](#lcpelement) ## Stable Attributes -### lcp.element - -The dom element responsible for the largest contentful paint. - -| Property | Value | -| --- | --- | -| Type | `string` | -| Has PII | maybe | -| Exists in OpenTelemetry | No | -| Example | `img` | - ### lcp.id The id of the dom element responsible for the largest contentful paint. @@ -54,3 +44,21 @@ The url of the dom element responsible for the largest contentful paint. | Exists in OpenTelemetry | No | | Example | `https://example.com` | +## Deprecated Attributes + +These attributes are deprecated and will be removed in a future version. Please use the recommended replacements. + +### lcp.element + +The dom element responsible for the largest contentful paint. + +| Property | Value | +| --- | --- | +| Type | `string` | +| Has PII | maybe | +| Exists in OpenTelemetry | No | +| Example | `img` | +| Deprecated | Yes, use `browser.web_vital.lcp.element` instead | +| Deprecation Reason | The LCP element is now recorded as a browser.web_vital.lcp.element attribute. | +| Aliases | `browser.web_vital.lcp.element` | + diff --git a/javascript/sentry-conventions/src/attributes.ts b/javascript/sentry-conventions/src/attributes.ts index 6fb49369..9eea1e7a 100644 --- a/javascript/sentry-conventions/src/attributes.ts +++ b/javascript/sentry-conventions/src/attributes.ts @@ -885,7 +885,7 @@ export type BROWSER_VERSION_TYPE = string; * * Attribute Value Type: `string` {@link BROWSER_WEB_VITAL_LCP_ELEMENT_TYPE} * - * Contains PII: false + * Contains PII: maybe * * Attribute defined in OTEL: No * @@ -4074,6 +4074,9 @@ export type JVM_THREAD_STATE_TYPE = string; * * Attribute defined in OTEL: No * + * Aliases: {@link BROWSER_WEB_VITAL_LCP_ELEMENT} `browser.web_vital.lcp.element` + * + * @deprecated Use {@link BROWSER_WEB_VITAL_LCP_ELEMENT} (browser.web_vital.lcp.element) instead - The LCP element is now recorded as a browser.web_vital.lcp.element attribute. * @example "img" */ export const LCP_ELEMENT = 'lcp.element'; @@ -10150,7 +10153,7 @@ export const ATTRIBUTE_METADATA: Record = { brief: 'The HTML element selector or component name for which LCP was reported', type: 'string', pii: { - isPii: 'false', + isPii: 'maybe', }, isInOtel: false, example: 'body > div#app > div#container > div', @@ -11759,6 +11762,11 @@ export const ATTRIBUTE_METADATA: Record = { }, isInOtel: false, example: 'img', + deprecation: { + replacement: 'browser.web_vital.lcp.element', + reason: 'The LCP element is now recorded as a browser.web_vital.lcp.element attribute.', + }, + aliases: [BROWSER_WEB_VITAL_LCP_ELEMENT], }, [LCP_ID]: { brief: 'The id of the dom element responsible for the largest contentful paint.', diff --git a/model/attributes/browser/browser__web_vital__lcp__element.json b/model/attributes/browser/browser__web_vital__lcp__element.json index a99513de..04099c51 100644 --- a/model/attributes/browser/browser__web_vital__lcp__element.json +++ b/model/attributes/browser/browser__web_vital__lcp__element.json @@ -3,7 +3,7 @@ "brief": "The HTML element selector or component name for which LCP was reported", "type": "string", "pii": { - "key": "false" + "key": "maybe" }, "is_in_otel": false, "example": "body > div#app > div#container > div", diff --git a/model/attributes/lcp/lcp__element.json b/model/attributes/lcp/lcp__element.json index 2e7ad180..5448f813 100644 --- a/model/attributes/lcp/lcp__element.json +++ b/model/attributes/lcp/lcp__element.json @@ -6,5 +6,11 @@ "key": "maybe" }, "is_in_otel": false, - "example": "img" + "example": "img", + "deprecation": { + "replacement": "browser.web_vital.lcp.element", + "reason": "The LCP element is now recorded as a browser.web_vital.lcp.element attribute.", + "_status": "backfill" + }, + "alias": ["browser.web_vital.lcp.element"] } diff --git a/python/src/sentry_conventions/attributes.py b/python/src/sentry_conventions/attributes.py index 890e9694..68b63a1c 100644 --- a/python/src/sentry_conventions/attributes.py +++ b/python/src/sentry_conventions/attributes.py @@ -136,6 +136,7 @@ class _AttributeNamesMeta(type): "HTTP_TARGET", "HTTP_URL", "HTTP_USER_AGENT", + "LCP_ELEMENT", "METHOD", "NET_HOST_IP", "NET_HOST_NAME", @@ -642,7 +643,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): """The HTML element selector or component name for which LCP was reported Type: str - Contains PII: false + Contains PII: maybe Defined in OTEL: No Aliases: lcp.element Example: "body > div#app > div#container > div" @@ -2358,6 +2359,8 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Type: str Contains PII: maybe Defined in OTEL: No + Aliases: browser.web_vital.lcp.element + DEPRECATED: Use browser.web_vital.lcp.element instead - The LCP element is now recorded as a browser.web_vital.lcp.element attribute. Example: "img" """ @@ -5171,7 +5174,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "browser.web_vital.lcp.element": AttributeMetadata( brief="The HTML element selector or component name for which LCP was reported", type=AttributeType.STRING, - pii=PiiInfo(isPii=IsPii.FALSE), + pii=PiiInfo(isPii=IsPii.MAYBE), is_in_otel=False, example="body > div#app > div#container > div", aliases=["lcp.element"], @@ -6389,6 +6392,12 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): pii=PiiInfo(isPii=IsPii.MAYBE), is_in_otel=False, example="img", + deprecation=DeprecationInfo( + replacement="browser.web_vital.lcp.element", + reason="The LCP element is now recorded as a browser.web_vital.lcp.element attribute.", + status=DeprecationStatus.BACKFILL, + ), + aliases=["browser.web_vital.lcp.element"], ), "lcp.id": AttributeMetadata( brief="The id of the dom element responsible for the largest contentful paint.", diff --git a/shared/deprecated_attributes.json b/shared/deprecated_attributes.json index f02695e3..22ad744a 100644 --- a/shared/deprecated_attributes.json +++ b/shared/deprecated_attributes.json @@ -879,6 +879,22 @@ }, "alias": ["user_agent.original"] }, + { + "key": "lcp.element", + "brief": "The dom element responsible for the largest contentful paint.", + "type": "string", + "pii": { + "key": "maybe" + }, + "is_in_otel": false, + "example": "img", + "deprecation": { + "replacement": "browser.web_vital.lcp.element", + "reason": "The LCP element is now recorded as a browser.web_vital.lcp.element attribute.", + "_status": "backfill" + }, + "alias": ["browser.web_vital.lcp.element"] + }, { "key": "net.host.ip", "brief": "Local address of the network connection - IP address or Unix domain socket name.", From 34832b1cffc0bff304b35305bd4b47306bed89c5 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Fri, 23 Jan 2026 10:18:49 +0100 Subject: [PATCH 3/7] feat(attributes): Add `browser.web_vital.lcp.id` attribute --- generated/attributes/all.md | 5 ++- generated/attributes/browser.md | 13 ++++++ generated/attributes/lcp.md | 27 +++++++----- .../sentry-conventions/src/attributes.ts | 44 +++++++++++++++++++ .../browser/browser__web_vital__lcp__id.json | 12 +++++ model/attributes/lcp/lcp__id.json | 8 +++- python/src/sentry_conventions/attributes.py | 32 ++++++++++++++ shared/deprecated_attributes.json | 16 +++++++ 8 files changed, 142 insertions(+), 15 deletions(-) create mode 100644 model/attributes/browser/browser__web_vital__lcp__id.json diff --git a/generated/attributes/all.md b/generated/attributes/all.md index f587d56c..c1d3c696 100644 --- a/generated/attributes/all.md +++ b/generated/attributes/all.md @@ -4,7 +4,7 @@ This page lists all available attributes across all categories. -Total attributes: 423 +Total attributes: 424 ## Stable Attributes @@ -32,6 +32,7 @@ Total attributes: 423 | [`browser.script.source_char_position`](./browser.md#browserscriptsource_char_position) | A number representing the script character position of the script. | | [`browser.version`](./browser.md#browserversion) | The version of the browser. | | [`browser.web_vital.lcp.element`](./browser.md#browserweb_vitallcpelement) | The HTML element selector or component name for which LCP was reported | +| [`browser.web_vital.lcp.id`](./browser.md#browserweb_vitallcpid) | The id of the dom element responsible for the largest contentful paint | | [`cache.hit`](./cache.md#cachehit) | If the cache was hit during this span. | | [`cache.item_size`](./cache.md#cacheitem_size) | The size of the requested item in the cache. In bytes. | | [`cache.key`](./cache.md#cachekey) | The key of the cache accessed. | @@ -152,7 +153,6 @@ Total attributes: 423 | [`jvm.memory.type`](./jvm.md#jvmmemorytype) | Name of the memory pool. | | [`jvm.thread.daemon`](./jvm.md#jvmthreaddaemon) | Whether the thread is daemon or not. | | [`jvm.thread.state`](./jvm.md#jvmthreadstate) | State of the thread. | -| [`lcp.id`](./lcp.md#lcpid) | The id of the dom element responsible for the largest contentful paint. | | [`lcp.size`](./lcp.md#lcpsize) | The size of the largest contentful paint element. | | [`lcp.url`](./lcp.md#lcpurl) | The url of the dom element responsible for the largest contentful paint. | | [`logger.name`](./logger.md#loggername) | The name of the logger that generated this event. | @@ -411,6 +411,7 @@ Total attributes: 423 | [`http.url`](./http.md#httpurl) | [`url.full`](./url.md#urlfull) | | [`http.user_agent`](./http.md#httpuser_agent) | [`user_agent.original`](./user_agent.md#user_agentoriginal) | | [`lcp.element`](./lcp.md#lcpelement) | [`browser.web_vital.lcp.element`](./browser.md#browserweb_vitallcpelement) | +| [`lcp.id`](./lcp.md#lcpid) | [`browser.web_vital.lcp.id`](./browser.md#browserweb_vitallcpid) | | [`method`](./general.md#method) | [`http.request.method`](./http.md#httprequestmethod) | | [`net.host.ip`](./net.md#nethostip) | [`network.local.address`](./network.md#networklocaladdress) | | [`net.host.name`](./net.md#nethostname) | [`server.address`](./server.md#serveraddress) | diff --git a/generated/attributes/browser.md b/generated/attributes/browser.md index 85f195d7..d1b8c89c 100644 --- a/generated/attributes/browser.md +++ b/generated/attributes/browser.md @@ -10,6 +10,7 @@ - [browser.script.source_char_position](#browserscriptsource_char_position) - [browser.version](#browserversion) - [browser.web_vital.lcp.element](#browserweb_vitallcpelement) + - [browser.web_vital.lcp.id](#browserweb_vitallcpid) ## Stable Attributes @@ -93,3 +94,15 @@ The HTML element selector or component name for which LCP was reported | Example | `body > div#app > div#container > div` | | Aliases | `lcp.element` | +### browser.web_vital.lcp.id + +The id of the dom element responsible for the largest contentful paint + +| Property | Value | +| --- | --- | +| Type | `string` | +| Has PII | maybe | +| Exists in OpenTelemetry | No | +| Example | `#gero` | +| Aliases | `lcp.id` | + diff --git a/generated/attributes/lcp.md b/generated/attributes/lcp.md index 711d297f..23c18ae5 100644 --- a/generated/attributes/lcp.md +++ b/generated/attributes/lcp.md @@ -3,25 +3,14 @@ # Lcp Attributes - [Stable Attributes](#stable-attributes) - - [lcp.id](#lcpid) - [lcp.size](#lcpsize) - [lcp.url](#lcpurl) - [Deprecated Attributes](#deprecated-attributes) - [lcp.element](#lcpelement) + - [lcp.id](#lcpid) ## Stable Attributes -### lcp.id - -The id of the dom element responsible for the largest contentful paint. - -| Property | Value | -| --- | --- | -| Type | `string` | -| Has PII | maybe | -| Exists in OpenTelemetry | No | -| Example | `#hero` | - ### lcp.size The size of the largest contentful paint element. @@ -62,3 +51,17 @@ The dom element responsible for the largest contentful paint. | Deprecation Reason | The LCP element is now recorded as a browser.web_vital.lcp.element attribute. | | Aliases | `browser.web_vital.lcp.element` | +### lcp.id + +The id of the dom element responsible for the largest contentful paint. + +| Property | Value | +| --- | --- | +| Type | `string` | +| Has PII | maybe | +| Exists in OpenTelemetry | No | +| Example | `#hero` | +| Deprecated | Yes, use `browser.web_vital.lcp.id` instead | +| Deprecation Reason | The LCP id is now recorded as a browser.web_vital.lcp.id attribute. | +| Aliases | `browser.web_vital.lcp.id` | + diff --git a/javascript/sentry-conventions/src/attributes.ts b/javascript/sentry-conventions/src/attributes.ts index 9eea1e7a..3c28006b 100644 --- a/javascript/sentry-conventions/src/attributes.ts +++ b/javascript/sentry-conventions/src/attributes.ts @@ -900,6 +900,28 @@ 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__id.json + +/** + * The id of the dom element responsible for the largest contentful paint `browser.web_vital.lcp.id` + * + * Attribute Value Type: `string` {@link BROWSER_WEB_VITAL_LCP_ID_TYPE} + * + * Contains PII: maybe + * + * Attribute defined in OTEL: No + * + * Aliases: {@link LCP_ID} `lcp.id` + * + * @example "#gero" + */ +export const BROWSER_WEB_VITAL_LCP_ID = 'browser.web_vital.lcp.id'; + +/** + * Type for {@link BROWSER_WEB_VITAL_LCP_ID} browser.web_vital.lcp.id + */ +export type BROWSER_WEB_VITAL_LCP_ID_TYPE = string; + // Path: model/attributes/cache/cache__hit.json /** @@ -4097,6 +4119,9 @@ export type LCP_ELEMENT_TYPE = string; * * Attribute defined in OTEL: No * + * Aliases: {@link BROWSER_WEB_VITAL_LCP_ID} `browser.web_vital.lcp.id` + * + * @deprecated Use {@link BROWSER_WEB_VITAL_LCP_ID} (browser.web_vital.lcp.id) instead - The LCP id is now recorded as a browser.web_vital.lcp.id attribute. * @example "#hero" */ export const LCP_ID = 'lcp.id'; @@ -8875,6 +8900,7 @@ export const ATTRIBUTE_TYPE: Record = { [BROWSER_SCRIPT_SOURCE_CHAR_POSITION]: 'integer', [BROWSER_VERSION]: 'string', [BROWSER_WEB_VITAL_LCP_ELEMENT]: 'string', + [BROWSER_WEB_VITAL_LCP_ID]: 'string', [CACHE_HIT]: 'boolean', [CACHE_ITEM_SIZE]: 'integer', [CACHE_KEY]: 'string[]', @@ -9301,6 +9327,7 @@ export type AttributeName = | typeof BROWSER_SCRIPT_SOURCE_CHAR_POSITION | typeof BROWSER_VERSION | typeof BROWSER_WEB_VITAL_LCP_ELEMENT + | typeof BROWSER_WEB_VITAL_LCP_ID | typeof CACHE_HIT | typeof CACHE_ITEM_SIZE | typeof CACHE_KEY @@ -10160,6 +10187,17 @@ export const ATTRIBUTE_METADATA: Record = { aliases: [LCP_ELEMENT], sdks: ['javascript-browser'], }, + [BROWSER_WEB_VITAL_LCP_ID]: { + brief: 'The id of the dom element responsible for the largest contentful paint', + type: 'string', + pii: { + isPii: 'maybe', + }, + isInOtel: false, + example: '#gero', + aliases: [LCP_ID], + sdks: ['javascript-browser'], + }, [CACHE_HIT]: { brief: 'If the cache was hit during this span.', type: 'boolean', @@ -11776,6 +11814,11 @@ export const ATTRIBUTE_METADATA: Record = { }, isInOtel: false, example: '#hero', + deprecation: { + replacement: 'browser.web_vital.lcp.id', + reason: 'The LCP id is now recorded as a browser.web_vital.lcp.id attribute.', + }, + aliases: [BROWSER_WEB_VITAL_LCP_ID], }, [LCP_SIZE]: { brief: 'The size of the largest contentful paint element.', @@ -14070,6 +14113,7 @@ export type Attributes = { [BROWSER_SCRIPT_SOURCE_CHAR_POSITION]?: BROWSER_SCRIPT_SOURCE_CHAR_POSITION_TYPE; [BROWSER_VERSION]?: BROWSER_VERSION_TYPE; [BROWSER_WEB_VITAL_LCP_ELEMENT]?: BROWSER_WEB_VITAL_LCP_ELEMENT_TYPE; + [BROWSER_WEB_VITAL_LCP_ID]?: BROWSER_WEB_VITAL_LCP_ID_TYPE; [CACHE_HIT]?: CACHE_HIT_TYPE; [CACHE_ITEM_SIZE]?: CACHE_ITEM_SIZE_TYPE; [CACHE_KEY]?: CACHE_KEY_TYPE; diff --git a/model/attributes/browser/browser__web_vital__lcp__id.json b/model/attributes/browser/browser__web_vital__lcp__id.json new file mode 100644 index 00000000..e47fc086 --- /dev/null +++ b/model/attributes/browser/browser__web_vital__lcp__id.json @@ -0,0 +1,12 @@ +{ + "key": "browser.web_vital.lcp.id", + "brief": "The id of the dom element responsible for the largest contentful paint", + "type": "string", + "pii": { + "key": "maybe" + }, + "is_in_otel": false, + "example": "#gero", + "alias": ["lcp.id"], + "sdks": ["javascript-browser"] +} diff --git a/model/attributes/lcp/lcp__id.json b/model/attributes/lcp/lcp__id.json index e8776a9d..e8eb1654 100644 --- a/model/attributes/lcp/lcp__id.json +++ b/model/attributes/lcp/lcp__id.json @@ -6,5 +6,11 @@ "key": "maybe" }, "is_in_otel": false, - "example": "#hero" + "example": "#hero", + "deprecation": { + "replacement": "browser.web_vital.lcp.id", + "reason": "The LCP id is now recorded as a browser.web_vital.lcp.id attribute.", + "_status": "backfill" + }, + "alias": ["browser.web_vital.lcp.id"] } diff --git a/python/src/sentry_conventions/attributes.py b/python/src/sentry_conventions/attributes.py index 68b63a1c..8e367162 100644 --- a/python/src/sentry_conventions/attributes.py +++ b/python/src/sentry_conventions/attributes.py @@ -137,6 +137,7 @@ class _AttributeNamesMeta(type): "HTTP_URL", "HTTP_USER_AGENT", "LCP_ELEMENT", + "LCP_ID", "METHOD", "NET_HOST_IP", "NET_HOST_NAME", @@ -649,6 +650,19 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: "body > div#app > div#container > div" """ + # 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" + ) + """The id of the dom element responsible for the largest contentful paint + + Type: str + Contains PII: maybe + Defined in OTEL: No + Aliases: lcp.id + Example: "#gero" + """ + # Path: model/attributes/cache/cache__hit.json CACHE_HIT: Literal["cache.hit"] = "cache.hit" """If the cache was hit during this span. @@ -2371,6 +2385,8 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Type: str Contains PII: maybe Defined in OTEL: No + Aliases: browser.web_vital.lcp.id + DEPRECATED: Use browser.web_vital.lcp.id instead - The LCP id is now recorded as a browser.web_vital.lcp.id attribute. Example: "#hero" """ @@ -5180,6 +5196,15 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): aliases=["lcp.element"], sdks=["javascript-browser"], ), + "browser.web_vital.lcp.id": AttributeMetadata( + brief="The id of the dom element responsible for the largest contentful paint", + type=AttributeType.STRING, + pii=PiiInfo(isPii=IsPii.MAYBE), + is_in_otel=False, + example="#gero", + aliases=["lcp.id"], + sdks=["javascript-browser"], + ), "cache.hit": AttributeMetadata( brief="If the cache was hit during this span.", type=AttributeType.BOOLEAN, @@ -6405,6 +6430,12 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): pii=PiiInfo(isPii=IsPii.MAYBE), is_in_otel=False, example="#hero", + deprecation=DeprecationInfo( + replacement="browser.web_vital.lcp.id", + reason="The LCP id is now recorded as a browser.web_vital.lcp.id attribute.", + status=DeprecationStatus.BACKFILL, + ), + aliases=["browser.web_vital.lcp.id"], ), "lcp.size": AttributeMetadata( brief="The size of the largest contentful paint element.", @@ -8188,6 +8219,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "browser.script.source_char_position": int, "browser.version": str, "browser.web_vital.lcp.element": str, + "browser.web_vital.lcp.id": str, "cache.hit": bool, "cache.item_size": int, "cache.key": List[str], diff --git a/shared/deprecated_attributes.json b/shared/deprecated_attributes.json index 22ad744a..fb9f1083 100644 --- a/shared/deprecated_attributes.json +++ b/shared/deprecated_attributes.json @@ -895,6 +895,22 @@ }, "alias": ["browser.web_vital.lcp.element"] }, + { + "key": "lcp.id", + "brief": "The id of the dom element responsible for the largest contentful paint.", + "type": "string", + "pii": { + "key": "maybe" + }, + "is_in_otel": false, + "example": "#hero", + "deprecation": { + "replacement": "browser.web_vital.lcp.id", + "reason": "The LCP id is now recorded as a browser.web_vital.lcp.id attribute.", + "_status": "backfill" + }, + "alias": ["browser.web_vital.lcp.id"] + }, { "key": "net.host.ip", "brief": "Local address of the network connection - IP address or Unix domain socket name.", From 4477dce85966d53e91ce5009da2b2a2171486a7d Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Fri, 23 Jan 2026 10:22:06 +0100 Subject: [PATCH 4/7] feat(attributes): Add `browser.web_vital.lcp.url` attribute --- generated/attributes/all.md | 5 ++- generated/attributes/browser.md | 13 ++++++ generated/attributes/lcp.md | 27 +++++++----- .../sentry-conventions/src/attributes.ts | 44 +++++++++++++++++++ .../browser/browser__web_vital__lcp__url.json | 12 +++++ model/attributes/lcp/lcp__url.json | 8 +++- package.json | 2 +- python/src/sentry_conventions/attributes.py | 32 ++++++++++++++ shared/deprecated_attributes.json | 16 +++++++ 9 files changed, 143 insertions(+), 16 deletions(-) create mode 100644 model/attributes/browser/browser__web_vital__lcp__url.json diff --git a/generated/attributes/all.md b/generated/attributes/all.md index c1d3c696..ad8300e1 100644 --- a/generated/attributes/all.md +++ b/generated/attributes/all.md @@ -4,7 +4,7 @@ This page lists all available attributes across all categories. -Total attributes: 424 +Total attributes: 425 ## Stable Attributes @@ -33,6 +33,7 @@ Total attributes: 424 | [`browser.version`](./browser.md#browserversion) | The version of the browser. | | [`browser.web_vital.lcp.element`](./browser.md#browserweb_vitallcpelement) | The HTML element selector or component name for which LCP was reported | | [`browser.web_vital.lcp.id`](./browser.md#browserweb_vitallcpid) | The id of the dom element responsible for the largest contentful paint | +| [`browser.web_vital.lcp.url`](./browser.md#browserweb_vitallcpurl) | The url of the dom element responsible for the largest contentful paint | | [`cache.hit`](./cache.md#cachehit) | If the cache was hit during this span. | | [`cache.item_size`](./cache.md#cacheitem_size) | The size of the requested item in the cache. In bytes. | | [`cache.key`](./cache.md#cachekey) | The key of the cache accessed. | @@ -154,7 +155,6 @@ Total attributes: 424 | [`jvm.thread.daemon`](./jvm.md#jvmthreaddaemon) | Whether the thread is daemon or not. | | [`jvm.thread.state`](./jvm.md#jvmthreadstate) | State of the thread. | | [`lcp.size`](./lcp.md#lcpsize) | The size of the largest contentful paint element. | -| [`lcp.url`](./lcp.md#lcpurl) | The url of the dom element responsible for the largest contentful paint. | | [`logger.name`](./logger.md#loggername) | The name of the logger that generated this event. | | [`mcp.cancelled.reason`](./mcp.md#mcpcancelledreason) | Reason for the cancellation of an MCP operation. | | [`mcp.cancelled.request_id`](./mcp.md#mcpcancelledrequest_id) | Request ID of the cancelled MCP operation. | @@ -412,6 +412,7 @@ Total attributes: 424 | [`http.user_agent`](./http.md#httpuser_agent) | [`user_agent.original`](./user_agent.md#user_agentoriginal) | | [`lcp.element`](./lcp.md#lcpelement) | [`browser.web_vital.lcp.element`](./browser.md#browserweb_vitallcpelement) | | [`lcp.id`](./lcp.md#lcpid) | [`browser.web_vital.lcp.id`](./browser.md#browserweb_vitallcpid) | +| [`lcp.url`](./lcp.md#lcpurl) | [`browser.web_vital.lcp.url`](./browser.md#browserweb_vitallcpurl) | | [`method`](./general.md#method) | [`http.request.method`](./http.md#httprequestmethod) | | [`net.host.ip`](./net.md#nethostip) | [`network.local.address`](./network.md#networklocaladdress) | | [`net.host.name`](./net.md#nethostname) | [`server.address`](./server.md#serveraddress) | diff --git a/generated/attributes/browser.md b/generated/attributes/browser.md index d1b8c89c..60def66a 100644 --- a/generated/attributes/browser.md +++ b/generated/attributes/browser.md @@ -11,6 +11,7 @@ - [browser.version](#browserversion) - [browser.web_vital.lcp.element](#browserweb_vitallcpelement) - [browser.web_vital.lcp.id](#browserweb_vitallcpid) + - [browser.web_vital.lcp.url](#browserweb_vitallcpurl) ## Stable Attributes @@ -106,3 +107,15 @@ The id of the dom element responsible for the largest contentful paint | Example | `#gero` | | Aliases | `lcp.id` | +### browser.web_vital.lcp.url + +The url of the dom element responsible for the largest contentful paint + +| Property | Value | +| --- | --- | +| Type | `string` | +| Has PII | maybe | +| Exists in OpenTelemetry | No | +| Example | `https://example.com/static/img.png` | +| Aliases | `lcp.url` | + diff --git a/generated/attributes/lcp.md b/generated/attributes/lcp.md index 23c18ae5..09857c6e 100644 --- a/generated/attributes/lcp.md +++ b/generated/attributes/lcp.md @@ -4,10 +4,10 @@ - [Stable Attributes](#stable-attributes) - [lcp.size](#lcpsize) - - [lcp.url](#lcpurl) - [Deprecated Attributes](#deprecated-attributes) - [lcp.element](#lcpelement) - [lcp.id](#lcpid) + - [lcp.url](#lcpurl) ## Stable Attributes @@ -22,17 +22,6 @@ The size of the largest contentful paint element. | Exists in OpenTelemetry | No | | Example | `1234` | -### lcp.url - -The url of the dom element responsible for the largest contentful paint. - -| Property | Value | -| --- | --- | -| Type | `string` | -| Has PII | maybe | -| Exists in OpenTelemetry | No | -| Example | `https://example.com` | - ## Deprecated Attributes These attributes are deprecated and will be removed in a future version. Please use the recommended replacements. @@ -65,3 +54,17 @@ The id of the dom element responsible for the largest contentful paint. | Deprecation Reason | The LCP id is now recorded as a browser.web_vital.lcp.id attribute. | | Aliases | `browser.web_vital.lcp.id` | +### lcp.url + +The url of the dom element responsible for the largest contentful paint. + +| Property | Value | +| --- | --- | +| Type | `string` | +| Has PII | maybe | +| Exists in OpenTelemetry | No | +| Example | `https://example.com` | +| Deprecated | Yes, use `browser.web_vital.lcp.url` instead | +| Deprecation Reason | The LCP url is now recorded as a browser.web_vital.lcp.url attribute. | +| Aliases | `browser.web_vital.lcp.url` | + diff --git a/javascript/sentry-conventions/src/attributes.ts b/javascript/sentry-conventions/src/attributes.ts index 3c28006b..45a0100d 100644 --- a/javascript/sentry-conventions/src/attributes.ts +++ b/javascript/sentry-conventions/src/attributes.ts @@ -922,6 +922,28 @@ export const BROWSER_WEB_VITAL_LCP_ID = 'browser.web_vital.lcp.id'; */ export type BROWSER_WEB_VITAL_LCP_ID_TYPE = string; +// Path: model/attributes/browser/browser__web_vital__lcp__url.json + +/** + * The url of the dom element responsible for the largest contentful paint `browser.web_vital.lcp.url` + * + * Attribute Value Type: `string` {@link BROWSER_WEB_VITAL_LCP_URL_TYPE} + * + * Contains PII: maybe + * + * Attribute defined in OTEL: No + * + * Aliases: {@link LCP_URL} `lcp.url` + * + * @example "https://example.com/static/img.png" + */ +export const BROWSER_WEB_VITAL_LCP_URL = 'browser.web_vital.lcp.url'; + +/** + * Type for {@link BROWSER_WEB_VITAL_LCP_URL} browser.web_vital.lcp.url + */ +export type BROWSER_WEB_VITAL_LCP_URL_TYPE = string; + // Path: model/attributes/cache/cache__hit.json /** @@ -4162,6 +4184,9 @@ export type LCP_SIZE_TYPE = number; * * Attribute defined in OTEL: No * + * Aliases: {@link BROWSER_WEB_VITAL_LCP_URL} `browser.web_vital.lcp.url` + * + * @deprecated Use {@link BROWSER_WEB_VITAL_LCP_URL} (browser.web_vital.lcp.url) instead - The LCP url is now recorded as a browser.web_vital.lcp.url attribute. * @example "https://example.com" */ export const LCP_URL = 'lcp.url'; @@ -8901,6 +8926,7 @@ export const ATTRIBUTE_TYPE: Record = { [BROWSER_VERSION]: 'string', [BROWSER_WEB_VITAL_LCP_ELEMENT]: 'string', [BROWSER_WEB_VITAL_LCP_ID]: 'string', + [BROWSER_WEB_VITAL_LCP_URL]: 'string', [CACHE_HIT]: 'boolean', [CACHE_ITEM_SIZE]: 'integer', [CACHE_KEY]: 'string[]', @@ -9328,6 +9354,7 @@ export type AttributeName = | typeof BROWSER_VERSION | typeof BROWSER_WEB_VITAL_LCP_ELEMENT | typeof BROWSER_WEB_VITAL_LCP_ID + | typeof BROWSER_WEB_VITAL_LCP_URL | typeof CACHE_HIT | typeof CACHE_ITEM_SIZE | typeof CACHE_KEY @@ -10198,6 +10225,17 @@ export const ATTRIBUTE_METADATA: Record = { aliases: [LCP_ID], sdks: ['javascript-browser'], }, + [BROWSER_WEB_VITAL_LCP_URL]: { + brief: 'The url of the dom element responsible for the largest contentful paint', + type: 'string', + pii: { + isPii: 'maybe', + }, + isInOtel: false, + example: 'https://example.com/static/img.png', + aliases: [LCP_URL], + sdks: ['javascript-browser'], + }, [CACHE_HIT]: { brief: 'If the cache was hit during this span.', type: 'boolean', @@ -11837,6 +11875,11 @@ export const ATTRIBUTE_METADATA: Record = { }, isInOtel: false, example: 'https://example.com', + deprecation: { + replacement: 'browser.web_vital.lcp.url', + reason: 'The LCP url is now recorded as a browser.web_vital.lcp.url attribute.', + }, + aliases: [BROWSER_WEB_VITAL_LCP_URL], }, [LOGGER_NAME]: { brief: 'The name of the logger that generated this event.', @@ -14114,6 +14157,7 @@ export type Attributes = { [BROWSER_VERSION]?: BROWSER_VERSION_TYPE; [BROWSER_WEB_VITAL_LCP_ELEMENT]?: BROWSER_WEB_VITAL_LCP_ELEMENT_TYPE; [BROWSER_WEB_VITAL_LCP_ID]?: BROWSER_WEB_VITAL_LCP_ID_TYPE; + [BROWSER_WEB_VITAL_LCP_URL]?: BROWSER_WEB_VITAL_LCP_URL_TYPE; [CACHE_HIT]?: CACHE_HIT_TYPE; [CACHE_ITEM_SIZE]?: CACHE_ITEM_SIZE_TYPE; [CACHE_KEY]?: CACHE_KEY_TYPE; diff --git a/model/attributes/browser/browser__web_vital__lcp__url.json b/model/attributes/browser/browser__web_vital__lcp__url.json new file mode 100644 index 00000000..4400dab6 --- /dev/null +++ b/model/attributes/browser/browser__web_vital__lcp__url.json @@ -0,0 +1,12 @@ +{ + "key": "browser.web_vital.lcp.url", + "brief": "The url of the dom element responsible for the largest contentful paint", + "type": "string", + "pii": { + "key": "maybe" + }, + "is_in_otel": false, + "example": "https://example.com/static/img.png", + "alias": ["lcp.url"], + "sdks": ["javascript-browser"] +} diff --git a/model/attributes/lcp/lcp__url.json b/model/attributes/lcp/lcp__url.json index e6e0b24a..6a037b4d 100644 --- a/model/attributes/lcp/lcp__url.json +++ b/model/attributes/lcp/lcp__url.json @@ -6,5 +6,11 @@ "key": "maybe" }, "is_in_otel": false, - "example": "https://example.com" + "example": "https://example.com", + "deprecation": { + "replacement": "browser.web_vital.lcp.url", + "reason": "The LCP url is now recorded as a browser.web_vital.lcp.url attribute.", + "_status": "backfill" + }, + "alias": ["browser.web_vital.lcp.url"] } diff --git a/package.json b/package.json index a23276c2..8ce4d10e 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "lint-fix": "biome lint . --write", "test": "yarn test:js && yarn test:python", - "test:js": "vitest", + "test:js": "vitest --run", "test:python": "(cd python && uv venv && uv pip install -e . && uv run pytest)", "build": "yarn build:js && yarn build:python && yarn build:tarball", diff --git a/python/src/sentry_conventions/attributes.py b/python/src/sentry_conventions/attributes.py index 8e367162..abb15f2f 100644 --- a/python/src/sentry_conventions/attributes.py +++ b/python/src/sentry_conventions/attributes.py @@ -138,6 +138,7 @@ class _AttributeNamesMeta(type): "HTTP_USER_AGENT", "LCP_ELEMENT", "LCP_ID", + "LCP_URL", "METHOD", "NET_HOST_IP", "NET_HOST_NAME", @@ -663,6 +664,19 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: "#gero" """ + # Path: model/attributes/browser/browser__web_vital__lcp__url.json + BROWSER_WEB_VITAL_LCP_URL: Literal["browser.web_vital.lcp.url"] = ( + "browser.web_vital.lcp.url" + ) + """The url of the dom element responsible for the largest contentful paint + + Type: str + Contains PII: maybe + Defined in OTEL: No + Aliases: lcp.url + Example: "https://example.com/static/img.png" + """ + # Path: model/attributes/cache/cache__hit.json CACHE_HIT: Literal["cache.hit"] = "cache.hit" """If the cache was hit during this span. @@ -2407,6 +2421,8 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Type: str Contains PII: maybe Defined in OTEL: No + Aliases: browser.web_vital.lcp.url + DEPRECATED: Use browser.web_vital.lcp.url instead - The LCP url is now recorded as a browser.web_vital.lcp.url attribute. Example: "https://example.com" """ @@ -5205,6 +5221,15 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): aliases=["lcp.id"], sdks=["javascript-browser"], ), + "browser.web_vital.lcp.url": AttributeMetadata( + brief="The url of the dom element responsible for the largest contentful paint", + type=AttributeType.STRING, + pii=PiiInfo(isPii=IsPii.MAYBE), + is_in_otel=False, + example="https://example.com/static/img.png", + aliases=["lcp.url"], + sdks=["javascript-browser"], + ), "cache.hit": AttributeMetadata( brief="If the cache was hit during this span.", type=AttributeType.BOOLEAN, @@ -6450,6 +6475,12 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): pii=PiiInfo(isPii=IsPii.MAYBE), is_in_otel=False, example="https://example.com", + deprecation=DeprecationInfo( + replacement="browser.web_vital.lcp.url", + reason="The LCP url is now recorded as a browser.web_vital.lcp.url attribute.", + status=DeprecationStatus.BACKFILL, + ), + aliases=["browser.web_vital.lcp.url"], ), "logger.name": AttributeMetadata( brief="The name of the logger that generated this event.", @@ -8220,6 +8251,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "browser.version": str, "browser.web_vital.lcp.element": str, "browser.web_vital.lcp.id": str, + "browser.web_vital.lcp.url": str, "cache.hit": bool, "cache.item_size": int, "cache.key": List[str], diff --git a/shared/deprecated_attributes.json b/shared/deprecated_attributes.json index fb9f1083..833f8417 100644 --- a/shared/deprecated_attributes.json +++ b/shared/deprecated_attributes.json @@ -911,6 +911,22 @@ }, "alias": ["browser.web_vital.lcp.id"] }, + { + "key": "lcp.url", + "brief": "The url of the dom element responsible for the largest contentful paint.", + "type": "string", + "pii": { + "key": "maybe" + }, + "is_in_otel": false, + "example": "https://example.com", + "deprecation": { + "replacement": "browser.web_vital.lcp.url", + "reason": "The LCP url is now recorded as a browser.web_vital.lcp.url attribute.", + "_status": "backfill" + }, + "alias": ["browser.web_vital.lcp.url"] + }, { "key": "net.host.ip", "brief": "Local address of the network connection - IP address or Unix domain socket name.", From e182a494b4310aa8b3469adaa1f6dcbb21315f6f Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Fri, 23 Jan 2026 10:24:57 +0100 Subject: [PATCH 5/7] feat(attributes): Add `browser.web_vital.lcp.size` attribute --- generated/attributes/all.md | 7 ++- generated/attributes/browser.md | 13 ++++++ generated/attributes/lcp.md | 20 ++++++++- .../sentry-conventions/src/attributes.ts | 44 +++++++++++++++++++ .../browser__web_vital__lcp__size.json | 12 +++++ model/attributes/lcp/lcp__size.json | 8 +++- python/src/sentry_conventions/attributes.py | 32 ++++++++++++++ shared/deprecated_attributes.json | 16 +++++++ 8 files changed, 148 insertions(+), 4 deletions(-) create mode 100644 model/attributes/browser/browser__web_vital__lcp__size.json diff --git a/generated/attributes/all.md b/generated/attributes/all.md index ad8300e1..cd7b07ab 100644 --- a/generated/attributes/all.md +++ b/generated/attributes/all.md @@ -4,7 +4,11 @@ This page lists all available attributes across all categories. +<<<<<<< HEAD Total attributes: 425 +======= +Total attributes: 432 +>>>>>>> fed074c (feat(attributes): Add `browser.web_vital.lcp.size` attribute) ## Stable Attributes @@ -33,6 +37,7 @@ Total attributes: 425 | [`browser.version`](./browser.md#browserversion) | The version of the browser. | | [`browser.web_vital.lcp.element`](./browser.md#browserweb_vitallcpelement) | The HTML element selector or component name for which LCP was reported | | [`browser.web_vital.lcp.id`](./browser.md#browserweb_vitallcpid) | The id of the dom element responsible for the largest contentful paint | +| [`browser.web_vital.lcp.size`](./browser.md#browserweb_vitallcpsize) | The size of the largest contentful paint element | | [`browser.web_vital.lcp.url`](./browser.md#browserweb_vitallcpurl) | The url of the dom element responsible for the largest contentful paint | | [`cache.hit`](./cache.md#cachehit) | If the cache was hit during this span. | | [`cache.item_size`](./cache.md#cacheitem_size) | The size of the requested item in the cache. In bytes. | @@ -154,7 +159,6 @@ Total attributes: 425 | [`jvm.memory.type`](./jvm.md#jvmmemorytype) | Name of the memory pool. | | [`jvm.thread.daemon`](./jvm.md#jvmthreaddaemon) | Whether the thread is daemon or not. | | [`jvm.thread.state`](./jvm.md#jvmthreadstate) | State of the thread. | -| [`lcp.size`](./lcp.md#lcpsize) | The size of the largest contentful paint element. | | [`logger.name`](./logger.md#loggername) | The name of the logger that generated this event. | | [`mcp.cancelled.reason`](./mcp.md#mcpcancelledreason) | Reason for the cancellation of an MCP operation. | | [`mcp.cancelled.request_id`](./mcp.md#mcpcancelledrequest_id) | Request ID of the cancelled MCP operation. | @@ -412,6 +416,7 @@ Total attributes: 425 | [`http.user_agent`](./http.md#httpuser_agent) | [`user_agent.original`](./user_agent.md#user_agentoriginal) | | [`lcp.element`](./lcp.md#lcpelement) | [`browser.web_vital.lcp.element`](./browser.md#browserweb_vitallcpelement) | | [`lcp.id`](./lcp.md#lcpid) | [`browser.web_vital.lcp.id`](./browser.md#browserweb_vitallcpid) | +| [`lcp.size`](./lcp.md#lcpsize) | [`browser.web_vital.lcp.size`](./browser.md#browserweb_vitallcpsize) | | [`lcp.url`](./lcp.md#lcpurl) | [`browser.web_vital.lcp.url`](./browser.md#browserweb_vitallcpurl) | | [`method`](./general.md#method) | [`http.request.method`](./http.md#httprequestmethod) | | [`net.host.ip`](./net.md#nethostip) | [`network.local.address`](./network.md#networklocaladdress) | diff --git a/generated/attributes/browser.md b/generated/attributes/browser.md index 60def66a..e6226db9 100644 --- a/generated/attributes/browser.md +++ b/generated/attributes/browser.md @@ -11,6 +11,7 @@ - [browser.version](#browserversion) - [browser.web_vital.lcp.element](#browserweb_vitallcpelement) - [browser.web_vital.lcp.id](#browserweb_vitallcpid) + - [browser.web_vital.lcp.size](#browserweb_vitallcpsize) - [browser.web_vital.lcp.url](#browserweb_vitallcpurl) ## Stable Attributes @@ -107,6 +108,18 @@ The id of the dom element responsible for the largest contentful paint | Example | `#gero` | | Aliases | `lcp.id` | +### browser.web_vital.lcp.size + +The size of the largest contentful paint element + +| Property | Value | +| --- | --- | +| Type | `integer` | +| Has PII | false | +| Exists in OpenTelemetry | No | +| Example | `1024` | +| Aliases | `lcp.size` | + ### browser.web_vital.lcp.url The url of the dom element responsible for the largest contentful paint diff --git a/generated/attributes/lcp.md b/generated/attributes/lcp.md index 09857c6e..81254bed 100644 --- a/generated/attributes/lcp.md +++ b/generated/attributes/lcp.md @@ -2,13 +2,13 @@ # Lcp Attributes -- [Stable Attributes](#stable-attributes) - - [lcp.size](#lcpsize) - [Deprecated Attributes](#deprecated-attributes) - [lcp.element](#lcpelement) - [lcp.id](#lcpid) + - [lcp.size](#lcpsize) - [lcp.url](#lcpurl) +<<<<<<< HEAD ## Stable Attributes ### lcp.size @@ -22,6 +22,8 @@ The size of the largest contentful paint element. | Exists in OpenTelemetry | No | | Example | `1234` | +======= +>>>>>>> fed074c (feat(attributes): Add `browser.web_vital.lcp.size` attribute) ## Deprecated Attributes These attributes are deprecated and will be removed in a future version. Please use the recommended replacements. @@ -54,6 +56,20 @@ The id of the dom element responsible for the largest contentful paint. | Deprecation Reason | The LCP id is now recorded as a browser.web_vital.lcp.id attribute. | | Aliases | `browser.web_vital.lcp.id` | +### lcp.size + +The size of the largest contentful paint element. + +| Property | Value | +| --- | --- | +| Type | `integer` | +| Has PII | false | +| Exists in OpenTelemetry | No | +| Example | `1234` | +| Deprecated | Yes, use `browser.web_vital.lcp.size` instead | +| Deprecation Reason | The LCP size is now recorded as a browser.web_vital.lcp.size attribute. | +| Aliases | `browser.web_vital.lcp.size` | + ### lcp.url The url of the dom element responsible for the largest contentful paint. diff --git a/javascript/sentry-conventions/src/attributes.ts b/javascript/sentry-conventions/src/attributes.ts index 45a0100d..3c5145f8 100644 --- a/javascript/sentry-conventions/src/attributes.ts +++ b/javascript/sentry-conventions/src/attributes.ts @@ -922,6 +922,28 @@ export const BROWSER_WEB_VITAL_LCP_ID = 'browser.web_vital.lcp.id'; */ export type BROWSER_WEB_VITAL_LCP_ID_TYPE = string; +// Path: model/attributes/browser/browser__web_vital__lcp__size.json + +/** + * The size of the largest contentful paint element `browser.web_vital.lcp.size` + * + * Attribute Value Type: `number` {@link BROWSER_WEB_VITAL_LCP_SIZE_TYPE} + * + * Contains PII: false + * + * Attribute defined in OTEL: No + * + * Aliases: {@link LCP_SIZE} `lcp.size` + * + * @example 1024 + */ +export const BROWSER_WEB_VITAL_LCP_SIZE = 'browser.web_vital.lcp.size'; + +/** + * Type for {@link BROWSER_WEB_VITAL_LCP_SIZE} browser.web_vital.lcp.size + */ +export type BROWSER_WEB_VITAL_LCP_SIZE_TYPE = number; + // Path: model/attributes/browser/browser__web_vital__lcp__url.json /** @@ -4164,6 +4186,9 @@ export type LCP_ID_TYPE = string; * * Attribute defined in OTEL: No * + * Aliases: {@link BROWSER_WEB_VITAL_LCP_SIZE} `browser.web_vital.lcp.size` + * + * @deprecated Use {@link BROWSER_WEB_VITAL_LCP_SIZE} (browser.web_vital.lcp.size) instead - The LCP size is now recorded as a browser.web_vital.lcp.size attribute. * @example 1234 */ export const LCP_SIZE = 'lcp.size'; @@ -8926,6 +8951,7 @@ export const ATTRIBUTE_TYPE: Record = { [BROWSER_VERSION]: 'string', [BROWSER_WEB_VITAL_LCP_ELEMENT]: 'string', [BROWSER_WEB_VITAL_LCP_ID]: 'string', + [BROWSER_WEB_VITAL_LCP_SIZE]: 'integer', [BROWSER_WEB_VITAL_LCP_URL]: 'string', [CACHE_HIT]: 'boolean', [CACHE_ITEM_SIZE]: 'integer', @@ -9354,6 +9380,7 @@ export type AttributeName = | typeof BROWSER_VERSION | typeof BROWSER_WEB_VITAL_LCP_ELEMENT | typeof BROWSER_WEB_VITAL_LCP_ID + | typeof BROWSER_WEB_VITAL_LCP_SIZE | typeof BROWSER_WEB_VITAL_LCP_URL | typeof CACHE_HIT | typeof CACHE_ITEM_SIZE @@ -10225,6 +10252,17 @@ export const ATTRIBUTE_METADATA: Record = { aliases: [LCP_ID], sdks: ['javascript-browser'], }, + [BROWSER_WEB_VITAL_LCP_SIZE]: { + brief: 'The size of the largest contentful paint element', + type: 'integer', + pii: { + isPii: 'false', + }, + isInOtel: false, + example: 1024, + aliases: [LCP_SIZE], + sdks: ['javascript-browser'], + }, [BROWSER_WEB_VITAL_LCP_URL]: { brief: 'The url of the dom element responsible for the largest contentful paint', type: 'string', @@ -11866,6 +11904,11 @@ export const ATTRIBUTE_METADATA: Record = { }, isInOtel: false, example: 1234, + deprecation: { + replacement: 'browser.web_vital.lcp.size', + reason: 'The LCP size is now recorded as a browser.web_vital.lcp.size attribute.', + }, + aliases: [BROWSER_WEB_VITAL_LCP_SIZE], }, [LCP_URL]: { brief: 'The url of the dom element responsible for the largest contentful paint.', @@ -14157,6 +14200,7 @@ export type Attributes = { [BROWSER_VERSION]?: BROWSER_VERSION_TYPE; [BROWSER_WEB_VITAL_LCP_ELEMENT]?: BROWSER_WEB_VITAL_LCP_ELEMENT_TYPE; [BROWSER_WEB_VITAL_LCP_ID]?: BROWSER_WEB_VITAL_LCP_ID_TYPE; + [BROWSER_WEB_VITAL_LCP_SIZE]?: BROWSER_WEB_VITAL_LCP_SIZE_TYPE; [BROWSER_WEB_VITAL_LCP_URL]?: BROWSER_WEB_VITAL_LCP_URL_TYPE; [CACHE_HIT]?: CACHE_HIT_TYPE; [CACHE_ITEM_SIZE]?: CACHE_ITEM_SIZE_TYPE; diff --git a/model/attributes/browser/browser__web_vital__lcp__size.json b/model/attributes/browser/browser__web_vital__lcp__size.json new file mode 100644 index 00000000..1456df59 --- /dev/null +++ b/model/attributes/browser/browser__web_vital__lcp__size.json @@ -0,0 +1,12 @@ +{ + "key": "browser.web_vital.lcp.size", + "brief": "The size of the largest contentful paint element", + "type": "integer", + "pii": { + "key": "false" + }, + "is_in_otel": false, + "example": 1024, + "alias": ["lcp.size"], + "sdks": ["javascript-browser"] +} diff --git a/model/attributes/lcp/lcp__size.json b/model/attributes/lcp/lcp__size.json index d329a07d..f3570211 100644 --- a/model/attributes/lcp/lcp__size.json +++ b/model/attributes/lcp/lcp__size.json @@ -6,5 +6,11 @@ "key": "maybe" }, "is_in_otel": false, - "example": 1234 + "example": 1234, + "deprecation": { + "replacement": "browser.web_vital.lcp.size", + "reason": "The LCP size is now recorded as a browser.web_vital.lcp.size attribute.", + "_status": "backfill" + }, + "alias": ["browser.web_vital.lcp.size"] } diff --git a/python/src/sentry_conventions/attributes.py b/python/src/sentry_conventions/attributes.py index abb15f2f..6a447bc8 100644 --- a/python/src/sentry_conventions/attributes.py +++ b/python/src/sentry_conventions/attributes.py @@ -138,6 +138,7 @@ class _AttributeNamesMeta(type): "HTTP_USER_AGENT", "LCP_ELEMENT", "LCP_ID", + "LCP_SIZE", "LCP_URL", "METHOD", "NET_HOST_IP", @@ -664,6 +665,19 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: "#gero" """ + # 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" + ) + """The size of the largest contentful paint element + + Type: int + Contains PII: false + Defined in OTEL: No + Aliases: lcp.size + Example: 1024 + """ + # Path: model/attributes/browser/browser__web_vital__lcp__url.json BROWSER_WEB_VITAL_LCP_URL: Literal["browser.web_vital.lcp.url"] = ( "browser.web_vital.lcp.url" @@ -2411,6 +2425,8 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Type: int Contains PII: maybe Defined in OTEL: No + Aliases: browser.web_vital.lcp.size + DEPRECATED: Use browser.web_vital.lcp.size instead - The LCP size is now recorded as a browser.web_vital.lcp.size attribute. Example: 1234 """ @@ -5221,6 +5237,15 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): aliases=["lcp.id"], sdks=["javascript-browser"], ), + "browser.web_vital.lcp.size": AttributeMetadata( + brief="The size of the largest contentful paint element", + type=AttributeType.INTEGER, + pii=PiiInfo(isPii=IsPii.FALSE), + is_in_otel=False, + example=1024, + aliases=["lcp.size"], + sdks=["javascript-browser"], + ), "browser.web_vital.lcp.url": AttributeMetadata( brief="The url of the dom element responsible for the largest contentful paint", type=AttributeType.STRING, @@ -6468,6 +6493,12 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): pii=PiiInfo(isPii=IsPii.MAYBE), is_in_otel=False, example=1234, + deprecation=DeprecationInfo( + replacement="browser.web_vital.lcp.size", + reason="The LCP size is now recorded as a browser.web_vital.lcp.size attribute.", + status=DeprecationStatus.BACKFILL, + ), + aliases=["browser.web_vital.lcp.size"], ), "lcp.url": AttributeMetadata( brief="The url of the dom element responsible for the largest contentful paint.", @@ -8251,6 +8282,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "browser.version": str, "browser.web_vital.lcp.element": str, "browser.web_vital.lcp.id": str, + "browser.web_vital.lcp.size": int, "browser.web_vital.lcp.url": str, "cache.hit": bool, "cache.item_size": int, diff --git a/shared/deprecated_attributes.json b/shared/deprecated_attributes.json index 833f8417..cd2e729c 100644 --- a/shared/deprecated_attributes.json +++ b/shared/deprecated_attributes.json @@ -911,6 +911,22 @@ }, "alias": ["browser.web_vital.lcp.id"] }, + { + "key": "lcp.size", + "brief": "The size of the largest contentful paint element.", + "type": "integer", + "pii": { + "key": "false" + }, + "is_in_otel": false, + "example": 1234, + "deprecation": { + "replacement": "browser.web_vital.lcp.size", + "reason": "The LCP size is now recorded as a browser.web_vital.lcp.size attribute.", + "_status": "backfill" + }, + "alias": ["browser.web_vital.lcp.size"] + }, { "key": "lcp.url", "brief": "The url of the dom element responsible for the largest contentful paint.", From d31fd5db02e17ad5ad8fcbe06cd4a9c472ed06c1 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Fri, 23 Jan 2026 10:51:43 +0100 Subject: [PATCH 6/7] feat(attributes): Add `browser.web_vital.lcp.load_time` attribute --- generated/attributes/all.md | 8 +- generated/attributes/browser.md | 15 +++- generated/attributes/lcp.md | 33 ++++---- .../sentry-conventions/src/attributes.ts | 81 ++++++++++++++++++- .../browser__web_vital__lcp__load_time.json | 12 +++ .../browser__web_vital__lcp__size.json | 2 +- model/attributes/lcp/lcp__loadTime.json | 17 ++++ python/src/sentry_conventions/attributes.py | 55 ++++++++++++- shared/deprecated_attributes.json | 19 ++++- 9 files changed, 213 insertions(+), 29 deletions(-) create mode 100644 model/attributes/browser/browser__web_vital__lcp__load_time.json create mode 100644 model/attributes/lcp/lcp__loadTime.json diff --git a/generated/attributes/all.md b/generated/attributes/all.md index cd7b07ab..732ae6a3 100644 --- a/generated/attributes/all.md +++ b/generated/attributes/all.md @@ -4,11 +4,7 @@ This page lists all available attributes across all categories. -<<<<<<< HEAD -Total attributes: 425 -======= -Total attributes: 432 ->>>>>>> fed074c (feat(attributes): Add `browser.web_vital.lcp.size` attribute) +Total attributes: 428 ## Stable Attributes @@ -37,6 +33,7 @@ Total attributes: 432 | [`browser.version`](./browser.md#browserversion) | The version of the browser. | | [`browser.web_vital.lcp.element`](./browser.md#browserweb_vitallcpelement) | The HTML element selector or component name for which LCP was reported | | [`browser.web_vital.lcp.id`](./browser.md#browserweb_vitallcpid) | The id of the dom element responsible for the largest contentful paint | +| [`browser.web_vital.lcp.load_time`](./browser.md#browserweb_vitallcpload_time) | The time it took for the LCP element to be loaded | | [`browser.web_vital.lcp.size`](./browser.md#browserweb_vitallcpsize) | The size of the largest contentful paint element | | [`browser.web_vital.lcp.url`](./browser.md#browserweb_vitallcpurl) | The url of the dom element responsible for the largest contentful paint | | [`cache.hit`](./cache.md#cachehit) | If the cache was hit during this span. | @@ -416,6 +413,7 @@ Total attributes: 432 | [`http.user_agent`](./http.md#httpuser_agent) | [`user_agent.original`](./user_agent.md#user_agentoriginal) | | [`lcp.element`](./lcp.md#lcpelement) | [`browser.web_vital.lcp.element`](./browser.md#browserweb_vitallcpelement) | | [`lcp.id`](./lcp.md#lcpid) | [`browser.web_vital.lcp.id`](./browser.md#browserweb_vitallcpid) | +| [`lcp.loadTime`](./lcp.md#lcploadtime) | [`browser.web_vital.lcp.load_time`](./browser.md#browserweb_vitallcpload_time) | | [`lcp.size`](./lcp.md#lcpsize) | [`browser.web_vital.lcp.size`](./browser.md#browserweb_vitallcpsize) | | [`lcp.url`](./lcp.md#lcpurl) | [`browser.web_vital.lcp.url`](./browser.md#browserweb_vitallcpurl) | | [`method`](./general.md#method) | [`http.request.method`](./http.md#httprequestmethod) | diff --git a/generated/attributes/browser.md b/generated/attributes/browser.md index e6226db9..1b2aed70 100644 --- a/generated/attributes/browser.md +++ b/generated/attributes/browser.md @@ -11,6 +11,7 @@ - [browser.version](#browserversion) - [browser.web_vital.lcp.element](#browserweb_vitallcpelement) - [browser.web_vital.lcp.id](#browserweb_vitallcpid) + - [browser.web_vital.lcp.load_time](#browserweb_vitallcpload_time) - [browser.web_vital.lcp.size](#browserweb_vitallcpsize) - [browser.web_vital.lcp.url](#browserweb_vitallcpurl) @@ -108,6 +109,18 @@ The id of the dom element responsible for the largest contentful paint | Example | `#gero` | | Aliases | `lcp.id` | +### browser.web_vital.lcp.load_time + +The time it took for the LCP element to be loaded + +| Property | Value | +| --- | --- | +| Type | `integer` | +| Has PII | maybe | +| Exists in OpenTelemetry | No | +| Example | `1402` | +| Aliases | `lcp.loadTime` | + ### browser.web_vital.lcp.size The size of the largest contentful paint element @@ -115,7 +128,7 @@ The size of the largest contentful paint element | Property | Value | | --- | --- | | Type | `integer` | -| Has PII | false | +| Has PII | maybe | | Exists in OpenTelemetry | No | | Example | `1024` | | Aliases | `lcp.size` | diff --git a/generated/attributes/lcp.md b/generated/attributes/lcp.md index 81254bed..5dc8476a 100644 --- a/generated/attributes/lcp.md +++ b/generated/attributes/lcp.md @@ -5,25 +5,10 @@ - [Deprecated Attributes](#deprecated-attributes) - [lcp.element](#lcpelement) - [lcp.id](#lcpid) + - [lcp.loadTime](#lcploadtime) - [lcp.size](#lcpsize) - [lcp.url](#lcpurl) -<<<<<<< HEAD -## Stable Attributes - -### lcp.size - -The size of the largest contentful paint element. - -| Property | Value | -| --- | --- | -| Type | `integer` | -| Has PII | maybe | -| Exists in OpenTelemetry | No | -| Example | `1234` | - -======= ->>>>>>> fed074c (feat(attributes): Add `browser.web_vital.lcp.size` attribute) ## Deprecated Attributes These attributes are deprecated and will be removed in a future version. Please use the recommended replacements. @@ -56,6 +41,20 @@ The id of the dom element responsible for the largest contentful paint. | Deprecation Reason | The LCP id is now recorded as a browser.web_vital.lcp.id attribute. | | Aliases | `browser.web_vital.lcp.id` | +### lcp.loadTime + +The time it took for the LCP element to be loaded + +| Property | Value | +| --- | --- | +| Type | `integer` | +| Has PII | maybe | +| Exists in OpenTelemetry | No | +| Example | `1402` | +| Deprecated | Yes, use `browser.web_vital.lcp.load_time` instead | +| Deprecation Reason | The LCP load time is now recorded as a browser.web_vital.lcp.load_time attribute. | +| Aliases | `browser.web_vital.lcp.load_time` | + ### lcp.size The size of the largest contentful paint element. @@ -63,7 +62,7 @@ The size of the largest contentful paint element. | Property | Value | | --- | --- | | Type | `integer` | -| Has PII | false | +| Has PII | maybe | | Exists in OpenTelemetry | No | | Example | `1234` | | Deprecated | Yes, use `browser.web_vital.lcp.size` instead | diff --git a/javascript/sentry-conventions/src/attributes.ts b/javascript/sentry-conventions/src/attributes.ts index 3c5145f8..5fb460ea 100644 --- a/javascript/sentry-conventions/src/attributes.ts +++ b/javascript/sentry-conventions/src/attributes.ts @@ -922,6 +922,28 @@ export const BROWSER_WEB_VITAL_LCP_ID = 'browser.web_vital.lcp.id'; */ export type BROWSER_WEB_VITAL_LCP_ID_TYPE = string; +// Path: model/attributes/browser/browser__web_vital__lcp__load_time.json + +/** + * The time it took for the LCP element to be loaded `browser.web_vital.lcp.load_time` + * + * Attribute Value Type: `number` {@link BROWSER_WEB_VITAL_LCP_LOAD_TIME_TYPE} + * + * Contains PII: maybe + * + * Attribute defined in OTEL: No + * + * Aliases: {@link LCP_LOADTIME} `lcp.loadTime` + * + * @example 1402 + */ +export const BROWSER_WEB_VITAL_LCP_LOAD_TIME = 'browser.web_vital.lcp.load_time'; + +/** + * Type for {@link BROWSER_WEB_VITAL_LCP_LOAD_TIME} browser.web_vital.lcp.load_time + */ +export type BROWSER_WEB_VITAL_LCP_LOAD_TIME_TYPE = number; + // Path: model/attributes/browser/browser__web_vital__lcp__size.json /** @@ -929,7 +951,7 @@ export type BROWSER_WEB_VITAL_LCP_ID_TYPE = string; * * Attribute Value Type: `number` {@link BROWSER_WEB_VITAL_LCP_SIZE_TYPE} * - * Contains PII: false + * Contains PII: maybe * * Attribute defined in OTEL: No * @@ -4175,6 +4197,29 @@ export const LCP_ID = 'lcp.id'; */ export type LCP_ID_TYPE = string; +// Path: model/attributes/lcp/lcp__loadTime.json + +/** + * The time it took for the LCP element to be loaded `lcp.loadTime` + * + * Attribute Value Type: `number` {@link LCP_LOADTIME_TYPE} + * + * Contains PII: maybe + * + * Attribute defined in OTEL: No + * + * Aliases: {@link BROWSER_WEB_VITAL_LCP_LOAD_TIME} `browser.web_vital.lcp.load_time` + * + * @deprecated Use {@link BROWSER_WEB_VITAL_LCP_LOAD_TIME} (browser.web_vital.lcp.load_time) instead - The LCP load time is now recorded as a browser.web_vital.lcp.load_time attribute. + * @example 1402 + */ +export const LCP_LOADTIME = 'lcp.loadTime'; + +/** + * Type for {@link LCP_LOADTIME} lcp.loadTime + */ +export type LCP_LOADTIME_TYPE = number; + // Path: model/attributes/lcp/lcp__size.json /** @@ -8951,6 +8996,7 @@ export const ATTRIBUTE_TYPE: Record = { [BROWSER_VERSION]: 'string', [BROWSER_WEB_VITAL_LCP_ELEMENT]: 'string', [BROWSER_WEB_VITAL_LCP_ID]: 'string', + [BROWSER_WEB_VITAL_LCP_LOAD_TIME]: 'integer', [BROWSER_WEB_VITAL_LCP_SIZE]: 'integer', [BROWSER_WEB_VITAL_LCP_URL]: 'string', [CACHE_HIT]: 'boolean', @@ -9106,6 +9152,7 @@ export const ATTRIBUTE_TYPE: Record = { [JVM_THREAD_STATE]: 'string', [LCP_ELEMENT]: 'string', [LCP_ID]: 'string', + [LCP_LOADTIME]: 'integer', [LCP_SIZE]: 'integer', [LCP_URL]: 'string', [LOGGER_NAME]: 'string', @@ -9380,6 +9427,7 @@ export type AttributeName = | typeof BROWSER_VERSION | typeof BROWSER_WEB_VITAL_LCP_ELEMENT | typeof BROWSER_WEB_VITAL_LCP_ID + | typeof BROWSER_WEB_VITAL_LCP_LOAD_TIME | typeof BROWSER_WEB_VITAL_LCP_SIZE | typeof BROWSER_WEB_VITAL_LCP_URL | typeof CACHE_HIT @@ -9535,6 +9583,7 @@ export type AttributeName = | typeof JVM_THREAD_STATE | typeof LCP_ELEMENT | typeof LCP_ID + | typeof LCP_LOADTIME | typeof LCP_SIZE | typeof LCP_URL | typeof LOGGER_NAME @@ -10252,11 +10301,22 @@ export const ATTRIBUTE_METADATA: Record = { aliases: [LCP_ID], sdks: ['javascript-browser'], }, + [BROWSER_WEB_VITAL_LCP_LOAD_TIME]: { + brief: 'The time it took for the LCP element to be loaded', + type: 'integer', + pii: { + isPii: 'maybe', + }, + isInOtel: false, + example: 1402, + aliases: [LCP_LOADTIME], + sdks: ['javascript-browser'], + }, [BROWSER_WEB_VITAL_LCP_SIZE]: { brief: 'The size of the largest contentful paint element', type: 'integer', pii: { - isPii: 'false', + isPii: 'maybe', }, isInOtel: false, example: 1024, @@ -11896,6 +11956,21 @@ export const ATTRIBUTE_METADATA: Record = { }, aliases: [BROWSER_WEB_VITAL_LCP_ID], }, + [LCP_LOADTIME]: { + brief: 'The time it took for the LCP element to be loaded', + type: 'integer', + pii: { + isPii: 'maybe', + }, + isInOtel: false, + example: 1402, + deprecation: { + replacement: 'browser.web_vital.lcp.load_time', + reason: 'The LCP load time is now recorded as a browser.web_vital.lcp.load_time attribute.', + }, + aliases: [BROWSER_WEB_VITAL_LCP_LOAD_TIME], + sdks: ['javascript-browser'], + }, [LCP_SIZE]: { brief: 'The size of the largest contentful paint element.', type: 'integer', @@ -14200,6 +14275,7 @@ export type Attributes = { [BROWSER_VERSION]?: BROWSER_VERSION_TYPE; [BROWSER_WEB_VITAL_LCP_ELEMENT]?: BROWSER_WEB_VITAL_LCP_ELEMENT_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_SIZE]?: BROWSER_WEB_VITAL_LCP_SIZE_TYPE; [BROWSER_WEB_VITAL_LCP_URL]?: BROWSER_WEB_VITAL_LCP_URL_TYPE; [CACHE_HIT]?: CACHE_HIT_TYPE; @@ -14355,6 +14431,7 @@ export type Attributes = { [JVM_THREAD_STATE]?: JVM_THREAD_STATE_TYPE; [LCP_ELEMENT]?: LCP_ELEMENT_TYPE; [LCP_ID]?: LCP_ID_TYPE; + [LCP_LOADTIME]?: LCP_LOADTIME_TYPE; [LCP_SIZE]?: LCP_SIZE_TYPE; [LCP_URL]?: LCP_URL_TYPE; [LOGGER_NAME]?: LOGGER_NAME_TYPE; diff --git a/model/attributes/browser/browser__web_vital__lcp__load_time.json b/model/attributes/browser/browser__web_vital__lcp__load_time.json new file mode 100644 index 00000000..8773269c --- /dev/null +++ b/model/attributes/browser/browser__web_vital__lcp__load_time.json @@ -0,0 +1,12 @@ +{ + "key": "browser.web_vital.lcp.load_time", + "brief": "The time it took for the LCP element to be loaded", + "type": "integer", + "pii": { + "key": "maybe" + }, + "is_in_otel": false, + "example": 1402, + "alias": ["lcp.loadTime"], + "sdks": ["javascript-browser"] +} diff --git a/model/attributes/browser/browser__web_vital__lcp__size.json b/model/attributes/browser/browser__web_vital__lcp__size.json index 1456df59..c34c43cb 100644 --- a/model/attributes/browser/browser__web_vital__lcp__size.json +++ b/model/attributes/browser/browser__web_vital__lcp__size.json @@ -3,7 +3,7 @@ "brief": "The size of the largest contentful paint element", "type": "integer", "pii": { - "key": "false" + "key": "maybe" }, "is_in_otel": false, "example": 1024, diff --git a/model/attributes/lcp/lcp__loadTime.json b/model/attributes/lcp/lcp__loadTime.json new file mode 100644 index 00000000..b8065c2a --- /dev/null +++ b/model/attributes/lcp/lcp__loadTime.json @@ -0,0 +1,17 @@ +{ + "key": "lcp.loadTime", + "brief": "The time it took for the LCP element to be loaded", + "type": "integer", + "pii": { + "key": "maybe" + }, + "is_in_otel": false, + "example": 1402, + "sdks": ["javascript-browser"], + "deprecation": { + "replacement": "browser.web_vital.lcp.load_time", + "reason": "The LCP load time is now recorded as a browser.web_vital.lcp.load_time attribute.", + "_status": "backfill" + }, + "alias": ["browser.web_vital.lcp.load_time"] +} diff --git a/python/src/sentry_conventions/attributes.py b/python/src/sentry_conventions/attributes.py index 6a447bc8..c57116ff 100644 --- a/python/src/sentry_conventions/attributes.py +++ b/python/src/sentry_conventions/attributes.py @@ -138,6 +138,7 @@ class _AttributeNamesMeta(type): "HTTP_USER_AGENT", "LCP_ELEMENT", "LCP_ID", + "LCP_LOADTIME", "LCP_SIZE", "LCP_URL", "METHOD", @@ -665,6 +666,19 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: "#gero" """ + # Path: model/attributes/browser/browser__web_vital__lcp__load_time.json + BROWSER_WEB_VITAL_LCP_LOAD_TIME: Literal["browser.web_vital.lcp.load_time"] = ( + "browser.web_vital.lcp.load_time" + ) + """The time it took for the LCP element to be loaded + + Type: int + Contains PII: maybe + Defined in OTEL: No + Aliases: lcp.loadTime + Example: 1402 + """ + # 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" @@ -672,7 +686,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): """The size of the largest contentful paint element Type: int - Contains PII: false + Contains PII: maybe Defined in OTEL: No Aliases: lcp.size Example: 1024 @@ -2418,6 +2432,18 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: "#hero" """ + # Path: model/attributes/lcp/lcp__loadTime.json + LCP_LOADTIME: Literal["lcp.loadTime"] = "lcp.loadTime" + """The time it took for the LCP element to be loaded + + Type: int + Contains PII: maybe + Defined in OTEL: No + Aliases: browser.web_vital.lcp.load_time + DEPRECATED: Use browser.web_vital.lcp.load_time instead - The LCP load time is now recorded as a browser.web_vital.lcp.load_time attribute. + Example: 1402 + """ + # Path: model/attributes/lcp/lcp__size.json LCP_SIZE: Literal["lcp.size"] = "lcp.size" """The size of the largest contentful paint element. @@ -5237,10 +5263,19 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): aliases=["lcp.id"], sdks=["javascript-browser"], ), + "browser.web_vital.lcp.load_time": AttributeMetadata( + brief="The time it took for the LCP element to be loaded", + type=AttributeType.INTEGER, + pii=PiiInfo(isPii=IsPii.MAYBE), + is_in_otel=False, + example=1402, + aliases=["lcp.loadTime"], + sdks=["javascript-browser"], + ), "browser.web_vital.lcp.size": AttributeMetadata( brief="The size of the largest contentful paint element", type=AttributeType.INTEGER, - pii=PiiInfo(isPii=IsPii.FALSE), + pii=PiiInfo(isPii=IsPii.MAYBE), is_in_otel=False, example=1024, aliases=["lcp.size"], @@ -6487,6 +6522,20 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ), aliases=["browser.web_vital.lcp.id"], ), + "lcp.loadTime": AttributeMetadata( + brief="The time it took for the LCP element to be loaded", + type=AttributeType.INTEGER, + pii=PiiInfo(isPii=IsPii.MAYBE), + is_in_otel=False, + example=1402, + deprecation=DeprecationInfo( + replacement="browser.web_vital.lcp.load_time", + reason="The LCP load time is now recorded as a browser.web_vital.lcp.load_time attribute.", + status=DeprecationStatus.BACKFILL, + ), + aliases=["browser.web_vital.lcp.load_time"], + sdks=["javascript-browser"], + ), "lcp.size": AttributeMetadata( brief="The size of the largest contentful paint element.", type=AttributeType.INTEGER, @@ -8282,6 +8331,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "browser.version": str, "browser.web_vital.lcp.element": str, "browser.web_vital.lcp.id": str, + "browser.web_vital.lcp.load_time": int, "browser.web_vital.lcp.size": int, "browser.web_vital.lcp.url": str, "cache.hit": bool, @@ -8437,6 +8487,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "jvm.thread.state": str, "lcp.element": str, "lcp.id": str, + "lcp.loadTime": int, "lcp.size": int, "lcp.url": str, "logger.name": str, diff --git a/shared/deprecated_attributes.json b/shared/deprecated_attributes.json index cd2e729c..3610e9e2 100644 --- a/shared/deprecated_attributes.json +++ b/shared/deprecated_attributes.json @@ -911,12 +911,29 @@ }, "alias": ["browser.web_vital.lcp.id"] }, + { + "key": "lcp.loadTime", + "brief": "The time it took for the LCP element to be loaded", + "type": "integer", + "pii": { + "key": "maybe" + }, + "is_in_otel": false, + "example": 1402, + "sdks": ["javascript-browser"], + "deprecation": { + "replacement": "browser.web_vital.lcp.load_time", + "reason": "The LCP load time is now recorded as a browser.web_vital.lcp.load_time attribute.", + "_status": "backfill" + }, + "alias": ["browser.web_vital.lcp.load_time"] + }, { "key": "lcp.size", "brief": "The size of the largest contentful paint element.", "type": "integer", "pii": { - "key": "false" + "key": "maybe" }, "is_in_otel": false, "example": 1234, From 0f1d7ca3b47cc47522ee8ce7a56b1c57c7849488 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Fri, 23 Jan 2026 11:16:18 +0100 Subject: [PATCH 7/7] feat(attributes): Add LCP web vital meta attributes --- generated/attributes/all.md | 4 +- generated/attributes/browser.md | 13 ++++ generated/attributes/lcp.md | 15 ++++ .../sentry-conventions/src/attributes.ts | 77 +++++++++++++++++++ .../browser__web_vital__lcp__render_time.json | 12 +++ model/attributes/lcp/lcp__renderTime.json | 17 ++++ python/src/sentry_conventions/attributes.py | 51 ++++++++++++ shared/deprecated_attributes.json | 17 ++++ 8 files changed, 205 insertions(+), 1 deletion(-) create mode 100644 model/attributes/browser/browser__web_vital__lcp__render_time.json create mode 100644 model/attributes/lcp/lcp__renderTime.json diff --git a/generated/attributes/all.md b/generated/attributes/all.md index 732ae6a3..6efba0af 100644 --- a/generated/attributes/all.md +++ b/generated/attributes/all.md @@ -4,7 +4,7 @@ This page lists all available attributes across all categories. -Total attributes: 428 +Total attributes: 430 ## Stable Attributes @@ -34,6 +34,7 @@ Total attributes: 428 | [`browser.web_vital.lcp.element`](./browser.md#browserweb_vitallcpelement) | The HTML element selector or component name for which LCP was reported | | [`browser.web_vital.lcp.id`](./browser.md#browserweb_vitallcpid) | The id of the dom element responsible for the largest contentful paint | | [`browser.web_vital.lcp.load_time`](./browser.md#browserweb_vitallcpload_time) | The time it took for the LCP element to be loaded | +| [`browser.web_vital.lcp.render_time`](./browser.md#browserweb_vitallcprender_time) | The time it took for the LCP element to be rendered | | [`browser.web_vital.lcp.size`](./browser.md#browserweb_vitallcpsize) | The size of the largest contentful paint element | | [`browser.web_vital.lcp.url`](./browser.md#browserweb_vitallcpurl) | The url of the dom element responsible for the largest contentful paint | | [`cache.hit`](./cache.md#cachehit) | If the cache was hit during this span. | @@ -414,6 +415,7 @@ Total attributes: 428 | [`lcp.element`](./lcp.md#lcpelement) | [`browser.web_vital.lcp.element`](./browser.md#browserweb_vitallcpelement) | | [`lcp.id`](./lcp.md#lcpid) | [`browser.web_vital.lcp.id`](./browser.md#browserweb_vitallcpid) | | [`lcp.loadTime`](./lcp.md#lcploadtime) | [`browser.web_vital.lcp.load_time`](./browser.md#browserweb_vitallcpload_time) | +| [`lcp.renderTime`](./lcp.md#lcprendertime) | [`browser.web_vital.lcp.render_time`](./browser.md#browserweb_vitallcprender_time) | | [`lcp.size`](./lcp.md#lcpsize) | [`browser.web_vital.lcp.size`](./browser.md#browserweb_vitallcpsize) | | [`lcp.url`](./lcp.md#lcpurl) | [`browser.web_vital.lcp.url`](./browser.md#browserweb_vitallcpurl) | | [`method`](./general.md#method) | [`http.request.method`](./http.md#httprequestmethod) | diff --git a/generated/attributes/browser.md b/generated/attributes/browser.md index 1b2aed70..8111d872 100644 --- a/generated/attributes/browser.md +++ b/generated/attributes/browser.md @@ -12,6 +12,7 @@ - [browser.web_vital.lcp.element](#browserweb_vitallcpelement) - [browser.web_vital.lcp.id](#browserweb_vitallcpid) - [browser.web_vital.lcp.load_time](#browserweb_vitallcpload_time) + - [browser.web_vital.lcp.render_time](#browserweb_vitallcprender_time) - [browser.web_vital.lcp.size](#browserweb_vitallcpsize) - [browser.web_vital.lcp.url](#browserweb_vitallcpurl) @@ -121,6 +122,18 @@ The time it took for the LCP element to be loaded | Example | `1402` | | Aliases | `lcp.loadTime` | +### browser.web_vital.lcp.render_time + +The time it took for the LCP element to be rendered + +| Property | Value | +| --- | --- | +| Type | `integer` | +| Has PII | maybe | +| Exists in OpenTelemetry | No | +| Example | `1685` | +| Aliases | `lcp.renderTime` | + ### browser.web_vital.lcp.size The size of the largest contentful paint element diff --git a/generated/attributes/lcp.md b/generated/attributes/lcp.md index 5dc8476a..2ac0467d 100644 --- a/generated/attributes/lcp.md +++ b/generated/attributes/lcp.md @@ -6,6 +6,7 @@ - [lcp.element](#lcpelement) - [lcp.id](#lcpid) - [lcp.loadTime](#lcploadtime) + - [lcp.renderTime](#lcprendertime) - [lcp.size](#lcpsize) - [lcp.url](#lcpurl) @@ -55,6 +56,20 @@ The time it took for the LCP element to be loaded | Deprecation Reason | The LCP load time is now recorded as a browser.web_vital.lcp.load_time attribute. | | Aliases | `browser.web_vital.lcp.load_time` | +### lcp.renderTime + +The time it took for the LCP element to be rendered + +| Property | Value | +| --- | --- | +| Type | `integer` | +| Has PII | maybe | +| Exists in OpenTelemetry | No | +| Example | `1685` | +| Deprecated | Yes, use `browser.web_vital.lcp.render_time` instead | +| Deprecation Reason | The LCP render time is now recorded as a browser.web_vital.lcp.render_time attribute. | +| Aliases | `browser.web_vital.lcp.render_time` | + ### lcp.size The size of the largest contentful paint element. diff --git a/javascript/sentry-conventions/src/attributes.ts b/javascript/sentry-conventions/src/attributes.ts index 5fb460ea..e3aa3846 100644 --- a/javascript/sentry-conventions/src/attributes.ts +++ b/javascript/sentry-conventions/src/attributes.ts @@ -944,6 +944,28 @@ export const BROWSER_WEB_VITAL_LCP_LOAD_TIME = 'browser.web_vital.lcp.load_time' */ export type BROWSER_WEB_VITAL_LCP_LOAD_TIME_TYPE = number; +// Path: model/attributes/browser/browser__web_vital__lcp__render_time.json + +/** + * The time it took for the LCP element to be rendered `browser.web_vital.lcp.render_time` + * + * Attribute Value Type: `number` {@link BROWSER_WEB_VITAL_LCP_RENDER_TIME_TYPE} + * + * Contains PII: maybe + * + * Attribute defined in OTEL: No + * + * Aliases: {@link LCP_RENDERTIME} `lcp.renderTime` + * + * @example 1685 + */ +export const BROWSER_WEB_VITAL_LCP_RENDER_TIME = 'browser.web_vital.lcp.render_time'; + +/** + * Type for {@link BROWSER_WEB_VITAL_LCP_RENDER_TIME} browser.web_vital.lcp.render_time + */ +export type BROWSER_WEB_VITAL_LCP_RENDER_TIME_TYPE = number; + // Path: model/attributes/browser/browser__web_vital__lcp__size.json /** @@ -4220,6 +4242,29 @@ export const LCP_LOADTIME = 'lcp.loadTime'; */ export type LCP_LOADTIME_TYPE = number; +// Path: model/attributes/lcp/lcp__renderTime.json + +/** + * The time it took for the LCP element to be rendered `lcp.renderTime` + * + * Attribute Value Type: `number` {@link LCP_RENDERTIME_TYPE} + * + * Contains PII: maybe + * + * Attribute defined in OTEL: No + * + * Aliases: {@link BROWSER_WEB_VITAL_LCP_RENDER_TIME} `browser.web_vital.lcp.render_time` + * + * @deprecated Use {@link BROWSER_WEB_VITAL_LCP_RENDER_TIME} (browser.web_vital.lcp.render_time) instead - The LCP render time is now recorded as a browser.web_vital.lcp.render_time attribute. + * @example 1685 + */ +export const LCP_RENDERTIME = 'lcp.renderTime'; + +/** + * Type for {@link LCP_RENDERTIME} lcp.renderTime + */ +export type LCP_RENDERTIME_TYPE = number; + // Path: model/attributes/lcp/lcp__size.json /** @@ -8997,6 +9042,7 @@ export const ATTRIBUTE_TYPE: Record = { [BROWSER_WEB_VITAL_LCP_ELEMENT]: 'string', [BROWSER_WEB_VITAL_LCP_ID]: 'string', [BROWSER_WEB_VITAL_LCP_LOAD_TIME]: 'integer', + [BROWSER_WEB_VITAL_LCP_RENDER_TIME]: 'integer', [BROWSER_WEB_VITAL_LCP_SIZE]: 'integer', [BROWSER_WEB_VITAL_LCP_URL]: 'string', [CACHE_HIT]: 'boolean', @@ -9153,6 +9199,7 @@ export const ATTRIBUTE_TYPE: Record = { [LCP_ELEMENT]: 'string', [LCP_ID]: 'string', [LCP_LOADTIME]: 'integer', + [LCP_RENDERTIME]: 'integer', [LCP_SIZE]: 'integer', [LCP_URL]: 'string', [LOGGER_NAME]: 'string', @@ -9428,6 +9475,7 @@ export type AttributeName = | typeof BROWSER_WEB_VITAL_LCP_ELEMENT | 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_SIZE | typeof BROWSER_WEB_VITAL_LCP_URL | typeof CACHE_HIT @@ -9584,6 +9632,7 @@ export type AttributeName = | typeof LCP_ELEMENT | typeof LCP_ID | typeof LCP_LOADTIME + | typeof LCP_RENDERTIME | typeof LCP_SIZE | typeof LCP_URL | typeof LOGGER_NAME @@ -10312,6 +10361,17 @@ export const ATTRIBUTE_METADATA: Record = { aliases: [LCP_LOADTIME], sdks: ['javascript-browser'], }, + [BROWSER_WEB_VITAL_LCP_RENDER_TIME]: { + brief: 'The time it took for the LCP element to be rendered', + type: 'integer', + pii: { + isPii: 'maybe', + }, + isInOtel: false, + example: 1685, + aliases: [LCP_RENDERTIME], + sdks: ['javascript-browser'], + }, [BROWSER_WEB_VITAL_LCP_SIZE]: { brief: 'The size of the largest contentful paint element', type: 'integer', @@ -11971,6 +12031,21 @@ export const ATTRIBUTE_METADATA: Record = { aliases: [BROWSER_WEB_VITAL_LCP_LOAD_TIME], sdks: ['javascript-browser'], }, + [LCP_RENDERTIME]: { + brief: 'The time it took for the LCP element to be rendered', + type: 'integer', + pii: { + isPii: 'maybe', + }, + isInOtel: false, + example: 1685, + deprecation: { + replacement: 'browser.web_vital.lcp.render_time', + reason: 'The LCP render time is now recorded as a browser.web_vital.lcp.render_time attribute.', + }, + aliases: [BROWSER_WEB_VITAL_LCP_RENDER_TIME], + sdks: ['javascript-browser'], + }, [LCP_SIZE]: { brief: 'The size of the largest contentful paint element.', type: 'integer', @@ -14276,6 +14351,7 @@ export type Attributes = { [BROWSER_WEB_VITAL_LCP_ELEMENT]?: BROWSER_WEB_VITAL_LCP_ELEMENT_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_SIZE]?: BROWSER_WEB_VITAL_LCP_SIZE_TYPE; [BROWSER_WEB_VITAL_LCP_URL]?: BROWSER_WEB_VITAL_LCP_URL_TYPE; [CACHE_HIT]?: CACHE_HIT_TYPE; @@ -14432,6 +14508,7 @@ export type Attributes = { [LCP_ELEMENT]?: LCP_ELEMENT_TYPE; [LCP_ID]?: LCP_ID_TYPE; [LCP_LOADTIME]?: LCP_LOADTIME_TYPE; + [LCP_RENDERTIME]?: LCP_RENDERTIME_TYPE; [LCP_SIZE]?: LCP_SIZE_TYPE; [LCP_URL]?: LCP_URL_TYPE; [LOGGER_NAME]?: LOGGER_NAME_TYPE; diff --git a/model/attributes/browser/browser__web_vital__lcp__render_time.json b/model/attributes/browser/browser__web_vital__lcp__render_time.json new file mode 100644 index 00000000..de923b9b --- /dev/null +++ b/model/attributes/browser/browser__web_vital__lcp__render_time.json @@ -0,0 +1,12 @@ +{ + "key": "browser.web_vital.lcp.render_time", + "brief": "The time it took for the LCP element to be rendered", + "type": "integer", + "pii": { + "key": "maybe" + }, + "is_in_otel": false, + "example": 1685, + "alias": ["lcp.renderTime"], + "sdks": ["javascript-browser"] +} diff --git a/model/attributes/lcp/lcp__renderTime.json b/model/attributes/lcp/lcp__renderTime.json new file mode 100644 index 00000000..3e41719a --- /dev/null +++ b/model/attributes/lcp/lcp__renderTime.json @@ -0,0 +1,17 @@ +{ + "key": "lcp.renderTime", + "brief": "The time it took for the LCP element to be rendered", + "type": "integer", + "pii": { + "key": "maybe" + }, + "is_in_otel": false, + "example": 1685, + "sdks": ["javascript-browser"], + "deprecation": { + "replacement": "browser.web_vital.lcp.render_time", + "reason": "The LCP render time is now recorded as a browser.web_vital.lcp.render_time attribute.", + "_status": "backfill" + }, + "alias": ["browser.web_vital.lcp.render_time"] +} diff --git a/python/src/sentry_conventions/attributes.py b/python/src/sentry_conventions/attributes.py index c57116ff..a28bf1b8 100644 --- a/python/src/sentry_conventions/attributes.py +++ b/python/src/sentry_conventions/attributes.py @@ -139,6 +139,7 @@ class _AttributeNamesMeta(type): "LCP_ELEMENT", "LCP_ID", "LCP_LOADTIME", + "LCP_RENDERTIME", "LCP_SIZE", "LCP_URL", "METHOD", @@ -679,6 +680,19 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: 1402 """ + # Path: model/attributes/browser/browser__web_vital__lcp__render_time.json + BROWSER_WEB_VITAL_LCP_RENDER_TIME: Literal["browser.web_vital.lcp.render_time"] = ( + "browser.web_vital.lcp.render_time" + ) + """The time it took for the LCP element to be rendered + + Type: int + Contains PII: maybe + Defined in OTEL: No + Aliases: lcp.renderTime + Example: 1685 + """ + # 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" @@ -2444,6 +2458,18 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: 1402 """ + # Path: model/attributes/lcp/lcp__renderTime.json + LCP_RENDERTIME: Literal["lcp.renderTime"] = "lcp.renderTime" + """The time it took for the LCP element to be rendered + + Type: int + Contains PII: maybe + Defined in OTEL: No + Aliases: browser.web_vital.lcp.render_time + DEPRECATED: Use browser.web_vital.lcp.render_time instead - The LCP render time is now recorded as a browser.web_vital.lcp.render_time attribute. + Example: 1685 + """ + # Path: model/attributes/lcp/lcp__size.json LCP_SIZE: Literal["lcp.size"] = "lcp.size" """The size of the largest contentful paint element. @@ -5272,6 +5298,15 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): aliases=["lcp.loadTime"], sdks=["javascript-browser"], ), + "browser.web_vital.lcp.render_time": AttributeMetadata( + brief="The time it took for the LCP element to be rendered", + type=AttributeType.INTEGER, + pii=PiiInfo(isPii=IsPii.MAYBE), + is_in_otel=False, + example=1685, + aliases=["lcp.renderTime"], + sdks=["javascript-browser"], + ), "browser.web_vital.lcp.size": AttributeMetadata( brief="The size of the largest contentful paint element", type=AttributeType.INTEGER, @@ -6536,6 +6571,20 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): aliases=["browser.web_vital.lcp.load_time"], sdks=["javascript-browser"], ), + "lcp.renderTime": AttributeMetadata( + brief="The time it took for the LCP element to be rendered", + type=AttributeType.INTEGER, + pii=PiiInfo(isPii=IsPii.MAYBE), + is_in_otel=False, + example=1685, + deprecation=DeprecationInfo( + replacement="browser.web_vital.lcp.render_time", + reason="The LCP render time is now recorded as a browser.web_vital.lcp.render_time attribute.", + status=DeprecationStatus.BACKFILL, + ), + aliases=["browser.web_vital.lcp.render_time"], + sdks=["javascript-browser"], + ), "lcp.size": AttributeMetadata( brief="The size of the largest contentful paint element.", type=AttributeType.INTEGER, @@ -8332,6 +8381,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "browser.web_vital.lcp.element": str, "browser.web_vital.lcp.id": str, "browser.web_vital.lcp.load_time": int, + "browser.web_vital.lcp.render_time": int, "browser.web_vital.lcp.size": int, "browser.web_vital.lcp.url": str, "cache.hit": bool, @@ -8488,6 +8538,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "lcp.element": str, "lcp.id": str, "lcp.loadTime": int, + "lcp.renderTime": int, "lcp.size": int, "lcp.url": str, "logger.name": str, diff --git a/shared/deprecated_attributes.json b/shared/deprecated_attributes.json index 3610e9e2..68ccd18d 100644 --- a/shared/deprecated_attributes.json +++ b/shared/deprecated_attributes.json @@ -928,6 +928,23 @@ }, "alias": ["browser.web_vital.lcp.load_time"] }, + { + "key": "lcp.renderTime", + "brief": "The time it took for the LCP element to be rendered", + "type": "integer", + "pii": { + "key": "maybe" + }, + "is_in_otel": false, + "example": 1685, + "sdks": ["javascript-browser"], + "deprecation": { + "replacement": "browser.web_vital.lcp.render_time", + "reason": "The LCP render time is now recorded as a browser.web_vital.lcp.render_time attribute.", + "_status": "backfill" + }, + "alias": ["browser.web_vital.lcp.render_time"] + }, { "key": "lcp.size", "brief": "The size of the largest contentful paint element.",