The CLS web vital is now recorded as a browser.web_vital.cls.value attribute.
Status: backfill
Changelog
v0.5.0#229Added and deprecated attribute to document JS SDK's current behaviour
Raw JSON
{
"key": "cls",
"brief": "The value of the recorded Cumulative Layout Shift (CLS) web vital",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 0.2361,
"deprecation": {
"replacement": "browser.web_vital.cls.value",
"reason": "The CLS web vital is now recorded as a browser.web_vital.cls.value attribute.",
"_status": "backfill"
},
"alias": [
"browser.web_vital.cls.value"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
229
],
"description": "Added and deprecated attribute to document JS SDK's current behaviour"
}
]
}
{
"key": "fcp",
"brief": "The time it takes for the browser to render the first piece of meaningful content on the screen",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 547.6951,
"deprecation": {
"replacement": "browser.web_vital.fcp.value",
"reason": "This attribute is being deprecated in favor of browser.web_vital.fcp.value",
"_status": "backfill"
},
"alias": [
"browser.web_vital.fcp.value"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
235
]
}
]
}
{
"key": "fp",
"brief": "The time it takes for the browser to render the first pixel on the screen",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 477.1926,
"deprecation": {
"replacement": "browser.web_vital.fp.value",
"reason": "This attribute is being deprecated in favor of browser.web_vital.fp.value",
"_status": "backfill"
},
"alias": [
"browser.web_vital.fp.value"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
235
]
}
]
}
This attribute is not part of the OpenTelemetry specification and error.type fits much better. The value changes from the full error message to the syscall error code, so the old value cannot be copied over.
Changelog
v0.23.0#638Remove unnecessary transformation and change deprecation status to null.
{
"key": "fs_error",
"brief": "The error message of a file system error.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "ENOENT: no such file or directory",
"deprecation": {
"replacement": "error.type",
"reason": "This attribute is not part of the OpenTelemetry specification and error.type fits much better. The value changes from the full error message to the syscall error code, so the old value cannot be copied over.",
"_status": null
},
"changelog": [
{
"version": "0.23.0",
"prs": [
638
],
"description": "Remove unnecessary transformation and change deprecation status to null."
},
{
"version": "0.22.0",
"prs": [
589
],
"description": "Transform fs_error into error.type"
},
{
"version": "0.1.0",
"prs": [
61,
127
]
},
{
"version": "0.0.0"
}
]
}
The INP web vital is now recorded as a browser.web_vital.inp.value attribute.
Status: backfill
Changelog
v0.5.0#229Added and deprecated attribute to document JS SDK's current behaviour
Raw JSON
{
"key": "inp",
"brief": "The value of the recorded Interaction to Next Paint (INP) web vital",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 200,
"deprecation": {
"replacement": "browser.web_vital.inp.value",
"reason": "The INP web vital is now recorded as a browser.web_vital.inp.value attribute.",
"_status": "backfill"
},
"alias": [
"browser.web_vital.inp.value"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
229
],
"description": "Added and deprecated attribute to document JS SDK's current behaviour"
}
]
}
The LCP web vital is now recorded as a browser.web_vital.lcp.value attribute.
Status: backfill
Changelog
v0.5.0#229Added and deprecated attribute to document JS SDK's current behaviour
Raw JSON
{
"key": "lcp",
"brief": "The value of the recorded Largest Contentful Paint (LCP) web vital",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 2500,
"deprecation": {
"replacement": "browser.web_vital.lcp.value",
"reason": "The LCP web vital is now recorded as a browser.web_vital.lcp.value attribute.",
"_status": "backfill"
},
"alias": [
"browser.web_vital.lcp.value"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
229
],
"description": "Added and deprecated attribute to document JS SDK's current behaviour"
}
]
}
The matched route, that is, the path template in the format used by the respective server framework. Also used by mobile SDKs to indicate the current route in the application.
{
"key": "route",
"brief": "The matched route, that is, the path template in the format used by the respective server framework. Also used by mobile SDKs to indicate the current route in the application.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "App\\Controller::indexAction",
"deprecation": {
"replacement": "http.route",
"_status": null
},
"alias": [
"http.route"
],
"changelog": [
{
"version": "0.1.0",
"prs": [
61,
74
]
},
{
"version": "0.0.0"
}
]
}
{
"key": "stall_percentage",
"brief": "The fraction of time the app was stalled. Only applies to React Native. This is computed by Relay.",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"deprecation": {
"replacement": "app.vitals.stall.percentage",
"reason": "Replaced by app.vitals.stall.percentage to align with the app.vitals.* namespace for mobile performance attributes",
"_status": "backfill"
},
"alias": [
"app.vitals.stall.percentage"
],
"changelog": [
{
"version": "0.19.0",
"prs": [
493
],
"description": "Deprecated in favor of app.vitals.stall.percentage"
},
{
"version": "0.7.0",
"prs": [
362
],
"description": "Added stall_percentage attribute"
}
]
}
Replaced by app.vitals.ttfd.value to align with the app.vitals.* namespace for mobile performance attributes
Status: backfill
Changelog
v0.5.0#313Added and deprecated in favor of app.vitals.ttfd.value
Raw JSON
{
"key": "time_to_full_display",
"brief": "The duration of time to full display in milliseconds",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 1234.56,
"deprecation": {
"replacement": "app.vitals.ttfd.value",
"reason": "Replaced by app.vitals.ttfd.value to align with the app.vitals.* namespace for mobile performance attributes",
"_status": "backfill"
},
"alias": [
"app.vitals.ttfd.value"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
313
],
"description": "Added and deprecated in favor of app.vitals.ttfd.value"
}
]
}
{
"key": "ttfb",
"brief": "The value of the recorded Time To First Byte (TTFB) web vital in milliseconds",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 194,
"deprecation": {
"replacement": "browser.web_vital.ttfb.value",
"reason": "This attribute is being deprecated in favor of browser.web_vital.ttfb.value",
"_status": "backfill"
},
"alias": [
"browser.web_vital.ttfb.value"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
235
]
}
]
}
Used to reduce repetitiveness of generated tokens. The higher the value, the stronger a penalty is applied to previously present tokens, proportional to how many times they have already appeared in the prompt or prior generation.
{
"key": "ai.frequency_penalty",
"brief": "Used to reduce repetitiveness of generated tokens. The higher the value, the stronger a penalty is applied to previously present tokens, proportional to how many times they have already appeared in the prompt or prior generation.",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 0.5,
"deprecation": {
"replacement": "gen_ai.request.frequency_penalty",
"_status": "backfill"
},
"alias": [
"gen_ai.request.frequency_penalty"
],
"changelog": [
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.1.0",
"prs": [
55,
57,
61,
108
]
}
]
}
{
"key": "ai.preamble",
"brief": "For an AI model call, the preamble parameter. Preambles are a part of the prompt used to adjust the model's overall behavior and conversation style.",
"type": "string",
"apply_scrubbing": {
"key": "auto"
},
"is_in_otel": false,
"visibility": "public",
"example": "You are now a clown.",
"deprecation": {
"replacement": "gen_ai.system_instructions",
"_status": "backfill"
},
"alias": [
"gen_ai.system_instructions"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
264
]
},
{
"version": "0.1.0",
"prs": [
55
]
}
]
}
Used to reduce repetitiveness of generated tokens. Similar to frequency_penalty, except that this penalty is applied equally to all tokens that have already appeared, regardless of their exact frequencies.
{
"key": "ai.response.object",
"brief": "The type of the object returned by the model.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"chat.completion"
],
"deprecation": {
"reason": "This attribute is deprecated. The Sentry conventions have no replacement for the raw Vercel AI response object type.",
"_status": null
},
"changelog": [
{
"version": "0.21.0",
"prs": [
583
],
"description": "Added ai.response.object attribute"
}
]
}
Limits the model to only consider the K most likely next tokens, where K is an integer (e.g., top_k=20 means only the 20 highest probability tokens are considered).
{
"key": "ai.top_k",
"brief": "Limits the model to only consider the K most likely next tokens, where K is an integer (e.g., top_k=20 means only the 20 highest probability tokens are considered).",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 35,
"deprecation": {
"replacement": "gen_ai.request.top_k",
"_status": "backfill"
},
"alias": [
"gen_ai.request.top_k"
],
"changelog": [
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.1.0",
"prs": [
55,
57,
61,
108
]
}
]
}
Limits the model to only consider tokens whose cumulative probability mass adds up to p, where p is a float between 0 and 1 (e.g., top_p=0.7 means only tokens that sum up to 70% of the probability mass are considered).
{
"key": "ai.top_p",
"brief": "Limits the model to only consider tokens whose cumulative probability mass adds up to p, where p is a float between 0 and 1 (e.g., top_p=0.7 means only tokens that sum up to 70% of the probability mass are considered).",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 0.7,
"deprecation": {
"replacement": "gen_ai.request.top_p",
"_status": "backfill"
},
"alias": [
"gen_ai.request.top_p"
],
"changelog": [
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.1.0",
"prs": [
55,
57,
61,
108
]
}
]
}
The sum of all delayed frame durations in seconds during the lifetime of the span. For more information see [frames delay](https://develop.sentry.dev/sdk/performance/frames-delay/).
v0.5.0#313Added app.vitals.frames.delay.value to replace frames.delay
Raw JSON
{
"key": "app.vitals.frames.delay.value",
"brief": "The sum of all delayed frame durations in seconds during the lifetime of the span. For more information see [frames delay](https://develop.sentry.dev/sdk/performance/frames-delay/).",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 5,
"alias": [
"frames.delay"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
313
],
"description": "Added app.vitals.frames.delay.value to replace frames.delay"
}
]
}
The fraction of rendered frames that were frozen, calculated as `app.vitals.frames.frozen.count` divided by `app.vitals.frames.total.count`. This is computed by Relay.
The fraction of rendered frames that were slow, calculated as `app.vitals.frames.slow.count` divided by `app.vitals.frames.total.count`. This is computed by Relay.
The fraction of transaction duration during which the app was stalled, between 0.0 and 1.0. For example, 0.8 represents 80%. Only applies to React Native. This is computed by Relay.
{
"key": "app.vitals.stall.percentage",
"brief": "The fraction of transaction duration during which the app was stalled, between 0.0 and 1.0. For example, 0.8 represents 80%. Only applies to React Native. This is computed by Relay.",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 0.8,
"alias": [
"stall_percentage"
],
"changelog": [
{
"version": "0.19.0",
"prs": [
493
],
"description": "Added app.vitals.stall.percentage attribute"
}
]
}
The screen that is rendered when the app start is complete. This is the screen the user first sees and can interact with after launch. The absence of this attribute on the app start span indicates a background app start where no UI was rendered.
{
"key": "app.vitals.start.screen",
"brief": "The screen that is rendered when the app start is complete. This is the screen the user first sees and can interact with after launch. The absence of this attribute on the app start span indicates a background app start where no UI was rendered.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "MainActivity",
"changelog": [
{
"version": "0.7.0",
"prs": [
353
],
"description": "Added app.vitals.start.screen attribute"
}
]
}
{
"key": "aws.sns.topic.arn",
"brief": "The ARN of the AWS SNS Topic. An Amazon SNS topic is a logical access point that acts as a communication channel.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": "arn:aws:sns:us-east-1:123456789012:mystack-mytopic-NZJ5JSMVGFIE",
"changelog": [
{
"version": "0.16.0",
"prs": [
480
],
"description": "Added aws.sns.topic.arn attribute"
}
]
}
This attribute is being deprecated in favor of aws.extended_request_id, which is the OTel-aligned replacement.
Status: backfill
Changelog
v0.16.0#480Added aws.request.extended_id attribute, deprecated in favor of aws.extended_request_id
Raw JSON
{
"key": "aws.request.extended_id",
"brief": "The AWS extended request ID as returned in the response headers.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "wzHcyEWfmOGDIE5QOhTAqFDoDWP3y8IUvpNINCwL9N4TEHbUw0/gZJ+VZTmCNCWR7fezEN3eCiQ=",
"deprecation": {
"replacement": "aws.extended_request_id",
"reason": "This attribute is being deprecated in favor of aws.extended_request_id, which is the OTel-aligned replacement.",
"_status": "backfill"
},
"alias": [
"aws.extended_request_id"
],
"changelog": [
{
"version": "0.16.0",
"prs": [
480
],
"description": "Added aws.request.extended_id attribute, deprecated in favor of aws.extended_request_id"
}
]
}
This attribute is being deprecated in favor of aws.request_id, which is the OTel-aligned replacement.
Status: backfill
Changelog
v0.16.0#480Added aws.request.id attribute, deprecated in favor of aws.request_id
Raw JSON
{
"key": "aws.request.id",
"brief": "The AWS request ID as returned in the response headers.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "79b9da39-b7ae-508a-a6bc-864b2829c622",
"deprecation": {
"replacement": "aws.request_id",
"reason": "This attribute is being deprecated in favor of aws.request_id, which is the OTel-aligned replacement.",
"_status": "backfill"
},
"alias": [
"aws.request_id"
],
"changelog": [
{
"version": "0.16.0",
"prs": [
480
],
"description": "Added aws.request.id attribute, deprecated in favor of aws.request_id"
}
]
}
The number of reported reasons a page was not restored from the back/forward cache on a back/forward navigation. 0 when the browser reported no reasons (e.g. non-Chromium browsers).
{
"key": "browser.bfcache.not_restored_reason_count",
"brief": "The number of reported reasons a page was not restored from the back/forward cache on a back/forward navigation. 0 when the browser reported no reasons (e.g. non-Chromium browsers).",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
2
],
"changelog": [
{
"version": "0.19.0",
"prs": [
513
],
"description": "Added browser.bfcache.not_restored_reason_count attribute"
}
]
}
Whether a back/forward navigation was restored from the browser's back/forward cache (bfcache). 'hit' means the page was restored; 'miss' means it was reloaded.
A browser-reported reason a page was not restored from the back/forward cache on a back/forward navigation, taken from the notRestoredReasons API. Reported per reason (a single miss can have several). Currently Chromium-only.
{
"key": "browser.bfcache.reason",
"brief": "A browser-reported reason a page was not restored from the back/forward cache on a back/forward navigation, taken from the notRestoredReasons API. Reported per reason (a single miss can have several). Currently Chromium-only.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"unload-listener",
"websocket",
"idbversionchangeevent",
"response-cache-control-no-store"
],
"changelog": [
{
"version": "0.19.0",
"prs": [
513
],
"description": "Added browser.bfcache.reason attribute"
}
]
}
The identifier of the navigation the measurement belongs to, incremented by the browser for each navigation within a page's lifetime.
Examples130
Additional Context
Sourced from `PerformanceEntry.navigationId`, defined by the Soft Navigations spec. Despite its origin it is not soft-navigation specific: the field is set on the `PerformanceNavigationTiming` entry of a hard navigation too.
The value starts at 1 for the initial page load and increments for each subsequent navigation. It is only unique within a single page lifetime, not globally.
A value of 0 is a fallback rather than a real navigation id: web-vitals reports 0 when the browser does not expose `PerformanceEntry.navigationId`, so 0 means the id is unknown.
Pairs with `browser.navigation.type`: the type says how the browser arrived at the page, the id says which navigation of that page a measurement belongs to.
Not to be confused with the Navigation API's `NavigationHistoryEntry.id`, which is an opaque string identifying a history entry rather than a counter, and is not interchangeable with this value.
Also distinct from the `router.navigation.*` attributes, which describe the client-side router's own view of a navigation. Those come from the framework, this one comes from the browser, and both can be set on the same span.
Changelog
v0.24.0#640Document 0 as the fallback value when the browser does not support `navigationId`
{
"key": "browser.navigation.id",
"brief": "The identifier of the navigation the measurement belongs to, incremented by the browser for each navigation within a page's lifetime.",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
1,
3,
0
],
"additional_context": [
"Sourced from `PerformanceEntry.navigationId`, defined by the Soft Navigations spec. Despite its origin it is not soft-navigation specific: the field is set on the `PerformanceNavigationTiming` entry of a hard navigation too.",
"The value starts at 1 for the initial page load and increments for each subsequent navigation. It is only unique within a single page lifetime, not globally.",
"A value of 0 is a fallback rather than a real navigation id: web-vitals reports 0 when the browser does not expose `PerformanceEntry.navigationId`, so 0 means the id is unknown.",
"Pairs with `browser.navigation.type`: the type says how the browser arrived at the page, the id says which navigation of that page a measurement belongs to.",
"Not to be confused with the Navigation API's `NavigationHistoryEntry.id`, which is an opaque string identifying a history entry rather than a counter, and is not interchangeable with this value.",
"Also distinct from the `router.navigation.*` attributes, which describe the client-side router's own view of a navigation. Those come from the framework, this one comes from the browser, and both can be set on the same span."
],
"changelog": [
{
"version": "0.24.0",
"prs": [
640
],
"description": "Document 0 as the fallback value when the browser does not support `navigationId`"
},
{
"version": "0.22.0",
"prs": [
634
],
"description": "Added browser.navigation.id attribute"
}
]
}
Carries the `navigationType` value reported by the web-vitals library verbatim. web-vitals hyphenates the Navigation Timing `PerformanceNavigationTiming.type` value (`back_forward` becomes `back-forward`) and adds states that API does not cover: `back-forward-cache` for a restore from the back/forward cache, `prerender`, `restore` for a discarded tab being reloaded, and `soft-navigation`.
`back-forward-cache` is only set when the page was actually restored from the back/forward cache. A back/forward navigation that missed the cache is a full document load and reports `back-forward`. Use the `browser.bfcache.*` attributes to diagnose misses.
`prerender` pages finish painting before activation, so their paint timings are offset by `browser.performance.navigation.activation_start`. Keep them separate when aggregating web vitals.
Not to be confused with `router.navigation.type`, which holds the client-side router's own vocabulary (`link`, `goto`, `router.push`). The two are independent and can both be set on the same span.
Changelog
v0.24.0#640Use the web-vitals navigation types as-is: `bfcache` is now `back-forward-cache`, and `back-forward` and `restore` are no longer reported as `navigate`
{
"key": "browser.navigation.type",
"brief": "The type of navigation the browser performed to arrive at the page the metrics were measured on.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"navigate",
"reload",
"back-forward",
"back-forward-cache",
"prerender",
"restore",
"soft-navigation"
],
"additional_context": [
"Carries the `navigationType` value reported by the web-vitals library verbatim. web-vitals hyphenates the Navigation Timing `PerformanceNavigationTiming.type` value (`back_forward` becomes `back-forward`) and adds states that API does not cover: `back-forward-cache` for a restore from the back/forward cache, `prerender`, `restore` for a discarded tab being reloaded, and `soft-navigation`.",
"`back-forward-cache` is only set when the page was actually restored from the back/forward cache. A back/forward navigation that missed the cache is a full document load and reports `back-forward`. Use the `browser.bfcache.*` attributes to diagnose misses.",
"`prerender` pages finish painting before activation, so their paint timings are offset by `browser.performance.navigation.activation_start`. Keep them separate when aggregating web vitals.",
"Not to be confused with `router.navigation.type`, which holds the client-side router's own vocabulary (`link`, `goto`, `router.push`). The two are independent and can both be set on the same span."
],
"changelog": [
{
"version": "0.24.0",
"prs": [
640
],
"description": "Use the web-vitals navigation types as-is: `bfcache` is now `back-forward-cache`, and `back-forward` and `restore` are no longer reported as `navigate`"
},
{
"version": "0.22.0",
"prs": [
600
],
"description": "Added browser.navigation.type attribute"
}
]
}
{
"key": "browser.web_vital.fcp.value",
"brief": "The time it takes for the browser to render the first piece of meaningful content on the screen",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 547.6951,
"alias": [
"fcp"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
235
]
}
]
}
{
"key": "browser.web_vital.fp.value",
"brief": "The time in milliseconds it takes for the browser to render the first pixel on the screen",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 477.1926,
"alias": [
"fp"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
235
]
}
]
}
One of `click`, `hover`, `drag` or `press`, derived from the DOM event name of the Event Timing entry: pointer, mouse and touch events map to `click`, `mouseover` and similar to `hover`, drag and drop events to `drag`, and keyboard and `input` events to `press`. The same value forms the suffix of the span's `ui.interaction.*` op.
Not to be confused with the `interactionType` of the web-vitals attribution build, which only distinguishes `pointer` and `keyboard`.
Omitted when INP is reported without an interaction to attribute it to, see `browser.web_vital.inp.target`. The op of such a span still falls into `ui.interaction.click` so that it stays within the interaction span family, which makes this attribute, not the op, the way to tell a real click from a value with no interaction.
{
"key": "browser.web_vital.inp.interaction_type",
"brief": "The kind of user interaction INP was reported on",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"click",
"hover",
"drag",
"press"
],
"additional_context": [
"One of `click`, `hover`, `drag` or `press`, derived from the DOM event name of the Event Timing entry: pointer, mouse and touch events map to `click`, `mouseover` and similar to `hover`, drag and drop events to `drag`, and keyboard and `input` events to `press`. The same value forms the suffix of the span's `ui.interaction.*` op.",
"Not to be confused with the `interactionType` of the web-vitals attribution build, which only distinguishes `pointer` and `keyboard`.",
"Omitted when INP is reported without an interaction to attribute it to, see `browser.web_vital.inp.target`. The op of such a span still falls into `ui.interaction.click` so that it stays within the interaction span family, which makes this attribute, not the op, the way to tell a real click from a value with no interaction."
],
"changelog": [
{
"version": "0.24.0",
"prs": [
641
],
"description": "Added browser.web_vital.inp.interaction_type attribute"
}
]
}
Named after `PerformanceEventTiming.target`, the way `browser.web_vital.lcp.element` is named after `LargestContentfulPaint.element`. The value uses the same format as that attribute.
Omitted when INP is reported without an interaction to attribute it to. web-vitals reports such a value for a soft navigation whose interactions all stayed below the Event Timing duration threshold, so there is no element to name. The span is still named and still carries `browser.web_vital.inp.value`.
{
"key": "browser.web_vital.inp.target",
"brief": "The HTML element selector or component name of the element the user interacted with, for the interaction INP was reported on",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"body > div#app > button.submit",
"SubmitButton"
],
"additional_context": [
"Named after `PerformanceEventTiming.target`, the way `browser.web_vital.lcp.element` is named after `LargestContentfulPaint.element`. The value uses the same format as that attribute.",
"Omitted when INP is reported without an interaction to attribute it to. web-vitals reports such a value for a soft navigation whose interactions all stayed below the Event Timing duration threshold, so there is no element to name. The span is still named and still carries `browser.web_vital.inp.value`."
],
"changelog": [
{
"version": "0.24.0",
"prs": [
641
],
"description": "Added browser.web_vital.inp.target attribute"
}
]
}
{
"key": "browser.web_vital.lcp.id",
"brief": "The id of the dom element responsible for the largest contentful paint",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "#gero",
"alias": [
"lcp.id"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
233
]
}
]
}
{
"key": "browser.web_vital.lcp.load_time",
"brief": "The time it took for the LCP element to be loaded",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 1402,
"alias": [
"lcp.loadTime"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
233
]
}
]
}
{
"key": "browser.web_vital.lcp.render_time",
"brief": "The time it took for the LCP element to be rendered",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 1685,
"alias": [
"lcp.renderTime"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
233
]
}
]
}
{
"key": "browser.web_vital.ttfb.request_time",
"brief": "The time it takes for the server to process the initial request and send the first byte of a response to the user's browser",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 1554.5814,
"alias": [
"ttfb.requestTime"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
235
]
}
]
}
{
"key": "browser.web_vital.ttfb.value",
"brief": "The value of the recorded Time To First Byte (TTFB) web vital in Milliseconds",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 194.3322,
"alias": [
"ttfb"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
235
]
}
]
}
The event that caused the SDK to report CLS (pagehide or navigation)
Examplenavigation
No replacement available at this time.
The JavaScript SDK stopped setting this in v11. With per-navigation web vitals, web-vitals decides when the CLS value is final, so there is no report event to record. No replacement.
Changelog
v0.24.0#642Deprecated browser.web_vital.cls.report_event, which has no replacement
{
"key": "browser.web_vital.cls.report_event",
"brief": "The event that caused the SDK to report CLS (pagehide or navigation)",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "navigation",
"deprecation": {
"reason": "The JavaScript SDK stopped setting this in v11. With per-navigation web vitals, web-vitals decides when the CLS value is final, so there is no report event to record. No replacement.",
"_status": null
},
"changelog": [
{
"version": "0.24.0",
"prs": [
642
],
"description": "Deprecated browser.web_vital.cls.report_event, which has no replacement"
},
{
"version": "0.5.0",
"prs": [
319
],
"description": "Added browser.web_vital.cls.report_event attribute"
}
]
}
The event that caused the SDK to report LCP (pagehide or navigation)
Examplepagehide
No replacement available at this time.
The JavaScript SDK stopped setting this in v11. With per-navigation web vitals, web-vitals decides when the LCP value is final, so there is no report event to record. No replacement.
Changelog
v0.24.0#642Deprecated browser.web_vital.lcp.report_event, which has no replacement
{
"key": "browser.web_vital.lcp.report_event",
"brief": "The event that caused the SDK to report LCP (pagehide or navigation)",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "pagehide",
"deprecation": {
"reason": "The JavaScript SDK stopped setting this in v11. With per-navigation web vitals, web-vitals decides when the LCP value is final, so there is no report event to record. No replacement.",
"_status": null
},
"changelog": [
{
"version": "0.24.0",
"prs": [
642
],
"description": "Deprecated browser.web_vital.lcp.report_event, which has no replacement"
},
{
"version": "0.5.0",
"prs": [
319
],
"description": "Added browser.web_vital.lcp.report_event attribute"
}
]
}
{
"key": "cache.item_age",
"brief": "The age of the cache entry in seconds, measured at read time.",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
5,
3600
],
"search_alias": {
"name": "cache.item_age",
"type": "second"
},
"additional_context": [
"Set on reads that return an entry. Absent on a miss, or when the cache does not report a write time.",
"Clamped to 0. On a shared cache, the writer's clock and the reader's clock can drift far enough to make the age negative.",
"Can exceed `cache.ttl`. A cache that discards an expired entry on read still reports the age of that entry, with `cache.hit: false`."
],
"changelog": [
{
"version": "0.23.0",
"prs": [
637
],
"description": "Added cache.item_age attribute"
}
]
}
{
"key": "cache.tags",
"brief": "The tags attached to the cache entry. Tags group entries so a cache can invalidate them together.",
"type": "string[]",
"apply_scrubbing": {
"key": "auto",
"reason": "Applications pick tag values freely and often build them from record identifiers such as a user id."
},
"is_in_otel": false,
"visibility": "public",
"examples": [
[
"blog-posts",
"post-42"
],
[
"products"
]
],
"additional_context": [
"Cache library examples that support tags: Next.js `cacheTag()`, Symfony `ItemInterface::tag()`, Laravel `Cache::tags()`.",
"HTTP caches take tags from a response header. Cloudflare reads `Cache-Tag`, Fastly reads `Surrogate-Key`.",
"Record only the tags the application declared. Leave out implicit tags that the framework adds itself, for example one tag per route.",
"The tags describe the entry, not the operation. Take them from the entry the cache returned or stored."
],
"changelog": [
{
"version": "0.23.0",
"prs": [
637
],
"description": "Added cache.tags attribute"
}
]
}
This can be an identifier for a resource in AWS, GCP, or Azure. There may be some overlap in values found here with other attributes. For instance, an AWS lambda ARN may be found here as well as in `aws.lambda.invoked_arn`. OTEL recommends setting them alongside each other.
{
"key": "cloud.resource_id",
"brief": "Cloud provider-specific native identifier of the monitored cloud resource",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": "arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function",
"alias": [
"faas.id"
],
"additional_context": [
"This can be an identifier for a resource in AWS, GCP, or Azure. There may be some overlap in values found here with other attributes. For instance, an AWS lambda ARN may be found here as well as in `aws.lambda.invoked_arn`. OTEL recommends setting them alongside each other."
],
"changelog": [
{
"version": "0.16.0",
"prs": [
475
],
"description": "Added faas.id as an alias"
},
{
"version": "0.11.1",
"prs": [
414
]
}
]
}
{
"key": "cls.source.<key>",
"brief": "The HTML elements or components responsible for the layout shift. <key> is a numeric index from 1 to N",
"has_dynamic_suffix": true,
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "body > div#app",
"deprecation": {
"replacement": "browser.web_vital.cls.source.<key>",
"reason": "The CLS source is now recorded as a browser.web_vital.cls.source.<key> attribute.",
"_status": "backfill"
},
"alias": [
"browser.web_vital.cls.source.<key>"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
234
]
}
]
}
{
"key": "code.line.number",
"brief": "The line number in code.filepath best representing the operation. It SHOULD point within the code unit named in code.function",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": 42,
"alias": [
"code.lineno"
],
"changelog": [
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.0.0"
}
]
}
The 'namespace' within which code.function is defined. Usually the qualified class or module name, such that code.namespace + some separator + code.function form a unique identifier for the code unit.
{
"key": "code.namespace",
"brief": "The 'namespace' within which code.function is defined. Usually the qualified class or module name, such that code.namespace + some separator + code.function form a unique identifier for the code unit.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": "http.handler",
"changelog": [
{
"version": "0.1.0",
"prs": [
61,
74
]
},
{
"version": "0.0.0"
}
]
}
Old attribute name (no official namespace), to be replaced with network.connection.rtt for span-first future
Status: backfill
Changelog
v0.5.0#279Added and deprecated attribute to document JS SDK's current behaviour
Raw JSON
{
"key": "connection.rtt",
"brief": "Specifies the estimated effective round-trip time of the current connection, in milliseconds.",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 100,
"deprecation": {
"replacement": "network.connection.rtt",
"reason": "Old attribute name (no official namespace), to be replaced with network.connection.rtt for span-first future",
"_status": "backfill"
},
"alias": [
"network.connection.rtt"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
279
],
"description": "Added and deprecated attribute to document JS SDK's current behaviour"
}
]
}
The number of queries included in a batch operation. Operations are only considered batches when they contain two or more operations, and so db.operation.batch.size SHOULD never be 1.
{
"key": "db.operation.batch.size",
"brief": "The number of queries included in a batch operation. Operations are only considered batches when they contain two or more operations, and so db.operation.batch.size SHOULD never be 1.",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": 3,
"changelog": [
{
"version": "0.11.0",
"prs": [
407
],
"description": "Added db.operation.batch.size attribute"
}
]
}
A query parameter used in db.query.text, with <key> being the parameter name, and the attribute value being a string representation of the parameter value.
Exampledb.query.parameter.foo='123'
Dynamic SuffixYes - the key contains dynamic parts
{
"key": "db.query.parameter.<key>",
"brief": "A query parameter used in db.query.text, with <key> being the parameter name, and the attribute value being a string representation of the parameter value.",
"has_dynamic_suffix": true,
"type": "string",
"apply_scrubbing": {
"key": "auto"
},
"is_in_otel": true,
"visibility": "public",
"example": "db.query.parameter.foo='123'",
"changelog": [
{
"version": "0.1.0",
"prs": [
103,
127
]
}
]
}
A shortened representation of operation(s) in the full query. This attribute must be low-cardinality and should only contain the operation table names.
The database parameterized query being executed. Any parameter values (filters, insertion values, etc) should be replaced with parameter placeholders. If applicable, use `db.query.parameter.<key>` to add the parameter value.
Database response status code. The status code returned by the database. Usually it represents an error code, but may also represent partial success, warning, or differentiate between various types of successful outcomes.
{
"key": "db.response.status_code",
"brief": "Database response status code. The status code returned by the database. Usually it represents an error code, but may also represent partial success, warning, or differentiate between various types of successful outcomes.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": "ORA-17002",
"changelog": [
{
"version": "0.16.0",
"prs": [
462
],
"description": "Added db.response.status_code attribute"
}
]
}
An identifier for the database management system (DBMS) product being used. See [OpenTelemetry docs](https://github.com/open-telemetry/semantic-conventions/blob/main/docs/database/database-spans.md#notes-and-well-known-identifiers-for-dbsystem) for a list of well-known identifiers.
The connection string used to connect to the database.
Examplesredis://localhost:6379
No replacement available at this time.
This attribute is deprecated. The connection is described by server.address and server.port instead, so the value cannot be copied to a single replacement attribute.
{
"key": "db.connection_string",
"brief": "The connection string used to connect to the database.",
"type": "string",
"apply_scrubbing": {
"key": "auto"
},
"is_in_otel": true,
"visibility": "public",
"examples": [
"redis://localhost:6379"
],
"deprecation": {
"reason": "This attribute is deprecated. The connection is described by server.address and server.port instead, so the value cannot be copied to a single replacement attribute.",
"_status": null
},
"changelog": [
{
"version": "0.21.0",
"prs": [
581
],
"description": "Added db.connection_string attribute"
}
]
}
An identifier for the database management system (DBMS) product being used. See [OpenTelemetry docs](https://github.com/open-telemetry/semantic-conventions/blob/main/docs/database/database-spans.md#notes-and-well-known-identifiers-for-dbsystem) for a list of well-known identifiers.
The classification of the device. For example, `low`, `medium`, or `high`. Typically inferred by Relay - SDKs generally do not need to set this directly.
{
"key": "device.class",
"brief": "The classification of the device. For example, `low`, `medium`, or `high`. Typically inferred by Relay - SDKs generally do not need to set this directly.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "medium",
"changelog": [
{
"version": "0.5.0",
"prs": [
300
],
"description": "Added device.class attribute"
}
]
}
The estimated total memory capacity of the device, only a rough estimation in gigabytes. Browsers report estimations in buckets of powers of 2, mostly capped at 8 GB
v0.5.0#281Added attribute device.memory.estimated_capacity to be used instead of deviceMemory
Raw JSON
{
"key": "device.memory.estimated_capacity",
"brief": "The estimated total memory capacity of the device, only a rough estimation in gigabytes. Browsers report estimations in buckets of powers of 2, mostly capped at 8 GB",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 8,
"alias": [
"deviceMemory"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
281
],
"description": "Added attribute device.memory.estimated_capacity to be used instead of deviceMemory"
}
]
}
This attribute is being deprecated in favor of network.connection.type
Status: backfill
Changelog
v0.5.0#303Added and deprecated device.connection_type in favor of network.connection.type
Raw JSON
{
"key": "device.connection_type",
"brief": "The internet connection type currently being used by the device.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "wifi",
"deprecation": {
"replacement": "network.connection.type",
"reason": "This attribute is being deprecated in favor of network.connection.type",
"_status": "backfill"
},
"alias": [
"network.connection.type",
"connectionType"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
303
],
"description": "Added and deprecated device.connection_type in favor of network.connection.type"
}
]
}
{
"key": "django.function_name",
"brief": "The fully qualified name of a function used in a Django context.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"django.contrib.sessions.middleware.SessionMiddleware"
],
"deprecation": {
"replacement": "code.function.name",
"reason": "This attribute is being deprecated in favor of code.function.name, which is the framework-agnostic replacement.",
"_status": "backfill"
},
"alias": [
"code.function.name",
"code.function"
],
"changelog": [
{
"version": "0.19.0",
"prs": [
538
],
"description": "Added django.function_name attribute"
}
]
}
SHOULD be set to true if the exception event is recorded at a point where it is known that the exception is escaping the scope of the span.
Exampletrue
Changelog
v0.0.0
Raw JSON
{
"key": "exception.escaped",
"brief": "SHOULD be set to true if the exception event is recorded at a point where it is known that the exception is escaping the scope of the span.",
"type": "boolean",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": true,
"changelog": [
{
"version": "0.0.0"
}
]
}
A stacktrace as a string in the natural representation for the language runtime. The representation is to be determined and documented by each language SIG.
ExampleException in thread "main" java.lang.RuntimeException: Test exception
at com.example.GenerateTrace.methodB(GenerateTrace.java:13)
at com.example.GenerateTrace.methodA(GenerateTrace.java:9)
at com.example.GenerateTrace.main(GenerateTrace.java:5)
{
"key": "exception.stacktrace",
"brief": "A stacktrace as a string in the natural representation for the language runtime. The representation is to be determined and documented by each language SIG.",
"type": "string",
"apply_scrubbing": {
"key": "auto"
},
"is_in_otel": true,
"visibility": "public",
"example": "Exception in thread \"main\" java.lang.RuntimeException: Test exception\n at com.example.GenerateTrace.methodB(GenerateTrace.java:13)\n at com.example.GenerateTrace.methodA(GenerateTrace.java:9)\n at com.example.GenerateTrace.main(GenerateTrace.java:5)",
"changelog": [
{
"version": "0.1.0",
"prs": [
127
]
},
{
"version": "0.0.0"
}
]
}
The type of the exception (its fully-qualified class name, if applicable). The dynamic type of the exception should be preferred over the static type in languages that support it.
{
"key": "exception.type",
"brief": "The type of the exception (its fully-qualified class name, if applicable). The dynamic type of the exception should be preferred over the static type in languages that support it.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": "OSError",
"changelog": [
{
"version": "0.1.0",
"prs": [
127
]
},
{
"version": "0.0.0"
}
]
}
A boolean that is true if the serverless function is executed for the first time (aka cold-start).
Exampletrue
Changelog
v0.0.0
Raw JSON
{
"key": "faas.coldstart",
"brief": "A boolean that is true if the serverless function is executed for the first time (aka cold-start).",
"type": "boolean",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": true,
"changelog": [
{
"version": "0.0.0"
}
]
}
The Service Account (GCP), IAM Execution Role (AWS), or Managed Identity (Azure) used by the serverless function when interacting with other cloud services
{
"key": "faas.identity",
"brief": "The Service Account (GCP), IAM Execution Role (AWS), or Managed Identity (Azure) used by the serverless function when interacting with other cloud services",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "name@project.iam.gserviceaccount.com (GCP), arn:aws:iam::123456789012:role/role-name (AWS), 00000000-0000-0000-0000-000000000000 (Azure)",
"changelog": [
{
"version": "0.11.0",
"prs": [
403
]
}
]
}
This attribute is being deprecated in favor of faas.invocation_id, which is the OTel-aligned replacement.
Status: backfill
Changelog
v0.16.0#473Added faas.execution attribute, deprecated in favor of faas.invocation_id
Raw JSON
{
"key": "faas.execution",
"brief": "The execution ID of the current function execution.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "af9d5aa4-a685-4c5f-a22b-444f80b3cc28",
"deprecation": {
"replacement": "faas.invocation_id",
"reason": "This attribute is being deprecated in favor of faas.invocation_id, which is the OTel-aligned replacement.",
"_status": "backfill"
},
"alias": [
"faas.invocation_id",
"aws.lambda.aws_request_id"
],
"changelog": [
{
"version": "0.16.0",
"prs": [
473
],
"description": "Added faas.execution attribute, deprecated in favor of faas.invocation_id"
}
]
}
This attribute is being deprecated in favor of cloud.resource_id, which is the OTel-aligned replacement (renamed in OTel semantic conventions v1.19.0).
Status: backfill
Changelog
v0.16.0#475Added faas.id attribute, deprecated in favor of cloud.resource_id
Raw JSON
{
"key": "faas.id",
"brief": "The unique ID of the single function that this runtime instance executes.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function",
"deprecation": {
"replacement": "cloud.resource_id",
"reason": "This attribute is being deprecated in favor of cloud.resource_id, which is the OTel-aligned replacement (renamed in OTel semantic conventions v1.19.0).",
"_status": "backfill"
},
"alias": [
"cloud.resource_id"
],
"changelog": [
{
"version": "0.16.0",
"prs": [
475
],
"description": "Added faas.id attribute, deprecated in favor of cloud.resource_id"
}
]
}
An instance of a feature flag evaluation. The value of this attribute is the boolean representing the evaluation result. The <key> suffix is the name of the feature flag.
Exampleflag.evaluation.is_new_ui=true
Dynamic SuffixYes - the key contains dynamic parts
{
"key": "flag.evaluation.<key>",
"brief": "An instance of a feature flag evaluation. The value of this attribute is the boolean representing the evaluation result. The <key> suffix is the name of the feature flag.",
"has_dynamic_suffix": true,
"type": "boolean",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "flag.evaluation.is_new_ui=true",
"changelog": [
{
"version": "0.1.0",
"prs": [
103
]
}
]
}
The sum of all delayed frame durations in seconds during the lifetime of the span. For more information see [frames delay](https://develop.sentry.dev/sdk/performance/frames-delay/).
{
"key": "frames.delay",
"brief": "The sum of all delayed frame durations in seconds during the lifetime of the span. For more information see [frames delay](https://develop.sentry.dev/sdk/performance/frames-delay/).",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 5,
"deprecation": {
"replacement": "app.vitals.frames.delay.value",
"reason": "Replaced by app.vitals.frames.delay.value to align with the app.vitals.* namespace for mobile performance attributes",
"_status": "backfill"
},
"alias": [
"app.vitals.frames.delay.value"
],
"search_alias": {
"name": "mobile.frames_delay",
"type": "second"
},
"changelog": [
{
"version": "0.5.0",
"prs": [
313
],
"description": "Deprecated in favor of app.vitals.frames.delay.value"
},
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.0.0"
}
]
}
This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to calculate total cost, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.
Despite the name 'cost.cache_creation.input_tokens', this value is cost in USD, not a token count. For token counts, use gen_ai.usage.cache_creation.input_tokens.
This is a subset of gen_ai.cost.input_tokens, not an independent cost. Do not sum this with gen_ai.cost.input_tokens — it is already included.
{
"key": "gen_ai.cost.cache_creation.input_tokens",
"brief": "The cost of input tokens written to cache in USD.",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 12.34,
"additional_context": [
"This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to calculate total cost, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.",
"Despite the name 'cost.cache_creation.input_tokens', this value is cost in USD, not a token count. For token counts, use gen_ai.usage.cache_creation.input_tokens.",
"This is a subset of gen_ai.cost.input_tokens, not an independent cost. Do not sum this with gen_ai.cost.input_tokens — it is already included."
],
"changelog": [
{
"version": "0.16.0",
"prs": [],
"description": "Added gen_ai.cost.cache_creation.input_tokens attribute"
}
]
}
This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to calculate total cost, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.
Despite the name 'cost.cache_read.input_tokens', this value is cost in USD, not a token count. For token counts, use gen_ai.usage.cache_read.input_tokens.
This is a subset of gen_ai.cost.input_tokens, not an independent cost. Do not sum this with gen_ai.cost.input_tokens — it is already included.
{
"key": "gen_ai.cost.cache_read.input_tokens",
"brief": "The cost of cached input tokens in USD.",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 12.34,
"additional_context": [
"This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to calculate total cost, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.",
"Despite the name 'cost.cache_read.input_tokens', this value is cost in USD, not a token count. For token counts, use gen_ai.usage.cache_read.input_tokens.",
"This is a subset of gen_ai.cost.input_tokens, not an independent cost. Do not sum this with gen_ai.cost.input_tokens — it is already included."
],
"changelog": [
{
"version": "0.16.0",
"prs": [],
"description": "Added gen_ai.cost.cache_read.input_tokens attribute"
}
]
}
The total cost of all input tokens in USD (includes cached and cache creation tokens).
Example123.45
Additional Context
This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to calculate total cost, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.
Despite the name 'cost.input_tokens', this value is cost in USD, not a token count. For token counts, use gen_ai.usage.input_tokens.
This is the total cost of all input tokens, including cached and cache creation tokens at their respective rates. For the cached portion, see gen_ai.cost.cache_read.input_tokens. For the cache creation portion, see gen_ai.cost.cache_creation.input_tokens.
{
"key": "gen_ai.cost.input_tokens",
"brief": "The total cost of all input tokens in USD (includes cached and cache creation tokens).",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 123.45,
"additional_context": [
"This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to calculate total cost, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.",
"Despite the name 'cost.input_tokens', this value is cost in USD, not a token count. For token counts, use gen_ai.usage.input_tokens.",
"This is the total cost of all input tokens, including cached and cache creation tokens at their respective rates. For the cached portion, see gen_ai.cost.cache_read.input_tokens. For the cache creation portion, see gen_ai.cost.cache_creation.input_tokens."
],
"changelog": [
{
"version": "0.9.0",
"prs": [
397
],
"description": "Add additional_context"
},
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.1.0",
"prs": [
112
]
}
]
}
The total cost of all output tokens in USD (includes reasoning tokens).
Example123.45
Additional Context
This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to calculate total cost, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.
Despite the name 'cost.output_tokens', this value is cost in USD, not a token count. For token counts, use gen_ai.usage.output_tokens.
This is the total cost of all output tokens, including reasoning tokens at their respective rate. For the reasoning portion, see gen_ai.cost.reasoning.output_tokens.
{
"key": "gen_ai.cost.output_tokens",
"brief": "The total cost of all output tokens in USD (includes reasoning tokens).",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 123.45,
"additional_context": [
"This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to calculate total cost, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.",
"Despite the name 'cost.output_tokens', this value is cost in USD, not a token count. For token counts, use gen_ai.usage.output_tokens.",
"This is the total cost of all output tokens, including reasoning tokens at their respective rate. For the reasoning portion, see gen_ai.cost.reasoning.output_tokens."
],
"changelog": [
{
"version": "0.9.0",
"prs": [
397
],
"description": "Add additional_context"
},
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.1.0",
"prs": [
112
]
}
]
}
This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to calculate total cost, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.
Despite the name 'cost.reasoning.output_tokens', this value is cost in USD, not a token count. For token counts, use gen_ai.usage.reasoning.output_tokens.
This is a subset of gen_ai.cost.output_tokens, not an independent cost. Do not sum this with gen_ai.cost.output_tokens — it is already included.
{
"key": "gen_ai.cost.reasoning.output_tokens",
"brief": "The cost of reasoning output tokens in USD.",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 12.34,
"additional_context": [
"This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to calculate total cost, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.",
"Despite the name 'cost.reasoning.output_tokens', this value is cost in USD, not a token count. For token counts, use gen_ai.usage.reasoning.output_tokens.",
"This is a subset of gen_ai.cost.output_tokens, not an independent cost. Do not sum this with gen_ai.cost.output_tokens — it is already included."
],
"changelog": [
{
"version": "0.16.0",
"prs": [],
"description": "Added gen_ai.cost.reasoning.output_tokens attribute"
}
]
}
This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to calculate total cost, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.
Despite the name 'cost.total_tokens', this value is cost in USD, not a token count. For token counts, use gen_ai.usage.total_tokens.
{
"key": "gen_ai.function_id",
"brief": "Framework-specific tracing label for the execution of a function or other unit of execution in a generative AI system.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "my-awesome-function",
"changelog": [
{
"version": "0.5.0",
"prs": [
308
],
"description": "Added gen_ai.function_id attribute"
}
]
}
The messages passed to the model. It has to be a stringified version of an array of objects. The `role` attribute of each object must be `"user"`, `"assistant"`, `"tool"`, or `"system"`. For messages of the role `"tool"`, the `content` can be a string or an arbitrary object with information about the tool call. For other messages the `content` can be either a string or a list of objects in the format `{type: "text", text:"..."}`.
{
"key": "gen_ai.input.messages",
"brief": "The messages passed to the model. It has to be a stringified version of an array of objects. The `role` attribute of each object must be `\"user\"`, `\"assistant\"`, `\"tool\"`, or `\"system\"`. For messages of the role `\"tool\"`, the `content` can be a string or an arbitrary object with information about the tool call. For other messages the `content` can be either a string or a list of objects in the format `{type: \"text\", text:\"...\"}`.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": "[{\"role\": \"user\", \"parts\": [{\"type\": \"text\", \"content\": \"Weather in Paris?\"}]}, {\"role\": \"assistant\", \"parts\": [{\"type\": \"tool_call\", \"id\": \"call_VSPygqKTWdrhaFErNvMV18Yl\", \"name\": \"get_weather\", \"arguments\": {\"location\": \"Paris\"}}]}, {\"role\": \"tool\", \"parts\": [{\"type\": \"tool_call_response\", \"id\": \"call_VSPygqKTWdrhaFErNvMV18Yl\", \"result\": \"rainy, 57°F\"}]}]",
"alias": [
"ai.texts",
"ai.prompt.messages",
"gen_ai.prompt",
"ai.prompt"
],
"changelog": [
{
"version": "0.21.0",
"prs": [
583
],
"description": "Added ai.prompt as an alias"
},
{
"version": "0.5.0",
"prs": [
264
]
},
{
"version": "0.4.0",
"prs": [
221
]
}
]
}
The name of the operation being performed. It has the following list of well-known values: 'chat', 'create_agent', 'embeddings', 'execute_tool', 'generate_content', 'invoke_agent', 'text_completion'. If one of them applies, then that value MUST be used. Otherwise a custom value MAY be used.
{
"key": "gen_ai.operation.name",
"brief": "The name of the operation being performed. It has the following list of well-known values: 'chat', 'create_agent', 'embeddings', 'execute_tool', 'generate_content', 'invoke_agent', 'text_completion'. If one of them applies, then that value MUST be used. Otherwise a custom value MAY be used.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": "chat",
"changelog": [
{
"version": "0.4.0",
"prs": [
225
]
},
{
"version": "0.1.0",
"prs": [
62,
127
]
}
]
}
The type of AI operation. Must be one of 'agent' (invoke_agent and create_agent spans), 'ai_client' (any LLM call), 'tool' (execute_tool spans), 'handoff' (handoff spans), 'other' (input and output processors, skill loading, guardrails etc.) . Added during ingestion based on span.op and gen_ai.operation.type. Used to filter and aggregate data in the UI
{
"key": "gen_ai.operation.type",
"brief": "The type of AI operation. Must be one of 'agent' (invoke_agent and create_agent spans), 'ai_client' (any LLM call), 'tool' (execute_tool spans), 'handoff' (handoff spans), 'other' (input and output processors, skill loading, guardrails etc.) . Added during ingestion based on span.op and gen_ai.operation.type. Used to filter and aggregate data in the UI",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "tool",
"changelog": [
{
"version": "0.4.0",
"prs": [
257
]
},
{
"version": "0.1.0",
"prs": [
113,
127
]
}
]
}
The model's response messages. It has to be a stringified version of an array of message objects, which can include text responses and tool calls.
Example[{"role": "assistant", "parts": [{"type": "text", "content": "The weather in Paris is currently rainy with a temperature of 57°F."}], "finish_reason": "stop"}]
{
"key": "gen_ai.output.messages",
"brief": "The model's response messages. It has to be a stringified version of an array of message objects, which can include text responses and tool calls.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": "[{\"role\": \"assistant\", \"parts\": [{\"type\": \"text\", \"content\": \"The weather in Paris is currently rainy with a temperature of 57°F.\"}], \"finish_reason\": \"stop\"}]",
"alias": [
"ai.response.toolCalls",
"ai.response.text"
],
"changelog": [
{
"version": "0.4.0",
"prs": [
221
]
}
]
}
Used to reduce repetitiveness of generated tokens. The higher the value, the stronger a penalty is applied to previously present tokens, proportional to how many times they have already appeared in the prompt or prior generation.
{
"key": "gen_ai.request.frequency_penalty",
"brief": "Used to reduce repetitiveness of generated tokens. The higher the value, the stronger a penalty is applied to previously present tokens, proportional to how many times they have already appeared in the prompt or prior generation.",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": 0.5,
"alias": [
"ai.frequency_penalty"
],
"changelog": [
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.1.0",
"prs": [
57
]
}
]
}
Used to reduce repetitiveness of generated tokens. Similar to frequency_penalty, except that this penalty is applied equally to all tokens that have already appeared, regardless of their exact frequencies.
{
"key": "gen_ai.request.seed",
"brief": "The seed, ideally models given the same seed and same other parameters will produce the exact same output.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": "1234567890",
"alias": [
"ai.seed"
],
"changelog": [
{
"version": "0.1.0",
"prs": [
57,
127
]
}
]
}
Limits the model to only consider the K most likely next tokens, where K is an integer (e.g., top_k=20 means only the 20 highest probability tokens are considered).
{
"key": "gen_ai.request.top_k",
"brief": "Limits the model to only consider the K most likely next tokens, where K is an integer (e.g., top_k=20 means only the 20 highest probability tokens are considered).",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": 35,
"alias": [
"ai.top_k"
],
"changelog": [
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.1.0",
"prs": [
57
]
}
]
}
Limits the model to only consider tokens whose cumulative probability mass adds up to p, where p is a float between 0 and 1 (e.g., top_p=0.7 means only tokens that sum up to 70% of the probability mass are considered).
{
"key": "gen_ai.request.top_p",
"brief": "Limits the model to only consider tokens whose cumulative probability mass adds up to p, where p is a float between 0 and 1 (e.g., top_p=0.7 means only tokens that sum up to 70% of the probability mass are considered).",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": 0.7,
"alias": [
"ai.top_p"
],
"changelog": [
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.1.0",
"prs": [
57
]
}
]
}
{
"key": "gen_ai.tool.call.arguments",
"brief": "The arguments of the tool call. It has to be a stringified version of the arguments to the tool.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": "{\"location\": \"Paris\"}",
"alias": [
"gen_ai.tool.input",
"ai.toolCall.args"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
265
]
},
{
"version": "0.4.0",
"prs": [
221
]
}
]
}
{
"key": "gen_ai.tool.call.result",
"brief": "The result of the tool call. It has to be a stringified version of the result of the tool.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": "rainy, 57°F",
"alias": [
"gen_ai.tool.output",
"gen_ai.tool.message",
"mcp.tool.result.content",
"ai.toolCall.result"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
265
]
},
{
"version": "0.4.0",
"prs": [
221
]
}
]
}
The list of source system tool definitions available to the GenAI agent or model.
Example[{"type": "function", "name": "get_current_weather", "description": "Get the current weather in a given location", "parameters": {"type": "object", "properties": {"location": {"type": "string", "description": "The city and state, e.g. San Francisco, CA"}, "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}}, "required": ["location", "unit"]}}]
{
"key": "gen_ai.tool.description",
"brief": "The description of the tool being used.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": "Searches the web for current information about a topic",
"changelog": [
{
"version": "0.1.0",
"prs": [
62,
127
]
}
]
}
This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.
Changelog
v0.24.0#582Added gen_ai.usage.cache_creation_input_tokens as an alias
This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.
This is a subset of gen_ai.usage.input_tokens, not an independent count. Do not sum this with gen_ai.usage.input_tokens — it is already included.
Changelog
v0.24.0#582Added gen_ai.usage.cache_read_input_tokens as an alias
{
"key": "gen_ai.usage.cache_read.input_tokens",
"brief": "The number of cached tokens used to process the AI input (prompt).",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": 50,
"alias": [
"gen_ai.usage.input_tokens.cached",
"gen_ai.usage.cache_read_input_tokens"
],
"additional_context": [
"This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.",
"This is a subset of gen_ai.usage.input_tokens, not an independent count. Do not sum this with gen_ai.usage.input_tokens — it is already included."
],
"changelog": [
{
"version": "0.24.0",
"prs": [
582
],
"description": "Added gen_ai.usage.cache_read_input_tokens as an alias"
},
{
"version": "0.11.0",
"prs": [
418
],
"description": "Added gen_ai.usage.cache_read.input_tokens attribute"
}
]
}
This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.
This count includes cached input tokens. gen_ai.usage.cache_read.input_tokens is a subset of this value, not an independent count — do not sum them together.
Changelog
v0.11.0#418Update additional_context to reference gen_ai.usage.cache_read.input_tokens
This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.
This count includes reasoning tokens. gen_ai.usage.reasoning.output_tokens is a subset of this value, not an independent count — do not sum them together.
Changelog
v0.11.0#418Update additional_context to reference gen_ai.usage.reasoning.output_tokens
This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.
This is a subset of gen_ai.usage.output_tokens, not an independent count. Do not sum this with gen_ai.usage.output_tokens — it is already included.
{
"key": "gen_ai.usage.reasoning.output_tokens",
"brief": "The number of tokens used for reasoning to create the AI output.",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": 75,
"alias": [
"gen_ai.usage.output_tokens.reasoning"
],
"additional_context": [
"This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.",
"This is a subset of gen_ai.usage.output_tokens, not an independent count. Do not sum this with gen_ai.usage.output_tokens — it is already included."
],
"changelog": [
{
"version": "0.11.0",
"prs": [
418
],
"description": "Added gen_ai.usage.reasoning.output_tokens attribute"
}
]
}
This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.
This is the sum of gen_ai.usage.input_tokens and gen_ai.usage.output_tokens. Do not sum this with either of them — they are already included.
{
"key": "gen_ai.usage.total_tokens",
"brief": "The total number of tokens used to process the prompt. (input tokens plus output todkens)",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 20,
"alias": [
"ai.total_tokens.used",
"ai.usage.tokens"
],
"additional_context": [
"This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.",
"This is the sum of gen_ai.usage.input_tokens and gen_ai.usage.output_tokens. Do not sum this with either of them — they are already included."
],
"changelog": [
{
"version": "0.21.0",
"prs": [
583
],
"description": "Added ai.usage.tokens as an alias"
},
{
"version": "0.9.0",
"prs": [
397
],
"description": "Add additional_context"
},
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.1.0",
"prs": [
57
]
}
]
}
The available tools for the model. It has to be a stringified version of an array of objects.
Example[{"name": "get_weather", "description": "Get the weather for a given location"}, {"name": "get_news", "description": "Get the news for a given topic"}]
{
"key": "gen_ai.request.available_tools",
"brief": "The available tools for the model. It has to be a stringified version of an array of objects.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "[{\"name\": \"get_weather\", \"description\": \"Get the weather for a given location\"}, {\"name\": \"get_news\", \"description\": \"Get the news for a given topic\"}]",
"deprecation": {
"replacement": "gen_ai.tool.definitions",
"_status": "normalize"
},
"alias": [
"gen_ai.tool.definitions"
],
"changelog": [
{
"version": "0.22.0",
"prs": [
595
],
"description": "Added gen_ai.tool.definitions as an alias"
},
{
"version": "0.4.0",
"prs": [
221
]
},
{
"version": "0.1.0",
"prs": [
63,
127
]
}
]
}
The messages passed to the model. It has to be a stringified version of an array of objects. The `role` attribute of each object must be `"user"`, `"assistant"`, `"tool"`, or `"system"`. For messages of the role `"tool"`, the `content` can be a string or an arbitrary object with information about the tool call. For other messages the `content` can be either a string or a list of objects in the format `{type: "text", text:"..."}`.
Example[{"role": "system", "content": "Generate a random number."}, {"role": "user", "content": [{"text": "Generate a random number between 0 and 10.", "type": "text"}]}, {"role": "tool", "content": {"toolCallId": "1", "toolName": "Weather", "output": "rainy"}}]
{
"key": "gen_ai.request.messages",
"brief": "The messages passed to the model. It has to be a stringified version of an array of objects. The `role` attribute of each object must be `\"user\"`, `\"assistant\"`, `\"tool\"`, or `\"system\"`. For messages of the role `\"tool\"`, the `content` can be a string or an arbitrary object with information about the tool call. For other messages the `content` can be either a string or a list of objects in the format `{type: \"text\", text:\"...\"}`.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "[{\"role\": \"system\", \"content\": \"Generate a random number.\"}, {\"role\": \"user\", \"content\": [{\"text\": \"Generate a random number between 0 and 10.\", \"type\": \"text\"}]}, {\"role\": \"tool\", \"content\": {\"toolCallId\": \"1\", \"toolName\": \"Weather\", \"output\": \"rainy\"}}]",
"deprecation": {
"replacement": "gen_ai.input.messages",
"_status": "transform",
"transformation": "gen_ai_request_messages_to_input_messages"
},
"alias": [
"ai.input_messages"
],
"changelog": [
{
"version": "0.4.0",
"prs": [
221
]
},
{
"version": "0.1.0",
"prs": [
63,
74,
108,
119,
122
]
}
]
}
{
"key": "gen_ai.response.object",
"brief": "The type of the object returned by the model.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"chat.completion"
],
"deprecation": {
"reason": "This attribute is deprecated. The Sentry conventions have no replacement for the raw response object type.",
"_status": null
},
"changelog": [
{
"version": "0.21.0",
"prs": [
583
],
"description": "Added gen_ai.response.object attribute"
}
]
}
The model's response text messages. It has to be a stringified version of an array of response text messages.
Example["The weather in Paris is rainy and overcast, with temperatures around 57°F", "The weather in London is sunny and warm, with temperatures around 65°F"]
{
"key": "gen_ai.response.text",
"brief": "The model's response text messages. It has to be a stringified version of an array of response text messages.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "[\"The weather in Paris is rainy and overcast, with temperatures around 57°F\", \"The weather in London is sunny and warm, with temperatures around 65°F\"]",
"deprecation": {
"replacement": "gen_ai.output.messages",
"_status": "transform",
"transformation": "gen_ai_response_to_output_messages"
},
"alias": [],
"changelog": [
{
"version": "0.4.0",
"prs": [
221
]
},
{
"version": "0.1.0",
"prs": [
63,
74
]
}
]
}
This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.
This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.
Changelog
v0.24.0#582Added gen_ai.usage.cache_creation_input_tokens as an alias
v0.11.0#418Deprecate in favor of gen_ai.usage.cache_creation.input_tokens
This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.
This is a subset of gen_ai.usage.input_tokens, not an independent count. Do not sum this with gen_ai.usage.input_tokens — it is already included.
Changelog
v0.24.0#582Added gen_ai.usage.cache_read_input_tokens as an alias
v0.11.0#418Deprecate in favor of gen_ai.usage.cache_read.input_tokens
{
"key": "gen_ai.usage.input_tokens.cached",
"brief": "The number of cached tokens used to process the AI input (prompt).",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 50,
"deprecation": {
"replacement": "gen_ai.usage.cache_read.input_tokens",
"_status": "backfill"
},
"alias": [
"gen_ai.usage.cache_read.input_tokens",
"gen_ai.usage.cache_read_input_tokens"
],
"additional_context": [
"This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.",
"This is a subset of gen_ai.usage.input_tokens, not an independent count. Do not sum this with gen_ai.usage.input_tokens — it is already included."
],
"changelog": [
{
"version": "0.24.0",
"prs": [
582
],
"description": "Added gen_ai.usage.cache_read_input_tokens as an alias"
},
{
"version": "0.11.0",
"prs": [
418
],
"description": "Deprecate in favor of gen_ai.usage.cache_read.input_tokens"
},
{
"version": "0.9.0",
"prs": [
397
],
"description": "Add additional_context"
},
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.1.0",
"prs": [
62,
112
]
}
]
}
This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.
This is a subset of gen_ai.usage.output_tokens, not an independent count. Do not sum this with gen_ai.usage.output_tokens — it is already included.
Changelog
v0.11.0#418Deprecate in favor of gen_ai.usage.reasoning.output_tokens
{
"key": "gen_ai.usage.output_tokens.reasoning",
"brief": "The number of tokens used for reasoning to create the AI output.",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 75,
"deprecation": {
"replacement": "gen_ai.usage.reasoning.output_tokens",
"_status": "backfill"
},
"alias": [
"gen_ai.usage.reasoning.output_tokens"
],
"additional_context": [
"This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.",
"This is a subset of gen_ai.usage.output_tokens, not an independent count. Do not sum this with gen_ai.usage.output_tokens — it is already included."
],
"changelog": [
{
"version": "0.11.0",
"prs": [
418
],
"description": "Deprecate in favor of gen_ai.usage.reasoning.output_tokens"
},
{
"version": "0.9.0",
"prs": [
397
],
"description": "Add additional_context"
},
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.1.0",
"prs": [
62,
112
]
}
]
}
This attribute appears on both agent parent spans (aggregated totals) and LLM child spans (per-call values). When using sum() to count tokens, filter to gen_ai.operation.type:ai_client to avoid double-counting hierarchical spans.
Scrubbing ReasonThe document may contain sensitive information in arguments or variables. Instrumentation should redact sensitive information when possible.
Examplequery findBookById { bookById(id: ?) { name } }
Well-known values are request, parse, validate, variable_coercion, plan, execute, subscription_event, step_execute, resolve, dataloader_dispatch, dataloader_batch and _OTHER. Use one of these if it applies, otherwise a custom value.
Not to be confused with graphql.operation.type, which holds the GraphQL operation type (query, mutation, subscription) and only applies to spans that run an operation.
{
"key": "graphql.processing.type",
"brief": "The type of processing represented by this span.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"parse",
"validate",
"execute",
"resolve"
],
"additional_context": [
"Well-known values are request, parse, validate, variable_coercion, plan, execute, subscription_event, step_execute, resolve, dataloader_dispatch, dataloader_batch and _OTHER. Use one of these if it applies, otherwise a custom value.",
"Not to be confused with graphql.operation.type, which holds the GraphQL operation type (query, mutation, subscription) and only applies to spans that run an operation."
],
"changelog": [
{
"version": "0.21.0",
"prs": [
572
],
"description": "Added graphql.processing.type attribute"
}
]
}
The individual field violations from a google.rpc.BadRequest error detail. Each entry is a JSON-encoded object with field, description, reason, and (optional) localized_message keys, mirroring google.rpc.BadRequest.FieldViolation.
Example["{\"field\":\"email\",\"description\":\"must be a valid email address\",\"reason\":\"FIELD_INVALID\",\"localized_message\":{\"locale\":\"en-US\",\"message\":\"Must be a valid email address\"}}"]
Additional debugging information, such as a server-side stack trace, from a google.rpc.DebugInfo error detail. SDKs should only send this attribute when sendDefaultPii is enabled or dataCollection is configured accordingly.
The server-side stack trace entries from a google.rpc.DebugInfo error detail. SDKs should only send this attribute when sendDefaultPii is enabled or dataCollection is configured accordingly.
Additional structured metadata attached to a google.rpc.ErrorInfo error detail, with <key> being the metadata key name. SDKs should only send this attribute when sendDefaultPii is enabled or dataCollection is configured accordingly.
{
"key": "grpc.error.error_info.reason",
"brief": "The reason for the gRPC error, as defined by the service that generated it, from the google.rpc.ErrorInfo error detail.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "FIELD_INVALID",
"changelog": [
{
"version": "0.17.0",
"prs": [
460
],
"description": "Added grpc.error.error_info.reason attribute"
}
]
}
The individual precondition violations from a google.rpc.PreconditionFailure error detail. Each entry is a JSON-encoded object with type, subject, and description keys. SDKs should only send this attribute when sendDefaultPii is enabled or dataCollection is configured accordingly, since violation subjects may identify specific resources or users.
Example["{\"type\":\"TOS\",\"subject\":\"example.com/user/123\",\"description\":\"User must accept the terms of service\"}"]
{
"key": "grpc.error.precondition_failure.violations",
"brief": "The individual precondition violations from a google.rpc.PreconditionFailure error detail. Each entry is a JSON-encoded object with type, subject, and description keys. SDKs should only send this attribute when sendDefaultPii is enabled or dataCollection is configured accordingly, since violation subjects may identify specific resources or users.",
"type": "string[]",
"apply_scrubbing": {
"key": "auto"
},
"is_in_otel": false,
"visibility": "public",
"example": [
"{\"type\":\"TOS\",\"subject\":\"example.com/user/123\",\"description\":\"User must accept the terms of service\"}"
],
"changelog": [
{
"version": "0.17.0",
"prs": [
460
],
"description": "Added grpc.error.precondition_failure.violations attribute"
}
]
}
The individual quota violations from a google.rpc.QuotaFailure error detail. Each entry is a JSON-encoded object with subject, description, api_service, quota_metric, quota_id, quota_dimensions, quota_value, and (optional) future_quota_value keys, mirroring google.rpc.QuotaFailure.Violation. SDKs should only send this attribute when sendDefaultPii is enabled or dataCollection is configured accordingly, since violation subjects may identify specific resources or users.
{
"key": "grpc.error.quota_failure.violations",
"brief": "The individual quota violations from a google.rpc.QuotaFailure error detail. Each entry is a JSON-encoded object with subject, description, api_service, quota_metric, quota_id, quota_dimensions, quota_value, and (optional) future_quota_value keys, mirroring google.rpc.QuotaFailure.Violation. SDKs should only send this attribute when sendDefaultPii is enabled or dataCollection is configured accordingly, since violation subjects may identify specific resources or users.",
"type": "string[]",
"apply_scrubbing": {
"key": "auto"
},
"is_in_otel": false,
"visibility": "public",
"example": [
"{\"subject\":\"clientip:127.0.0.1\",\"description\":\"Limit checks failed.\",\"api_service\":\"example.googleapis.com\",\"quota_metric\":\"example.googleapis.com/read_requests\",\"quota_id\":\"ReadRequestsPerMinutePerProject\",\"quota_dimensions\":{\"region\":\"us-central1\"},\"quota_value\":1000}"
],
"changelog": [
{
"version": "0.17.0",
"prs": [
460
],
"description": "Added grpc.error.quota_failure.violations attribute"
}
]
}
{
"key": "grpc.error.resource_info.description",
"brief": "A description of the error that occurred while accessing the resource, from a google.rpc.ResourceInfo error detail.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "Instance is not ready for the request.",
"changelog": [
{
"version": "0.17.0",
"prs": [
460
],
"description": "Added grpc.error.resource_info.description attribute"
}
]
}
The owner of the resource being accessed (e.g. project or account owning it), from a google.rpc.ResourceInfo error detail. SDKs should only send this attribute when sendDefaultPii is enabled or dataCollection is configured accordingly.
{
"key": "grpc.error.resource_info.owner",
"brief": "The owner of the resource being accessed (e.g. project or account owning it), from a google.rpc.ResourceInfo error detail. SDKs should only send this attribute when sendDefaultPii is enabled or dataCollection is configured accordingly.",
"type": "string",
"apply_scrubbing": {
"key": "auto"
},
"is_in_otel": false,
"visibility": "public",
"example": "user@example.com",
"changelog": [
{
"version": "0.17.0",
"prs": [
460
],
"description": "Added grpc.error.resource_info.owner attribute"
}
]
}
The name of the resource being accessed, from a google.rpc.ResourceInfo error detail. SDKs should only send this attribute when sendDefaultPii is enabled or dataCollection is configured accordingly.
{
"key": "grpc.error.resource_info.resource_name",
"brief": "The name of the resource being accessed, from a google.rpc.ResourceInfo error detail. SDKs should only send this attribute when sendDefaultPii is enabled or dataCollection is configured accordingly.",
"type": "string",
"apply_scrubbing": {
"key": "auto"
},
"is_in_otel": false,
"visibility": "public",
"example": "projects/example/instances/example-instance",
"changelog": [
{
"version": "0.17.0",
"prs": [
460
],
"description": "Added grpc.error.resource_info.resource_name attribute"
}
]
}
The fragments present in the URI. Note that this contains the leading # character, while the `url.fragment` attribute does not.
Example#details
Changelog
v0.0.0
Raw JSON
{
"key": "http.fragment",
"brief": "The fragments present in the URI. Note that this contains the leading # character, while the `url.fragment` attribute does not.",
"type": "string",
"apply_scrubbing": {
"key": "auto"
},
"is_in_otel": false,
"visibility": "public",
"example": "#details",
"changelog": [
{
"version": "0.0.0"
}
]
}
The query string present in the URL. Note that this contains the leading ? character, while the `url.query` attribute does not.
Scrubbing ReasonQuery string values can contain sensitive information. Clients should attempt to scrub parameters that might contain sensitive information.
Example?foo=bar&bar=baz
Changelog
v0.0.0
Raw JSON
{
"key": "http.query",
"brief": "The query string present in the URL. Note that this contains the leading ? character, while the `url.query` attribute does not.",
"type": "string",
"apply_scrubbing": {
"key": "auto",
"reason": "Query string values can contain sensitive information. Clients should attempt to scrub parameters that might contain sensitive information."
},
"is_in_otel": false,
"visibility": "public",
"example": "?foo=bar&bar=baz",
"changelog": [
{
"version": "0.0.0"
}
]
}
{
"key": "http.request.body.decoded_size",
"brief": "The decoded body size of the request (in bytes).",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 456,
"alias": [
"http.request_content_length_uncompressed"
],
"additional_context": [
"This is the size after content decoding. Set it only when the decoded size is actually known, for example by measuring a decompressed request stream.",
"Do not derive this from the `content-length` header, which always carries the encoded size. Use `http.request.body.size` for that."
],
"changelog": [
{
"version": "0.21.0",
"prs": [
574
],
"description": "Added http.request.body.decoded_size attribute"
}
]
}
This is the on-the-wire (encoded) size. The `content-length` header always carries the encoded size, so set this attribute whenever `content-length` is known, regardless of whether `content-encoding` is present.
The UNIX timestamp representing the time immediately after the browser finishes establishing the connection to the server to retrieve the resource. The timestamp value includes the time interval to establish the transport connection, as well as other time intervals such as TLS handshake and SOCKS authentication.
{
"key": "http.request.connection_end",
"brief": "The UNIX timestamp representing the time immediately after the browser finishes establishing the connection to the server to retrieve the resource. The timestamp value includes the time interval to establish the transport connection, as well as other time intervals such as TLS handshake and SOCKS authentication.",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 1732829555.15,
"changelog": [
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.1.0",
"prs": [
134
]
},
{
"version": "0.0.0"
}
]
}
The UNIX timestamp representing the time immediately before the browser starts requesting the resource from the server, cache, or local resource. If the transport connection fails and the browser retires the request, the value returned will be the start of the retry request.
{
"key": "http.request.request_start",
"brief": "The UNIX timestamp representing the time immediately before the browser starts requesting the resource from the server, cache, or local resource. If the transport connection fails and the browser retires the request, the value returned will be the start of the retry request.",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 1732829555.51,
"changelog": [
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.1.0",
"prs": [
134
]
},
{
"version": "0.0.0"
}
]
}
The UNIX timestamp representing the time immediately after the browser receives the last byte of the resource or immediately before the transport connection is closed, whichever comes first.
{
"key": "http.request.response_end",
"brief": "The UNIX timestamp representing the time immediately after the browser receives the last byte of the resource or immediately before the transport connection is closed, whichever comes first.",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 1732829555.89,
"changelog": [
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.1.0",
"prs": [
134
]
},
{
"version": "0.0.0"
}
]
}
The UNIX timestamp representing the time immediately before the browser starts requesting the resource from the server, cache, or local resource. If the transport connection fails and the browser retires the request, the value returned will be the start of the retry request.
{
"key": "http.request.response_start",
"brief": "The UNIX timestamp representing the time immediately before the browser starts requesting the resource from the server, cache, or local resource. If the transport connection fails and the browser retires the request, the value returned will be the start of the retry request.",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 1732829555.7,
"changelog": [
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.1.0",
"prs": [
134
]
},
{
"version": "0.0.0"
}
]
}
The UNIX timestamp representing the time immediately before the browser starts the handshake process to secure the current connection. If a secure connection is not used, the property returns zero.
{
"key": "http.request.secure_connection_start",
"brief": "The UNIX timestamp representing the time immediately before the browser starts the handshake process to secure the current connection. If a secure connection is not used, the property returns zero.",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 1732829555.73,
"changelog": [
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.1.0",
"prs": [
134
]
},
{
"version": "0.0.0"
}
]
}
The time in seconds from the browser's timeorigin to when the first byte of the request's response was received. See https://web.dev/articles/ttfb#measure-resource-requests
{
"key": "http.request.time_to_first_byte",
"brief": "The time in seconds from the browser's timeorigin to when the first byte of the request's response was received. See https://web.dev/articles/ttfb#measure-resource-requests",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 1.032,
"changelog": [
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.1.0",
"prs": [
131
]
}
]
}
The UNIX timestamp representing the timestamp immediately before dispatching the FetchEvent if a Service Worker thread is already running, or immediately before starting the Service Worker thread if it is not already running.
{
"key": "http.request.worker_start",
"brief": "The UNIX timestamp representing the timestamp immediately before dispatching the FetchEvent if a Service Worker thread is already running, or immediately before starting the Service Worker thread if it is not already running.",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 1732829553.68,
"changelog": [
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.1.0",
"prs": [
130,
134
]
}
]
}
This is the size after content decoding. Set it only when the decoded size is actually known, for example from the browser Resource Timing `decodedBodySize` or by measuring a decompressed response stream.
Do not derive this from the `content-length` header, which always carries the encoded size. Use `http.response.body.size` for that.
{
"key": "http.response.body.decoded_size",
"brief": "The decoded body size of the response (in bytes).",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 456,
"alias": [
"http.decoded_response_content_length",
"http.response_content_length_uncompressed"
],
"additional_context": [
"This is the size after content decoding. Set it only when the decoded size is actually known, for example from the browser Resource Timing `decodedBodySize` or by measuring a decompressed response stream.",
"Do not derive this from the `content-length` header, which always carries the encoded size. Use `http.response.body.size` for that."
],
"changelog": [
{
"version": "0.21.0",
"prs": [
574
],
"description": "Added http.response.body.decoded_size attribute"
}
]
}
{
"key": "http.response.status_text",
"brief": "The reason phrase of the HTTP response.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "NOT FOUND",
"alias": [
"http.status_text"
],
"additional_context": [
"HTTP/2 and HTTP/3 do not carry a reason phrase. Do not set this attribute when the protocol provides none; use `http.response.status_code` instead."
],
"changelog": [
{
"version": "0.21.0",
"prs": [
574
],
"description": "Added http.response.status_text attribute"
}
]
}
{
"key": "http.route",
"brief": "The matched route, that is, the path template in the format used by the respective server framework.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"examples": [
"/users/:id",
"my-controller/my-action/{id}",
"/posts"
],
"alias": [
"route"
],
"additional_context": [
"This attribute should primarily be set by server-side instrumentation that captures the framework route of an incoming request.",
"For `http.client` spans and client-side routing, use `url.template` instead."
],
"changelog": [
{
"version": "0.19.0",
"prs": [
505,
521
],
"description": "Added multiple examples, removed alias to `url.template`, added additional context"
},
{
"version": "0.1.0",
"prs": [
127
]
},
{
"version": "0.0.0"
}
]
}
The time in milliseconds the request spent in the server queue before processing began. Measured from the X-Request-Start header set by reverse proxies (e.g., Nginx, HAProxy, Heroku) to when the application started handling the request.
{
"key": "http.server.request.time_in_queue",
"brief": "The time in milliseconds the request spent in the server queue before processing began. Measured from the X-Request-Start header set by reverse proxies (e.g., Nginx, HAProxy, Heroku) to when the application started handling the request.",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 50,
"changelog": [
{
"version": "0.5.0",
"prs": [
267
]
}
]
}
This attribute is being deprecated in favor of url.path, url.query and url.fragment. The value holds all three parts at once, so it has no single replacement.
Changelog
v0.21.0#587Documented url.path, url.query and url.fragment as the replacements for http.target
{
"key": "http.target",
"brief": "The pathname and query string of the URL.",
"type": "string",
"apply_scrubbing": {
"key": "auto"
},
"is_in_otel": true,
"visibility": "public",
"example": "/test?foo=bar#buzz",
"deprecation": {
"reason": "This attribute is being deprecated in favor of url.path, url.query and url.fragment. The value holds all three parts at once, so it has no single replacement.",
"_status": null
},
"changelog": [
{
"version": "0.21.0",
"prs": [
587
],
"description": "Documented url.path, url.query and url.fragment as the replacements for http.target"
},
{
"version": "0.1.0",
"prs": [
61
]
},
{
"version": "0.0.0"
}
]
}
{
"key": "koa.name",
"brief": "The name of the Koa middleware or matched route that handled the request.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "/users/:id",
"deprecation": {
"reason": "No single replacement. SDKs should use http.route for router layers and code.function.name for middleware layers instead.",
"_status": null
},
"changelog": [
{
"version": "0.16.0",
"prs": [
490
],
"description": "Added koa.name attribute as deprecated"
}
]
}
This attribute is being deprecated in favor of gen_ai.pipeline.name, which is the SDK-agnostic replacement for the name of the AI pipeline or chain being executed.
{
"key": "langchain.chain.name",
"brief": "The name of the LangChain chain being executed.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"format_prompt",
"RunnableSequence"
],
"deprecation": {
"replacement": "gen_ai.pipeline.name",
"reason": "This attribute is being deprecated in favor of gen_ai.pipeline.name, which is the SDK-agnostic replacement for the name of the AI pipeline or chain being executed.",
"_status": "backfill"
},
"alias": [
"gen_ai.pipeline.name",
"ai.pipeline.name"
],
"changelog": [
{
"version": "0.22.0",
"prs": [
599
],
"description": "Added langchain.chain.name attribute"
}
]
}
{
"key": "lcp.id",
"brief": "The id of the dom element responsible for the largest contentful paint.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "#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"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
233
]
},
{
"version": "0.1.0",
"prs": [
127
]
},
{
"version": "0.0.0"
}
]
}
{
"key": "lcp.loadTime",
"brief": "The time it took for the LCP element to be loaded",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 1402,
"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"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
233
]
}
]
}
{
"key": "lcp.renderTime",
"brief": "The time it took for the LCP element to be rendered",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 1685,
"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"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
233
]
}
]
}
{
"key": "mcp.prompt.result.message_content",
"brief": "Content of the message in the prompt result. Used for single message results only.",
"type": "string",
"apply_scrubbing": {
"key": "auto"
},
"is_in_otel": false,
"visibility": "public",
"example": "Please provide a summary of the document",
"changelog": [
{
"version": "0.3.0",
"prs": [
171
]
}
]
}
MCP request argument with dynamic key suffix. The <key> is replaced with the actual argument name. The value is a JSON-stringified representation of the argument value.
Scrubbing ReasonArguments contain user input
Examplemcp.request.argument.query='weather in Paris'
Dynamic SuffixYes - the key contains dynamic parts
{
"key": "mcp.request.argument.<key>",
"brief": "MCP request argument with dynamic key suffix. The <key> is replaced with the actual argument name. The value is a JSON-stringified representation of the argument value.",
"has_dynamic_suffix": true,
"type": "string",
"apply_scrubbing": {
"key": "auto",
"reason": "Arguments contain user input"
},
"is_in_otel": false,
"visibility": "public",
"example": "mcp.request.argument.query='weather in Paris'",
"changelog": [
{
"version": "0.3.0",
"prs": [
176
]
}
]
}
Attributes from the Mapped Diagnostic Context (MDC) present at the moment the log record was created. The MDC is supported by all the most popular logging solutions in the Java ecosystem, and it's usually implemented as a thread-local map that stores context for e.g. a specific request.
Examplemdc.some_key='some_value'
Dynamic SuffixYes - the key contains dynamic parts
{
"key": "mdc.<key>",
"brief": "Attributes from the Mapped Diagnostic Context (MDC) present at the moment the log record was created. The MDC is supported by all the most popular logging solutions in the Java ecosystem, and it's usually implemented as a thread-local map that stores context for e.g. a specific request.",
"has_dynamic_suffix": true,
"type": "string",
"apply_scrubbing": {
"key": "auto"
},
"is_in_otel": false,
"visibility": "public",
"example": "mdc.some_key='some_value'",
"changelog": [
{
"version": "0.3.0",
"prs": [
176
]
}
]
}
{
"key": "messaging.destination.partition.id",
"brief": "The identifier of the partition messages are sent to or received from, unique within the messaging.destination.name.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": "1",
"changelog": [
{
"version": "0.19.0",
"prs": [
474
],
"description": "Added messaging.destination.partition.id attribute"
}
]
}
Message keys in Kafka are used for grouping alike messages to ensure they're processed on the same partition. They differ from messaging.message.id in that they're not unique. If the key is null, the attribute MUST NOT be set.
{
"key": "messaging.kafka.message.key",
"brief": "Message keys in Kafka are used for grouping alike messages to ensure they're processed on the same partition. They differ from messaging.message.id in that they're not unique. If the key is null, the attribute MUST NOT be set.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": "myKey",
"changelog": [
{
"version": "0.19.0",
"prs": [
474
],
"description": "Added messaging.kafka.message.key attribute"
}
]
}
{
"key": "messaging.message.id",
"brief": "A value used by the messaging system as an identifier for the message, represented as a string.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": "f47ac10b58cc4372a5670e02b2c3d479",
"alias": [
"messaging.message_id"
],
"changelog": [
{
"version": "0.21.0",
"prs": [
581
],
"description": "Added messaging.message_id as an alias"
},
{
"version": "0.1.0",
"prs": [
127
]
},
{
"version": "0.0.0"
}
]
}
{
"key": "messaging.message_id",
"brief": "A value used by the messaging system as an identifier for the message, represented as a string.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"452a7c7c7c7048c2f887f0e7"
],
"deprecation": {
"replacement": "messaging.message.id",
"reason": "This attribute is being deprecated in favor of messaging.message.id.",
"_status": "backfill"
},
"alias": [
"messaging.message.id"
],
"changelog": [
{
"version": "0.21.0",
"prs": [
581
],
"description": "Added messaging.message_id attribute"
}
]
}
The origin of the navigation (usually client side router navigations). Should preferrably parameterized template (like url.template) or a URL path otherwise.
{
"key": "nel.elapsed_time",
"brief": "The elapsed number of milliseconds between the start of the resource fetch and when it was completed or aborted by the user agent.",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 100,
"changelog": [
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.1.0",
"prs": [
68
]
}
]
}
This attribute is being deprecated in favor of network.transport. The values change from ip_tcp and ip_udp to tcp and udp, so the old value cannot be copied over.
Changelog
v0.21.0#588Set net.transport to _status null, because its values change on the replacement
{
"key": "net.transport",
"brief": "OSI transport layer or inter-process communication method.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": "tcp",
"deprecation": {
"replacement": "network.transport",
"reason": "This attribute is being deprecated in favor of network.transport. The values change from ip_tcp and ip_udp to tcp and udp, so the old value cannot be copied over.",
"_status": null
},
"alias": [
"network.transport",
"mcp.transport"
],
"changelog": [
{
"version": "0.21.0",
"prs": [
588
],
"description": "Set net.transport to _status null, because its values change on the replacement"
},
{
"version": "0.1.0",
"prs": [
61,
127
]
},
{
"version": "0.0.0"
}
]
}
An unprocessed description string obtained by the operating system. For some well-known runtimes, Sentry will attempt to parse `name` and `version` from this string, if they are not explicitly given.
{
"key": "otel.status_code",
"brief": "Name of the code, either “OK” or “ERROR”. MUST NOT be set if the status code is UNSET.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": "OK",
"changelog": [
{
"version": "0.1.0",
"prs": [
127
]
},
{
"version": "0.0.0"
}
]
}
{
"key": "performance.activationStart",
"brief": "The time between initiating a navigation to a page and the browser activating the page",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 1.983,
"deprecation": {
"replacement": "browser.performance.navigation.activation_start",
"reason": "The activationStart is now recorded as the browser.performance.navigation.activation_start attribute.",
"_status": "backfill"
},
"alias": [
"browser.performance.navigation.activation_start"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
321
],
"description": "Added performance.activationStart attribute"
}
]
}
An additional description about the runtime of the process, for example a specific vendor customization of the runtime environment. Equivalent to `raw_description` in the Sentry runtime context.
{
"key": "process.runtime.description",
"brief": "An additional description about the runtime of the process, for example a specific vendor customization of the runtime environment. Equivalent to `raw_description` in the Sentry runtime context.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": "Eclipse OpenJ9 VM openj9-0.21.0",
"alias": [
"runtime.raw_description"
],
"changelog": [
{
"version": "0.1.0",
"prs": [
127
]
},
{
"version": "0.0.0"
}
]
}
{
"key": "process.runtime.version",
"brief": "The version of the runtime of this process, as returned by the runtime without modification. Equivalent to `version` in the Sentry runtime context.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": "18.04.2",
"alias": [
"runtime.version"
],
"changelog": [
{
"version": "0.1.0",
"prs": [
127
]
},
{
"version": "0.0.0"
}
]
}
{
"key": "query.<key>",
"brief": "An item in a query string. Usually added by client-side routing frameworks like vue-router.",
"has_dynamic_suffix": true,
"type": "string",
"apply_scrubbing": {
"key": "auto"
},
"is_in_otel": false,
"visibility": "public",
"example": "query.id='123'",
"deprecation": {
"replacement": "url.query",
"reason": "Instead of sending items individually in query.<key>, they should be sent all together with url.query.",
"_status": null
},
"changelog": [
{
"version": "0.1.0",
"prs": [
103
]
}
]
}
The React Native architecture the app is running on. `new` for the New Architecture, where native modules are resolved as TurboModules through `TurboModuleRegistry`, `legacy` for the Old Architecture bridge.
{
"key": "react_native.architecture",
"brief": "The React Native architecture the app is running on. `new` for the New Architecture, where native modules are resolved as TurboModules through `TurboModuleRegistry`, `legacy` for the Old Architecture bridge.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"new",
"legacy"
],
"alias": [
"turbo_module.arch"
],
"changelog": [
{
"version": "0.24.0",
"prs": [
564
],
"description": "Added react_native.architecture attribute"
}
]
}
The number of distinct native module and method pairs called during the lifetime of the span. Useful as a cardinality signal when the per-method breakdown has been truncated.
{
"key": "react_native.module.call.distinct_count",
"brief": "The number of distinct native module and method pairs called during the lifetime of the span. Useful as a cardinality signal when the per-method breakdown has been truncated.",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
7
],
"alias": [
"turbo_module.unique_methods",
"turbo_modules.unique_methods"
],
"changelog": [
{
"version": "0.24.0",
"prs": [
564
],
"description": "Added react_native.module.call.distinct_count attribute"
}
]
}
The combined wall-clock duration of all native module calls observed during the lifetime of the span, in milliseconds. Calls overlap, so this can exceed the span duration.
The number of native module calls that failed during the lifetime of the span. A call counts as failed when it threw, rejected, or — on the Old Architecture bridge only — invoked its failure callback.
{
"key": "react_native.module.error.count",
"brief": "The number of native module calls that failed during the lifetime of the span. A call counts as failed when it threw, rejected, or — on the Old Architecture bridge only — invoked its failure callback.",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
2
],
"alias": [
"turbo_module.total_error_count",
"turbo_modules.total_error_count"
],
"changelog": [
{
"version": "0.24.0",
"prs": [
564
],
"description": "Added react_native.module.error.count attribute"
}
]
}
The name of the native module the call was dispatched to. On the New Architecture this is the TurboModule name, on the Old Architecture the `NativeModules` key.
Scrubbing ReasonNative module and method names are app-defined identifiers, but scrubbing them would make the call attribution unusable
{
"key": "react_native.module.name",
"brief": "The name of the native module the call was dispatched to. On the New Architecture this is the TurboModule name, on the Old Architecture the `NativeModules` key.",
"type": "string",
"apply_scrubbing": {
"key": "manual",
"reason": "Native module and method names are app-defined identifiers, but scrubbing them would make the call attribution unusable"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"RNDeviceInfo"
],
"alias": [
"turbo_module.name"
],
"changelog": [
{
"version": "0.24.0",
"prs": [
564
],
"description": "Added react_native.module.name attribute"
}
]
}
{
"key": "react_native.module.top.name",
"brief": "The native module and method that accounted for the most total duration during the lifetime of the span, formatted as `<module>.<method>`.",
"type": "string",
"apply_scrubbing": {
"key": "manual",
"reason": "Native module and method names are app-defined identifiers, but scrubbing them would make the call attribution unusable"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"RNDeviceInfo.getUniqueId"
],
"alias": [
"turbo_module.top_module"
],
"changelog": [
{
"version": "0.24.0",
"prs": [
564
],
"description": "Added react_native.module.top.name attribute"
}
]
}
{
"key": "remix.action_form_data.<key>",
"brief": "Remix form data, <key> being the form data key, the value being the form data value.",
"has_dynamic_suffix": true,
"type": "string",
"apply_scrubbing": {
"key": "auto"
},
"is_in_otel": false,
"visibility": "public",
"example": "http.response.header.text='test'",
"changelog": [
{
"version": "0.1.0",
"prs": [
103
]
}
]
}
The origin of the navigation (usually client side router navigations). Should preferably be a parameterized template (like url.template) or a URL path otherwise.
{
"key": "rpc.service",
"brief": "The full (logical) name of the service being called, including its package name, if applicable.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": "myService.BestService",
"changelog": [
{
"version": "0.1.0",
"prs": [
127
]
},
{
"version": "0.0.0"
}
]
}
Cannot be automatically backfilled due to type mismatch (integer vs string); rpc.grpc.status_code is a numeric gRPC status code while rpc.response.status_code is the string status name.
Changelog
v0.19.0#494#533Deprecated rpc.grpc.status_code in favor of rpc.response.status_code
The application build string, when it is separate from the version.
Examplestable
No replacement available at this time.
The runtime.* namespace is deprecated in favor of process.runtime.*. No direct OTel equivalent exists for this attribute.
Changelog
v0.11.0#383Added and deprecated runtime.build attribute
Raw JSON
{
"key": "runtime.build",
"brief": "The application build string, when it is separate from the version.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "stable",
"deprecation": {
"reason": "The runtime.* namespace is deprecated in favor of process.runtime.*. No direct OTel equivalent exists for this attribute.",
"_status": null
},
"changelog": [
{
"version": "0.11.0",
"prs": [
383
],
"description": "Added and deprecated runtime.build attribute"
}
]
}
{
"key": "score.total",
"brief": "The total performance score of a span. This is the sum of individual weighted web vital scores (see `score.<key>`).",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"changelog": [
{
"version": "0.7.0",
"prs": [
355
],
"description": "Added score.total attribute"
}
]
}
Used as a generic attribute representing the action depending on the type of span. For instance, this is the database query operation for DB spans, and the request method for HTTP spans.
ExampleSELECT
Search AliasHow this attribute is exposed in Sentry search. Query it by this name instead of the attribute key.
{
"key": "sentry.action",
"brief": "Used as a generic attribute representing the action depending on the type of span. For instance, this is the database query operation for DB spans, and the request method for HTTP spans.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "SELECT",
"search_alias": {
"name": "span.action"
},
"changelog": [
{
"version": "0.4.0",
"prs": [
212
]
}
]
}
Used as a generic attribute representing the domain depending on the type of span. For instance, this is the collection/table name for database spans, and the server address for HTTP spans.
Exampleexample.com
Search AliasHow this attribute is exposed in Sentry search. Query it by this name instead of the attribute key.
{
"key": "sentry.domain",
"brief": "Used as a generic attribute representing the domain depending on the type of span. For instance, this is the collection/table name for database spans, and the server address for HTTP spans.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "example.com",
"search_alias": {
"name": "span.domain"
},
"changelog": [
{
"version": "0.4.0",
"prs": [
212
]
}
]
}
The ID of the project where the trace originated (i.e. the project of the SDK that started the trace). Propagated through the dynamic sampling context and set by Relay during ingestion.
Example12345
Changelog
v0.7.0#358Add sentry.dsc.project_id as an attribute
Raw JSON
{
"key": "sentry.dsc.project_id",
"brief": "The ID of the project where the trace originated (i.e. the project of the SDK that started the trace). Propagated through the dynamic sampling context and set by Relay during ingestion.",
"type": "string",
"apply_scrubbing": {
"key": "never"
},
"is_in_otel": false,
"visibility": "internal",
"example": "12345",
"changelog": [
{
"version": "0.7.0",
"prs": [
358
],
"description": "Add sentry.dsc.project_id as an attribute"
}
]
}
{
"key": "sentry.is_localhost",
"brief": "Indicates whether a telemetry item was sent on a host, device or browser on a localhost URL or IP address.",
"type": "boolean",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "internal",
"examples": [
true,
false
],
"additional_context": [
"This attribute is used for the Sentry \"Filter telemetry from localhost\" inbound filter feature.",
"SDKs must set this attribute on every span, as well as every other telemetry item supporting attribuztes."
],
"changelog": [
{
"version": "0.24.0",
"prs": [
646
],
"description": "Added sentry.is_localhost attribute"
}
]
}
Whether the span or event occurred on the main thread. Computed by Relay and should not be set by SDKs.
Exampletrue
Changelog
v0.5.0
Raw JSON
{
"key": "sentry.main_thread",
"brief": "Whether the span or event occurred on the main thread. Computed by Relay and should not be set by SDKs.",
"type": "boolean",
"apply_scrubbing": {
"key": "never"
},
"is_in_otel": false,
"visibility": "public",
"example": true,
"changelog": [
{
"version": "0.5.0"
}
]
}
A parameter used in the message template. <key> can either be the number that represent the parameter's position in the template string (sentry.message.parameter.0, sentry.message.parameter.1, etc) or the parameter's name (sentry.message.parameter.item_id, sentry.message.parameter.user_id, etc)
{
"key": "sentry.message.parameter.<key>",
"brief": "A parameter used in the message template. <key> can either be the number that represent the parameter's position in the template string (sentry.message.parameter.0, sentry.message.parameter.1, etc) or the parameter's name (sentry.message.parameter.item_id, sentry.message.parameter.user_id, etc)",
"type": "string",
"apply_scrubbing": {
"key": "auto"
},
"is_in_otel": false,
"visibility": "public",
"example": "sentry.message.parameter.0='123'",
"changelog": [
{
"version": "0.1.0",
"prs": [
116
]
}
]
}
{
"key": "sentry.metric.source",
"brief": "The provenance of a metric. For example, this can be set to indicate if a metric was generated by Relay from a span.",
"type": "string",
"apply_scrubbing": {
"key": "never"
},
"is_in_otel": false,
"visibility": "public",
"example": "span",
"changelog": [
{
"version": "0.16.0",
"prs": [
476
],
"description": "Added sentry.metric.source attribute"
}
]
}
Whether the application is using a mobile SDK. Computed by Relay and should not be set by SDKs.
Exampletrue
Changelog
v0.5.0
Raw JSON
{
"key": "sentry.mobile",
"brief": "Whether the application is using a mobile SDK. Computed by Relay and should not be set by SDKs.",
"type": "boolean",
"apply_scrubbing": {
"key": "never"
},
"is_in_otel": false,
"visibility": "public",
"example": true,
"changelog": [
{
"version": "0.5.0"
}
]
}
{
"key": "sentry.module.<key>",
"brief": "A module that was loaded in the process. The key is the name of the module.",
"has_dynamic_suffix": true,
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "sentry.module.brianium/paratest='v7.7.0'",
"changelog": [
{
"version": "0.1.0",
"prs": [
103
]
}
]
}
A parameterized route for a function in Next.js that contributes to Server-Side Rendering. Should be present on spans that track such functions when the file location of the function is known.
{
"key": "sentry.nextjs.ssr.function.route",
"brief": "A parameterized route for a function in Next.js that contributes to Server-Side Rendering. Should be present on spans that track such functions when the file location of the function is known.",
"type": "string",
"apply_scrubbing": {
"key": "never"
},
"is_in_otel": false,
"visibility": "public",
"example": "/posts/[id]/layout",
"changelog": [
{
"version": "0.1.0",
"prs": [
54,
106
]
}
]
}
{
"key": "sentry.nextjs.ssr.function.type",
"brief": "A descriptor for a for a function in Next.js that contributes to Server-Side Rendering. Should be present on spans that track such functions.",
"type": "string",
"apply_scrubbing": {
"key": "never"
},
"is_in_otel": false,
"visibility": "public",
"example": "generateMetadata",
"changelog": [
{
"version": "0.1.0",
"prs": [
54,
106
]
}
]
}
Used as a generic attribute representing the normalized `sentry.description`. This refers to the legacy use case of `sentry.description` where it holds relevant data depending on the type of span (e.g. database query, resource url, http request description, etc).
ExampleSELECT .. FROM sentry_project WHERE (project_id = %s)
{
"key": "sentry.normalized_description",
"brief": "Used as a generic attribute representing the normalized `sentry.description`. This refers to the legacy use case of `sentry.description` where it holds relevant data depending on the type of span (e.g. database query, resource url, http request description, etc).",
"type": "string",
"apply_scrubbing": {
"key": "auto"
},
"is_in_otel": false,
"visibility": "public",
"example": "SELECT .. FROM sentry_project WHERE (project_id = %s)",
"changelog": [
{
"version": "0.4.0",
"prs": [
212
]
}
]
}
A list of names identifying enabled integrations. The list shouldhave all enabled integrations, including default integrations. Defaultintegrations are included because different SDK releases may contain differentdefault integrations.
The source of the segment span name. Should only be set on segment spans. Known values are: `'custom'`, `'url'`, `'route'`, `'component'`, `'view'`, `'task'`.
Examplesroutecomponentviewtaskcustomurl
Additional Context
This attribute is the replacement for `transaction_info.source` on transactions.
Should we bring back clustering for segment names (like we do for transaction names), this attribute will be used to determine if a segment name should be clustered.
{
"key": "sentry.segment.name.source",
"brief": "The source of the segment span name. Should only be set on segment spans. Known values are: `'custom'`, `'url'`, `'route'`, `'component'`, `'view'`, `'task'`.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "internal",
"examples": [
"route",
"component",
"view",
"task",
"custom",
"url"
],
"additional_context": [
"This attribute is the replacement for `transaction_info.source` on transactions.",
"Should we bring back clustering for segment names (like we do for transaction names), this attribute will be used to determine if a segment name should be clustered."
],
"changelog": [
{
"version": "0.19.0",
"prs": [
466
],
"description": "Added sentry.segment.name.source"
}
]
}
{
"key": "sentry.status",
"brief": "The span's status (either \"ok\" or \"error\"). Older SDKs may set this to a more specific error, but this behaviour is deprecated.",
"type": "string",
"apply_scrubbing": {
"key": "never"
},
"is_in_otel": false,
"visibility": "public",
"example": "ok",
"search_alias": {
"name": "span.status"
},
"changelog": [
{
"version": "0.14.0",
"prs": [
453
]
}
]
}
{
"key": "sentry.status_code",
"brief": "The HTTP status code used in Sentry Insights. Typically set by Sentry during ingestion, rather than by clients.",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 200,
"search_alias": {
"name": "span.status_code"
},
"changelog": [
{
"version": "0.4.0",
"prs": [
223,
228
]
}
]
}
A sequencing counter for deterministic ordering of logs or metrics when timestamps share the same integer millisecond. Starts at 0 on SDK initialization, increments by 1 for each captured item, and resets to 0 when the integer millisecond of the current item differs from the previous one.
{
"key": "sentry.timestamp.sequence",
"brief": "A sequencing counter for deterministic ordering of logs or metrics when timestamps share the same integer millisecond. Starts at 0 on SDK initialization, increments by 1 for each captured item, and resets to 0 when the integer millisecond of the current item differs from the previous one.",
"type": "integer",
"apply_scrubbing": {
"key": "never"
},
"is_in_otel": false,
"visibility": "public",
"example": 0,
"changelog": [
{
"version": "0.5.0",
"prs": [
262
]
}
]
}
{
"key": "sentry.trace.status",
"brief": "The segment's status (either \"ok\" or \"error\"). Older SDKs may set this to a more specific error, but this behaviour is deprecated.",
"type": "string",
"apply_scrubbing": {
"key": "never"
},
"is_in_otel": false,
"visibility": "public",
"example": "ok",
"search_alias": {
"name": "trace.status"
},
"changelog": [
{
"version": "0.14.0",
"prs": [
453
]
}
]
}
(Deprecated) The event that caused the SDK to report CLS or LCP (pagehide or navigation)
Examplepagehide
No replacement available at this time.
The report event moved to browser.web_vital.lcp.report_event and browser.web_vital.cls.report_event, which are themselves deprecated without a replacement. No backfill required.
Changelog
v0.24.0#642Updated the deprecation reason now that the browser.web_vital.*.report_event attributes are deprecated
{
"key": "sentry.report_event",
"brief": "(Deprecated) The event that caused the SDK to report CLS or LCP (pagehide or navigation)",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": "pagehide",
"deprecation": {
"reason": "The report event moved to browser.web_vital.lcp.report_event and browser.web_vital.cls.report_event, which are themselves deprecated without a replacement. No backfill required.",
"_status": null
},
"changelog": [
{
"version": "0.24.0",
"prs": [
642
],
"description": "Updated the deprecation reason now that the browser.web_vital.*.report_event attributes are deprecated"
},
{
"version": "0.5.0",
"prs": [
320
],
"description": "Added sentry.report_event attribute"
}
]
}
The source of a span, also referred to as transaction source. Known values are: `'custom'`, `'url'`, `'route'`, `'component'`, `'view'`, `'task'`. '`source`' describes a parametrized route, while `'url'` describes the full URL, potentially containing identifiers.
Exampleroute
No replacement available at this time.
This attribute is superseded by sentry.segment.name.source, which only needs to be set on segment spans.
Changelog
v0.19.0#510Removed the sentry.span.source replacement
v0.5.0
Raw JSON
{
"key": "sentry.source",
"brief": "The source of a span, also referred to as transaction source. Known values are: `'custom'`, `'url'`, `'route'`, `'component'`, `'view'`, `'task'`. '`source`' describes a parametrized route, while `'url'` describes the full URL, potentially containing identifiers.",
"type": "string",
"apply_scrubbing": {
"key": "never"
},
"is_in_otel": false,
"visibility": "public",
"example": "route",
"deprecation": {
"reason": "This attribute is superseded by sentry.segment.name.source, which only needs to be set on segment spans.",
"_status": null
},
"changelog": [
{
"version": "0.19.0",
"prs": [
510
],
"description": "Removed the sentry.span.source replacement"
},
{
"version": "0.5.0"
}
]
}
The source of a span, also referred to as transaction source. Known values are: `'custom'`, `'url'`, `'route'`, `'component'`, `'view'`, `'task'`. '`source`' describes a parametrized route, while `'url'` describes the full URL, potentially containing identifiers.
Exampleroute
No replacement available at this time.
This attribute is superseded by sentry.segment.name.source, which only needs to be set on segment spans.
Changelog
v0.19.0#510Deprecated; superseded by sentry.segment.name.source on segment spans
{
"key": "sentry.span.source",
"brief": "The source of a span, also referred to as transaction source. Known values are: `'custom'`, `'url'`, `'route'`, `'component'`, `'view'`, `'task'`. '`source`' describes a parametrized route, while `'url'` describes the full URL, potentially containing identifiers.",
"type": "string",
"apply_scrubbing": {
"key": "never"
},
"is_in_otel": false,
"visibility": "public",
"example": "route",
"deprecation": {
"reason": "This attribute is superseded by sentry.segment.name.source, which only needs to be set on segment spans.",
"_status": null
},
"changelog": [
{
"version": "0.19.0",
"prs": [
510
],
"description": "Deprecated; superseded by sentry.segment.name.source on segment spans"
},
{
"version": "0.4.0",
"prs": [
214
]
},
{
"version": "0.0.0"
}
]
}
{
"key": "sentry.trace.parent_span_id",
"brief": "The span id of the span that was active when the log was collected. This should not be set if there was no active span.",
"type": "string",
"apply_scrubbing": {
"key": "never"
},
"is_in_otel": false,
"visibility": "public",
"example": "b0e6f15b45c36b12",
"deprecation": {
"_status": null
},
"changelog": [
{
"version": "0.5.0",
"prs": [
287
],
"description": "Deprecate `sentry.trace.parent_span_id`"
},
{
"version": "0.1.0",
"prs": [
116
]
}
]
}
Preferably the server domain name if available without reverse DNS lookup, or an IP address or Unix domain socket name. For compatibility, it may contain what the hostname command returns on UNIX systems, the fully qualified hostname, or another name specified by the user.
{
"key": "server.address",
"brief": "Preferably the server domain name if available without reverse DNS lookup, or an IP address or Unix domain socket name. For compatibility, it may contain what the hostname command returns on UNIX systems, the fully qualified hostname, or another name specified by the user.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": "example.com",
"alias": [
"address",
"http.server_name",
"net.host.name",
"http.host",
"server_name",
"net.peer.name"
],
"changelog": [
{
"version": "0.24.0",
"prs": [
645,
647
],
"description": "Broaden brief to allow hostnames"
},
{
"version": "0.21.0",
"prs": [
588,
602
],
"description": "Added net.peer.name as an alias"
},
{
"version": "0.19.0",
"prs": [
534
],
"description": "Added address as an alias"
},
{
"version": "0.1.0",
"prs": [
108,
127
]
},
{
"version": "0.0.0"
}
]
}
{
"key": "service.version",
"brief": "The version string of the service API or implementation. The format is not defined by these conventions.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": "5.0.0",
"alias": [
"sentry.release"
],
"changelog": [
{
"version": "0.1.0",
"prs": [
127
]
},
{
"version": "0.0.0"
}
]
}
This attribute is being deprecated in favor of process.pid, which is the OTel-aligned replacement.
Status: backfill
Changelog
v0.19.0#487Added subprocess.pid attribute, deprecated in favor of process.pid
Raw JSON
{
"key": "subprocess.pid",
"brief": "The process ID of a subprocess.",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 12345,
"deprecation": {
"replacement": "process.pid",
"reason": "This attribute is being deprecated in favor of process.pid, which is the OTel-aligned replacement.",
"_status": "backfill"
},
"alias": [
"process.pid"
],
"changelog": [
{
"version": "0.19.0",
"prs": [
487
],
"description": "Added subprocess.pid attribute, deprecated in favor of process.pid"
}
]
}
{
"key": "sveltekit.load.environment",
"brief": "The runtime environment in which the SvelteKit load function was executed. Known values are `'server'` and `'client'`.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"server",
"client"
],
"additional_context": [
"Added by the SvelteKit framework itself. The Sentry SDK only forwards the attribute to Sentry."
],
"changelog": [
{
"version": "0.22.0",
"prs": [
611
],
"description": "Added sveltekit.load.environment attribute"
}
]
}
{
"key": "sveltekit.load.node_type",
"brief": "The kind of SvelteKit load function that was executed, distinguishing page from layout and universal from server load functions.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"+page.server",
"+layout",
"+layout.server"
],
"additional_context": [
"Added by the SvelteKit framework itself. The Sentry SDK only forwards the attribute to Sentry."
],
"changelog": [
{
"version": "0.22.0",
"prs": [
611
],
"description": "Added sveltekit.load.node_type attribute"
}
]
}
The Sentry SDK renames SvelteKit-emitted spans to match Sentry's span name semantics, and preserves the name SvelteKit originally set in this attribute.
{
"key": "sveltekit.tracing.original_name",
"brief": "The original span name as emitted by SvelteKit.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"sveltekit.handle.root"
],
"additional_context": [
"The Sentry SDK renames SvelteKit-emitted spans to match Sentry's span name semantics, and preserves the name SvelteKit originally set in this attribute."
],
"changelog": [
{
"version": "0.22.0",
"prs": [
611
],
"description": "Added sveltekit.tracing.original_name attribute"
}
]
}
{
"key": "ttfb.requestTime",
"brief": "The time it takes for the server to process the initial request and send the first byte of a response to the user's browser",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": 1554.5814,
"deprecation": {
"replacement": "browser.web_vital.ttfb.request_time",
"reason": "This attribute is being deprecated in favor of browser.web_vital.ttfb.request_time",
"_status": "backfill"
},
"alias": [
"browser.web_vital.ttfb.request_time"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
235
]
}
]
}
The React Native architecture the call was observed on. `new` for a TurboModule resolved through `TurboModuleRegistry`, `legacy` for a module reached over the Old Architecture bridge. Only applies to React Native.
Replaced by the `react_native.*` namespace, which also covers native module calls made over the Old Architecture bridge, which are not TurboModules
Status: backfill
Changelog
v0.24.0#564Added turbo_module.arch and deprecated it in favor of react_native.architecture
Raw JSON
{
"key": "turbo_module.arch",
"brief": "The React Native architecture the call was observed on. `new` for a TurboModule resolved through `TurboModuleRegistry`, `legacy` for a module reached over the Old Architecture bridge. Only applies to React Native.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"new",
"legacy"
],
"deprecation": {
"replacement": "react_native.architecture",
"reason": "Replaced by the `react_native.*` namespace, which also covers native module calls made over the Old Architecture bridge, which are not TurboModules",
"_status": "backfill"
},
"alias": [
"react_native.architecture"
],
"changelog": [
{
"version": "0.24.0",
"prs": [
564
],
"description": "Added turbo_module.arch and deprecated it in favor of react_native.architecture"
}
]
}
Replaced by the `react_native.*` namespace, which also covers native module calls made over the Old Architecture bridge, which are not TurboModules
Status: backfill
Changelog
v0.24.0#564Added turbo_module.method and deprecated it in favor of react_native.module.method
Raw JSON
{
"key": "turbo_module.method",
"brief": "The name of the native module method that was called. Only applies to React Native.",
"type": "string",
"apply_scrubbing": {
"key": "manual",
"reason": "Native module and method names are app-defined identifiers, but scrubbing them would make the call attribution unusable"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"getUniqueId"
],
"deprecation": {
"replacement": "react_native.module.method",
"reason": "Replaced by the `react_native.*` namespace, which also covers native module calls made over the Old Architecture bridge, which are not TurboModules",
"_status": "backfill"
},
"alias": [
"react_native.module.method"
],
"changelog": [
{
"version": "0.24.0",
"prs": [
564
],
"description": "Added turbo_module.method and deprecated it in favor of react_native.module.method"
}
]
}
The name of the native module the call was dispatched to. On the New Architecture this is the TurboModule name, on the Old Architecture the `NativeModules` key. Only applies to React Native.
Scrubbing ReasonNative module and method names are app-defined identifiers, but scrubbing them would make the call attribution unusable
Replaced by the `react_native.*` namespace, which also covers native module calls made over the Old Architecture bridge, which are not TurboModules
Status: backfill
Changelog
v0.24.0#564Added turbo_module.name and deprecated it in favor of react_native.module.name
Raw JSON
{
"key": "turbo_module.name",
"brief": "The name of the native module the call was dispatched to. On the New Architecture this is the TurboModule name, on the Old Architecture the `NativeModules` key. Only applies to React Native.",
"type": "string",
"apply_scrubbing": {
"key": "manual",
"reason": "Native module and method names are app-defined identifiers, but scrubbing them would make the call attribution unusable"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"RNDeviceInfo"
],
"deprecation": {
"replacement": "react_native.module.name",
"reason": "Replaced by the `react_native.*` namespace, which also covers native module calls made over the Old Architecture bridge, which are not TurboModules",
"_status": "backfill"
},
"alias": [
"react_native.module.name"
],
"changelog": [
{
"version": "0.24.0",
"prs": [
564
],
"description": "Added turbo_module.name and deprecated it in favor of react_native.module.name"
}
]
}
Replaced by the `react_native.module.*` namespace, which also covers native module calls made over the Old Architecture bridge, and which drops the `total_` prefix and `_ms` suffix in favor of dot-separated logical grouping
Status: backfill
Changelog
v0.24.0#564Added turbo_module.top_module and deprecated it in favor of react_native.module.top.name
Raw JSON
{
"key": "turbo_module.top_module",
"brief": "The native module and method that accounted for the most total duration during the lifetime of the span. Only applies to React Native.",
"type": "string",
"apply_scrubbing": {
"key": "manual",
"reason": "Native module and method names are app-defined identifiers, but scrubbing them would make the call attribution unusable"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
"RNDeviceInfo.getUniqueId"
],
"deprecation": {
"replacement": "react_native.module.top.name",
"reason": "Replaced by the `react_native.module.*` namespace, which also covers native module calls made over the Old Architecture bridge, and which drops the `total_` prefix and `_ms` suffix in favor of dot-separated logical grouping",
"_status": "backfill"
},
"alias": [
"react_native.module.top.name"
],
"changelog": [
{
"version": "0.24.0",
"prs": [
564
],
"description": "Added turbo_module.top_module and deprecated it in favor of react_native.module.top.name"
}
]
}
Replaced by the `react_native.module.*` namespace, which also covers native module calls made over the Old Architecture bridge, and which drops the `total_` prefix and `_ms` suffix in favor of dot-separated logical grouping
Status: backfill
Changelog
v0.24.0#564Added turbo_module.top_module_duration_ms and deprecated it in favor of react_native.module.top.duration
Raw JSON
{
"key": "turbo_module.top_module_duration_ms",
"brief": "The total duration attributed to the top native module method, in milliseconds. Only applies to React Native.",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
87.25
],
"deprecation": {
"replacement": "react_native.module.top.duration",
"reason": "Replaced by the `react_native.module.*` namespace, which also covers native module calls made over the Old Architecture bridge, and which drops the `total_` prefix and `_ms` suffix in favor of dot-separated logical grouping",
"_status": "backfill"
},
"alias": [
"react_native.module.top.duration"
],
"changelog": [
{
"version": "0.24.0",
"prs": [
564
],
"description": "Added turbo_module.top_module_duration_ms and deprecated it in favor of react_native.module.top.duration"
}
]
}
Replaced by the `react_native.module.*` namespace, which also covers native module calls made over the Old Architecture bridge, and which drops the `total_` prefix and `_ms` suffix in favor of dot-separated logical grouping
Status: backfill
Changelog
v0.24.0#564Added turbo_module.total_call_count and deprecated it in favor of react_native.module.call.count
Raw JSON
{
"key": "turbo_module.total_call_count",
"brief": "The number of native module calls observed during the lifetime of the span. Only applies to React Native.",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
42
],
"deprecation": {
"replacement": "react_native.module.call.count",
"reason": "Replaced by the `react_native.module.*` namespace, which also covers native module calls made over the Old Architecture bridge, and which drops the `total_` prefix and `_ms` suffix in favor of dot-separated logical grouping",
"_status": "backfill"
},
"alias": [
"react_native.module.call.count",
"turbo_modules.total_call_count"
],
"changelog": [
{
"version": "0.24.0",
"prs": [
564
],
"description": "Added turbo_module.total_call_count and deprecated it in favor of react_native.module.call.count"
}
]
}
Replaced by the `react_native.module.*` namespace, which also covers native module calls made over the Old Architecture bridge, and which drops the `total_` prefix and `_ms` suffix in favor of dot-separated logical grouping
Status: backfill
Changelog
v0.24.0#564Added turbo_module.total_duration_ms and deprecated it in favor of react_native.module.duration.total
Raw JSON
{
"key": "turbo_module.total_duration_ms",
"brief": "The combined duration of all native module calls observed during the lifetime of the span, in milliseconds. Only applies to React Native.",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
128.45
],
"deprecation": {
"replacement": "react_native.module.duration.total",
"reason": "Replaced by the `react_native.module.*` namespace, which also covers native module calls made over the Old Architecture bridge, and which drops the `total_` prefix and `_ms` suffix in favor of dot-separated logical grouping",
"_status": "backfill"
},
"alias": [
"react_native.module.duration.total",
"turbo_modules.total_duration_ms"
],
"changelog": [
{
"version": "0.24.0",
"prs": [
564
],
"description": "Added turbo_module.total_duration_ms and deprecated it in favor of react_native.module.duration.total"
}
]
}
Replaced by the `react_native.module.*` namespace, which also covers native module calls made over the Old Architecture bridge, and which drops the `total_` prefix and `_ms` suffix in favor of dot-separated logical grouping
Status: backfill
Changelog
v0.24.0#564Added turbo_module.total_error_count and deprecated it in favor of react_native.module.error.count
Raw JSON
{
"key": "turbo_module.total_error_count",
"brief": "The number of native module calls that failed during the lifetime of the span. Only applies to React Native.",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
2
],
"deprecation": {
"replacement": "react_native.module.error.count",
"reason": "Replaced by the `react_native.module.*` namespace, which also covers native module calls made over the Old Architecture bridge, and which drops the `total_` prefix and `_ms` suffix in favor of dot-separated logical grouping",
"_status": "backfill"
},
"alias": [
"react_native.module.error.count",
"turbo_modules.total_error_count"
],
"changelog": [
{
"version": "0.24.0",
"prs": [
564
],
"description": "Added turbo_module.total_error_count and deprecated it in favor of react_native.module.error.count"
}
]
}
Replaced by the `react_native.module.*` namespace, which also covers native module calls made over the Old Architecture bridge, and which drops the `total_` prefix and `_ms` suffix in favor of dot-separated logical grouping
Status: backfill
Changelog
v0.24.0#564Added turbo_module.unique_methods and deprecated it in favor of react_native.module.call.distinct_count
Raw JSON
{
"key": "turbo_module.unique_methods",
"brief": "The number of distinct native module and method pairs called during the lifetime of the span. Only applies to React Native.",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
7
],
"deprecation": {
"replacement": "react_native.module.call.distinct_count",
"reason": "Replaced by the `react_native.module.*` namespace, which also covers native module calls made over the Old Architecture bridge, and which drops the `total_` prefix and `_ms` suffix in favor of dot-separated logical grouping",
"_status": "backfill"
},
"alias": [
"react_native.module.call.distinct_count",
"turbo_modules.unique_methods"
],
"changelog": [
{
"version": "0.24.0",
"prs": [
564
],
"description": "Added turbo_module.unique_methods and deprecated it in favor of react_native.module.call.distinct_count"
}
]
}
Replaced by the `react_native.module.*` namespace; the SDK emitted the same values under both a singular `turbo_module.*` and a plural `turbo_modules.*` prefix
Status: backfill
Changelog
v0.24.0#564Added turbo_modules.total_call_count and deprecated it in favor of react_native.module.call.count
Raw JSON
{
"key": "turbo_modules.total_call_count",
"brief": "The number of native module calls in the flushed call aggregate. Only applies to React Native.",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
42
],
"deprecation": {
"replacement": "react_native.module.call.count",
"reason": "Replaced by the `react_native.module.*` namespace; the SDK emitted the same values under both a singular `turbo_module.*` and a plural `turbo_modules.*` prefix",
"_status": "backfill"
},
"alias": [
"react_native.module.call.count",
"turbo_module.total_call_count"
],
"changelog": [
{
"version": "0.24.0",
"prs": [
564
],
"description": "Added turbo_modules.total_call_count and deprecated it in favor of react_native.module.call.count"
}
]
}
Replaced by the `react_native.module.*` namespace; the SDK emitted the same values under both a singular `turbo_module.*` and a plural `turbo_modules.*` prefix
Status: backfill
Changelog
v0.24.0#564Added turbo_modules.total_duration_ms and deprecated it in favor of react_native.module.duration.total
Raw JSON
{
"key": "turbo_modules.total_duration_ms",
"brief": "The combined duration of all native module calls in the flushed call aggregate, in milliseconds. Only applies to React Native.",
"type": "double",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
128.45
],
"deprecation": {
"replacement": "react_native.module.duration.total",
"reason": "Replaced by the `react_native.module.*` namespace; the SDK emitted the same values under both a singular `turbo_module.*` and a plural `turbo_modules.*` prefix",
"_status": "backfill"
},
"alias": [
"react_native.module.duration.total",
"turbo_module.total_duration_ms"
],
"changelog": [
{
"version": "0.24.0",
"prs": [
564
],
"description": "Added turbo_modules.total_duration_ms and deprecated it in favor of react_native.module.duration.total"
}
]
}
Replaced by the `react_native.module.*` namespace; the SDK emitted the same values under both a singular `turbo_module.*` and a plural `turbo_modules.*` prefix
Status: backfill
Changelog
v0.24.0#564Added turbo_modules.total_error_count and deprecated it in favor of react_native.module.error.count
Raw JSON
{
"key": "turbo_modules.total_error_count",
"brief": "The number of failed native module calls in the flushed call aggregate. Only applies to React Native.",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
2
],
"deprecation": {
"replacement": "react_native.module.error.count",
"reason": "Replaced by the `react_native.module.*` namespace; the SDK emitted the same values under both a singular `turbo_module.*` and a plural `turbo_modules.*` prefix",
"_status": "backfill"
},
"alias": [
"react_native.module.error.count",
"turbo_module.total_error_count"
],
"changelog": [
{
"version": "0.24.0",
"prs": [
564
],
"description": "Added turbo_modules.total_error_count and deprecated it in favor of react_native.module.error.count"
}
]
}
Replaced by the `react_native.module.*` namespace; the SDK emitted the same values under both a singular `turbo_module.*` and a plural `turbo_modules.*` prefix
Status: backfill
Changelog
v0.24.0#564Added turbo_modules.unique_methods and deprecated it in favor of react_native.module.call.distinct_count
Raw JSON
{
"key": "turbo_modules.unique_methods",
"brief": "The number of distinct native module and method pairs in the flushed call aggregate. Only applies to React Native.",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"examples": [
7
],
"deprecation": {
"replacement": "react_native.module.call.distinct_count",
"reason": "Replaced by the `react_native.module.*` namespace; the SDK emitted the same values under both a singular `turbo_module.*` and a plural `turbo_modules.*` prefix",
"_status": "backfill"
},
"alias": [
"react_native.module.call.distinct_count",
"turbo_module.unique_methods"
],
"changelog": [
{
"version": "0.24.0",
"prs": [
564
],
"description": "Added turbo_modules.unique_methods and deprecated it in favor of react_native.module.call.distinct_count"
}
]
}
The fragments present in the URI. Note that this does not contain the leading # character, while the `http.fragment` attribute does.
Exampledetails
Changelog
v0.0.0
Raw JSON
{
"key": "url.fragment",
"brief": "The fragments present in the URI. Note that this does not contain the leading # character, while the `http.fragment` attribute does.",
"type": "string",
"apply_scrubbing": {
"key": "auto"
},
"is_in_otel": true,
"visibility": "public",
"example": "details",
"changelog": [
{
"version": "0.0.0"
}
]
}
The query string present in the URL. Note that this does not contain the leading ? character, while the `http.query` attribute does.
Scrubbing ReasonQuery string values can contain sensitive information. Clients should attempt to scrub parameters that might contain sensitive information.
Examplefoo=bar&bar=baz
Changelog
v0.0.0
Raw JSON
{
"key": "url.query",
"brief": "The query string present in the URL. Note that this does not contain the leading ? character, while the `http.query` attribute does.",
"type": "string",
"apply_scrubbing": {
"key": "auto",
"reason": "Query string values can contain sensitive information. Clients should attempt to scrub parameters that might contain sensitive information."
},
"is_in_otel": true,
"visibility": "public",
"example": "foo=bar&bar=baz",
"changelog": [
{
"version": "0.0.0"
}
]
}
This attribute is being deprecated in favor of http.request.same_origin.
Status: backfill
Changelog
v0.16.0#456Added url.same_origin attribute, deprecated in favor of http.request.same_origin
Raw JSON
{
"key": "url.same_origin",
"brief": "Indicates that a URL has the same origin as the current page's origin in the browser.",
"type": "boolean",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": false,
"visibility": "public",
"example": true,
"deprecation": {
"replacement": "http.request.same_origin",
"reason": "This attribute is being deprecated in favor of http.request.same_origin.",
"_status": "backfill"
},
"alias": [
"http.request.same_origin"
],
"changelog": [
{
"version": "0.16.0",
"prs": [
456
],
"description": "Added url.same_origin attribute, deprecated in favor of http.request.same_origin"
}
]
}