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
]
}
]
}
{
"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.",
"_status": null
},
"changelog": [
{
"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": "next",
"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.
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": "next",
"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"
}
]
}
{
"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
]
}
]
}
{
"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
]
}
]
}
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.
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"
}
]
}
{
"key": "device.name",
"brief": "The name of the device. On mobile, this is the user-assigned device name. On servers and desktops, this is typically the hostname.",
"type": "string",
"apply_scrubbing": {
"key": "auto"
},
"is_in_otel": false,
"visibility": "public",
"example": "localhost",
"changelog": [
{
"version": "0.5.0",
"prs": [
303
],
"description": "Added device.name attribute"
}
]
}
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"
}
]
}
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"
],
"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"
],
"changelog": [
{
"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.definitions",
"brief": "The list of source system tool definitions available to the GenAI agent or model.",
"type": "string",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"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\"]}}]",
"changelog": [
{
"version": "0.4.0",
"prs": [
221
]
}
]
}
{
"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.
{
"key": "gen_ai.usage.cache_creation.input_tokens",
"brief": "The number of tokens written to the cache when processing the AI input (prompt).",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": 100,
"alias": [
"gen_ai.usage.input_tokens.cache_write"
],
"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."
],
"changelog": [
{
"version": "0.11.0",
"prs": [
418
],
"description": "Added gen_ai.usage.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 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.
{
"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"
],
"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.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"
],
"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.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": [],
"changelog": [
{
"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
]
}
]
}
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.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.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"
],
"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.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 } }
Changelog
v0.7.0Adds the `graphql.document` attribute to track the GraphQL document being executed.
Raw JSON
{
"key": "graphql.document",
"brief": "The GraphQL document being executed.",
"type": "string",
"apply_scrubbing": {
"key": "auto",
"reason": "The document may contain sensitive information in arguments or variables. Instrumentation should redact sensitive information when possible."
},
"is_in_otel": true,
"visibility": "public",
"example": "query findBookById { bookById(id: ?) { name } }",
"changelog": [
{
"version": "0.7.0",
"description": "Adds the `graphql.document` attribute to track the GraphQL document being executed."
}
]
}
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"
}
]
}
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
]
}
]
}
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
]
}
]
}
{
"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"
}
]
}
{
"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": "next",
"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": "next",
"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",
"changelog": [
{
"version": "0.1.0",
"prs": [
127
]
},
{
"version": "0.0.0"
}
]
}
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
]
}
]
}
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
]
}
]
}
{
"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
]
}
]
}
{
"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
nextDeprecated rpc.grpc.status_code in favor of rpc.response.status_code
{
"key": "rpc.grpc.status_code",
"brief": "The numeric status code of the gRPC request.",
"type": "integer",
"apply_scrubbing": {
"key": "manual"
},
"is_in_otel": true,
"visibility": "public",
"example": 2,
"deprecation": {
"replacement": "rpc.response.status_code",
"reason": "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.",
"_status": null
},
"alias": [
"rpc.response.status_code"
],
"changelog": [
{
"version": "next",
"description": "Deprecated rpc.grpc.status_code in favor of rpc.response.status_code"
},
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.0.0"
}
]
}
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.
{
"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",
"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.
{
"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",
"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"
}
]
}
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": "next",
"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",
"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,
"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",
"changelog": [
{
"version": "0.14.0",
"prs": [
453
]
}
]
}
{
"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 is now recorded as a browser.web_vital.lcp.report_event or browser.web_vital.cls.report_event attribute. No backfill required.",
"_status": null
},
"changelog": [
{
"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
nextRemoved 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": "next",
"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
nextDeprecated; 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": "next",
"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
]
}
]
}
{
"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
nextAdded 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": "next",
"description": "Added subprocess.pid attribute, deprecated in favor of process.pid"
}
]
}
{
"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 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"
}
]
}