From b5e75a4a8a05024c9028f6d7702b9f1a60708ee7 Mon Sep 17 00:00:00 2001 From: Charly Gomez Date: Tue, 12 May 2026 14:26:58 +0200 Subject: [PATCH 1/2] feat(attributes): Add `profile.start_timestamp` attribute Add the profile.start_timestamp attribute for recording when a profile started. This is needed by the JS SDK for span streaming, where scope contexts are converted to segment span attributes. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../sentry-conventions/src/attributes.ts | 33 +++++++++++++++++++ .../profile/profile__start_timestamp.json | 17 ++++++++++ python/src/sentry_conventions/attributes.py | 27 +++++++++++++++ 3 files changed, 77 insertions(+) create mode 100644 model/attributes/profile/profile__start_timestamp.json diff --git a/javascript/sentry-conventions/src/attributes.ts b/javascript/sentry-conventions/src/attributes.ts index e74c1197..edaf07f6 100644 --- a/javascript/sentry-conventions/src/attributes.ts +++ b/javascript/sentry-conventions/src/attributes.ts @@ -8677,6 +8677,26 @@ export const PROCESS_RUNTIME_VERSION = 'process.runtime.version'; */ export type PROCESS_RUNTIME_VERSION_TYPE = string; +// Path: model/attributes/profile/profile__start_timestamp.json + +/** + * The timestamp when the profile started `profile.start_timestamp` + * + * Attribute Value Type: `number` {@link PROFILE_START_TIMESTAMP_TYPE} + * + * Contains PII: false + * + * Attribute defined in OTEL: No + * + * @example 1700000000.123 + */ +export const PROFILE_START_TIMESTAMP = 'profile.start_timestamp'; + +/** + * Type for {@link PROFILE_START_TIMESTAMP} profile.start_timestamp + */ +export type PROFILE_START_TIMESTAMP_TYPE = number; + // Path: model/attributes/query/query__[key].json /** @@ -12366,6 +12386,7 @@ export const ATTRIBUTE_TYPE: Record = { [PROCESS_RUNTIME_ENGINE_VERSION]: 'string', [PROCESS_RUNTIME_NAME]: 'string', [PROCESS_RUNTIME_VERSION]: 'string', + [PROFILE_START_TIMESTAMP]: 'double', [QUERY_KEY]: 'string', [RELEASE]: 'string', [REMIX_ACTION_FORM_DATA_KEY]: 'string', @@ -12936,6 +12957,7 @@ export type AttributeName = | typeof PROCESS_RUNTIME_ENGINE_VERSION | typeof PROCESS_RUNTIME_NAME | typeof PROCESS_RUNTIME_VERSION + | typeof PROFILE_START_TIMESTAMP | typeof QUERY_KEY | typeof RELEASE | typeof REMIX_ACTION_FORM_DATA_KEY @@ -18315,6 +18337,16 @@ export const ATTRIBUTE_METADATA: Record = { example: '18.04.2', changelog: [{ version: '0.1.0', prs: [127] }, { version: '0.0.0' }], }, + [PROFILE_START_TIMESTAMP]: { + brief: 'The timestamp when the profile started', + type: 'double', + pii: { + isPii: 'false', + }, + isInOtel: false, + example: 1700000000.123, + changelog: [{ version: 'next', prs: [363], description: 'Added profile.start_timestamp attribute' }], + }, [QUERY_KEY]: { brief: 'An item in a query string. Usually added by client-side routing frameworks like vue-router.', type: 'string', @@ -20482,6 +20514,7 @@ export type Attributes = { [PROCESS_RUNTIME_ENGINE_VERSION]?: PROCESS_RUNTIME_ENGINE_VERSION_TYPE; [PROCESS_RUNTIME_NAME]?: PROCESS_RUNTIME_NAME_TYPE; [PROCESS_RUNTIME_VERSION]?: PROCESS_RUNTIME_VERSION_TYPE; + [PROFILE_START_TIMESTAMP]?: PROFILE_START_TIMESTAMP_TYPE; [QUERY_KEY]?: QUERY_KEY_TYPE; [RELEASE]?: RELEASE_TYPE; [REMIX_ACTION_FORM_DATA_KEY]?: REMIX_ACTION_FORM_DATA_KEY_TYPE; diff --git a/model/attributes/profile/profile__start_timestamp.json b/model/attributes/profile/profile__start_timestamp.json new file mode 100644 index 00000000..f177f2a2 --- /dev/null +++ b/model/attributes/profile/profile__start_timestamp.json @@ -0,0 +1,17 @@ +{ + "key": "profile.start_timestamp", + "brief": "The timestamp when the profile started", + "type": "double", + "pii": { + "key": "false" + }, + "is_in_otel": false, + "example": 1700000000.123, + "changelog": [ + { + "version": "next", + "prs": [363], + "description": "Added profile.start_timestamp attribute" + } + ] +} diff --git a/python/src/sentry_conventions/attributes.py b/python/src/sentry_conventions/attributes.py index 5563bd91..726b7098 100644 --- a/python/src/sentry_conventions/attributes.py +++ b/python/src/sentry_conventions/attributes.py @@ -4901,6 +4901,18 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: "18.04.2" """ + # Path: model/attributes/profile/profile__start_timestamp.json + PROFILE_START_TIMESTAMP: Literal["profile.start_timestamp"] = ( + "profile.start_timestamp" + ) + """The timestamp when the profile started + + Type: float + Contains PII: false + Defined in OTEL: No + Example: 1700000000.123 + """ + # Path: model/attributes/query/query__[key].json QUERY_KEY: Literal["query."] = "query." """An item in a query string. Usually added by client-side routing frameworks like vue-router. @@ -12112,6 +12124,20 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ChangelogEntry(version="0.0.0"), ], ), + "profile.start_timestamp": AttributeMetadata( + brief="The timestamp when the profile started", + type=AttributeType.DOUBLE, + pii=PiiInfo(isPii=IsPii.FALSE), + is_in_otel=False, + example=1700000000.123, + changelog=[ + ChangelogEntry( + version="next", + prs=[363], + description="Added profile.start_timestamp attribute", + ), + ], + ), "query.": AttributeMetadata( brief="An item in a query string. Usually added by client-side routing frameworks like vue-router.", type=AttributeType.STRING, @@ -14345,6 +14371,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "process.runtime.engine.version": str, "process.runtime.name": str, "process.runtime.version": str, + "profile.start_timestamp": float, "query.": str, "release": str, "remix.action_form_data.": str, From f07f04b339f17c14b58361574a01eac82d08c9cc Mon Sep 17 00:00:00 2001 From: Charly Gomez Date: Wed, 13 May 2026 11:19:17 +0200 Subject: [PATCH 2/2] fix(attributes): Set pii to maybe for profile attributes Co-Authored-By: Claude Opus 4.6 (1M context) --- .gitignore | 3 ++- javascript/sentry-conventions/src/attributes.ts | 4 ++-- model/attributes/profile/profile__start_timestamp.json | 2 +- python/src/sentry_conventions/attributes.py | 4 ++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index cccdd5a9..9f585527 100644 --- a/.gitignore +++ b/.gitignore @@ -149,4 +149,5 @@ dist # Playwright MCP temporary files .playwright-mcp/ -.DS_Store \ No newline at end of file +.DS_Store +.claude/projects/ diff --git a/javascript/sentry-conventions/src/attributes.ts b/javascript/sentry-conventions/src/attributes.ts index edaf07f6..cfac8313 100644 --- a/javascript/sentry-conventions/src/attributes.ts +++ b/javascript/sentry-conventions/src/attributes.ts @@ -8684,7 +8684,7 @@ export type PROCESS_RUNTIME_VERSION_TYPE = string; * * Attribute Value Type: `number` {@link PROFILE_START_TIMESTAMP_TYPE} * - * Contains PII: false + * Contains PII: maybe * * Attribute defined in OTEL: No * @@ -18341,7 +18341,7 @@ export const ATTRIBUTE_METADATA: Record = { brief: 'The timestamp when the profile started', type: 'double', pii: { - isPii: 'false', + isPii: 'maybe', }, isInOtel: false, example: 1700000000.123, diff --git a/model/attributes/profile/profile__start_timestamp.json b/model/attributes/profile/profile__start_timestamp.json index f177f2a2..a9fc8774 100644 --- a/model/attributes/profile/profile__start_timestamp.json +++ b/model/attributes/profile/profile__start_timestamp.json @@ -3,7 +3,7 @@ "brief": "The timestamp when the profile started", "type": "double", "pii": { - "key": "false" + "key": "maybe" }, "is_in_otel": false, "example": 1700000000.123, diff --git a/python/src/sentry_conventions/attributes.py b/python/src/sentry_conventions/attributes.py index 726b7098..ac78caac 100644 --- a/python/src/sentry_conventions/attributes.py +++ b/python/src/sentry_conventions/attributes.py @@ -4908,7 +4908,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): """The timestamp when the profile started Type: float - Contains PII: false + Contains PII: maybe Defined in OTEL: No Example: 1700000000.123 """ @@ -12127,7 +12127,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "profile.start_timestamp": AttributeMetadata( brief="The timestamp when the profile started", type=AttributeType.DOUBLE, - pii=PiiInfo(isPii=IsPii.FALSE), + pii=PiiInfo(isPii=IsPii.MAYBE), is_in_otel=False, example=1700000000.123, changelog=[