{
"key": "stall_percentage",
"brief": "The fraction of time the app was stalled. Only applies to React Native. This is computed by Relay.",
"type": "double",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"changelog": [
{
"version": "0.7.0",
"prs": [
362
],
"description": "Added stall_percentage attribute"
}
]
}
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",
"pii": {
"key": "maybe"
},
"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"
],
"sdks": [
"javascript-browser"
],
"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",
"pii": {
"key": "maybe"
},
"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"
],
"sdks": [
"javascript-browser"
],
"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",
"pii": {
"key": "maybe"
},
"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"
],
"sdks": [
"javascript-browser"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
235
]
}
]
}
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",
"pii": {
"key": "maybe"
},
"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"
],
"sdks": [
"javascript-browser"
],
"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",
"pii": {
"key": "maybe"
},
"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"
],
"sdks": [
"javascript-browser"
],
"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",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": "App\\Controller::indexAction",
"deprecation": {
"replacement": "http.route",
"_status": null
},
"alias": [
"http.route"
],
"sdks": [
"php-laravel",
"javascript-reactnative"
],
"changelog": [
{
"version": "0.1.0",
"prs": [
61,
74
]
},
{
"version": "0.0.0"
}
]
}
{
"key": "ttfb",
"brief": "The value of the recorded Time To First Byte (TTFB) web vital in milliseconds",
"type": "double",
"pii": {
"key": "maybe"
},
"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"
],
"sdks": [
"javascript-browser"
],
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "true"
},
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": 5,
"alias": [
"frames.delay"
],
"sdks": [
"sentry.cocoa",
"sentry.java.android",
"sentry.javascript.react-native",
"sentry.dart.flutter"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
313
],
"description": "Added app.vitals.frames.delay.value to replace frames.delay"
}
]
}
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",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": "MainActivity",
"sdks": [
"sentry.cocoa",
"sentry.java.android",
"sentry.javascript.react-native",
"sentry.dart.flutter",
"sentry.dotnet.maui"
],
"changelog": [
{
"version": "0.7.0",
"prs": [
353
],
"description": "Added app.vitals.start.screen attribute"
}
]
}
{
"key": "browser.web_vital.fcp.value",
"brief": "The time it takes for the browser to render the first piece of meaningful content on the screen",
"type": "double",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": 547.6951,
"alias": [
"fcp"
],
"sdks": [
"javascript-browser"
],
"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",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": 477.1926,
"alias": [
"fp"
],
"sdks": [
"javascript-browser"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
235
]
}
]
}
{
"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",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": 1554.5814,
"alias": [
"ttfb.requestTime"
],
"sdks": [
"javascript-browser"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
235
]
}
]
}
{
"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",
"pii": {
"key": "maybe"
},
"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>"
],
"sdks": [
"javascript-browser"
],
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "maybe"
},
"is_in_otel": true,
"visibility": "public",
"example": "http.handler",
"changelog": [
{
"version": "0.1.0",
"prs": [
61,
74
]
},
{
"version": "0.0.0"
}
]
}
string PII: Maybe Visibility: Public OTel: True Dynamic
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",
"pii": {
"key": "maybe"
},
"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.
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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": 8,
"alias": [
"deviceMemory"
],
"sdks": [
"javascript-browser"
],
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "false"
},
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "false"
},
"is_in_otel": true,
"visibility": "public",
"example": true,
"changelog": [
{
"version": "0.0.0"
}
]
}
boolean PII: False Visibility: Public OTel: False Dynamic
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",
"pii": {
"key": "false"
},
"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",
"pii": {
"key": "maybe"
},
"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"
}
]
}
The cost of tokens used to process the AI input (prompt) in USD (without cached input 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 cost of non-cached input tokens only. The cost of cached tokens is excluded from this value.
{
"key": "gen_ai.cost.input_tokens",
"brief": "The cost of tokens used to process the AI input (prompt) in USD (without cached input tokens).",
"type": "double",
"pii": {
"key": "maybe"
},
"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 cost of non-cached input tokens only. The cost of cached tokens is excluded from this value."
],
"changelog": [
{
"version": "0.9.0",
"prs": [
397
],
"description": "Add additional_context"
},
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.1.0",
"prs": [
112
]
}
]
}
The cost of tokens used for creating the AI output in USD (without 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 cost of non-reasoning output tokens only. The cost of reasoning tokens is excluded from this value.
{
"key": "gen_ai.cost.output_tokens",
"brief": "The cost of tokens used for creating the AI output in USD (without reasoning tokens).",
"type": "double",
"pii": {
"key": "maybe"
},
"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 cost of non-reasoning output tokens only. The cost of reasoning tokens is excluded from this value."
],
"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.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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "maybe"
},
"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"
],
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "maybe"
},
"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\"}]",
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "maybe"
},
"is_in_otel": true,
"visibility": "public",
"example": "{\"location\": \"Paris\"}",
"alias": [
"gen_ai.tool.input"
],
"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",
"pii": {
"key": "maybe"
},
"is_in_otel": true,
"visibility": "public",
"example": "rainy, 57°F",
"alias": [
"gen_ai.tool.output",
"gen_ai.tool.message"
],
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "maybe"
},
"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.
This count includes cached input tokens. gen_ai.usage.input_tokens.cached is a subset of this value, not an independent count — do not sum them together.
{
"key": "gen_ai.usage.input_tokens",
"brief": "The number of tokens used to process the AI input (prompt) including cached input tokens.",
"type": "integer",
"pii": {
"key": "maybe"
},
"is_in_otel": true,
"visibility": "public",
"example": 10,
"alias": [
"ai.prompt_tokens.used",
"gen_ai.usage.prompt_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 count includes cached input tokens. gen_ai.usage.input_tokens.cached is a subset of this value, not an independent count — do not sum them together."
],
"changelog": [
{
"version": "0.9.0",
"prs": [
397
],
"description": "Add additional_context"
},
{
"version": "0.5.0",
"prs": [
261
]
},
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.1.0",
"prs": [
112
]
},
{
"version": "0.0.0"
}
]
}
The number of tokens written to the cache when processing the AI input (prompt).
Example100
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.
The number of cached tokens used to process the AI input (prompt).
Example50
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.
{
"key": "gen_ai.usage.input_tokens.cached",
"brief": "The number of cached tokens used to process the AI input (prompt).",
"type": "integer",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": 50,
"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.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 count includes reasoning tokens. gen_ai.usage.output_tokens.reasoning is a subset of this value, not an independent count — do not sum them together.
The number of tokens used for reasoning to create the AI output.
Example75
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.
{
"key": "gen_ai.usage.output_tokens.reasoning",
"brief": "The number of tokens used for reasoning to create the AI output.",
"type": "integer",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": 75,
"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.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 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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "maybe"
},
"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": "normalize"
},
"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",
"pii": {
"key": "maybe"
},
"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": "normalize"
},
"alias": [],
"changelog": [
{
"version": "0.4.0",
"prs": [
221
]
},
{
"version": "0.1.0",
"prs": [
63,
74
]
}
]
}
{
"key": "gen_ai.tool.input",
"brief": "The input of the tool being used. It has to be a stringified version of the input to the tool.",
"type": "string",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": "{\"location\": \"Paris\"}",
"deprecation": {
"replacement": "gen_ai.tool.call.arguments",
"_status": "normalize"
},
"alias": [
"gen_ai.tool.call.arguments"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
265
]
},
{
"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.
PII 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",
"pii": {
"key": "maybe",
"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 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",
"pii": {
"key": "maybe"
},
"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.
PII 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",
"pii": {
"key": "true",
"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",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": 1732829555.15,
"sdks": [
"javascript-browser"
],
"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",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": 1732829555.51,
"sdks": [
"javascript-browser"
],
"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",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": 1732829555.89,
"sdks": [
"javascript-browser"
],
"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",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": 1732829555.7,
"sdks": [
"javascript-browser"
],
"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",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": 1732829555.73,
"sdks": [
"javascript-browser"
],
"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",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": 1.032,
"sdks": [
"javascript-browser"
],
"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",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": 1732829553.68,
"sdks": [
"javascript-browser"
],
"changelog": [
{
"version": "0.4.0",
"prs": [
228
]
},
{
"version": "0.1.0",
"prs": [
130,
134
]
}
]
}
{
"key": "http.route",
"brief": "The matched route, that is, the path template in the format used by the respective server framework.",
"type": "string",
"pii": {
"key": "maybe"
},
"is_in_otel": true,
"visibility": "public",
"example": "/users/:id",
"alias": [
"url.template"
],
"changelog": [
{
"version": "0.1.0",
"prs": [
127
]
},
{
"version": "0.0.0"
}
]
}
The time in milliseconds the request spent in the server queue before processing began. Measured from the X-Request-Start header set by reverse proxies (e.g., Nginx, HAProxy, Heroku) to when the application started handling the request.
{
"key": "http.server.request.time_in_queue",
"brief": "The time in milliseconds the request spent in the server queue before processing began. Measured from the X-Request-Start header set by reverse proxies (e.g., Nginx, HAProxy, Heroku) to when the application started handling the request.",
"type": "double",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": 50,
"sdks": [
"ruby"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
267
]
}
]
}
{
"key": "lcp.id",
"brief": "The id of the dom element responsible for the largest contentful paint.",
"type": "string",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"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",
"pii": {
"key": "maybe"
},
"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"
],
"sdks": [
"javascript-browser"
],
"changelog": [
{
"version": "0.5.0",
"prs": [
233
]
}
]
}
{
"key": "lcp.renderTime",
"brief": "The time it took for the LCP element to be rendered",
"type": "integer",
"pii": {
"key": "maybe"
},
"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"
],
"sdks": [
"javascript-browser"
],
"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",
"pii": {
"key": "true"
},
"is_in_otel": false,
"visibility": "public",
"example": "Please provide a summary of the document",
"changelog": [
{
"version": "0.3.0",
"prs": [
171
]
}
]
}
string PII: True Visibility: Public OTel: False Dynamic
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.
PII 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",
"pii": {
"key": "true",
"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
]
}
]
}
string PII: Maybe Visibility: Public OTel: False Dynamic
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'
SDKsjavajava.logbackjava.juljava.log4j2
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",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": "mdc.some_key='some_value'",
"sdks": [
"java",
"java.logback",
"java.jul",
"java.log4j2"
],
"changelog": [
{
"version": "0.3.0",
"prs": [
176
]
}
]
}
{
"key": "messaging.message.id",
"brief": "A value used by the messaging system as an identifier for the message, represented as a string.",
"type": "string",
"pii": {
"key": "maybe"
},
"is_in_otel": true,
"visibility": "public",
"example": "f47ac10b58cc4372a5670e02b2c3d479",
"sdks": [
"php-laravel"
],
"changelog": [
{
"version": "0.1.0",
"prs": [
127
]
},
{
"version": "0.0.0"
}
]
}
{
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "maybe"
},
"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"
],
"sdks": [
"javascript-browser"
],
"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",
"pii": {
"key": "maybe"
},
"is_in_otel": true,
"visibility": "public",
"example": "Eclipse OpenJ9 VM openj9-0.21.0",
"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",
"pii": {
"key": "maybe"
},
"is_in_otel": true,
"visibility": "public",
"example": "18.04.2",
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": "http.response.header.text='test'",
"sdks": [
"javascript-remix"
],
"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",
"pii": {
"key": "maybe"
},
"is_in_otel": true,
"visibility": "public",
"example": "myService.BestService",
"changelog": [
{
"version": "0.1.0",
"prs": [
127
]
},
{
"version": "0.0.0"
}
]
}
{
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "false"
},
"is_in_otel": false,
"visibility": "internal",
"example": "12345",
"changelog": [
{
"version": "0.7.0",
"prs": [
358
],
"description": "Add sentry.dsc.project_id as an attribute"
}
]
}
{
"key": "sentry.kind",
"brief": "Used to clarify the relationship between parents and children, or to distinguish between spans, e.g. a `server` and `client` span with the same name.",
"type": "string",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": "server",
"changelog": [
{
"version": "0.3.1",
"prs": [
190
]
}
]
}
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",
"pii": {
"key": "false"
},
"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",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": "sentry.message.parameter.0='123'",
"changelog": [
{
"version": "0.1.0",
"prs": [
116
]
}
]
}
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",
"pii": {
"key": "false"
},
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "false"
},
"is_in_otel": false,
"visibility": "public",
"example": "/posts/[id]/layout",
"sdks": [
"javascript"
],
"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",
"pii": {
"key": "false"
},
"is_in_otel": false,
"visibility": "public",
"example": "generateMetadata",
"sdks": [
"javascript"
],
"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",
"pii": {
"key": "maybe"
},
"is_in_otel": false,
"visibility": "public",
"example": "SELECT .. FROM sentry_project WHERE (project_id = %s)",
"changelog": [
{
"version": "0.4.0",
"prs": [
212
]
}
]
}
string[] PII: False Visibility: Public OTel: False
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 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.
{
"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",
"pii": {
"key": "maybe"
},
"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",
"pii": {
"key": "false"
},
"is_in_otel": false,
"visibility": "public",
"example": 0,
"changelog": [
{
"version": "0.5.0",
"prs": [
262
]
}
]
}
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.
This attribute is being deprecated in favor of sentry.span.source
Status: backfill
Changelog
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",
"pii": {
"key": "false"
},
"is_in_otel": false,
"visibility": "public",
"example": "route",
"deprecation": {
"replacement": "sentry.span.source",
"reason": "This attribute is being deprecated in favor of sentry.span.source",
"_status": "backfill"
},
"changelog": [
{
"version": "0.5.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",
"pii": {
"key": "false"
},
"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",
"pii": {
"key": "maybe"
},
"is_in_otel": true,
"visibility": "public",
"example": "5.0.0",
"alias": [
"sentry.release"
],
"changelog": [
{
"version": "0.1.0",
"prs": [
127
]
},
{
"version": "0.0.0"
}
]
}
{
"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",
"pii": {
"key": "maybe"
},
"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"
],
"sdks": [
"javascript-browser"
],
"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",
"pii": {
"key": "maybe"
},
"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.
PII 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",
"pii": {
"key": "true",
"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"
}
]
}