From fc9eb9d03858521c2393694e2978aef35ab1cd02 Mon Sep 17 00:00:00 2001 From: JPeer264 Date: Fri, 9 Oct 2026 10:35:01 +0200 Subject: [PATCH 01/11] feat: Add BullMQ attributes and metrics Co-Authored-By: Claude Opus 5.5 --- .../sentry-conventions/src/attributes.ts | 1210 +++++++++++++++++ javascript/sentry-conventions/src/search.ts | 375 +++++ .../attributes/bullmq/bullmq__flow__name.json | 21 + ...llmq__job__attempt_finished_timestamp.json | 21 + .../bullmq/bullmq__job__bulk__names.json | 21 + .../bullmq__job__deduplication__key.json | 21 + .../bullmq__job__finished__timestamp.json | 22 + model/attributes/bullmq/bullmq__job__ids.json | 22 + model/attributes/bullmq/bullmq__job__key.json | 21 + .../attributes/bullmq/bullmq__job__name.json | 22 + .../bullmq/bullmq__job__options.json | 21 + .../bullmq__job__processed__timestamp.json | 21 + .../bullmq/bullmq__job__progress.json | 21 + .../bullmq/bullmq__job__scheduler__id.json | 21 + .../attributes/bullmq/bullmq__job__state.json | 22 + .../bullmq/bullmq__job__status.json | 22 + .../attributes/bullmq/bullmq__job__type.json | 21 + .../bullmq/bullmq__queue__clean__count.json | 22 + .../bullmq/bullmq__queue__clean__limit.json | 21 + .../bullmq/bullmq__queue__drain__delay.json | 21 + .../bullmq__queue__event__max__length.json | 21 + .../bullmq/bullmq__queue__grace.json | 21 + .../bullmq/bullmq__queue__jobs__state.json | 22 + .../bullmq/bullmq__queue__options.json | 21 + .../bullmq/bullmq__queue__rate__limit.json | 21 + ...bullmq__worker__do__not__wait__active.json | 21 + .../bullmq/bullmq__worker__force__close.json | 21 + .../attributes/bullmq/bullmq__worker__id.json | 21 + ...llmq__worker__jobs__to__extend__locks.json | 21 + .../bullmq/bullmq__worker__name.json | 21 + .../bullmq/bullmq__worker__options.json | 21 + .../bullmq/bullmq__worker__rate__limit.json | 21 + .../bullmq/bullmq__worker__stalled__jobs.json | 21 + .../metrics/bullmq/bullmq__job__duration.json | 9 + .../bullmq/bullmq__jobs__completed.json | 9 + .../metrics/bullmq/bullmq__jobs__delayed.json | 9 + .../metrics/bullmq/bullmq__jobs__failed.json | 9 + .../metrics/bullmq/bullmq__jobs__retried.json | 9 + .../metrics/bullmq/bullmq__jobs__waiting.json | 9 + .../bullmq__jobs__waiting_children.json | 9 + model/metrics/bullmq/bullmq__queue__jobs.json | 9 + python/src/sentry_conventions/attributes.py | 1031 ++++++++++++++ 42 files changed, 3346 insertions(+) create mode 100644 model/attributes/bullmq/bullmq__flow__name.json create mode 100644 model/attributes/bullmq/bullmq__job__attempt_finished_timestamp.json create mode 100644 model/attributes/bullmq/bullmq__job__bulk__names.json create mode 100644 model/attributes/bullmq/bullmq__job__deduplication__key.json create mode 100644 model/attributes/bullmq/bullmq__job__finished__timestamp.json create mode 100644 model/attributes/bullmq/bullmq__job__ids.json create mode 100644 model/attributes/bullmq/bullmq__job__key.json create mode 100644 model/attributes/bullmq/bullmq__job__name.json create mode 100644 model/attributes/bullmq/bullmq__job__options.json create mode 100644 model/attributes/bullmq/bullmq__job__processed__timestamp.json create mode 100644 model/attributes/bullmq/bullmq__job__progress.json create mode 100644 model/attributes/bullmq/bullmq__job__scheduler__id.json create mode 100644 model/attributes/bullmq/bullmq__job__state.json create mode 100644 model/attributes/bullmq/bullmq__job__status.json create mode 100644 model/attributes/bullmq/bullmq__job__type.json create mode 100644 model/attributes/bullmq/bullmq__queue__clean__count.json create mode 100644 model/attributes/bullmq/bullmq__queue__clean__limit.json create mode 100644 model/attributes/bullmq/bullmq__queue__drain__delay.json create mode 100644 model/attributes/bullmq/bullmq__queue__event__max__length.json create mode 100644 model/attributes/bullmq/bullmq__queue__grace.json create mode 100644 model/attributes/bullmq/bullmq__queue__jobs__state.json create mode 100644 model/attributes/bullmq/bullmq__queue__options.json create mode 100644 model/attributes/bullmq/bullmq__queue__rate__limit.json create mode 100644 model/attributes/bullmq/bullmq__worker__do__not__wait__active.json create mode 100644 model/attributes/bullmq/bullmq__worker__force__close.json create mode 100644 model/attributes/bullmq/bullmq__worker__id.json create mode 100644 model/attributes/bullmq/bullmq__worker__jobs__to__extend__locks.json create mode 100644 model/attributes/bullmq/bullmq__worker__name.json create mode 100644 model/attributes/bullmq/bullmq__worker__options.json create mode 100644 model/attributes/bullmq/bullmq__worker__rate__limit.json create mode 100644 model/attributes/bullmq/bullmq__worker__stalled__jobs.json create mode 100644 model/metrics/bullmq/bullmq__job__duration.json create mode 100644 model/metrics/bullmq/bullmq__jobs__completed.json create mode 100644 model/metrics/bullmq/bullmq__jobs__delayed.json create mode 100644 model/metrics/bullmq/bullmq__jobs__failed.json create mode 100644 model/metrics/bullmq/bullmq__jobs__retried.json create mode 100644 model/metrics/bullmq/bullmq__jobs__waiting.json create mode 100644 model/metrics/bullmq/bullmq__jobs__waiting_children.json create mode 100644 model/metrics/bullmq/bullmq__queue__jobs.json diff --git a/javascript/sentry-conventions/src/attributes.ts b/javascript/sentry-conventions/src/attributes.ts index 4cebd7796..ddbe350d5 100644 --- a/javascript/sentry-conventions/src/attributes.ts +++ b/javascript/sentry-conventions/src/attributes.ts @@ -4076,6 +4076,665 @@ export const BROWSER_WEB_VITAL_TTFB_VALUE = 'browser.web_vital.ttfb.value'; */ export type BROWSER_WEB_VITAL_TTFB_VALUE_TYPE = number; +// Path: model/attributes/bullmq/bullmq__flow__name.json + +/** + * The name of the root job of the BullMQ flow that FlowProducer.add() adds. `bullmq.flow.name` + * + * Attribute Value Type: `string` {@link BULLMQ_FLOW_NAME_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "build-report" + */ +export const BULLMQ_FLOW_NAME = 'bullmq.flow.name'; + +/** + * Type for {@link BULLMQ_FLOW_NAME} bullmq.flow.name + */ +export type BULLMQ_FLOW_NAME_TYPE = string; + +// Path: model/attributes/bullmq/bullmq__job__attempt_finished_timestamp.json + +/** + * The time in milliseconds since the Unix epoch when the current attempt of the BullMQ job finished. `bullmq.job.attempt_finished_timestamp` + * + * Attribute Value Type: `number` {@link BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 1791184722406 + */ +export const BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP = 'bullmq.job.attempt_finished_timestamp'; + +/** + * Type for {@link BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP} bullmq.job.attempt_finished_timestamp + */ +export type BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP_TYPE = number; + +// Path: model/attributes/bullmq/bullmq__job__bulk__names.json + +/** + * The names of the BullMQ jobs or flows that one bulk operation adds, for example Queue.addBulk(). `bullmq.job.bulk.names` + * + * Attribute Value Type: `Array` {@link BULLMQ_JOB_BULK_NAMES_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example ["send-welcome-email","generate-report"] + */ +export const BULLMQ_JOB_BULK_NAMES = 'bullmq.job.bulk.names'; + +/** + * Type for {@link BULLMQ_JOB_BULK_NAMES} bullmq.job.bulk.names + */ +export type BULLMQ_JOB_BULK_NAMES_TYPE = Array; + +// Path: model/attributes/bullmq/bullmq__job__deduplication__key.json + +/** + * The deduplication ID that Queue.removeDeduplicationKey() removes. `bullmq.job.deduplication.key` + * + * Attribute Value Type: `string` {@link BULLMQ_JOB_DEDUPLICATION_KEY_TYPE} + * + * Apply Scrubbing: auto + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "user-42-sync" + */ +export const BULLMQ_JOB_DEDUPLICATION_KEY = 'bullmq.job.deduplication.key'; + +/** + * Type for {@link BULLMQ_JOB_DEDUPLICATION_KEY} bullmq.job.deduplication.key + */ +export type BULLMQ_JOB_DEDUPLICATION_KEY_TYPE = string; + +// Path: model/attributes/bullmq/bullmq__job__finished__timestamp.json + +/** + * The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job. `bullmq.job.finished.timestamp` + * + * Attribute Value Type: `number` {@link BULLMQ_JOB_FINISHED_TIMESTAMP_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 1791184722411 + */ +export const BULLMQ_JOB_FINISHED_TIMESTAMP = 'bullmq.job.finished.timestamp'; + +/** + * Type for {@link BULLMQ_JOB_FINISHED_TIMESTAMP} bullmq.job.finished.timestamp + */ +export type BULLMQ_JOB_FINISHED_TIMESTAMP_TYPE = number; + +// Path: model/attributes/bullmq/bullmq__job__ids.json + +/** + * The IDs of the BullMQ jobs that Queue.clean() removed. `bullmq.job.ids` + * + * Attribute Value Type: `Array` {@link BULLMQ_JOB_IDS_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example ["1","2","3"] + */ +export const BULLMQ_JOB_IDS = 'bullmq.job.ids'; + +/** + * Type for {@link BULLMQ_JOB_IDS} bullmq.job.ids + */ +export type BULLMQ_JOB_IDS_TYPE = Array; + +// Path: model/attributes/bullmq/bullmq__job__key.json + +/** + * The key that a BullMQ remove operation for a debounce or repeatable key gets, for example Queue.removeDebounceKey(). `bullmq.job.key` + * + * Attribute Value Type: `string` {@link BULLMQ_JOB_KEY_TYPE} + * + * Apply Scrubbing: auto + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "user-42-sync" + */ +export const BULLMQ_JOB_KEY = 'bullmq.job.key'; + +/** + * Type for {@link BULLMQ_JOB_KEY} bullmq.job.key + */ +export type BULLMQ_JOB_KEY_TYPE = string; + +// Path: model/attributes/bullmq/bullmq__job__name.json + +/** + * The name of the BullMQ job, which the user passes to Queue.add() to identify the kind of work. `bullmq.job.name` + * + * Attribute Value Type: `string` {@link BULLMQ_JOB_NAME_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "send-welcome-email" + * @example "generate-report" + */ +export const BULLMQ_JOB_NAME = 'bullmq.job.name'; + +/** + * Type for {@link BULLMQ_JOB_NAME} bullmq.job.name + */ +export type BULLMQ_JOB_NAME_TYPE = string; + +// Path: model/attributes/bullmq/bullmq__job__options.json + +/** + * The options of a BullMQ job operation as a JSON string, for example the options of Queue.remove(). `bullmq.job.options` + * + * Attribute Value Type: `string` {@link BULLMQ_JOB_OPTIONS_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "{\"removeChildren\":true}" + */ +export const BULLMQ_JOB_OPTIONS = 'bullmq.job.options'; + +/** + * Type for {@link BULLMQ_JOB_OPTIONS} bullmq.job.options + */ +export type BULLMQ_JOB_OPTIONS_TYPE = string; + +// Path: model/attributes/bullmq/bullmq__job__processed__timestamp.json + +/** + * The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job. `bullmq.job.processed.timestamp` + * + * Attribute Value Type: `number` {@link BULLMQ_JOB_PROCESSED_TIMESTAMP_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 1791184722281 + */ +export const BULLMQ_JOB_PROCESSED_TIMESTAMP = 'bullmq.job.processed.timestamp'; + +/** + * Type for {@link BULLMQ_JOB_PROCESSED_TIMESTAMP} bullmq.job.processed.timestamp + */ +export type BULLMQ_JOB_PROCESSED_TIMESTAMP_TYPE = number; + +// Path: model/attributes/bullmq/bullmq__job__progress.json + +/** + * The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress(). `bullmq.job.progress` + * + * Attribute Value Type: `string` {@link BULLMQ_JOB_PROGRESS_TYPE} + * + * Apply Scrubbing: auto + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "{\"percentage\":50}" + */ +export const BULLMQ_JOB_PROGRESS = 'bullmq.job.progress'; + +/** + * Type for {@link BULLMQ_JOB_PROGRESS} bullmq.job.progress + */ +export type BULLMQ_JOB_PROGRESS_TYPE = string; + +// Path: model/attributes/bullmq/bullmq__job__scheduler__id.json + +/** + * The ID of the BullMQ job scheduler that adds the job. `bullmq.job.scheduler.id` + * + * Attribute Value Type: `string` {@link BULLMQ_JOB_SCHEDULER_ID_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "daily-report" + */ +export const BULLMQ_JOB_SCHEDULER_ID = 'bullmq.job.scheduler.id'; + +/** + * Type for {@link BULLMQ_JOB_SCHEDULER_ID} bullmq.job.scheduler.id + */ +export type BULLMQ_JOB_SCHEDULER_ID_TYPE = string; + +// Path: model/attributes/bullmq/bullmq__job__state.json + +/** + * The state of the BullMQ job that a job metric counts. `bullmq.job.state` + * + * Attribute Value Type: `string` {@link BULLMQ_JOB_STATE_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "completed" + * @example "failed" + * @example "delayed" + */ +export const BULLMQ_JOB_STATE = 'bullmq.job.state'; + +/** + * Type for {@link BULLMQ_JOB_STATE} bullmq.job.state + */ +export type BULLMQ_JOB_STATE_TYPE = string; + +// Path: model/attributes/bullmq/bullmq__job__status.json + +/** + * The state of the BullMQ job that a job metric counts. `bullmq.job.status` + * + * Attribute Value Type: `string` {@link BULLMQ_JOB_STATUS_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "completed" + * @example "failed" + * @example "delayed" + */ +export const BULLMQ_JOB_STATUS = 'bullmq.job.status'; + +/** + * Type for {@link BULLMQ_JOB_STATUS} bullmq.job.status + */ +export type BULLMQ_JOB_STATUS_TYPE = string; + +// Path: model/attributes/bullmq/bullmq__job__type.json + +/** + * The job state from which Queue.clean() removes BullMQ jobs. `bullmq.job.type` + * + * Attribute Value Type: `string` {@link BULLMQ_JOB_TYPE_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "completed" + * @example "failed" + */ +export const BULLMQ_JOB_TYPE = 'bullmq.job.type'; + +/** + * Type for {@link BULLMQ_JOB_TYPE} bullmq.job.type + */ +export type BULLMQ_JOB_TYPE_TYPE = string; + +// Path: model/attributes/bullmq/bullmq__queue__clean__count.json + +/** + * The number of BullMQ jobs that Queue.clean() removed. `bullmq.queue.clean.count` + * + * Attribute Value Type: `number` {@link BULLMQ_QUEUE_CLEAN_COUNT_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 25 + */ +export const BULLMQ_QUEUE_CLEAN_COUNT = 'bullmq.queue.clean.count'; + +/** + * Type for {@link BULLMQ_QUEUE_CLEAN_COUNT} bullmq.queue.clean.count + */ +export type BULLMQ_QUEUE_CLEAN_COUNT_TYPE = number; + +// Path: model/attributes/bullmq/bullmq__queue__clean__limit.json + +/** + * The maximum number of BullMQ jobs that Queue.clean() removes. `bullmq.queue.clean.limit` + * + * Attribute Value Type: `number` {@link BULLMQ_QUEUE_CLEAN_LIMIT_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 1000 + */ +export const BULLMQ_QUEUE_CLEAN_LIMIT = 'bullmq.queue.clean.limit'; + +/** + * Type for {@link BULLMQ_QUEUE_CLEAN_LIMIT} bullmq.queue.clean.limit + */ +export type BULLMQ_QUEUE_CLEAN_LIMIT_TYPE = number; + +// Path: model/attributes/bullmq/bullmq__queue__drain__delay.json + +/** + * Whether Queue.drain() also removes the delayed BullMQ jobs. `bullmq.queue.drain.delay` + * + * Attribute Value Type: `boolean` {@link BULLMQ_QUEUE_DRAIN_DELAY_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example true + */ +export const BULLMQ_QUEUE_DRAIN_DELAY = 'bullmq.queue.drain.delay'; + +/** + * Type for {@link BULLMQ_QUEUE_DRAIN_DELAY} bullmq.queue.drain.delay + */ +export type BULLMQ_QUEUE_DRAIN_DELAY_TYPE = boolean; + +// Path: model/attributes/bullmq/bullmq__queue__event__max__length.json + +/** + * The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream. `bullmq.queue.event.max.length` + * + * Attribute Value Type: `number` {@link BULLMQ_QUEUE_EVENT_MAX_LENGTH_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 10000 + */ +export const BULLMQ_QUEUE_EVENT_MAX_LENGTH = 'bullmq.queue.event.max.length'; + +/** + * Type for {@link BULLMQ_QUEUE_EVENT_MAX_LENGTH} bullmq.queue.event.max.length + */ +export type BULLMQ_QUEUE_EVENT_MAX_LENGTH_TYPE = number; + +// Path: model/attributes/bullmq/bullmq__queue__grace.json + +/** + * The grace period in milliseconds that Queue.clean() uses. Only BullMQ jobs that are older are removed. `bullmq.queue.grace` + * + * Attribute Value Type: `number` {@link BULLMQ_QUEUE_GRACE_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 60000 + */ +export const BULLMQ_QUEUE_GRACE = 'bullmq.queue.grace'; + +/** + * Type for {@link BULLMQ_QUEUE_GRACE} bullmq.queue.grace + */ +export type BULLMQ_QUEUE_GRACE_TYPE = number; + +// Path: model/attributes/bullmq/bullmq__queue__jobs__state.json + +/** + * The BullMQ job state that the queue job count metric counts. `bullmq.queue.jobs.state` + * + * Attribute Value Type: `string` {@link BULLMQ_QUEUE_JOBS_STATE_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "waiting" + * @example "active" + * @example "completed" + */ +export const BULLMQ_QUEUE_JOBS_STATE = 'bullmq.queue.jobs.state'; + +/** + * Type for {@link BULLMQ_QUEUE_JOBS_STATE} bullmq.queue.jobs.state + */ +export type BULLMQ_QUEUE_JOBS_STATE_TYPE = string; + +// Path: model/attributes/bullmq/bullmq__queue__options.json + +/** + * The options of a BullMQ queue operation as a JSON string, for example the options of Queue.retryJobs() or Queue.promoteJobs(). `bullmq.queue.options` + * + * Attribute Value Type: `string` {@link BULLMQ_QUEUE_OPTIONS_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "{\"count\":1000}" + */ +export const BULLMQ_QUEUE_OPTIONS = 'bullmq.queue.options'; + +/** + * Type for {@link BULLMQ_QUEUE_OPTIONS} bullmq.queue.options + */ +export type BULLMQ_QUEUE_OPTIONS_TYPE = string; + +// Path: model/attributes/bullmq/bullmq__queue__rate__limit.json + +/** + * The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue. `bullmq.queue.rate.limit` + * + * Attribute Value Type: `number` {@link BULLMQ_QUEUE_RATE_LIMIT_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 5000 + */ +export const BULLMQ_QUEUE_RATE_LIMIT = 'bullmq.queue.rate.limit'; + +/** + * Type for {@link BULLMQ_QUEUE_RATE_LIMIT} bullmq.queue.rate.limit + */ +export type BULLMQ_QUEUE_RATE_LIMIT_TYPE = number; + +// Path: model/attributes/bullmq/bullmq__worker__do__not__wait__active.json + +/** + * Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish. `bullmq.worker.do.not.wait.active` + * + * Attribute Value Type: `boolean` {@link BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example false + */ +export const BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE = 'bullmq.worker.do.not.wait.active'; + +/** + * Type for {@link BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE} bullmq.worker.do.not.wait.active + */ +export type BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE_TYPE = boolean; + +// Path: model/attributes/bullmq/bullmq__worker__force__close.json + +/** + * Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish. `bullmq.worker.force.close` + * + * Attribute Value Type: `boolean` {@link BULLMQ_WORKER_FORCE_CLOSE_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example false + */ +export const BULLMQ_WORKER_FORCE_CLOSE = 'bullmq.worker.force.close'; + +/** + * Type for {@link BULLMQ_WORKER_FORCE_CLOSE} bullmq.worker.force.close + */ +export type BULLMQ_WORKER_FORCE_CLOSE_TYPE = boolean; + +// Path: model/attributes/bullmq/bullmq__worker__id.json + +/** + * The ID that BullMQ generates for the Worker instance. `bullmq.worker.id` + * + * Attribute Value Type: `string` {@link BULLMQ_WORKER_ID_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "03327d57-05cc-4528-9d24-c59bf6520039" + */ +export const BULLMQ_WORKER_ID = 'bullmq.worker.id'; + +/** + * Type for {@link BULLMQ_WORKER_ID} bullmq.worker.id + */ +export type BULLMQ_WORKER_ID_TYPE = string; + +// Path: model/attributes/bullmq/bullmq__worker__jobs__to__extend__locks.json + +/** + * The IDs of the BullMQ jobs whose locks the Worker extends. `bullmq.worker.jobs.to.extend.locks` + * + * Attribute Value Type: `Array` {@link BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example ["1","2"] + */ +export const BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS = 'bullmq.worker.jobs.to.extend.locks'; + +/** + * Type for {@link BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS} bullmq.worker.jobs.to.extend.locks + */ +export type BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS_TYPE = Array; + +// Path: model/attributes/bullmq/bullmq__worker__name.json + +/** + * The name that the user gives to the BullMQ Worker in its options. `bullmq.worker.name` + * + * Attribute Value Type: `string` {@link BULLMQ_WORKER_NAME_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "email-worker" + */ +export const BULLMQ_WORKER_NAME = 'bullmq.worker.name'; + +/** + * Type for {@link BULLMQ_WORKER_NAME} bullmq.worker.name + */ +export type BULLMQ_WORKER_NAME_TYPE = string; + +// Path: model/attributes/bullmq/bullmq__worker__options.json + +/** + * The options of a BullMQ Worker operation as a JSON string, for example the options of Worker.getNextJob(). `bullmq.worker.options` + * + * Attribute Value Type: `string` {@link BULLMQ_WORKER_OPTIONS_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "{\"block\":true}" + */ +export const BULLMQ_WORKER_OPTIONS = 'bullmq.worker.options'; + +/** + * Type for {@link BULLMQ_WORKER_OPTIONS} bullmq.worker.options + */ +export type BULLMQ_WORKER_OPTIONS_TYPE = string; + +// Path: model/attributes/bullmq/bullmq__worker__rate__limit.json + +/** + * The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker. `bullmq.worker.rate.limit` + * + * Attribute Value Type: `number` {@link BULLMQ_WORKER_RATE_LIMIT_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 5000 + */ +export const BULLMQ_WORKER_RATE_LIMIT = 'bullmq.worker.rate.limit'; + +/** + * Type for {@link BULLMQ_WORKER_RATE_LIMIT} bullmq.worker.rate.limit + */ +export type BULLMQ_WORKER_RATE_LIMIT_TYPE = number; + +// Path: model/attributes/bullmq/bullmq__worker__stalled__jobs.json + +/** + * The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state. `bullmq.worker.stalled.jobs` + * + * Attribute Value Type: `Array` {@link BULLMQ_WORKER_STALLED_JOBS_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example ["1","2"] + */ +export const BULLMQ_WORKER_STALLED_JOBS = 'bullmq.worker.stalled.jobs'; + +/** + * Type for {@link BULLMQ_WORKER_STALLED_JOBS} bullmq.worker.stalled.jobs + */ +export type BULLMQ_WORKER_STALLED_JOBS_TYPE = Array; + // Path: model/attributes/cache/cache__hit.json /** @@ -20138,6 +20797,37 @@ export const ATTRIBUTE_TYPE: Record = { 'browser.web_vital.lcp.value': 'double', 'browser.web_vital.ttfb.request_time': 'double', 'browser.web_vital.ttfb.value': 'double', + 'bullmq.flow.name': 'string', + 'bullmq.job.attempt_finished_timestamp': 'integer', + 'bullmq.job.bulk.names': 'string[]', + 'bullmq.job.deduplication.key': 'string', + 'bullmq.job.finished.timestamp': 'integer', + 'bullmq.job.ids': 'string[]', + 'bullmq.job.key': 'string', + 'bullmq.job.name': 'string', + 'bullmq.job.options': 'string', + 'bullmq.job.processed.timestamp': 'integer', + 'bullmq.job.progress': 'string', + 'bullmq.job.scheduler.id': 'string', + 'bullmq.job.state': 'string', + 'bullmq.job.status': 'string', + 'bullmq.job.type': 'string', + 'bullmq.queue.clean.count': 'integer', + 'bullmq.queue.clean.limit': 'integer', + 'bullmq.queue.drain.delay': 'boolean', + 'bullmq.queue.event.max.length': 'integer', + 'bullmq.queue.grace': 'integer', + 'bullmq.queue.jobs.state': 'string', + 'bullmq.queue.options': 'string', + 'bullmq.queue.rate.limit': 'integer', + 'bullmq.worker.do.not.wait.active': 'boolean', + 'bullmq.worker.force.close': 'boolean', + 'bullmq.worker.id': 'string', + 'bullmq.worker.jobs.to.extend.locks': 'string[]', + 'bullmq.worker.name': 'string', + 'bullmq.worker.options': 'string', + 'bullmq.worker.rate.limit': 'integer', + 'bullmq.worker.stalled.jobs': 'string[]', 'cache.hit': 'boolean', 'cache.item_age': 'integer', 'cache.item_size': 'integer', @@ -21025,6 +21715,37 @@ export type AttributeName = | typeof BROWSER_WEB_VITAL_LCP_VALUE | typeof BROWSER_WEB_VITAL_TTFB_REQUEST_TIME | typeof BROWSER_WEB_VITAL_TTFB_VALUE + | typeof BULLMQ_FLOW_NAME + | typeof BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP + | typeof BULLMQ_JOB_BULK_NAMES + | typeof BULLMQ_JOB_DEDUPLICATION_KEY + | typeof BULLMQ_JOB_FINISHED_TIMESTAMP + | typeof BULLMQ_JOB_IDS + | typeof BULLMQ_JOB_KEY + | typeof BULLMQ_JOB_NAME + | typeof BULLMQ_JOB_OPTIONS + | typeof BULLMQ_JOB_PROCESSED_TIMESTAMP + | typeof BULLMQ_JOB_PROGRESS + | typeof BULLMQ_JOB_SCHEDULER_ID + | typeof BULLMQ_JOB_STATE + | typeof BULLMQ_JOB_STATUS + | typeof BULLMQ_JOB_TYPE + | typeof BULLMQ_QUEUE_CLEAN_COUNT + | typeof BULLMQ_QUEUE_CLEAN_LIMIT + | typeof BULLMQ_QUEUE_DRAIN_DELAY + | typeof BULLMQ_QUEUE_EVENT_MAX_LENGTH + | typeof BULLMQ_QUEUE_GRACE + | typeof BULLMQ_QUEUE_JOBS_STATE + | typeof BULLMQ_QUEUE_OPTIONS + | typeof BULLMQ_QUEUE_RATE_LIMIT + | typeof BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE + | typeof BULLMQ_WORKER_FORCE_CLOSE + | typeof BULLMQ_WORKER_ID + | typeof BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS + | typeof BULLMQ_WORKER_NAME + | typeof BULLMQ_WORKER_OPTIONS + | typeof BULLMQ_WORKER_RATE_LIMIT + | typeof BULLMQ_WORKER_STALLED_JOBS | typeof CACHE_HIT | typeof CACHE_ITEM_AGE | typeof CACHE_ITEM_SIZE @@ -24643,6 +25364,464 @@ export const ATTRIBUTE_METADATA: Record = { aliases: ['ttfb'], changelog: [{ version: '0.5.0', prs: [235] }], }, + 'bullmq.flow.name': { + brief: 'The name of the root job of the BullMQ flow that FlowProducer.add() adds.', + type: 'string', + keys: ['bullmq.flow.name'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 'build-report', + examples: ['build-report'], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.flow.name attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.job.attempt_finished_timestamp': { + brief: 'The time in milliseconds since the Unix epoch when the current attempt of the BullMQ job finished.', + type: 'integer', + keys: ['bullmq.job.attempt_finished_timestamp'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 1791184722406, + examples: [1791184722406], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.attempt_finished_timestamp attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.job.bulk.names': { + brief: 'The names of the BullMQ jobs or flows that one bulk operation adds, for example Queue.addBulk().', + type: 'string[]', + keys: ['bullmq.job.bulk.names'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: ['send-welcome-email', 'generate-report'], + examples: [['send-welcome-email', 'generate-report']], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.bulk.names attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.job.deduplication.key': { + brief: 'The deduplication ID that Queue.removeDeduplicationKey() removes.', + type: 'string', + keys: ['bullmq.job.deduplication.key'], + applyScrubbing: { + key: 'auto', + }, + isInOtel: false, + visibility: 'public', + example: 'user-42-sync', + examples: ['user-42-sync'], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.deduplication.key attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.job.finished.timestamp': { + brief: + 'The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job.', + type: 'integer', + keys: ['bullmq.job.finished.timestamp'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 1791184722411, + examples: [1791184722411], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.finished.timestamp attribute' }], + additionalContext: [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + 'BullMQ 5.79.1 sets this attribute. BullMQ 6.3.11 does not.', + ], + }, + 'bullmq.job.ids': { + brief: 'The IDs of the BullMQ jobs that Queue.clean() removed.', + type: 'string[]', + keys: ['bullmq.job.ids'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: ['1', '2', '3'], + examples: [['1', '2', '3']], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.ids attribute' }], + additionalContext: [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + 'BullMQ 5.79.1 sets this attribute. BullMQ 6.3.11 does not.', + ], + }, + 'bullmq.job.key': { + brief: + 'The key that a BullMQ remove operation for a debounce or repeatable key gets, for example Queue.removeDebounceKey().', + type: 'string', + keys: ['bullmq.job.key'], + applyScrubbing: { + key: 'auto', + }, + isInOtel: false, + visibility: 'public', + example: 'user-42-sync', + examples: ['user-42-sync'], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.key attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.job.name': { + brief: 'The name of the BullMQ job, which the user passes to Queue.add() to identify the kind of work.', + type: 'string', + keys: ['bullmq.job.name'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 'send-welcome-email', + examples: ['send-welcome-email', 'generate-report'], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.name attribute' }], + additionalContext: [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + 'Also set on the BullMQ job metrics.', + ], + }, + 'bullmq.job.options': { + brief: 'The options of a BullMQ job operation as a JSON string, for example the options of Queue.remove().', + type: 'string', + keys: ['bullmq.job.options'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: '{"removeChildren":true}', + examples: ['{"removeChildren":true}'], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.options attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.job.processed.timestamp': { + brief: 'The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job.', + type: 'integer', + keys: ['bullmq.job.processed.timestamp'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 1791184722281, + examples: [1791184722281], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.processed.timestamp attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.job.progress': { + brief: 'The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress().', + type: 'string', + keys: ['bullmq.job.progress'], + applyScrubbing: { + key: 'auto', + }, + isInOtel: false, + visibility: 'public', + example: '{"percentage":50}', + examples: ['{"percentage":50}'], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.progress attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.job.scheduler.id': { + brief: 'The ID of the BullMQ job scheduler that adds the job.', + type: 'string', + keys: ['bullmq.job.scheduler.id'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 'daily-report', + examples: ['daily-report'], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.scheduler.id attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.job.state': { + brief: 'The state of the BullMQ job that a job metric counts.', + type: 'string', + keys: ['bullmq.job.state'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 'completed', + examples: ['completed', 'failed', 'delayed'], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.state attribute' }], + additionalContext: [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + 'Set on the BullMQ job metrics by BullMQ 6.3.11. BullMQ 5.79.1 sets `bullmq.job.status` instead.', + ], + }, + 'bullmq.job.status': { + brief: 'The state of the BullMQ job that a job metric counts.', + type: 'string', + keys: ['bullmq.job.status'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 'completed', + examples: ['completed', 'failed', 'delayed'], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.status attribute' }], + additionalContext: [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + 'Set on the BullMQ job metrics by BullMQ 5.79.1. BullMQ 6.3.11 sets `bullmq.job.state` instead.', + ], + }, + 'bullmq.job.type': { + brief: 'The job state from which Queue.clean() removes BullMQ jobs.', + type: 'string', + keys: ['bullmq.job.type'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 'completed', + examples: ['completed', 'failed'], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.type attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.queue.clean.count': { + brief: 'The number of BullMQ jobs that Queue.clean() removed.', + type: 'integer', + keys: ['bullmq.queue.clean.count'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 25, + examples: [25], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.queue.clean.count attribute' }], + additionalContext: [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + 'BullMQ 6.3.11 sets this attribute. BullMQ 5.79.1 does not.', + ], + }, + 'bullmq.queue.clean.limit': { + brief: 'The maximum number of BullMQ jobs that Queue.clean() removes.', + type: 'integer', + keys: ['bullmq.queue.clean.limit'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 1000, + examples: [1000], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.queue.clean.limit attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.queue.drain.delay': { + brief: 'Whether Queue.drain() also removes the delayed BullMQ jobs.', + type: 'boolean', + keys: ['bullmq.queue.drain.delay'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: true, + examples: [true], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.queue.drain.delay attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.queue.event.max.length': { + brief: 'The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream.', + type: 'integer', + keys: ['bullmq.queue.event.max.length'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 10000, + examples: [10000], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.queue.event.max.length attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.queue.grace': { + brief: 'The grace period in milliseconds that Queue.clean() uses. Only BullMQ jobs that are older are removed.', + type: 'integer', + keys: ['bullmq.queue.grace'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 60000, + examples: [60000], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.queue.grace attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.queue.jobs.state': { + brief: 'The BullMQ job state that the queue job count metric counts.', + type: 'string', + keys: ['bullmq.queue.jobs.state'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 'waiting', + examples: ['waiting', 'active', 'completed'], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.queue.jobs.state attribute' }], + additionalContext: [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + 'Set on the BullMQ queue job count metric.', + ], + }, + 'bullmq.queue.options': { + brief: + 'The options of a BullMQ queue operation as a JSON string, for example the options of Queue.retryJobs() or Queue.promoteJobs().', + type: 'string', + keys: ['bullmq.queue.options'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: '{"count":1000}', + examples: ['{"count":1000}'], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.queue.options attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.queue.rate.limit': { + brief: 'The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue.', + type: 'integer', + keys: ['bullmq.queue.rate.limit'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 5000, + examples: [5000], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.queue.rate.limit attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.worker.do.not.wait.active': { + brief: 'Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish.', + type: 'boolean', + keys: ['bullmq.worker.do.not.wait.active'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: false, + examples: [false], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.worker.do.not.wait.active attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.worker.force.close': { + brief: 'Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish.', + type: 'boolean', + keys: ['bullmq.worker.force.close'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: false, + examples: [false], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.worker.force.close attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.worker.id': { + brief: 'The ID that BullMQ generates for the Worker instance.', + type: 'string', + keys: ['bullmq.worker.id'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: '03327d57-05cc-4528-9d24-c59bf6520039', + examples: ['03327d57-05cc-4528-9d24-c59bf6520039'], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.worker.id attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.worker.jobs.to.extend.locks': { + brief: 'The IDs of the BullMQ jobs whose locks the Worker extends.', + type: 'string[]', + keys: ['bullmq.worker.jobs.to.extend.locks'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: ['1', '2'], + examples: [['1', '2']], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.worker.jobs.to.extend.locks attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.worker.name': { + brief: 'The name that the user gives to the BullMQ Worker in its options.', + type: 'string', + keys: ['bullmq.worker.name'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 'email-worker', + examples: ['email-worker'], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.worker.name attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.worker.options': { + brief: 'The options of a BullMQ Worker operation as a JSON string, for example the options of Worker.getNextJob().', + type: 'string', + keys: ['bullmq.worker.options'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: '{"block":true}', + examples: ['{"block":true}'], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.worker.options attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.worker.rate.limit': { + brief: 'The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker.', + type: 'integer', + keys: ['bullmq.worker.rate.limit'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 5000, + examples: [5000], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.worker.rate.limit attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, + 'bullmq.worker.stalled.jobs': { + brief: 'The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state.', + type: 'string[]', + keys: ['bullmq.worker.stalled.jobs'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: ['1', '2'], + examples: [['1', '2']], + changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.worker.stalled.jobs attribute' }], + additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], + }, 'cache.hit': { brief: 'If the cache was hit during this span.', type: 'boolean', @@ -36300,6 +37479,37 @@ export type Attributes = { [BROWSER_WEB_VITAL_LCP_VALUE]?: BROWSER_WEB_VITAL_LCP_VALUE_TYPE; [BROWSER_WEB_VITAL_TTFB_REQUEST_TIME]?: BROWSER_WEB_VITAL_TTFB_REQUEST_TIME_TYPE; [BROWSER_WEB_VITAL_TTFB_VALUE]?: BROWSER_WEB_VITAL_TTFB_VALUE_TYPE; + [BULLMQ_FLOW_NAME]?: BULLMQ_FLOW_NAME_TYPE; + [BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP]?: BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP_TYPE; + [BULLMQ_JOB_BULK_NAMES]?: BULLMQ_JOB_BULK_NAMES_TYPE; + [BULLMQ_JOB_DEDUPLICATION_KEY]?: BULLMQ_JOB_DEDUPLICATION_KEY_TYPE; + [BULLMQ_JOB_FINISHED_TIMESTAMP]?: BULLMQ_JOB_FINISHED_TIMESTAMP_TYPE; + [BULLMQ_JOB_IDS]?: BULLMQ_JOB_IDS_TYPE; + [BULLMQ_JOB_KEY]?: BULLMQ_JOB_KEY_TYPE; + [BULLMQ_JOB_NAME]?: BULLMQ_JOB_NAME_TYPE; + [BULLMQ_JOB_OPTIONS]?: BULLMQ_JOB_OPTIONS_TYPE; + [BULLMQ_JOB_PROCESSED_TIMESTAMP]?: BULLMQ_JOB_PROCESSED_TIMESTAMP_TYPE; + [BULLMQ_JOB_PROGRESS]?: BULLMQ_JOB_PROGRESS_TYPE; + [BULLMQ_JOB_SCHEDULER_ID]?: BULLMQ_JOB_SCHEDULER_ID_TYPE; + [BULLMQ_JOB_STATE]?: BULLMQ_JOB_STATE_TYPE; + [BULLMQ_JOB_STATUS]?: BULLMQ_JOB_STATUS_TYPE; + [BULLMQ_JOB_TYPE]?: BULLMQ_JOB_TYPE_TYPE; + [BULLMQ_QUEUE_CLEAN_COUNT]?: BULLMQ_QUEUE_CLEAN_COUNT_TYPE; + [BULLMQ_QUEUE_CLEAN_LIMIT]?: BULLMQ_QUEUE_CLEAN_LIMIT_TYPE; + [BULLMQ_QUEUE_DRAIN_DELAY]?: BULLMQ_QUEUE_DRAIN_DELAY_TYPE; + [BULLMQ_QUEUE_EVENT_MAX_LENGTH]?: BULLMQ_QUEUE_EVENT_MAX_LENGTH_TYPE; + [BULLMQ_QUEUE_GRACE]?: BULLMQ_QUEUE_GRACE_TYPE; + [BULLMQ_QUEUE_JOBS_STATE]?: BULLMQ_QUEUE_JOBS_STATE_TYPE; + [BULLMQ_QUEUE_OPTIONS]?: BULLMQ_QUEUE_OPTIONS_TYPE; + [BULLMQ_QUEUE_RATE_LIMIT]?: BULLMQ_QUEUE_RATE_LIMIT_TYPE; + [BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE]?: BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE_TYPE; + [BULLMQ_WORKER_FORCE_CLOSE]?: BULLMQ_WORKER_FORCE_CLOSE_TYPE; + [BULLMQ_WORKER_ID]?: BULLMQ_WORKER_ID_TYPE; + [BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS]?: BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS_TYPE; + [BULLMQ_WORKER_NAME]?: BULLMQ_WORKER_NAME_TYPE; + [BULLMQ_WORKER_OPTIONS]?: BULLMQ_WORKER_OPTIONS_TYPE; + [BULLMQ_WORKER_RATE_LIMIT]?: BULLMQ_WORKER_RATE_LIMIT_TYPE; + [BULLMQ_WORKER_STALLED_JOBS]?: BULLMQ_WORKER_STALLED_JOBS_TYPE; [CACHE_HIT]?: CACHE_HIT_TYPE; [CACHE_ITEM_AGE]?: CACHE_ITEM_AGE_TYPE; [CACHE_ITEM_SIZE]?: CACHE_ITEM_SIZE_TYPE; diff --git a/javascript/sentry-conventions/src/search.ts b/javascript/sentry-conventions/src/search.ts index b3dff46d8..b46979a12 100644 --- a/javascript/sentry-conventions/src/search.ts +++ b/javascript/sentry-conventions/src/search.ts @@ -1073,6 +1073,161 @@ export const SEARCH_BROWSER__WEB_VITAL__TTFB__REQUEST_TIME = 'browser.web_vital. */ export const SEARCH_BROWSER__WEB_VITAL__TTFB__VALUE = 'browser.web_vital.ttfb.value'; +/** + * Search name for {@link attributes.BULLMQ_FLOW_NAME}. `bullmq.flow.name` + */ +export const SEARCH_BULLMQ__FLOW__NAME = 'bullmq.flow.name'; + +/** + * Search name for {@link attributes.BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP}. `bullmq.job.attempt_finished_timestamp` + */ +export const SEARCH_BULLMQ__JOB__ATTEMPT_FINISHED_TIMESTAMP = 'bullmq.job.attempt_finished_timestamp'; + +/** + * Search name for {@link attributes.BULLMQ_JOB_BULK_NAMES}. `bullmq.job.bulk.names` + */ +export const SEARCH_BULLMQ__JOB__BULK__NAMES = 'bullmq.job.bulk.names'; + +/** + * Search name for {@link attributes.BULLMQ_JOB_DEDUPLICATION_KEY}. `bullmq.job.deduplication.key` + */ +export const SEARCH_BULLMQ__JOB__DEDUPLICATION__KEY = 'bullmq.job.deduplication.key'; + +/** + * Search name for {@link attributes.BULLMQ_JOB_FINISHED_TIMESTAMP}. `bullmq.job.finished.timestamp` + */ +export const SEARCH_BULLMQ__JOB__FINISHED__TIMESTAMP = 'bullmq.job.finished.timestamp'; + +/** + * Search name for {@link attributes.BULLMQ_JOB_IDS}. `bullmq.job.ids` + */ +export const SEARCH_BULLMQ__JOB__IDS = 'bullmq.job.ids'; + +/** + * Search name for {@link attributes.BULLMQ_JOB_KEY}. `bullmq.job.key` + */ +export const SEARCH_BULLMQ__JOB__KEY = 'bullmq.job.key'; + +/** + * Search name for {@link attributes.BULLMQ_JOB_NAME}. `bullmq.job.name` + */ +export const SEARCH_BULLMQ__JOB__NAME = 'bullmq.job.name'; + +/** + * Search name for {@link attributes.BULLMQ_JOB_OPTIONS}. `bullmq.job.options` + */ +export const SEARCH_BULLMQ__JOB__OPTIONS = 'bullmq.job.options'; + +/** + * Search name for {@link attributes.BULLMQ_JOB_PROCESSED_TIMESTAMP}. `bullmq.job.processed.timestamp` + */ +export const SEARCH_BULLMQ__JOB__PROCESSED__TIMESTAMP = 'bullmq.job.processed.timestamp'; + +/** + * Search name for {@link attributes.BULLMQ_JOB_PROGRESS}. `bullmq.job.progress` + */ +export const SEARCH_BULLMQ__JOB__PROGRESS = 'bullmq.job.progress'; + +/** + * Search name for {@link attributes.BULLMQ_JOB_SCHEDULER_ID}. `bullmq.job.scheduler.id` + */ +export const SEARCH_BULLMQ__JOB__SCHEDULER__ID = 'bullmq.job.scheduler.id'; + +/** + * Search name for {@link attributes.BULLMQ_JOB_STATE}. `bullmq.job.state` + */ +export const SEARCH_BULLMQ__JOB__STATE = 'bullmq.job.state'; + +/** + * Search name for {@link attributes.BULLMQ_JOB_STATUS}. `bullmq.job.status` + */ +export const SEARCH_BULLMQ__JOB__STATUS = 'bullmq.job.status'; + +/** + * Search name for {@link attributes.BULLMQ_JOB_TYPE}. `bullmq.job.type` + */ +export const SEARCH_BULLMQ__JOB__TYPE = 'bullmq.job.type'; + +/** + * Search name for {@link attributes.BULLMQ_QUEUE_CLEAN_COUNT}. `bullmq.queue.clean.count` + */ +export const SEARCH_BULLMQ__QUEUE__CLEAN__COUNT = 'bullmq.queue.clean.count'; + +/** + * Search name for {@link attributes.BULLMQ_QUEUE_CLEAN_LIMIT}. `bullmq.queue.clean.limit` + */ +export const SEARCH_BULLMQ__QUEUE__CLEAN__LIMIT = 'bullmq.queue.clean.limit'; + +/** + * Search name for {@link attributes.BULLMQ_QUEUE_DRAIN_DELAY}. `bullmq.queue.drain.delay` + */ +export const SEARCH_BULLMQ__QUEUE__DRAIN__DELAY = 'bullmq.queue.drain.delay'; + +/** + * Search name for {@link attributes.BULLMQ_QUEUE_EVENT_MAX_LENGTH}. `bullmq.queue.event.max.length` + */ +export const SEARCH_BULLMQ__QUEUE__EVENT__MAX__LENGTH = 'bullmq.queue.event.max.length'; + +/** + * Search name for {@link attributes.BULLMQ_QUEUE_GRACE}. `bullmq.queue.grace` + */ +export const SEARCH_BULLMQ__QUEUE__GRACE = 'bullmq.queue.grace'; + +/** + * Search name for {@link attributes.BULLMQ_QUEUE_JOBS_STATE}. `bullmq.queue.jobs.state` + */ +export const SEARCH_BULLMQ__QUEUE__JOBS__STATE = 'bullmq.queue.jobs.state'; + +/** + * Search name for {@link attributes.BULLMQ_QUEUE_OPTIONS}. `bullmq.queue.options` + */ +export const SEARCH_BULLMQ__QUEUE__OPTIONS = 'bullmq.queue.options'; + +/** + * Search name for {@link attributes.BULLMQ_QUEUE_RATE_LIMIT}. `bullmq.queue.rate.limit` + */ +export const SEARCH_BULLMQ__QUEUE__RATE__LIMIT = 'bullmq.queue.rate.limit'; + +/** + * Search name for {@link attributes.BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE}. `bullmq.worker.do.not.wait.active` + */ +export const SEARCH_BULLMQ__WORKER__DO__NOT__WAIT__ACTIVE = 'bullmq.worker.do.not.wait.active'; + +/** + * Search name for {@link attributes.BULLMQ_WORKER_FORCE_CLOSE}. `bullmq.worker.force.close` + */ +export const SEARCH_BULLMQ__WORKER__FORCE__CLOSE = 'bullmq.worker.force.close'; + +/** + * Search name for {@link attributes.BULLMQ_WORKER_ID}. `bullmq.worker.id` + */ +export const SEARCH_BULLMQ__WORKER__ID = 'bullmq.worker.id'; + +/** + * Search name for {@link attributes.BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS}. `bullmq.worker.jobs.to.extend.locks` + */ +export const SEARCH_BULLMQ__WORKER__JOBS__TO__EXTEND__LOCKS = 'bullmq.worker.jobs.to.extend.locks'; + +/** + * Search name for {@link attributes.BULLMQ_WORKER_NAME}. `bullmq.worker.name` + */ +export const SEARCH_BULLMQ__WORKER__NAME = 'bullmq.worker.name'; + +/** + * Search name for {@link attributes.BULLMQ_WORKER_OPTIONS}. `bullmq.worker.options` + */ +export const SEARCH_BULLMQ__WORKER__OPTIONS = 'bullmq.worker.options'; + +/** + * Search name for {@link attributes.BULLMQ_WORKER_RATE_LIMIT}. `bullmq.worker.rate.limit` + */ +export const SEARCH_BULLMQ__WORKER__RATE__LIMIT = 'bullmq.worker.rate.limit'; + +/** + * Search name for {@link attributes.BULLMQ_WORKER_STALLED_JOBS}. `bullmq.worker.stalled.jobs` + */ +export const SEARCH_BULLMQ__WORKER__STALLED__JOBS = 'bullmq.worker.stalled.jobs'; + /** * Search name for {@link attributes.CACHE_HIT}. `cache.hit` */ @@ -5297,6 +5452,37 @@ export type AttributeSearchName = | typeof SEARCH_BROWSER__WEB_VITAL__LCP__VALUE | typeof SEARCH_BROWSER__WEB_VITAL__TTFB__REQUEST_TIME | typeof SEARCH_BROWSER__WEB_VITAL__TTFB__VALUE + | typeof SEARCH_BULLMQ__FLOW__NAME + | typeof SEARCH_BULLMQ__JOB__ATTEMPT_FINISHED_TIMESTAMP + | typeof SEARCH_BULLMQ__JOB__BULK__NAMES + | typeof SEARCH_BULLMQ__JOB__DEDUPLICATION__KEY + | typeof SEARCH_BULLMQ__JOB__FINISHED__TIMESTAMP + | typeof SEARCH_BULLMQ__JOB__IDS + | typeof SEARCH_BULLMQ__JOB__KEY + | typeof SEARCH_BULLMQ__JOB__NAME + | typeof SEARCH_BULLMQ__JOB__OPTIONS + | typeof SEARCH_BULLMQ__JOB__PROCESSED__TIMESTAMP + | typeof SEARCH_BULLMQ__JOB__PROGRESS + | typeof SEARCH_BULLMQ__JOB__SCHEDULER__ID + | typeof SEARCH_BULLMQ__JOB__STATE + | typeof SEARCH_BULLMQ__JOB__STATUS + | typeof SEARCH_BULLMQ__JOB__TYPE + | typeof SEARCH_BULLMQ__QUEUE__CLEAN__COUNT + | typeof SEARCH_BULLMQ__QUEUE__CLEAN__LIMIT + | typeof SEARCH_BULLMQ__QUEUE__DRAIN__DELAY + | typeof SEARCH_BULLMQ__QUEUE__EVENT__MAX__LENGTH + | typeof SEARCH_BULLMQ__QUEUE__GRACE + | typeof SEARCH_BULLMQ__QUEUE__JOBS__STATE + | typeof SEARCH_BULLMQ__QUEUE__OPTIONS + | typeof SEARCH_BULLMQ__QUEUE__RATE__LIMIT + | typeof SEARCH_BULLMQ__WORKER__DO__NOT__WAIT__ACTIVE + | typeof SEARCH_BULLMQ__WORKER__FORCE__CLOSE + | typeof SEARCH_BULLMQ__WORKER__ID + | typeof SEARCH_BULLMQ__WORKER__JOBS__TO__EXTEND__LOCKS + | typeof SEARCH_BULLMQ__WORKER__NAME + | typeof SEARCH_BULLMQ__WORKER__OPTIONS + | typeof SEARCH_BULLMQ__WORKER__RATE__LIMIT + | typeof SEARCH_BULLMQ__WORKER__STALLED__JOBS | typeof SEARCH_CACHE__HIT | typeof SEARCH_CACHE__ITEM_AGE | typeof SEARCH_CACHE__ITEM_SIZE @@ -7242,6 +7428,195 @@ export const ATTRIBUTE_SEARCH_METADATA: Record brief: 'The value of the recorded Time To First Byte (TTFB) web vital in Milliseconds', deprecationChain: ['browser.web_vital.ttfb.value', 'ttfb'], }, + 'bullmq.flow.name': { + canonicalName: 'bullmq.flow.name', + type: 'string', + brief: 'The name of the root job of the BullMQ flow that FlowProducer.add() adds.', + deprecationChain: ['bullmq.flow.name'], + }, + 'bullmq.job.attempt_finished_timestamp': { + canonicalName: 'bullmq.job.attempt_finished_timestamp', + type: 'integer', + brief: 'The time in milliseconds since the Unix epoch when the current attempt of the BullMQ job finished.', + deprecationChain: ['bullmq.job.attempt_finished_timestamp'], + }, + 'bullmq.job.bulk.names': { + canonicalName: 'bullmq.job.bulk.names', + type: 'string[]', + brief: 'The names of the BullMQ jobs or flows that one bulk operation adds, for example Queue.addBulk().', + deprecationChain: ['bullmq.job.bulk.names'], + }, + 'bullmq.job.deduplication.key': { + canonicalName: 'bullmq.job.deduplication.key', + type: 'string', + brief: 'The deduplication ID that Queue.removeDeduplicationKey() removes.', + deprecationChain: ['bullmq.job.deduplication.key'], + }, + 'bullmq.job.finished.timestamp': { + canonicalName: 'bullmq.job.finished.timestamp', + type: 'integer', + brief: + 'The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job.', + deprecationChain: ['bullmq.job.finished.timestamp'], + }, + 'bullmq.job.ids': { + canonicalName: 'bullmq.job.ids', + type: 'string[]', + brief: 'The IDs of the BullMQ jobs that Queue.clean() removed.', + deprecationChain: ['bullmq.job.ids'], + }, + 'bullmq.job.key': { + canonicalName: 'bullmq.job.key', + type: 'string', + brief: + 'The key that a BullMQ remove operation for a debounce or repeatable key gets, for example Queue.removeDebounceKey().', + deprecationChain: ['bullmq.job.key'], + }, + 'bullmq.job.name': { + canonicalName: 'bullmq.job.name', + type: 'string', + brief: 'The name of the BullMQ job, which the user passes to Queue.add() to identify the kind of work.', + deprecationChain: ['bullmq.job.name'], + }, + 'bullmq.job.options': { + canonicalName: 'bullmq.job.options', + type: 'string', + brief: 'The options of a BullMQ job operation as a JSON string, for example the options of Queue.remove().', + deprecationChain: ['bullmq.job.options'], + }, + 'bullmq.job.processed.timestamp': { + canonicalName: 'bullmq.job.processed.timestamp', + type: 'integer', + brief: 'The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job.', + deprecationChain: ['bullmq.job.processed.timestamp'], + }, + 'bullmq.job.progress': { + canonicalName: 'bullmq.job.progress', + type: 'string', + brief: 'The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress().', + deprecationChain: ['bullmq.job.progress'], + }, + 'bullmq.job.scheduler.id': { + canonicalName: 'bullmq.job.scheduler.id', + type: 'string', + brief: 'The ID of the BullMQ job scheduler that adds the job.', + deprecationChain: ['bullmq.job.scheduler.id'], + }, + 'bullmq.job.state': { + canonicalName: 'bullmq.job.state', + type: 'string', + brief: 'The state of the BullMQ job that a job metric counts.', + deprecationChain: ['bullmq.job.state'], + }, + 'bullmq.job.status': { + canonicalName: 'bullmq.job.status', + type: 'string', + brief: 'The state of the BullMQ job that a job metric counts.', + deprecationChain: ['bullmq.job.status'], + }, + 'bullmq.job.type': { + canonicalName: 'bullmq.job.type', + type: 'string', + brief: 'The job state from which Queue.clean() removes BullMQ jobs.', + deprecationChain: ['bullmq.job.type'], + }, + 'bullmq.queue.clean.count': { + canonicalName: 'bullmq.queue.clean.count', + type: 'integer', + brief: 'The number of BullMQ jobs that Queue.clean() removed.', + deprecationChain: ['bullmq.queue.clean.count'], + }, + 'bullmq.queue.clean.limit': { + canonicalName: 'bullmq.queue.clean.limit', + type: 'integer', + brief: 'The maximum number of BullMQ jobs that Queue.clean() removes.', + deprecationChain: ['bullmq.queue.clean.limit'], + }, + 'bullmq.queue.drain.delay': { + canonicalName: 'bullmq.queue.drain.delay', + type: 'boolean', + brief: 'Whether Queue.drain() also removes the delayed BullMQ jobs.', + deprecationChain: ['bullmq.queue.drain.delay'], + }, + 'bullmq.queue.event.max.length': { + canonicalName: 'bullmq.queue.event.max.length', + type: 'integer', + brief: 'The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream.', + deprecationChain: ['bullmq.queue.event.max.length'], + }, + 'bullmq.queue.grace': { + canonicalName: 'bullmq.queue.grace', + type: 'integer', + brief: 'The grace period in milliseconds that Queue.clean() uses. Only BullMQ jobs that are older are removed.', + deprecationChain: ['bullmq.queue.grace'], + }, + 'bullmq.queue.jobs.state': { + canonicalName: 'bullmq.queue.jobs.state', + type: 'string', + brief: 'The BullMQ job state that the queue job count metric counts.', + deprecationChain: ['bullmq.queue.jobs.state'], + }, + 'bullmq.queue.options': { + canonicalName: 'bullmq.queue.options', + type: 'string', + brief: + 'The options of a BullMQ queue operation as a JSON string, for example the options of Queue.retryJobs() or Queue.promoteJobs().', + deprecationChain: ['bullmq.queue.options'], + }, + 'bullmq.queue.rate.limit': { + canonicalName: 'bullmq.queue.rate.limit', + type: 'integer', + brief: 'The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue.', + deprecationChain: ['bullmq.queue.rate.limit'], + }, + 'bullmq.worker.do.not.wait.active': { + canonicalName: 'bullmq.worker.do.not.wait.active', + type: 'boolean', + brief: 'Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish.', + deprecationChain: ['bullmq.worker.do.not.wait.active'], + }, + 'bullmq.worker.force.close': { + canonicalName: 'bullmq.worker.force.close', + type: 'boolean', + brief: 'Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish.', + deprecationChain: ['bullmq.worker.force.close'], + }, + 'bullmq.worker.id': { + canonicalName: 'bullmq.worker.id', + type: 'string', + brief: 'The ID that BullMQ generates for the Worker instance.', + deprecationChain: ['bullmq.worker.id'], + }, + 'bullmq.worker.jobs.to.extend.locks': { + canonicalName: 'bullmq.worker.jobs.to.extend.locks', + type: 'string[]', + brief: 'The IDs of the BullMQ jobs whose locks the Worker extends.', + deprecationChain: ['bullmq.worker.jobs.to.extend.locks'], + }, + 'bullmq.worker.name': { + canonicalName: 'bullmq.worker.name', + type: 'string', + brief: 'The name that the user gives to the BullMQ Worker in its options.', + deprecationChain: ['bullmq.worker.name'], + }, + 'bullmq.worker.options': { + canonicalName: 'bullmq.worker.options', + type: 'string', + brief: 'The options of a BullMQ Worker operation as a JSON string, for example the options of Worker.getNextJob().', + deprecationChain: ['bullmq.worker.options'], + }, + 'bullmq.worker.rate.limit': { + canonicalName: 'bullmq.worker.rate.limit', + type: 'integer', + brief: 'The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker.', + deprecationChain: ['bullmq.worker.rate.limit'], + }, + 'bullmq.worker.stalled.jobs': { + canonicalName: 'bullmq.worker.stalled.jobs', + type: 'string[]', + brief: 'The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state.', + deprecationChain: ['bullmq.worker.stalled.jobs'], + }, 'cache.hit': { canonicalName: 'cache.hit', type: 'boolean', diff --git a/model/attributes/bullmq/bullmq__flow__name.json b/model/attributes/bullmq/bullmq__flow__name.json new file mode 100644 index 000000000..ddd6e9f09 --- /dev/null +++ b/model/attributes/bullmq/bullmq__flow__name.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.flow.name", + "brief": "The name of the root job of the BullMQ flow that FlowProducer.add() adds.", + "type": "string", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": ["build-report"], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.flow.name attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__job__attempt_finished_timestamp.json b/model/attributes/bullmq/bullmq__job__attempt_finished_timestamp.json new file mode 100644 index 000000000..6f3cf0ebe --- /dev/null +++ b/model/attributes/bullmq/bullmq__job__attempt_finished_timestamp.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.job.attempt_finished_timestamp", + "brief": "The time in milliseconds since the Unix epoch when the current attempt of the BullMQ job finished.", + "type": "integer", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": [1791184722406], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.job.attempt_finished_timestamp attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__job__bulk__names.json b/model/attributes/bullmq/bullmq__job__bulk__names.json new file mode 100644 index 000000000..5e1ba7ac7 --- /dev/null +++ b/model/attributes/bullmq/bullmq__job__bulk__names.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.job.bulk.names", + "brief": "The names of the BullMQ jobs or flows that one bulk operation adds, for example Queue.addBulk().", + "type": "string[]", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": [["send-welcome-email", "generate-report"]], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.job.bulk.names attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__job__deduplication__key.json b/model/attributes/bullmq/bullmq__job__deduplication__key.json new file mode 100644 index 000000000..8a96b5e16 --- /dev/null +++ b/model/attributes/bullmq/bullmq__job__deduplication__key.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.job.deduplication.key", + "brief": "The deduplication ID that Queue.removeDeduplicationKey() removes.", + "type": "string", + "apply_scrubbing": { + "key": "auto" + }, + "is_in_otel": false, + "visibility": "public", + "examples": ["user-42-sync"], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.job.deduplication.key attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__job__finished__timestamp.json b/model/attributes/bullmq/bullmq__job__finished__timestamp.json new file mode 100644 index 000000000..708e811c1 --- /dev/null +++ b/model/attributes/bullmq/bullmq__job__finished__timestamp.json @@ -0,0 +1,22 @@ +{ + "key": "bullmq.job.finished.timestamp", + "brief": "The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job.", + "type": "integer", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": [1791184722411], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + "BullMQ 5.79.1 sets this attribute. BullMQ 6.3.11 does not." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.job.finished.timestamp attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__job__ids.json b/model/attributes/bullmq/bullmq__job__ids.json new file mode 100644 index 000000000..70f9ca4dc --- /dev/null +++ b/model/attributes/bullmq/bullmq__job__ids.json @@ -0,0 +1,22 @@ +{ + "key": "bullmq.job.ids", + "brief": "The IDs of the BullMQ jobs that Queue.clean() removed.", + "type": "string[]", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": [["1", "2", "3"]], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + "BullMQ 5.79.1 sets this attribute. BullMQ 6.3.11 does not." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.job.ids attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__job__key.json b/model/attributes/bullmq/bullmq__job__key.json new file mode 100644 index 000000000..c67e3d36d --- /dev/null +++ b/model/attributes/bullmq/bullmq__job__key.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.job.key", + "brief": "The key that a BullMQ remove operation for a debounce or repeatable key gets, for example Queue.removeDebounceKey().", + "type": "string", + "apply_scrubbing": { + "key": "auto" + }, + "is_in_otel": false, + "visibility": "public", + "examples": ["user-42-sync"], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.job.key attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__job__name.json b/model/attributes/bullmq/bullmq__job__name.json new file mode 100644 index 000000000..c19d2cf31 --- /dev/null +++ b/model/attributes/bullmq/bullmq__job__name.json @@ -0,0 +1,22 @@ +{ + "key": "bullmq.job.name", + "brief": "The name of the BullMQ job, which the user passes to Queue.add() to identify the kind of work.", + "type": "string", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": ["send-welcome-email", "generate-report"], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + "Also set on the BullMQ job metrics." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.job.name attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__job__options.json b/model/attributes/bullmq/bullmq__job__options.json new file mode 100644 index 000000000..0d0adc2cc --- /dev/null +++ b/model/attributes/bullmq/bullmq__job__options.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.job.options", + "brief": "The options of a BullMQ job operation as a JSON string, for example the options of Queue.remove().", + "type": "string", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": ["{\"removeChildren\":true}"], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.job.options attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__job__processed__timestamp.json b/model/attributes/bullmq/bullmq__job__processed__timestamp.json new file mode 100644 index 000000000..742f928fe --- /dev/null +++ b/model/attributes/bullmq/bullmq__job__processed__timestamp.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.job.processed.timestamp", + "brief": "The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job.", + "type": "integer", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": [1791184722281], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.job.processed.timestamp attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__job__progress.json b/model/attributes/bullmq/bullmq__job__progress.json new file mode 100644 index 000000000..bbf7a4bd7 --- /dev/null +++ b/model/attributes/bullmq/bullmq__job__progress.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.job.progress", + "brief": "The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress().", + "type": "string", + "apply_scrubbing": { + "key": "auto" + }, + "is_in_otel": false, + "visibility": "public", + "examples": ["{\"percentage\":50}"], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.job.progress attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__job__scheduler__id.json b/model/attributes/bullmq/bullmq__job__scheduler__id.json new file mode 100644 index 000000000..f86c06982 --- /dev/null +++ b/model/attributes/bullmq/bullmq__job__scheduler__id.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.job.scheduler.id", + "brief": "The ID of the BullMQ job scheduler that adds the job.", + "type": "string", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": ["daily-report"], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.job.scheduler.id attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__job__state.json b/model/attributes/bullmq/bullmq__job__state.json new file mode 100644 index 000000000..84c181a3a --- /dev/null +++ b/model/attributes/bullmq/bullmq__job__state.json @@ -0,0 +1,22 @@ +{ + "key": "bullmq.job.state", + "brief": "The state of the BullMQ job that a job metric counts.", + "type": "string", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": ["completed", "failed", "delayed"], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + "Set on the BullMQ job metrics by BullMQ 6.3.11. BullMQ 5.79.1 sets `bullmq.job.status` instead." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.job.state attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__job__status.json b/model/attributes/bullmq/bullmq__job__status.json new file mode 100644 index 000000000..69aa3be72 --- /dev/null +++ b/model/attributes/bullmq/bullmq__job__status.json @@ -0,0 +1,22 @@ +{ + "key": "bullmq.job.status", + "brief": "The state of the BullMQ job that a job metric counts.", + "type": "string", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": ["completed", "failed", "delayed"], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + "Set on the BullMQ job metrics by BullMQ 5.79.1. BullMQ 6.3.11 sets `bullmq.job.state` instead." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.job.status attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__job__type.json b/model/attributes/bullmq/bullmq__job__type.json new file mode 100644 index 000000000..4686e36db --- /dev/null +++ b/model/attributes/bullmq/bullmq__job__type.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.job.type", + "brief": "The job state from which Queue.clean() removes BullMQ jobs.", + "type": "string", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": ["completed", "failed"], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.job.type attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__queue__clean__count.json b/model/attributes/bullmq/bullmq__queue__clean__count.json new file mode 100644 index 000000000..afd2b1697 --- /dev/null +++ b/model/attributes/bullmq/bullmq__queue__clean__count.json @@ -0,0 +1,22 @@ +{ + "key": "bullmq.queue.clean.count", + "brief": "The number of BullMQ jobs that Queue.clean() removed.", + "type": "integer", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": [25], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + "BullMQ 6.3.11 sets this attribute. BullMQ 5.79.1 does not." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.queue.clean.count attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__queue__clean__limit.json b/model/attributes/bullmq/bullmq__queue__clean__limit.json new file mode 100644 index 000000000..7a9084b87 --- /dev/null +++ b/model/attributes/bullmq/bullmq__queue__clean__limit.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.queue.clean.limit", + "brief": "The maximum number of BullMQ jobs that Queue.clean() removes.", + "type": "integer", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": [1000], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.queue.clean.limit attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__queue__drain__delay.json b/model/attributes/bullmq/bullmq__queue__drain__delay.json new file mode 100644 index 000000000..ffb42832e --- /dev/null +++ b/model/attributes/bullmq/bullmq__queue__drain__delay.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.queue.drain.delay", + "brief": "Whether Queue.drain() also removes the delayed BullMQ jobs.", + "type": "boolean", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": [true], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.queue.drain.delay attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__queue__event__max__length.json b/model/attributes/bullmq/bullmq__queue__event__max__length.json new file mode 100644 index 000000000..aab0747f9 --- /dev/null +++ b/model/attributes/bullmq/bullmq__queue__event__max__length.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.queue.event.max.length", + "brief": "The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream.", + "type": "integer", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": [10000], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.queue.event.max.length attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__queue__grace.json b/model/attributes/bullmq/bullmq__queue__grace.json new file mode 100644 index 000000000..44aa8aaf6 --- /dev/null +++ b/model/attributes/bullmq/bullmq__queue__grace.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.queue.grace", + "brief": "The grace period in milliseconds that Queue.clean() uses. Only BullMQ jobs that are older are removed.", + "type": "integer", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": [60000], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.queue.grace attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__queue__jobs__state.json b/model/attributes/bullmq/bullmq__queue__jobs__state.json new file mode 100644 index 000000000..e58c5330d --- /dev/null +++ b/model/attributes/bullmq/bullmq__queue__jobs__state.json @@ -0,0 +1,22 @@ +{ + "key": "bullmq.queue.jobs.state", + "brief": "The BullMQ job state that the queue job count metric counts.", + "type": "string", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": ["waiting", "active", "completed"], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + "Set on the BullMQ queue job count metric." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.queue.jobs.state attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__queue__options.json b/model/attributes/bullmq/bullmq__queue__options.json new file mode 100644 index 000000000..898a6822a --- /dev/null +++ b/model/attributes/bullmq/bullmq__queue__options.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.queue.options", + "brief": "The options of a BullMQ queue operation as a JSON string, for example the options of Queue.retryJobs() or Queue.promoteJobs().", + "type": "string", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": ["{\"count\":1000}"], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.queue.options attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__queue__rate__limit.json b/model/attributes/bullmq/bullmq__queue__rate__limit.json new file mode 100644 index 000000000..d26ed1245 --- /dev/null +++ b/model/attributes/bullmq/bullmq__queue__rate__limit.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.queue.rate.limit", + "brief": "The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue.", + "type": "integer", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": [5000], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.queue.rate.limit attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__worker__do__not__wait__active.json b/model/attributes/bullmq/bullmq__worker__do__not__wait__active.json new file mode 100644 index 000000000..63cb2de48 --- /dev/null +++ b/model/attributes/bullmq/bullmq__worker__do__not__wait__active.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.worker.do.not.wait.active", + "brief": "Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish.", + "type": "boolean", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": [false], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.worker.do.not.wait.active attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__worker__force__close.json b/model/attributes/bullmq/bullmq__worker__force__close.json new file mode 100644 index 000000000..ba33657c8 --- /dev/null +++ b/model/attributes/bullmq/bullmq__worker__force__close.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.worker.force.close", + "brief": "Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish.", + "type": "boolean", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": [false], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.worker.force.close attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__worker__id.json b/model/attributes/bullmq/bullmq__worker__id.json new file mode 100644 index 000000000..2cf790190 --- /dev/null +++ b/model/attributes/bullmq/bullmq__worker__id.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.worker.id", + "brief": "The ID that BullMQ generates for the Worker instance.", + "type": "string", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": ["03327d57-05cc-4528-9d24-c59bf6520039"], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.worker.id attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__worker__jobs__to__extend__locks.json b/model/attributes/bullmq/bullmq__worker__jobs__to__extend__locks.json new file mode 100644 index 000000000..da3e66aeb --- /dev/null +++ b/model/attributes/bullmq/bullmq__worker__jobs__to__extend__locks.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.worker.jobs.to.extend.locks", + "brief": "The IDs of the BullMQ jobs whose locks the Worker extends.", + "type": "string[]", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": [["1", "2"]], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.worker.jobs.to.extend.locks attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__worker__name.json b/model/attributes/bullmq/bullmq__worker__name.json new file mode 100644 index 000000000..4daab5544 --- /dev/null +++ b/model/attributes/bullmq/bullmq__worker__name.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.worker.name", + "brief": "The name that the user gives to the BullMQ Worker in its options.", + "type": "string", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": ["email-worker"], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.worker.name attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__worker__options.json b/model/attributes/bullmq/bullmq__worker__options.json new file mode 100644 index 000000000..13b30257e --- /dev/null +++ b/model/attributes/bullmq/bullmq__worker__options.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.worker.options", + "brief": "The options of a BullMQ Worker operation as a JSON string, for example the options of Worker.getNextJob().", + "type": "string", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": ["{\"block\":true}"], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.worker.options attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__worker__rate__limit.json b/model/attributes/bullmq/bullmq__worker__rate__limit.json new file mode 100644 index 000000000..c57850b24 --- /dev/null +++ b/model/attributes/bullmq/bullmq__worker__rate__limit.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.worker.rate.limit", + "brief": "The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker.", + "type": "integer", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": [5000], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.worker.rate.limit attribute" + } + ] +} diff --git a/model/attributes/bullmq/bullmq__worker__stalled__jobs.json b/model/attributes/bullmq/bullmq__worker__stalled__jobs.json new file mode 100644 index 000000000..5760ff7c4 --- /dev/null +++ b/model/attributes/bullmq/bullmq__worker__stalled__jobs.json @@ -0,0 +1,21 @@ +{ + "key": "bullmq.worker.stalled.jobs", + "brief": "The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state.", + "type": "string[]", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": false, + "visibility": "public", + "examples": [["1", "2"]], + "additional_context": [ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added bullmq.worker.stalled.jobs attribute" + } + ] +} diff --git a/model/metrics/bullmq/bullmq__job__duration.json b/model/metrics/bullmq/bullmq__job__duration.json new file mode 100644 index 000000000..033fffbab --- /dev/null +++ b/model/metrics/bullmq/bullmq__job__duration.json @@ -0,0 +1,9 @@ +{ + "key": "bullmq.job.duration", + "brief": "The time in milliseconds from when a Worker started to process a BullMQ job until the job left the active state.", + "instrument": "distribution", + "unit": "millisecond", + "is_in_otel": false, + "requirement_level": "opt_in", + "attributes": ["messaging.destination.name", "bullmq.job.name", "bullmq.job.status", "bullmq.job.state"] +} diff --git a/model/metrics/bullmq/bullmq__jobs__completed.json b/model/metrics/bullmq/bullmq__jobs__completed.json new file mode 100644 index 000000000..47e184944 --- /dev/null +++ b/model/metrics/bullmq/bullmq__jobs__completed.json @@ -0,0 +1,9 @@ +{ + "key": "bullmq.jobs.completed", + "brief": "The number of BullMQ jobs that completed.", + "instrument": "counter", + "unit": "none", + "is_in_otel": false, + "requirement_level": "opt_in", + "attributes": ["messaging.destination.name", "bullmq.job.name", "bullmq.job.status", "bullmq.job.state"] +} diff --git a/model/metrics/bullmq/bullmq__jobs__delayed.json b/model/metrics/bullmq/bullmq__jobs__delayed.json new file mode 100644 index 000000000..5aa108f30 --- /dev/null +++ b/model/metrics/bullmq/bullmq__jobs__delayed.json @@ -0,0 +1,9 @@ +{ + "key": "bullmq.jobs.delayed", + "brief": "The number of BullMQ jobs that moved to the delayed state, for a retry with a backoff delay or through Job.moveToDelayed().", + "instrument": "counter", + "unit": "none", + "is_in_otel": false, + "requirement_level": "opt_in", + "attributes": ["messaging.destination.name", "bullmq.job.name", "bullmq.job.status", "bullmq.job.state"] +} diff --git a/model/metrics/bullmq/bullmq__jobs__failed.json b/model/metrics/bullmq/bullmq__jobs__failed.json new file mode 100644 index 000000000..16f3f50cd --- /dev/null +++ b/model/metrics/bullmq/bullmq__jobs__failed.json @@ -0,0 +1,9 @@ +{ + "key": "bullmq.jobs.failed", + "brief": "The number of BullMQ jobs that failed and are not retried.", + "instrument": "counter", + "unit": "none", + "is_in_otel": false, + "requirement_level": "opt_in", + "attributes": ["messaging.destination.name", "bullmq.job.name", "bullmq.job.status", "bullmq.job.state"] +} diff --git a/model/metrics/bullmq/bullmq__jobs__retried.json b/model/metrics/bullmq/bullmq__jobs__retried.json new file mode 100644 index 000000000..d09a9649d --- /dev/null +++ b/model/metrics/bullmq/bullmq__jobs__retried.json @@ -0,0 +1,9 @@ +{ + "key": "bullmq.jobs.retried", + "brief": "The number of failed BullMQ jobs that are retried without a delay.", + "instrument": "counter", + "unit": "none", + "is_in_otel": false, + "requirement_level": "opt_in", + "attributes": ["messaging.destination.name", "bullmq.job.name", "bullmq.job.status", "bullmq.job.state"] +} diff --git a/model/metrics/bullmq/bullmq__jobs__waiting.json b/model/metrics/bullmq/bullmq__jobs__waiting.json new file mode 100644 index 000000000..17a940b32 --- /dev/null +++ b/model/metrics/bullmq/bullmq__jobs__waiting.json @@ -0,0 +1,9 @@ +{ + "key": "bullmq.jobs.waiting", + "brief": "The number of BullMQ jobs that Job.moveToWait() moved back to the wait state.", + "instrument": "counter", + "unit": "none", + "is_in_otel": false, + "requirement_level": "opt_in", + "attributes": ["messaging.destination.name", "bullmq.job.name", "bullmq.job.status", "bullmq.job.state"] +} diff --git a/model/metrics/bullmq/bullmq__jobs__waiting_children.json b/model/metrics/bullmq/bullmq__jobs__waiting_children.json new file mode 100644 index 000000000..a0eaeb5b2 --- /dev/null +++ b/model/metrics/bullmq/bullmq__jobs__waiting_children.json @@ -0,0 +1,9 @@ +{ + "key": "bullmq.jobs.waiting_children", + "brief": "The number of BullMQ jobs that moved to the waiting-children state to wait for their child jobs.", + "instrument": "counter", + "unit": "none", + "is_in_otel": false, + "requirement_level": "opt_in", + "attributes": ["messaging.destination.name", "bullmq.job.name", "bullmq.job.status", "bullmq.job.state"] +} diff --git a/model/metrics/bullmq/bullmq__queue__jobs.json b/model/metrics/bullmq/bullmq__queue__jobs.json new file mode 100644 index 000000000..f26f46b3e --- /dev/null +++ b/model/metrics/bullmq/bullmq__queue__jobs.json @@ -0,0 +1,9 @@ +{ + "key": "bullmq.queue.jobs", + "brief": "The number of BullMQ jobs in a queue in one job state, as counted by Queue.recordJobCountsMetric().", + "instrument": "gauge", + "unit": "none", + "is_in_otel": false, + "requirement_level": "opt_in", + "attributes": ["messaging.destination.name", "bullmq.queue.jobs.state"] +} diff --git a/python/src/sentry_conventions/attributes.py b/python/src/sentry_conventions/attributes.py index e9e6a247e..b7fb0c649 100644 --- a/python/src/sentry_conventions/attributes.py +++ b/python/src/sentry_conventions/attributes.py @@ -2759,6 +2759,387 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: 194.3322 """ + # Path: model/attributes/bullmq/bullmq__flow__name.json + BULLMQ_FLOW_NAME: Literal["bullmq.flow.name"] = "bullmq.flow.name" + """The name of the root job of the BullMQ flow that FlowProducer.add() adds. + + Type: str + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: "build-report" + """ + + # Path: model/attributes/bullmq/bullmq__job__attempt_finished_timestamp.json + BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP: Literal[ + "bullmq.job.attempt_finished_timestamp" + ] = "bullmq.job.attempt_finished_timestamp" + """The time in milliseconds since the Unix epoch when the current attempt of the BullMQ job finished. + + Type: int + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: 1791184722406 + """ + + # Path: model/attributes/bullmq/bullmq__job__bulk__names.json + BULLMQ_JOB_BULK_NAMES: Literal["bullmq.job.bulk.names"] = "bullmq.job.bulk.names" + """The names of the BullMQ jobs or flows that one bulk operation adds, for example Queue.addBulk(). + + Type: List[str] + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: ["send-welcome-email","generate-report"] + """ + + # Path: model/attributes/bullmq/bullmq__job__deduplication__key.json + BULLMQ_JOB_DEDUPLICATION_KEY: Literal["bullmq.job.deduplication.key"] = ( + "bullmq.job.deduplication.key" + ) + """The deduplication ID that Queue.removeDeduplicationKey() removes. + + Type: str + Apply Scrubbing: auto + Defined in OTEL: No + Visibility: public + Example: "user-42-sync" + """ + + # Path: model/attributes/bullmq/bullmq__job__finished__timestamp.json + BULLMQ_JOB_FINISHED_TIMESTAMP: Literal["bullmq.job.finished.timestamp"] = ( + "bullmq.job.finished.timestamp" + ) + """The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job. + + Type: int + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: 1791184722411 + """ + + # Path: model/attributes/bullmq/bullmq__job__ids.json + BULLMQ_JOB_IDS: Literal["bullmq.job.ids"] = "bullmq.job.ids" + """The IDs of the BullMQ jobs that Queue.clean() removed. + + Type: List[str] + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: ["1","2","3"] + """ + + # Path: model/attributes/bullmq/bullmq__job__key.json + BULLMQ_JOB_KEY: Literal["bullmq.job.key"] = "bullmq.job.key" + """The key that a BullMQ remove operation for a debounce or repeatable key gets, for example Queue.removeDebounceKey(). + + Type: str + Apply Scrubbing: auto + Defined in OTEL: No + Visibility: public + Example: "user-42-sync" + """ + + # Path: model/attributes/bullmq/bullmq__job__name.json + BULLMQ_JOB_NAME: Literal["bullmq.job.name"] = "bullmq.job.name" + """The name of the BullMQ job, which the user passes to Queue.add() to identify the kind of work. + + Type: str + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: "send-welcome-email" + Example: "generate-report" + """ + + # Path: model/attributes/bullmq/bullmq__job__options.json + BULLMQ_JOB_OPTIONS: Literal["bullmq.job.options"] = "bullmq.job.options" + """The options of a BullMQ job operation as a JSON string, for example the options of Queue.remove(). + + Type: str + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: "{\"removeChildren\":true}" + """ + + # Path: model/attributes/bullmq/bullmq__job__processed__timestamp.json + BULLMQ_JOB_PROCESSED_TIMESTAMP: Literal["bullmq.job.processed.timestamp"] = ( + "bullmq.job.processed.timestamp" + ) + """The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job. + + Type: int + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: 1791184722281 + """ + + # Path: model/attributes/bullmq/bullmq__job__progress.json + BULLMQ_JOB_PROGRESS: Literal["bullmq.job.progress"] = "bullmq.job.progress" + """The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress(). + + Type: str + Apply Scrubbing: auto + Defined in OTEL: No + Visibility: public + Example: "{\"percentage\":50}" + """ + + # Path: model/attributes/bullmq/bullmq__job__scheduler__id.json + BULLMQ_JOB_SCHEDULER_ID: Literal["bullmq.job.scheduler.id"] = ( + "bullmq.job.scheduler.id" + ) + """The ID of the BullMQ job scheduler that adds the job. + + Type: str + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: "daily-report" + """ + + # Path: model/attributes/bullmq/bullmq__job__state.json + BULLMQ_JOB_STATE: Literal["bullmq.job.state"] = "bullmq.job.state" + """The state of the BullMQ job that a job metric counts. + + Type: str + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: "completed" + Example: "failed" + Example: "delayed" + """ + + # Path: model/attributes/bullmq/bullmq__job__status.json + BULLMQ_JOB_STATUS: Literal["bullmq.job.status"] = "bullmq.job.status" + """The state of the BullMQ job that a job metric counts. + + Type: str + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: "completed" + Example: "failed" + Example: "delayed" + """ + + # Path: model/attributes/bullmq/bullmq__job__type.json + BULLMQ_JOB_TYPE: Literal["bullmq.job.type"] = "bullmq.job.type" + """The job state from which Queue.clean() removes BullMQ jobs. + + Type: str + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: "completed" + Example: "failed" + """ + + # Path: model/attributes/bullmq/bullmq__queue__clean__count.json + BULLMQ_QUEUE_CLEAN_COUNT: Literal["bullmq.queue.clean.count"] = ( + "bullmq.queue.clean.count" + ) + """The number of BullMQ jobs that Queue.clean() removed. + + Type: int + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: 25 + """ + + # Path: model/attributes/bullmq/bullmq__queue__clean__limit.json + BULLMQ_QUEUE_CLEAN_LIMIT: Literal["bullmq.queue.clean.limit"] = ( + "bullmq.queue.clean.limit" + ) + """The maximum number of BullMQ jobs that Queue.clean() removes. + + Type: int + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: 1000 + """ + + # Path: model/attributes/bullmq/bullmq__queue__drain__delay.json + BULLMQ_QUEUE_DRAIN_DELAY: Literal["bullmq.queue.drain.delay"] = ( + "bullmq.queue.drain.delay" + ) + """Whether Queue.drain() also removes the delayed BullMQ jobs. + + Type: bool + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: true + """ + + # Path: model/attributes/bullmq/bullmq__queue__event__max__length.json + BULLMQ_QUEUE_EVENT_MAX_LENGTH: Literal["bullmq.queue.event.max.length"] = ( + "bullmq.queue.event.max.length" + ) + """The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream. + + Type: int + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: 10000 + """ + + # Path: model/attributes/bullmq/bullmq__queue__grace.json + BULLMQ_QUEUE_GRACE: Literal["bullmq.queue.grace"] = "bullmq.queue.grace" + """The grace period in milliseconds that Queue.clean() uses. Only BullMQ jobs that are older are removed. + + Type: int + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: 60000 + """ + + # Path: model/attributes/bullmq/bullmq__queue__jobs__state.json + BULLMQ_QUEUE_JOBS_STATE: Literal["bullmq.queue.jobs.state"] = ( + "bullmq.queue.jobs.state" + ) + """The BullMQ job state that the queue job count metric counts. + + Type: str + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: "waiting" + Example: "active" + Example: "completed" + """ + + # Path: model/attributes/bullmq/bullmq__queue__options.json + BULLMQ_QUEUE_OPTIONS: Literal["bullmq.queue.options"] = "bullmq.queue.options" + """The options of a BullMQ queue operation as a JSON string, for example the options of Queue.retryJobs() or Queue.promoteJobs(). + + Type: str + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: "{\"count\":1000}" + """ + + # Path: model/attributes/bullmq/bullmq__queue__rate__limit.json + BULLMQ_QUEUE_RATE_LIMIT: Literal["bullmq.queue.rate.limit"] = ( + "bullmq.queue.rate.limit" + ) + """The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue. + + Type: int + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: 5000 + """ + + # Path: model/attributes/bullmq/bullmq__worker__do__not__wait__active.json + BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE: Literal["bullmq.worker.do.not.wait.active"] = ( + "bullmq.worker.do.not.wait.active" + ) + """Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish. + + Type: bool + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: false + """ + + # Path: model/attributes/bullmq/bullmq__worker__force__close.json + BULLMQ_WORKER_FORCE_CLOSE: Literal["bullmq.worker.force.close"] = ( + "bullmq.worker.force.close" + ) + """Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish. + + Type: bool + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: false + """ + + # Path: model/attributes/bullmq/bullmq__worker__id.json + BULLMQ_WORKER_ID: Literal["bullmq.worker.id"] = "bullmq.worker.id" + """The ID that BullMQ generates for the Worker instance. + + Type: str + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: "03327d57-05cc-4528-9d24-c59bf6520039" + """ + + # Path: model/attributes/bullmq/bullmq__worker__jobs__to__extend__locks.json + BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS: Literal[ + "bullmq.worker.jobs.to.extend.locks" + ] = "bullmq.worker.jobs.to.extend.locks" + """The IDs of the BullMQ jobs whose locks the Worker extends. + + Type: List[str] + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: ["1","2"] + """ + + # Path: model/attributes/bullmq/bullmq__worker__name.json + BULLMQ_WORKER_NAME: Literal["bullmq.worker.name"] = "bullmq.worker.name" + """The name that the user gives to the BullMQ Worker in its options. + + Type: str + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: "email-worker" + """ + + # Path: model/attributes/bullmq/bullmq__worker__options.json + BULLMQ_WORKER_OPTIONS: Literal["bullmq.worker.options"] = "bullmq.worker.options" + """The options of a BullMQ Worker operation as a JSON string, for example the options of Worker.getNextJob(). + + Type: str + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: "{\"block\":true}" + """ + + # Path: model/attributes/bullmq/bullmq__worker__rate__limit.json + BULLMQ_WORKER_RATE_LIMIT: Literal["bullmq.worker.rate.limit"] = ( + "bullmq.worker.rate.limit" + ) + """The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker. + + Type: int + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: 5000 + """ + + # Path: model/attributes/bullmq/bullmq__worker__stalled__jobs.json + BULLMQ_WORKER_STALLED_JOBS: Literal["bullmq.worker.stalled.jobs"] = ( + "bullmq.worker.stalled.jobs" + ) + """The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state. + + Type: List[str] + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: ["1","2"] + """ + # Path: model/attributes/cache/cache__hit.json CACHE_HIT: Literal["cache.hit"] = "cache.hit" """If the cache was hit during this span. @@ -15185,6 +15566,625 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ChangelogEntry(version="0.5.0", prs=[235]), ], ), + "bullmq.flow.name": AttributeMetadata( + brief="The name of the root job of the BullMQ flow that FlowProducer.add() adds.", + type=AttributeType.STRING, + keys=("bullmq.flow.name",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example="build-report", + examples=["build-report"], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.flow.name attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.job.attempt_finished_timestamp": AttributeMetadata( + brief="The time in milliseconds since the Unix epoch when the current attempt of the BullMQ job finished.", + type=AttributeType.INTEGER, + keys=("bullmq.job.attempt_finished_timestamp",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=1791184722406, + examples=[1791184722406], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.job.attempt_finished_timestamp attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.job.bulk.names": AttributeMetadata( + brief="The names of the BullMQ jobs or flows that one bulk operation adds, for example Queue.addBulk().", + type=AttributeType.STRING_ARRAY, + keys=("bullmq.job.bulk.names",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=["send-welcome-email", "generate-report"], + examples=[["send-welcome-email", "generate-report"]], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.job.bulk.names attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.job.deduplication.key": AttributeMetadata( + brief="The deduplication ID that Queue.removeDeduplicationKey() removes.", + type=AttributeType.STRING, + keys=("bullmq.job.deduplication.key",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example="user-42-sync", + examples=["user-42-sync"], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.job.deduplication.key attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.job.finished.timestamp": AttributeMetadata( + brief="The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job.", + type=AttributeType.INTEGER, + keys=("bullmq.job.finished.timestamp",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=1791184722411, + examples=[1791184722411], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.job.finished.timestamp attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + "BullMQ 5.79.1 sets this attribute. BullMQ 6.3.11 does not.", + ], + ), + "bullmq.job.ids": AttributeMetadata( + brief="The IDs of the BullMQ jobs that Queue.clean() removed.", + type=AttributeType.STRING_ARRAY, + keys=("bullmq.job.ids",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=["1", "2", "3"], + examples=[["1", "2", "3"]], + changelog=[ + ChangelogEntry( + version="next", prs=[690], description="Added bullmq.job.ids attribute" + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + "BullMQ 5.79.1 sets this attribute. BullMQ 6.3.11 does not.", + ], + ), + "bullmq.job.key": AttributeMetadata( + brief="The key that a BullMQ remove operation for a debounce or repeatable key gets, for example Queue.removeDebounceKey().", + type=AttributeType.STRING, + keys=("bullmq.job.key",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example="user-42-sync", + examples=["user-42-sync"], + changelog=[ + ChangelogEntry( + version="next", prs=[690], description="Added bullmq.job.key attribute" + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.job.name": AttributeMetadata( + brief="The name of the BullMQ job, which the user passes to Queue.add() to identify the kind of work.", + type=AttributeType.STRING, + keys=("bullmq.job.name",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example="send-welcome-email", + examples=["send-welcome-email", "generate-report"], + changelog=[ + ChangelogEntry( + version="next", prs=[690], description="Added bullmq.job.name attribute" + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + "Also set on the BullMQ job metrics.", + ], + ), + "bullmq.job.options": AttributeMetadata( + brief="The options of a BullMQ job operation as a JSON string, for example the options of Queue.remove().", + type=AttributeType.STRING, + keys=("bullmq.job.options",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example='{"removeChildren":true}', + examples=['{"removeChildren":true}'], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.job.options attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.job.processed.timestamp": AttributeMetadata( + brief="The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job.", + type=AttributeType.INTEGER, + keys=("bullmq.job.processed.timestamp",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=1791184722281, + examples=[1791184722281], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.job.processed.timestamp attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.job.progress": AttributeMetadata( + brief="The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress().", + type=AttributeType.STRING, + keys=("bullmq.job.progress",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example='{"percentage":50}', + examples=['{"percentage":50}'], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.job.progress attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.job.scheduler.id": AttributeMetadata( + brief="The ID of the BullMQ job scheduler that adds the job.", + type=AttributeType.STRING, + keys=("bullmq.job.scheduler.id",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example="daily-report", + examples=["daily-report"], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.job.scheduler.id attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.job.state": AttributeMetadata( + brief="The state of the BullMQ job that a job metric counts.", + type=AttributeType.STRING, + keys=("bullmq.job.state",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example="completed", + examples=["completed", "failed", "delayed"], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.job.state attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + "Set on the BullMQ job metrics by BullMQ 6.3.11. BullMQ 5.79.1 sets `bullmq.job.status` instead.", + ], + ), + "bullmq.job.status": AttributeMetadata( + brief="The state of the BullMQ job that a job metric counts.", + type=AttributeType.STRING, + keys=("bullmq.job.status",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example="completed", + examples=["completed", "failed", "delayed"], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.job.status attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + "Set on the BullMQ job metrics by BullMQ 5.79.1. BullMQ 6.3.11 sets `bullmq.job.state` instead.", + ], + ), + "bullmq.job.type": AttributeMetadata( + brief="The job state from which Queue.clean() removes BullMQ jobs.", + type=AttributeType.STRING, + keys=("bullmq.job.type",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example="completed", + examples=["completed", "failed"], + changelog=[ + ChangelogEntry( + version="next", prs=[690], description="Added bullmq.job.type attribute" + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.queue.clean.count": AttributeMetadata( + brief="The number of BullMQ jobs that Queue.clean() removed.", + type=AttributeType.INTEGER, + keys=("bullmq.queue.clean.count",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=25, + examples=[25], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.queue.clean.count attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + "BullMQ 6.3.11 sets this attribute. BullMQ 5.79.1 does not.", + ], + ), + "bullmq.queue.clean.limit": AttributeMetadata( + brief="The maximum number of BullMQ jobs that Queue.clean() removes.", + type=AttributeType.INTEGER, + keys=("bullmq.queue.clean.limit",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=1000, + examples=[1000], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.queue.clean.limit attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.queue.drain.delay": AttributeMetadata( + brief="Whether Queue.drain() also removes the delayed BullMQ jobs.", + type=AttributeType.BOOLEAN, + keys=("bullmq.queue.drain.delay",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=True, + examples=[True], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.queue.drain.delay attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.queue.event.max.length": AttributeMetadata( + brief="The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream.", + type=AttributeType.INTEGER, + keys=("bullmq.queue.event.max.length",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=10000, + examples=[10000], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.queue.event.max.length attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.queue.grace": AttributeMetadata( + brief="The grace period in milliseconds that Queue.clean() uses. Only BullMQ jobs that are older are removed.", + type=AttributeType.INTEGER, + keys=("bullmq.queue.grace",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=60000, + examples=[60000], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.queue.grace attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.queue.jobs.state": AttributeMetadata( + brief="The BullMQ job state that the queue job count metric counts.", + type=AttributeType.STRING, + keys=("bullmq.queue.jobs.state",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example="waiting", + examples=["waiting", "active", "completed"], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.queue.jobs.state attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + "Set on the BullMQ queue job count metric.", + ], + ), + "bullmq.queue.options": AttributeMetadata( + brief="The options of a BullMQ queue operation as a JSON string, for example the options of Queue.retryJobs() or Queue.promoteJobs().", + type=AttributeType.STRING, + keys=("bullmq.queue.options",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example='{"count":1000}', + examples=['{"count":1000}'], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.queue.options attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.queue.rate.limit": AttributeMetadata( + brief="The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue.", + type=AttributeType.INTEGER, + keys=("bullmq.queue.rate.limit",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=5000, + examples=[5000], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.queue.rate.limit attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.worker.do.not.wait.active": AttributeMetadata( + brief="Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish.", + type=AttributeType.BOOLEAN, + keys=("bullmq.worker.do.not.wait.active",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=False, + examples=[False], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.worker.do.not.wait.active attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.worker.force.close": AttributeMetadata( + brief="Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish.", + type=AttributeType.BOOLEAN, + keys=("bullmq.worker.force.close",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=False, + examples=[False], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.worker.force.close attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.worker.id": AttributeMetadata( + brief="The ID that BullMQ generates for the Worker instance.", + type=AttributeType.STRING, + keys=("bullmq.worker.id",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example="03327d57-05cc-4528-9d24-c59bf6520039", + examples=["03327d57-05cc-4528-9d24-c59bf6520039"], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.worker.id attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.worker.jobs.to.extend.locks": AttributeMetadata( + brief="The IDs of the BullMQ jobs whose locks the Worker extends.", + type=AttributeType.STRING_ARRAY, + keys=("bullmq.worker.jobs.to.extend.locks",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=["1", "2"], + examples=[["1", "2"]], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.worker.jobs.to.extend.locks attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.worker.name": AttributeMetadata( + brief="The name that the user gives to the BullMQ Worker in its options.", + type=AttributeType.STRING, + keys=("bullmq.worker.name",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example="email-worker", + examples=["email-worker"], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.worker.name attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.worker.options": AttributeMetadata( + brief="The options of a BullMQ Worker operation as a JSON string, for example the options of Worker.getNextJob().", + type=AttributeType.STRING, + keys=("bullmq.worker.options",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example='{"block":true}', + examples=['{"block":true}'], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.worker.options attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.worker.rate.limit": AttributeMetadata( + brief="The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker.", + type=AttributeType.INTEGER, + keys=("bullmq.worker.rate.limit",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=5000, + examples=[5000], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.worker.rate.limit attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), + "bullmq.worker.stalled.jobs": AttributeMetadata( + brief="The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state.", + type=AttributeType.STRING_ARRAY, + keys=("bullmq.worker.stalled.jobs",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=["1", "2"], + examples=[["1", "2"]], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added bullmq.worker.stalled.jobs attribute", + ), + ], + additional_context=[ + "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ], + ), "cache.hit": AttributeMetadata( brief="If the cache was hit during this span.", type=AttributeType.BOOLEAN, @@ -28573,6 +29573,37 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "browser.web_vital.lcp.value": float, "browser.web_vital.ttfb.request_time": float, "browser.web_vital.ttfb.value": float, + "bullmq.flow.name": str, + "bullmq.job.attempt_finished_timestamp": int, + "bullmq.job.bulk.names": List[str], + "bullmq.job.deduplication.key": str, + "bullmq.job.finished.timestamp": int, + "bullmq.job.ids": List[str], + "bullmq.job.key": str, + "bullmq.job.name": str, + "bullmq.job.options": str, + "bullmq.job.processed.timestamp": int, + "bullmq.job.progress": str, + "bullmq.job.scheduler.id": str, + "bullmq.job.state": str, + "bullmq.job.status": str, + "bullmq.job.type": str, + "bullmq.queue.clean.count": int, + "bullmq.queue.clean.limit": int, + "bullmq.queue.drain.delay": bool, + "bullmq.queue.event.max.length": int, + "bullmq.queue.grace": int, + "bullmq.queue.jobs.state": str, + "bullmq.queue.options": str, + "bullmq.queue.rate.limit": int, + "bullmq.worker.do.not.wait.active": bool, + "bullmq.worker.force.close": bool, + "bullmq.worker.id": str, + "bullmq.worker.jobs.to.extend.locks": List[str], + "bullmq.worker.name": str, + "bullmq.worker.options": str, + "bullmq.worker.rate.limit": int, + "bullmq.worker.stalled.jobs": List[str], "cache.hit": bool, "cache.item_age": int, "cache.item_size": int, From 9622e73ab5a6d1c811ada5fe6d83da81035fada4 Mon Sep 17 00:00:00 2001 From: JPeer264 Date: Tue, 20 Oct 2026 10:04:53 +0200 Subject: [PATCH 02/11] fixup! feat: Add BullMQ attributes and metrics --- .../sentry-conventions/src/attributes.ts | 115 ------------------ javascript/sentry-conventions/src/search.ts | 37 ------ .../bullmq/bullmq__job__options.json | 21 ---- .../bullmq/bullmq__queue__options.json | 21 ---- .../bullmq/bullmq__worker__options.json | 21 ---- python/src/sentry_conventions/attributes.py | 96 --------------- 6 files changed, 311 deletions(-) delete mode 100644 model/attributes/bullmq/bullmq__job__options.json delete mode 100644 model/attributes/bullmq/bullmq__queue__options.json delete mode 100644 model/attributes/bullmq/bullmq__worker__options.json diff --git a/javascript/sentry-conventions/src/attributes.ts b/javascript/sentry-conventions/src/attributes.ts index ddbe350d5..350959688 100644 --- a/javascript/sentry-conventions/src/attributes.ts +++ b/javascript/sentry-conventions/src/attributes.ts @@ -4245,27 +4245,6 @@ export const BULLMQ_JOB_NAME = 'bullmq.job.name'; */ export type BULLMQ_JOB_NAME_TYPE = string; -// Path: model/attributes/bullmq/bullmq__job__options.json - -/** - * The options of a BullMQ job operation as a JSON string, for example the options of Queue.remove(). `bullmq.job.options` - * - * Attribute Value Type: `string` {@link BULLMQ_JOB_OPTIONS_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example "{\"removeChildren\":true}" - */ -export const BULLMQ_JOB_OPTIONS = 'bullmq.job.options'; - -/** - * Type for {@link BULLMQ_JOB_OPTIONS} bullmq.job.options - */ -export type BULLMQ_JOB_OPTIONS_TYPE = string; - // Path: model/attributes/bullmq/bullmq__job__processed__timestamp.json /** @@ -4525,27 +4504,6 @@ export const BULLMQ_QUEUE_JOBS_STATE = 'bullmq.queue.jobs.state'; */ export type BULLMQ_QUEUE_JOBS_STATE_TYPE = string; -// Path: model/attributes/bullmq/bullmq__queue__options.json - -/** - * The options of a BullMQ queue operation as a JSON string, for example the options of Queue.retryJobs() or Queue.promoteJobs(). `bullmq.queue.options` - * - * Attribute Value Type: `string` {@link BULLMQ_QUEUE_OPTIONS_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example "{\"count\":1000}" - */ -export const BULLMQ_QUEUE_OPTIONS = 'bullmq.queue.options'; - -/** - * Type for {@link BULLMQ_QUEUE_OPTIONS} bullmq.queue.options - */ -export type BULLMQ_QUEUE_OPTIONS_TYPE = string; - // Path: model/attributes/bullmq/bullmq__queue__rate__limit.json /** @@ -4672,27 +4630,6 @@ export const BULLMQ_WORKER_NAME = 'bullmq.worker.name'; */ export type BULLMQ_WORKER_NAME_TYPE = string; -// Path: model/attributes/bullmq/bullmq__worker__options.json - -/** - * The options of a BullMQ Worker operation as a JSON string, for example the options of Worker.getNextJob(). `bullmq.worker.options` - * - * Attribute Value Type: `string` {@link BULLMQ_WORKER_OPTIONS_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example "{\"block\":true}" - */ -export const BULLMQ_WORKER_OPTIONS = 'bullmq.worker.options'; - -/** - * Type for {@link BULLMQ_WORKER_OPTIONS} bullmq.worker.options - */ -export type BULLMQ_WORKER_OPTIONS_TYPE = string; - // Path: model/attributes/bullmq/bullmq__worker__rate__limit.json /** @@ -20805,7 +20742,6 @@ export const ATTRIBUTE_TYPE: Record = { 'bullmq.job.ids': 'string[]', 'bullmq.job.key': 'string', 'bullmq.job.name': 'string', - 'bullmq.job.options': 'string', 'bullmq.job.processed.timestamp': 'integer', 'bullmq.job.progress': 'string', 'bullmq.job.scheduler.id': 'string', @@ -20818,14 +20754,12 @@ export const ATTRIBUTE_TYPE: Record = { 'bullmq.queue.event.max.length': 'integer', 'bullmq.queue.grace': 'integer', 'bullmq.queue.jobs.state': 'string', - 'bullmq.queue.options': 'string', 'bullmq.queue.rate.limit': 'integer', 'bullmq.worker.do.not.wait.active': 'boolean', 'bullmq.worker.force.close': 'boolean', 'bullmq.worker.id': 'string', 'bullmq.worker.jobs.to.extend.locks': 'string[]', 'bullmq.worker.name': 'string', - 'bullmq.worker.options': 'string', 'bullmq.worker.rate.limit': 'integer', 'bullmq.worker.stalled.jobs': 'string[]', 'cache.hit': 'boolean', @@ -21723,7 +21657,6 @@ export type AttributeName = | typeof BULLMQ_JOB_IDS | typeof BULLMQ_JOB_KEY | typeof BULLMQ_JOB_NAME - | typeof BULLMQ_JOB_OPTIONS | typeof BULLMQ_JOB_PROCESSED_TIMESTAMP | typeof BULLMQ_JOB_PROGRESS | typeof BULLMQ_JOB_SCHEDULER_ID @@ -21736,14 +21669,12 @@ export type AttributeName = | typeof BULLMQ_QUEUE_EVENT_MAX_LENGTH | typeof BULLMQ_QUEUE_GRACE | typeof BULLMQ_QUEUE_JOBS_STATE - | typeof BULLMQ_QUEUE_OPTIONS | typeof BULLMQ_QUEUE_RATE_LIMIT | typeof BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE | typeof BULLMQ_WORKER_FORCE_CLOSE | typeof BULLMQ_WORKER_ID | typeof BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS | typeof BULLMQ_WORKER_NAME - | typeof BULLMQ_WORKER_OPTIONS | typeof BULLMQ_WORKER_RATE_LIMIT | typeof BULLMQ_WORKER_STALLED_JOBS | typeof CACHE_HIT @@ -25487,20 +25418,6 @@ export const ATTRIBUTE_METADATA: Record = { 'Also set on the BullMQ job metrics.', ], }, - 'bullmq.job.options': { - brief: 'The options of a BullMQ job operation as a JSON string, for example the options of Queue.remove().', - type: 'string', - keys: ['bullmq.job.options'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: '{"removeChildren":true}', - examples: ['{"removeChildren":true}'], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.options attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, 'bullmq.job.processed.timestamp': { brief: 'The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job.', type: 'integer', @@ -25681,21 +25598,6 @@ export const ATTRIBUTE_METADATA: Record = { 'Set on the BullMQ queue job count metric.', ], }, - 'bullmq.queue.options': { - brief: - 'The options of a BullMQ queue operation as a JSON string, for example the options of Queue.retryJobs() or Queue.promoteJobs().', - type: 'string', - keys: ['bullmq.queue.options'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: '{"count":1000}', - examples: ['{"count":1000}'], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.queue.options attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, 'bullmq.queue.rate.limit': { brief: 'The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue.', type: 'integer', @@ -25780,20 +25682,6 @@ export const ATTRIBUTE_METADATA: Record = { changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.worker.name attribute' }], additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], }, - 'bullmq.worker.options': { - brief: 'The options of a BullMQ Worker operation as a JSON string, for example the options of Worker.getNextJob().', - type: 'string', - keys: ['bullmq.worker.options'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: '{"block":true}', - examples: ['{"block":true}'], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.worker.options attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, 'bullmq.worker.rate.limit': { brief: 'The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker.', type: 'integer', @@ -37487,7 +37375,6 @@ export type Attributes = { [BULLMQ_JOB_IDS]?: BULLMQ_JOB_IDS_TYPE; [BULLMQ_JOB_KEY]?: BULLMQ_JOB_KEY_TYPE; [BULLMQ_JOB_NAME]?: BULLMQ_JOB_NAME_TYPE; - [BULLMQ_JOB_OPTIONS]?: BULLMQ_JOB_OPTIONS_TYPE; [BULLMQ_JOB_PROCESSED_TIMESTAMP]?: BULLMQ_JOB_PROCESSED_TIMESTAMP_TYPE; [BULLMQ_JOB_PROGRESS]?: BULLMQ_JOB_PROGRESS_TYPE; [BULLMQ_JOB_SCHEDULER_ID]?: BULLMQ_JOB_SCHEDULER_ID_TYPE; @@ -37500,14 +37387,12 @@ export type Attributes = { [BULLMQ_QUEUE_EVENT_MAX_LENGTH]?: BULLMQ_QUEUE_EVENT_MAX_LENGTH_TYPE; [BULLMQ_QUEUE_GRACE]?: BULLMQ_QUEUE_GRACE_TYPE; [BULLMQ_QUEUE_JOBS_STATE]?: BULLMQ_QUEUE_JOBS_STATE_TYPE; - [BULLMQ_QUEUE_OPTIONS]?: BULLMQ_QUEUE_OPTIONS_TYPE; [BULLMQ_QUEUE_RATE_LIMIT]?: BULLMQ_QUEUE_RATE_LIMIT_TYPE; [BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE]?: BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE_TYPE; [BULLMQ_WORKER_FORCE_CLOSE]?: BULLMQ_WORKER_FORCE_CLOSE_TYPE; [BULLMQ_WORKER_ID]?: BULLMQ_WORKER_ID_TYPE; [BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS]?: BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS_TYPE; [BULLMQ_WORKER_NAME]?: BULLMQ_WORKER_NAME_TYPE; - [BULLMQ_WORKER_OPTIONS]?: BULLMQ_WORKER_OPTIONS_TYPE; [BULLMQ_WORKER_RATE_LIMIT]?: BULLMQ_WORKER_RATE_LIMIT_TYPE; [BULLMQ_WORKER_STALLED_JOBS]?: BULLMQ_WORKER_STALLED_JOBS_TYPE; [CACHE_HIT]?: CACHE_HIT_TYPE; diff --git a/javascript/sentry-conventions/src/search.ts b/javascript/sentry-conventions/src/search.ts index b46979a12..862a3d678 100644 --- a/javascript/sentry-conventions/src/search.ts +++ b/javascript/sentry-conventions/src/search.ts @@ -1113,11 +1113,6 @@ export const SEARCH_BULLMQ__JOB__KEY = 'bullmq.job.key'; */ export const SEARCH_BULLMQ__JOB__NAME = 'bullmq.job.name'; -/** - * Search name for {@link attributes.BULLMQ_JOB_OPTIONS}. `bullmq.job.options` - */ -export const SEARCH_BULLMQ__JOB__OPTIONS = 'bullmq.job.options'; - /** * Search name for {@link attributes.BULLMQ_JOB_PROCESSED_TIMESTAMP}. `bullmq.job.processed.timestamp` */ @@ -1178,11 +1173,6 @@ export const SEARCH_BULLMQ__QUEUE__GRACE = 'bullmq.queue.grace'; */ export const SEARCH_BULLMQ__QUEUE__JOBS__STATE = 'bullmq.queue.jobs.state'; -/** - * Search name for {@link attributes.BULLMQ_QUEUE_OPTIONS}. `bullmq.queue.options` - */ -export const SEARCH_BULLMQ__QUEUE__OPTIONS = 'bullmq.queue.options'; - /** * Search name for {@link attributes.BULLMQ_QUEUE_RATE_LIMIT}. `bullmq.queue.rate.limit` */ @@ -1213,11 +1203,6 @@ export const SEARCH_BULLMQ__WORKER__JOBS__TO__EXTEND__LOCKS = 'bullmq.worker.job */ export const SEARCH_BULLMQ__WORKER__NAME = 'bullmq.worker.name'; -/** - * Search name for {@link attributes.BULLMQ_WORKER_OPTIONS}. `bullmq.worker.options` - */ -export const SEARCH_BULLMQ__WORKER__OPTIONS = 'bullmq.worker.options'; - /** * Search name for {@link attributes.BULLMQ_WORKER_RATE_LIMIT}. `bullmq.worker.rate.limit` */ @@ -5460,7 +5445,6 @@ export type AttributeSearchName = | typeof SEARCH_BULLMQ__JOB__IDS | typeof SEARCH_BULLMQ__JOB__KEY | typeof SEARCH_BULLMQ__JOB__NAME - | typeof SEARCH_BULLMQ__JOB__OPTIONS | typeof SEARCH_BULLMQ__JOB__PROCESSED__TIMESTAMP | typeof SEARCH_BULLMQ__JOB__PROGRESS | typeof SEARCH_BULLMQ__JOB__SCHEDULER__ID @@ -5473,14 +5457,12 @@ export type AttributeSearchName = | typeof SEARCH_BULLMQ__QUEUE__EVENT__MAX__LENGTH | typeof SEARCH_BULLMQ__QUEUE__GRACE | typeof SEARCH_BULLMQ__QUEUE__JOBS__STATE - | typeof SEARCH_BULLMQ__QUEUE__OPTIONS | typeof SEARCH_BULLMQ__QUEUE__RATE__LIMIT | typeof SEARCH_BULLMQ__WORKER__DO__NOT__WAIT__ACTIVE | typeof SEARCH_BULLMQ__WORKER__FORCE__CLOSE | typeof SEARCH_BULLMQ__WORKER__ID | typeof SEARCH_BULLMQ__WORKER__JOBS__TO__EXTEND__LOCKS | typeof SEARCH_BULLMQ__WORKER__NAME - | typeof SEARCH_BULLMQ__WORKER__OPTIONS | typeof SEARCH_BULLMQ__WORKER__RATE__LIMIT | typeof SEARCH_BULLMQ__WORKER__STALLED__JOBS | typeof SEARCH_CACHE__HIT @@ -7478,12 +7460,6 @@ export const ATTRIBUTE_SEARCH_METADATA: Record brief: 'The name of the BullMQ job, which the user passes to Queue.add() to identify the kind of work.', deprecationChain: ['bullmq.job.name'], }, - 'bullmq.job.options': { - canonicalName: 'bullmq.job.options', - type: 'string', - brief: 'The options of a BullMQ job operation as a JSON string, for example the options of Queue.remove().', - deprecationChain: ['bullmq.job.options'], - }, 'bullmq.job.processed.timestamp': { canonicalName: 'bullmq.job.processed.timestamp', type: 'integer', @@ -7556,13 +7532,6 @@ export const ATTRIBUTE_SEARCH_METADATA: Record brief: 'The BullMQ job state that the queue job count metric counts.', deprecationChain: ['bullmq.queue.jobs.state'], }, - 'bullmq.queue.options': { - canonicalName: 'bullmq.queue.options', - type: 'string', - brief: - 'The options of a BullMQ queue operation as a JSON string, for example the options of Queue.retryJobs() or Queue.promoteJobs().', - deprecationChain: ['bullmq.queue.options'], - }, 'bullmq.queue.rate.limit': { canonicalName: 'bullmq.queue.rate.limit', type: 'integer', @@ -7599,12 +7568,6 @@ export const ATTRIBUTE_SEARCH_METADATA: Record brief: 'The name that the user gives to the BullMQ Worker in its options.', deprecationChain: ['bullmq.worker.name'], }, - 'bullmq.worker.options': { - canonicalName: 'bullmq.worker.options', - type: 'string', - brief: 'The options of a BullMQ Worker operation as a JSON string, for example the options of Worker.getNextJob().', - deprecationChain: ['bullmq.worker.options'], - }, 'bullmq.worker.rate.limit': { canonicalName: 'bullmq.worker.rate.limit', type: 'integer', diff --git a/model/attributes/bullmq/bullmq__job__options.json b/model/attributes/bullmq/bullmq__job__options.json deleted file mode 100644 index 0d0adc2cc..000000000 --- a/model/attributes/bullmq/bullmq__job__options.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "key": "bullmq.job.options", - "brief": "The options of a BullMQ job operation as a JSON string, for example the options of Queue.remove().", - "type": "string", - "apply_scrubbing": { - "key": "manual" - }, - "is_in_otel": false, - "visibility": "public", - "examples": ["{\"removeChildren\":true}"], - "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." - ], - "changelog": [ - { - "version": "next", - "prs": [690], - "description": "Added bullmq.job.options attribute" - } - ] -} diff --git a/model/attributes/bullmq/bullmq__queue__options.json b/model/attributes/bullmq/bullmq__queue__options.json deleted file mode 100644 index 898a6822a..000000000 --- a/model/attributes/bullmq/bullmq__queue__options.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "key": "bullmq.queue.options", - "brief": "The options of a BullMQ queue operation as a JSON string, for example the options of Queue.retryJobs() or Queue.promoteJobs().", - "type": "string", - "apply_scrubbing": { - "key": "manual" - }, - "is_in_otel": false, - "visibility": "public", - "examples": ["{\"count\":1000}"], - "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." - ], - "changelog": [ - { - "version": "next", - "prs": [690], - "description": "Added bullmq.queue.options attribute" - } - ] -} diff --git a/model/attributes/bullmq/bullmq__worker__options.json b/model/attributes/bullmq/bullmq__worker__options.json deleted file mode 100644 index 13b30257e..000000000 --- a/model/attributes/bullmq/bullmq__worker__options.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "key": "bullmq.worker.options", - "brief": "The options of a BullMQ Worker operation as a JSON string, for example the options of Worker.getNextJob().", - "type": "string", - "apply_scrubbing": { - "key": "manual" - }, - "is_in_otel": false, - "visibility": "public", - "examples": ["{\"block\":true}"], - "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." - ], - "changelog": [ - { - "version": "next", - "prs": [690], - "description": "Added bullmq.worker.options attribute" - } - ] -} diff --git a/python/src/sentry_conventions/attributes.py b/python/src/sentry_conventions/attributes.py index b7fb0c649..a7de80362 100644 --- a/python/src/sentry_conventions/attributes.py +++ b/python/src/sentry_conventions/attributes.py @@ -2854,17 +2854,6 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: "generate-report" """ - # Path: model/attributes/bullmq/bullmq__job__options.json - BULLMQ_JOB_OPTIONS: Literal["bullmq.job.options"] = "bullmq.job.options" - """The options of a BullMQ job operation as a JSON string, for example the options of Queue.remove(). - - Type: str - Apply Scrubbing: manual - Defined in OTEL: No - Visibility: public - Example: "{\"removeChildren\":true}" - """ - # Path: model/attributes/bullmq/bullmq__job__processed__timestamp.json BULLMQ_JOB_PROCESSED_TIMESTAMP: Literal["bullmq.job.processed.timestamp"] = ( "bullmq.job.processed.timestamp" @@ -3018,17 +3007,6 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: "completed" """ - # Path: model/attributes/bullmq/bullmq__queue__options.json - BULLMQ_QUEUE_OPTIONS: Literal["bullmq.queue.options"] = "bullmq.queue.options" - """The options of a BullMQ queue operation as a JSON string, for example the options of Queue.retryJobs() or Queue.promoteJobs(). - - Type: str - Apply Scrubbing: manual - Defined in OTEL: No - Visibility: public - Example: "{\"count\":1000}" - """ - # Path: model/attributes/bullmq/bullmq__queue__rate__limit.json BULLMQ_QUEUE_RATE_LIMIT: Literal["bullmq.queue.rate.limit"] = ( "bullmq.queue.rate.limit" @@ -3103,17 +3081,6 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: "email-worker" """ - # Path: model/attributes/bullmq/bullmq__worker__options.json - BULLMQ_WORKER_OPTIONS: Literal["bullmq.worker.options"] = "bullmq.worker.options" - """The options of a BullMQ Worker operation as a JSON string, for example the options of Worker.getNextJob(). - - Type: str - Apply Scrubbing: manual - Defined in OTEL: No - Visibility: public - Example: "{\"block\":true}" - """ - # Path: model/attributes/bullmq/bullmq__worker__rate__limit.json BULLMQ_WORKER_RATE_LIMIT: Literal["bullmq.worker.rate.limit"] = ( "bullmq.worker.rate.limit" @@ -15723,26 +15690,6 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "Also set on the BullMQ job metrics.", ], ), - "bullmq.job.options": AttributeMetadata( - brief="The options of a BullMQ job operation as a JSON string, for example the options of Queue.remove().", - type=AttributeType.STRING, - keys=("bullmq.job.options",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, - visibility=Visibility.PUBLIC, - example='{"removeChildren":true}', - examples=['{"removeChildren":true}'], - changelog=[ - ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.job.options attribute", - ), - ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." - ], - ), "bullmq.job.processed.timestamp": AttributeMetadata( brief="The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job.", type=AttributeType.INTEGER, @@ -15985,26 +15932,6 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "Set on the BullMQ queue job count metric.", ], ), - "bullmq.queue.options": AttributeMetadata( - brief="The options of a BullMQ queue operation as a JSON string, for example the options of Queue.retryJobs() or Queue.promoteJobs().", - type=AttributeType.STRING, - keys=("bullmq.queue.options",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, - visibility=Visibility.PUBLIC, - example='{"count":1000}', - examples=['{"count":1000}'], - changelog=[ - ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.queue.options attribute", - ), - ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." - ], - ), "bullmq.queue.rate.limit": AttributeMetadata( brief="The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue.", type=AttributeType.INTEGER, @@ -16125,26 +16052,6 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." ], ), - "bullmq.worker.options": AttributeMetadata( - brief="The options of a BullMQ Worker operation as a JSON string, for example the options of Worker.getNextJob().", - type=AttributeType.STRING, - keys=("bullmq.worker.options",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, - visibility=Visibility.PUBLIC, - example='{"block":true}', - examples=['{"block":true}'], - changelog=[ - ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.worker.options attribute", - ), - ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." - ], - ), "bullmq.worker.rate.limit": AttributeMetadata( brief="The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker.", type=AttributeType.INTEGER, @@ -29581,7 +29488,6 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "bullmq.job.ids": List[str], "bullmq.job.key": str, "bullmq.job.name": str, - "bullmq.job.options": str, "bullmq.job.processed.timestamp": int, "bullmq.job.progress": str, "bullmq.job.scheduler.id": str, @@ -29594,14 +29500,12 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "bullmq.queue.event.max.length": int, "bullmq.queue.grace": int, "bullmq.queue.jobs.state": str, - "bullmq.queue.options": str, "bullmq.queue.rate.limit": int, "bullmq.worker.do.not.wait.active": bool, "bullmq.worker.force.close": bool, "bullmq.worker.id": str, "bullmq.worker.jobs.to.extend.locks": List[str], "bullmq.worker.name": str, - "bullmq.worker.options": str, "bullmq.worker.rate.limit": int, "bullmq.worker.stalled.jobs": List[str], "cache.hit": bool, From 81128ac5b50b069f281a1daa29119472bb2bfca7 Mon Sep 17 00:00:00 2001 From: JPeer264 Date: Tue, 20 Oct 2026 10:05:16 +0200 Subject: [PATCH 03/11] fixup! feat: Add BullMQ attributes and metrics --- .../sentry-conventions/src/attributes.ts | 2244 +-- javascript/sentry-conventions/src/search.ts | 677 +- .../messaging__bullmq__flow__name.json} | 6 +- ...lmq__job__attempt_finished_timestamp.json} | 6 +- .../messaging__bullmq__job__bulk__names.json} | 6 +- ...ing__bullmq__job__deduplication__key.json} | 6 +- ...ng__bullmq__job__finished__timestamp.json} | 6 +- .../messaging__bullmq__job__ids.json} | 6 +- .../messaging__bullmq__job__key.json} | 6 +- .../messaging__bullmq__job__name.json} | 6 +- ...g__bullmq__job__processed__timestamp.json} | 6 +- .../messaging__bullmq__job__progress.json} | 6 +- ...essaging__bullmq__job__scheduler__id.json} | 6 +- .../messaging__bullmq__job__state.json} | 8 +- .../messaging__bullmq__job__status.json} | 8 +- .../messaging__bullmq__job__type.json} | 6 +- ...ssaging__bullmq__queue__clean__count.json} | 6 +- ...ssaging__bullmq__queue__clean__limit.json} | 6 +- ...ssaging__bullmq__queue__drain__delay.json} | 6 +- ...g__bullmq__queue__event__max__length.json} | 6 +- .../messaging__bullmq__queue__grace.json} | 6 +- ...essaging__bullmq__queue__jobs__state.json} | 6 +- ...essaging__bullmq__queue__rate__limit.json} | 6 +- ...ullmq__worker__do__not__wait__active.json} | 6 +- ...saging__bullmq__worker__force__close.json} | 6 +- .../messaging__bullmq__worker__id.json} | 6 +- ...lmq__worker__jobs__to__extend__locks.json} | 6 +- .../messaging__bullmq__worker__name.json} | 6 +- ...ssaging__bullmq__worker__rate__limit.json} | 6 +- ...aging__bullmq__worker__stalled__jobs.json} | 6 +- .../metrics/bullmq/bullmq__job__duration.json | 7 +- .../bullmq/bullmq__jobs__completed.json | 7 +- .../metrics/bullmq/bullmq__jobs__delayed.json | 7 +- .../metrics/bullmq/bullmq__jobs__failed.json | 7 +- .../metrics/bullmq/bullmq__jobs__retried.json | 7 +- .../metrics/bullmq/bullmq__jobs__waiting.json | 7 +- .../bullmq__jobs__waiting_children.json | 7 +- model/metrics/bullmq/bullmq__queue__jobs.json | 2 +- python/src/sentry_conventions/attributes.py | 14768 ++++++++-------- 39 files changed, 9017 insertions(+), 8895 deletions(-) rename model/attributes/{bullmq/bullmq__flow__name.json => messaging/messaging__bullmq__flow__name.json} (61%) rename model/attributes/{bullmq/bullmq__job__attempt_finished_timestamp.json => messaging/messaging__bullmq__job__attempt_finished_timestamp.json} (57%) rename model/attributes/{bullmq/bullmq__job__bulk__names.json => messaging/messaging__bullmq__job__bulk__names.json} (63%) rename model/attributes/{bullmq/bullmq__job__deduplication__key.json => messaging/messaging__bullmq__job__deduplication__key.json} (57%) rename model/attributes/{bullmq/bullmq__job__finished__timestamp.json => messaging/messaging__bullmq__job__finished__timestamp.json} (63%) rename model/attributes/{bullmq/bullmq__job__ids.json => messaging/messaging__bullmq__job__ids.json} (65%) rename model/attributes/{bullmq/bullmq__job__key.json => messaging/messaging__bullmq__job__key.json} (64%) rename model/attributes/{bullmq/bullmq__job__name.json => messaging/messaging__bullmq__job__name.json} (67%) rename model/attributes/{bullmq/bullmq__job__processed__timestamp.json => messaging/messaging__bullmq__job__processed__timestamp.json} (59%) rename model/attributes/{bullmq/bullmq__job__progress.json => messaging/messaging__bullmq__job__progress.json} (62%) rename model/attributes/{bullmq/bullmq__job__scheduler__id.json => messaging/messaging__bullmq__job__scheduler__id.json} (58%) rename model/attributes/{bullmq/bullmq__job__status.json => messaging/messaging__bullmq__job__state.json} (50%) rename model/attributes/{bullmq/bullmq__job__state.json => messaging/messaging__bullmq__job__status.json} (50%) rename model/attributes/{bullmq/bullmq__job__type.json => messaging/messaging__bullmq__job__type.json} (61%) rename model/attributes/{bullmq/bullmq__queue__clean__count.json => messaging/messaging__bullmq__queue__clean__count.json} (61%) rename model/attributes/{bullmq/bullmq__queue__clean__limit.json => messaging/messaging__bullmq__queue__clean__limit.json} (57%) rename model/attributes/{bullmq/bullmq__queue__drain__delay.json => messaging/messaging__bullmq__queue__drain__delay.json} (57%) rename model/attributes/{bullmq/bullmq__queue__event__max__length.json => messaging/messaging__bullmq__queue__event__max__length.json} (58%) rename model/attributes/{bullmq/bullmq__queue__grace.json => messaging/messaging__bullmq__queue__grace.json} (62%) rename model/attributes/{bullmq/bullmq__queue__jobs__state.json => messaging/messaging__bullmq__queue__jobs__state.json} (62%) rename model/attributes/{bullmq/bullmq__queue__rate__limit.json => messaging/messaging__bullmq__queue__rate__limit.json} (59%) rename model/attributes/{bullmq/bullmq__worker__do__not__wait__active.json => messaging/messaging__bullmq__worker__do__not__wait__active.json} (57%) rename model/attributes/{bullmq/bullmq__worker__force__close.json => messaging/messaging__bullmq__worker__force__close.json} (59%) rename model/attributes/{bullmq/bullmq__worker__id.json => messaging/messaging__bullmq__worker__id.json} (61%) rename model/attributes/{bullmq/bullmq__worker__jobs__to__extend__locks.json => messaging/messaging__bullmq__worker__jobs__to__extend__locks.json} (55%) rename model/attributes/{bullmq/bullmq__worker__name.json => messaging/messaging__bullmq__worker__name.json} (60%) rename model/attributes/{bullmq/bullmq__worker__rate__limit.json => messaging/messaging__bullmq__worker__rate__limit.json} (59%) rename model/attributes/{bullmq/bullmq__worker__stalled__jobs.json => messaging/messaging__bullmq__worker__stalled__jobs.json} (58%) diff --git a/javascript/sentry-conventions/src/attributes.ts b/javascript/sentry-conventions/src/attributes.ts index 350959688..5122f329e 100644 --- a/javascript/sentry-conventions/src/attributes.ts +++ b/javascript/sentry-conventions/src/attributes.ts @@ -4076,602 +4076,6 @@ export const BROWSER_WEB_VITAL_TTFB_VALUE = 'browser.web_vital.ttfb.value'; */ export type BROWSER_WEB_VITAL_TTFB_VALUE_TYPE = number; -// Path: model/attributes/bullmq/bullmq__flow__name.json - -/** - * The name of the root job of the BullMQ flow that FlowProducer.add() adds. `bullmq.flow.name` - * - * Attribute Value Type: `string` {@link BULLMQ_FLOW_NAME_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example "build-report" - */ -export const BULLMQ_FLOW_NAME = 'bullmq.flow.name'; - -/** - * Type for {@link BULLMQ_FLOW_NAME} bullmq.flow.name - */ -export type BULLMQ_FLOW_NAME_TYPE = string; - -// Path: model/attributes/bullmq/bullmq__job__attempt_finished_timestamp.json - -/** - * The time in milliseconds since the Unix epoch when the current attempt of the BullMQ job finished. `bullmq.job.attempt_finished_timestamp` - * - * Attribute Value Type: `number` {@link BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example 1791184722406 - */ -export const BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP = 'bullmq.job.attempt_finished_timestamp'; - -/** - * Type for {@link BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP} bullmq.job.attempt_finished_timestamp - */ -export type BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP_TYPE = number; - -// Path: model/attributes/bullmq/bullmq__job__bulk__names.json - -/** - * The names of the BullMQ jobs or flows that one bulk operation adds, for example Queue.addBulk(). `bullmq.job.bulk.names` - * - * Attribute Value Type: `Array` {@link BULLMQ_JOB_BULK_NAMES_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example ["send-welcome-email","generate-report"] - */ -export const BULLMQ_JOB_BULK_NAMES = 'bullmq.job.bulk.names'; - -/** - * Type for {@link BULLMQ_JOB_BULK_NAMES} bullmq.job.bulk.names - */ -export type BULLMQ_JOB_BULK_NAMES_TYPE = Array; - -// Path: model/attributes/bullmq/bullmq__job__deduplication__key.json - -/** - * The deduplication ID that Queue.removeDeduplicationKey() removes. `bullmq.job.deduplication.key` - * - * Attribute Value Type: `string` {@link BULLMQ_JOB_DEDUPLICATION_KEY_TYPE} - * - * Apply Scrubbing: auto - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example "user-42-sync" - */ -export const BULLMQ_JOB_DEDUPLICATION_KEY = 'bullmq.job.deduplication.key'; - -/** - * Type for {@link BULLMQ_JOB_DEDUPLICATION_KEY} bullmq.job.deduplication.key - */ -export type BULLMQ_JOB_DEDUPLICATION_KEY_TYPE = string; - -// Path: model/attributes/bullmq/bullmq__job__finished__timestamp.json - -/** - * The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job. `bullmq.job.finished.timestamp` - * - * Attribute Value Type: `number` {@link BULLMQ_JOB_FINISHED_TIMESTAMP_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example 1791184722411 - */ -export const BULLMQ_JOB_FINISHED_TIMESTAMP = 'bullmq.job.finished.timestamp'; - -/** - * Type for {@link BULLMQ_JOB_FINISHED_TIMESTAMP} bullmq.job.finished.timestamp - */ -export type BULLMQ_JOB_FINISHED_TIMESTAMP_TYPE = number; - -// Path: model/attributes/bullmq/bullmq__job__ids.json - -/** - * The IDs of the BullMQ jobs that Queue.clean() removed. `bullmq.job.ids` - * - * Attribute Value Type: `Array` {@link BULLMQ_JOB_IDS_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example ["1","2","3"] - */ -export const BULLMQ_JOB_IDS = 'bullmq.job.ids'; - -/** - * Type for {@link BULLMQ_JOB_IDS} bullmq.job.ids - */ -export type BULLMQ_JOB_IDS_TYPE = Array; - -// Path: model/attributes/bullmq/bullmq__job__key.json - -/** - * The key that a BullMQ remove operation for a debounce or repeatable key gets, for example Queue.removeDebounceKey(). `bullmq.job.key` - * - * Attribute Value Type: `string` {@link BULLMQ_JOB_KEY_TYPE} - * - * Apply Scrubbing: auto - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example "user-42-sync" - */ -export const BULLMQ_JOB_KEY = 'bullmq.job.key'; - -/** - * Type for {@link BULLMQ_JOB_KEY} bullmq.job.key - */ -export type BULLMQ_JOB_KEY_TYPE = string; - -// Path: model/attributes/bullmq/bullmq__job__name.json - -/** - * The name of the BullMQ job, which the user passes to Queue.add() to identify the kind of work. `bullmq.job.name` - * - * Attribute Value Type: `string` {@link BULLMQ_JOB_NAME_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example "send-welcome-email" - * @example "generate-report" - */ -export const BULLMQ_JOB_NAME = 'bullmq.job.name'; - -/** - * Type for {@link BULLMQ_JOB_NAME} bullmq.job.name - */ -export type BULLMQ_JOB_NAME_TYPE = string; - -// Path: model/attributes/bullmq/bullmq__job__processed__timestamp.json - -/** - * The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job. `bullmq.job.processed.timestamp` - * - * Attribute Value Type: `number` {@link BULLMQ_JOB_PROCESSED_TIMESTAMP_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example 1791184722281 - */ -export const BULLMQ_JOB_PROCESSED_TIMESTAMP = 'bullmq.job.processed.timestamp'; - -/** - * Type for {@link BULLMQ_JOB_PROCESSED_TIMESTAMP} bullmq.job.processed.timestamp - */ -export type BULLMQ_JOB_PROCESSED_TIMESTAMP_TYPE = number; - -// Path: model/attributes/bullmq/bullmq__job__progress.json - -/** - * The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress(). `bullmq.job.progress` - * - * Attribute Value Type: `string` {@link BULLMQ_JOB_PROGRESS_TYPE} - * - * Apply Scrubbing: auto - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example "{\"percentage\":50}" - */ -export const BULLMQ_JOB_PROGRESS = 'bullmq.job.progress'; - -/** - * Type for {@link BULLMQ_JOB_PROGRESS} bullmq.job.progress - */ -export type BULLMQ_JOB_PROGRESS_TYPE = string; - -// Path: model/attributes/bullmq/bullmq__job__scheduler__id.json - -/** - * The ID of the BullMQ job scheduler that adds the job. `bullmq.job.scheduler.id` - * - * Attribute Value Type: `string` {@link BULLMQ_JOB_SCHEDULER_ID_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example "daily-report" - */ -export const BULLMQ_JOB_SCHEDULER_ID = 'bullmq.job.scheduler.id'; - -/** - * Type for {@link BULLMQ_JOB_SCHEDULER_ID} bullmq.job.scheduler.id - */ -export type BULLMQ_JOB_SCHEDULER_ID_TYPE = string; - -// Path: model/attributes/bullmq/bullmq__job__state.json - -/** - * The state of the BullMQ job that a job metric counts. `bullmq.job.state` - * - * Attribute Value Type: `string` {@link BULLMQ_JOB_STATE_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example "completed" - * @example "failed" - * @example "delayed" - */ -export const BULLMQ_JOB_STATE = 'bullmq.job.state'; - -/** - * Type for {@link BULLMQ_JOB_STATE} bullmq.job.state - */ -export type BULLMQ_JOB_STATE_TYPE = string; - -// Path: model/attributes/bullmq/bullmq__job__status.json - -/** - * The state of the BullMQ job that a job metric counts. `bullmq.job.status` - * - * Attribute Value Type: `string` {@link BULLMQ_JOB_STATUS_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example "completed" - * @example "failed" - * @example "delayed" - */ -export const BULLMQ_JOB_STATUS = 'bullmq.job.status'; - -/** - * Type for {@link BULLMQ_JOB_STATUS} bullmq.job.status - */ -export type BULLMQ_JOB_STATUS_TYPE = string; - -// Path: model/attributes/bullmq/bullmq__job__type.json - -/** - * The job state from which Queue.clean() removes BullMQ jobs. `bullmq.job.type` - * - * Attribute Value Type: `string` {@link BULLMQ_JOB_TYPE_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example "completed" - * @example "failed" - */ -export const BULLMQ_JOB_TYPE = 'bullmq.job.type'; - -/** - * Type for {@link BULLMQ_JOB_TYPE} bullmq.job.type - */ -export type BULLMQ_JOB_TYPE_TYPE = string; - -// Path: model/attributes/bullmq/bullmq__queue__clean__count.json - -/** - * The number of BullMQ jobs that Queue.clean() removed. `bullmq.queue.clean.count` - * - * Attribute Value Type: `number` {@link BULLMQ_QUEUE_CLEAN_COUNT_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example 25 - */ -export const BULLMQ_QUEUE_CLEAN_COUNT = 'bullmq.queue.clean.count'; - -/** - * Type for {@link BULLMQ_QUEUE_CLEAN_COUNT} bullmq.queue.clean.count - */ -export type BULLMQ_QUEUE_CLEAN_COUNT_TYPE = number; - -// Path: model/attributes/bullmq/bullmq__queue__clean__limit.json - -/** - * The maximum number of BullMQ jobs that Queue.clean() removes. `bullmq.queue.clean.limit` - * - * Attribute Value Type: `number` {@link BULLMQ_QUEUE_CLEAN_LIMIT_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example 1000 - */ -export const BULLMQ_QUEUE_CLEAN_LIMIT = 'bullmq.queue.clean.limit'; - -/** - * Type for {@link BULLMQ_QUEUE_CLEAN_LIMIT} bullmq.queue.clean.limit - */ -export type BULLMQ_QUEUE_CLEAN_LIMIT_TYPE = number; - -// Path: model/attributes/bullmq/bullmq__queue__drain__delay.json - -/** - * Whether Queue.drain() also removes the delayed BullMQ jobs. `bullmq.queue.drain.delay` - * - * Attribute Value Type: `boolean` {@link BULLMQ_QUEUE_DRAIN_DELAY_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example true - */ -export const BULLMQ_QUEUE_DRAIN_DELAY = 'bullmq.queue.drain.delay'; - -/** - * Type for {@link BULLMQ_QUEUE_DRAIN_DELAY} bullmq.queue.drain.delay - */ -export type BULLMQ_QUEUE_DRAIN_DELAY_TYPE = boolean; - -// Path: model/attributes/bullmq/bullmq__queue__event__max__length.json - -/** - * The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream. `bullmq.queue.event.max.length` - * - * Attribute Value Type: `number` {@link BULLMQ_QUEUE_EVENT_MAX_LENGTH_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example 10000 - */ -export const BULLMQ_QUEUE_EVENT_MAX_LENGTH = 'bullmq.queue.event.max.length'; - -/** - * Type for {@link BULLMQ_QUEUE_EVENT_MAX_LENGTH} bullmq.queue.event.max.length - */ -export type BULLMQ_QUEUE_EVENT_MAX_LENGTH_TYPE = number; - -// Path: model/attributes/bullmq/bullmq__queue__grace.json - -/** - * The grace period in milliseconds that Queue.clean() uses. Only BullMQ jobs that are older are removed. `bullmq.queue.grace` - * - * Attribute Value Type: `number` {@link BULLMQ_QUEUE_GRACE_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example 60000 - */ -export const BULLMQ_QUEUE_GRACE = 'bullmq.queue.grace'; - -/** - * Type for {@link BULLMQ_QUEUE_GRACE} bullmq.queue.grace - */ -export type BULLMQ_QUEUE_GRACE_TYPE = number; - -// Path: model/attributes/bullmq/bullmq__queue__jobs__state.json - -/** - * The BullMQ job state that the queue job count metric counts. `bullmq.queue.jobs.state` - * - * Attribute Value Type: `string` {@link BULLMQ_QUEUE_JOBS_STATE_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example "waiting" - * @example "active" - * @example "completed" - */ -export const BULLMQ_QUEUE_JOBS_STATE = 'bullmq.queue.jobs.state'; - -/** - * Type for {@link BULLMQ_QUEUE_JOBS_STATE} bullmq.queue.jobs.state - */ -export type BULLMQ_QUEUE_JOBS_STATE_TYPE = string; - -// Path: model/attributes/bullmq/bullmq__queue__rate__limit.json - -/** - * The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue. `bullmq.queue.rate.limit` - * - * Attribute Value Type: `number` {@link BULLMQ_QUEUE_RATE_LIMIT_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example 5000 - */ -export const BULLMQ_QUEUE_RATE_LIMIT = 'bullmq.queue.rate.limit'; - -/** - * Type for {@link BULLMQ_QUEUE_RATE_LIMIT} bullmq.queue.rate.limit - */ -export type BULLMQ_QUEUE_RATE_LIMIT_TYPE = number; - -// Path: model/attributes/bullmq/bullmq__worker__do__not__wait__active.json - -/** - * Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish. `bullmq.worker.do.not.wait.active` - * - * Attribute Value Type: `boolean` {@link BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example false - */ -export const BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE = 'bullmq.worker.do.not.wait.active'; - -/** - * Type for {@link BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE} bullmq.worker.do.not.wait.active - */ -export type BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE_TYPE = boolean; - -// Path: model/attributes/bullmq/bullmq__worker__force__close.json - -/** - * Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish. `bullmq.worker.force.close` - * - * Attribute Value Type: `boolean` {@link BULLMQ_WORKER_FORCE_CLOSE_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example false - */ -export const BULLMQ_WORKER_FORCE_CLOSE = 'bullmq.worker.force.close'; - -/** - * Type for {@link BULLMQ_WORKER_FORCE_CLOSE} bullmq.worker.force.close - */ -export type BULLMQ_WORKER_FORCE_CLOSE_TYPE = boolean; - -// Path: model/attributes/bullmq/bullmq__worker__id.json - -/** - * The ID that BullMQ generates for the Worker instance. `bullmq.worker.id` - * - * Attribute Value Type: `string` {@link BULLMQ_WORKER_ID_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example "03327d57-05cc-4528-9d24-c59bf6520039" - */ -export const BULLMQ_WORKER_ID = 'bullmq.worker.id'; - -/** - * Type for {@link BULLMQ_WORKER_ID} bullmq.worker.id - */ -export type BULLMQ_WORKER_ID_TYPE = string; - -// Path: model/attributes/bullmq/bullmq__worker__jobs__to__extend__locks.json - -/** - * The IDs of the BullMQ jobs whose locks the Worker extends. `bullmq.worker.jobs.to.extend.locks` - * - * Attribute Value Type: `Array` {@link BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example ["1","2"] - */ -export const BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS = 'bullmq.worker.jobs.to.extend.locks'; - -/** - * Type for {@link BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS} bullmq.worker.jobs.to.extend.locks - */ -export type BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS_TYPE = Array; - -// Path: model/attributes/bullmq/bullmq__worker__name.json - -/** - * The name that the user gives to the BullMQ Worker in its options. `bullmq.worker.name` - * - * Attribute Value Type: `string` {@link BULLMQ_WORKER_NAME_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example "email-worker" - */ -export const BULLMQ_WORKER_NAME = 'bullmq.worker.name'; - -/** - * Type for {@link BULLMQ_WORKER_NAME} bullmq.worker.name - */ -export type BULLMQ_WORKER_NAME_TYPE = string; - -// Path: model/attributes/bullmq/bullmq__worker__rate__limit.json - -/** - * The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker. `bullmq.worker.rate.limit` - * - * Attribute Value Type: `number` {@link BULLMQ_WORKER_RATE_LIMIT_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example 5000 - */ -export const BULLMQ_WORKER_RATE_LIMIT = 'bullmq.worker.rate.limit'; - -/** - * Type for {@link BULLMQ_WORKER_RATE_LIMIT} bullmq.worker.rate.limit - */ -export type BULLMQ_WORKER_RATE_LIMIT_TYPE = number; - -// Path: model/attributes/bullmq/bullmq__worker__stalled__jobs.json - -/** - * The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state. `bullmq.worker.stalled.jobs` - * - * Attribute Value Type: `Array` {@link BULLMQ_WORKER_STALLED_JOBS_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example ["1","2"] - */ -export const BULLMQ_WORKER_STALLED_JOBS = 'bullmq.worker.stalled.jobs'; - -/** - * Type for {@link BULLMQ_WORKER_STALLED_JOBS} bullmq.worker.stalled.jobs - */ -export type BULLMQ_WORKER_STALLED_JOBS_TYPE = Array; - // Path: model/attributes/cache/cache__hit.json /** @@ -12932,6 +12336,602 @@ export const MESSAGING_BATCH_MESSAGE_COUNT = 'messaging.batch.message_count'; */ export type MESSAGING_BATCH_MESSAGE_COUNT_TYPE = number; +// Path: model/attributes/messaging/messaging__bullmq__flow__name.json + +/** + * The name of the root job of the BullMQ flow that FlowProducer.add() adds. `messaging.bullmq.flow.name` + * + * Attribute Value Type: `string` {@link MESSAGING_BULLMQ_FLOW_NAME_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "build-report" + */ +export const MESSAGING_BULLMQ_FLOW_NAME = 'messaging.bullmq.flow.name'; + +/** + * Type for {@link MESSAGING_BULLMQ_FLOW_NAME} messaging.bullmq.flow.name + */ +export type MESSAGING_BULLMQ_FLOW_NAME_TYPE = string; + +// Path: model/attributes/messaging/messaging__bullmq__job__attempt_finished_timestamp.json + +/** + * The time in milliseconds since the Unix epoch when the current attempt of the BullMQ job finished. `messaging.bullmq.job.attempt_finished_timestamp` + * + * Attribute Value Type: `number` {@link MESSAGING_BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 1791184722406 + */ +export const MESSAGING_BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP = 'messaging.bullmq.job.attempt_finished_timestamp'; + +/** + * Type for {@link MESSAGING_BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP} messaging.bullmq.job.attempt_finished_timestamp + */ +export type MESSAGING_BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP_TYPE = number; + +// Path: model/attributes/messaging/messaging__bullmq__job__bulk__names.json + +/** + * The names of the BullMQ jobs or flows that one bulk operation adds, for example Queue.addBulk(). `messaging.bullmq.job.bulk.names` + * + * Attribute Value Type: `Array` {@link MESSAGING_BULLMQ_JOB_BULK_NAMES_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example ["send-welcome-email","generate-report"] + */ +export const MESSAGING_BULLMQ_JOB_BULK_NAMES = 'messaging.bullmq.job.bulk.names'; + +/** + * Type for {@link MESSAGING_BULLMQ_JOB_BULK_NAMES} messaging.bullmq.job.bulk.names + */ +export type MESSAGING_BULLMQ_JOB_BULK_NAMES_TYPE = Array; + +// Path: model/attributes/messaging/messaging__bullmq__job__deduplication__key.json + +/** + * The deduplication ID that Queue.removeDeduplicationKey() removes. `messaging.bullmq.job.deduplication.key` + * + * Attribute Value Type: `string` {@link MESSAGING_BULLMQ_JOB_DEDUPLICATION_KEY_TYPE} + * + * Apply Scrubbing: auto + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "user-42-sync" + */ +export const MESSAGING_BULLMQ_JOB_DEDUPLICATION_KEY = 'messaging.bullmq.job.deduplication.key'; + +/** + * Type for {@link MESSAGING_BULLMQ_JOB_DEDUPLICATION_KEY} messaging.bullmq.job.deduplication.key + */ +export type MESSAGING_BULLMQ_JOB_DEDUPLICATION_KEY_TYPE = string; + +// Path: model/attributes/messaging/messaging__bullmq__job__finished__timestamp.json + +/** + * The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job. `messaging.bullmq.job.finished.timestamp` + * + * Attribute Value Type: `number` {@link MESSAGING_BULLMQ_JOB_FINISHED_TIMESTAMP_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 1791184722411 + */ +export const MESSAGING_BULLMQ_JOB_FINISHED_TIMESTAMP = 'messaging.bullmq.job.finished.timestamp'; + +/** + * Type for {@link MESSAGING_BULLMQ_JOB_FINISHED_TIMESTAMP} messaging.bullmq.job.finished.timestamp + */ +export type MESSAGING_BULLMQ_JOB_FINISHED_TIMESTAMP_TYPE = number; + +// Path: model/attributes/messaging/messaging__bullmq__job__ids.json + +/** + * The IDs of the BullMQ jobs that Queue.clean() removed. `messaging.bullmq.job.ids` + * + * Attribute Value Type: `Array` {@link MESSAGING_BULLMQ_JOB_IDS_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example ["1","2","3"] + */ +export const MESSAGING_BULLMQ_JOB_IDS = 'messaging.bullmq.job.ids'; + +/** + * Type for {@link MESSAGING_BULLMQ_JOB_IDS} messaging.bullmq.job.ids + */ +export type MESSAGING_BULLMQ_JOB_IDS_TYPE = Array; + +// Path: model/attributes/messaging/messaging__bullmq__job__key.json + +/** + * The key that a BullMQ remove operation for a debounce or repeatable key gets, for example Queue.removeDebounceKey(). `messaging.bullmq.job.key` + * + * Attribute Value Type: `string` {@link MESSAGING_BULLMQ_JOB_KEY_TYPE} + * + * Apply Scrubbing: auto + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "user-42-sync" + */ +export const MESSAGING_BULLMQ_JOB_KEY = 'messaging.bullmq.job.key'; + +/** + * Type for {@link MESSAGING_BULLMQ_JOB_KEY} messaging.bullmq.job.key + */ +export type MESSAGING_BULLMQ_JOB_KEY_TYPE = string; + +// Path: model/attributes/messaging/messaging__bullmq__job__name.json + +/** + * The name of the BullMQ job, which the user passes to Queue.add() to identify the kind of work. `messaging.bullmq.job.name` + * + * Attribute Value Type: `string` {@link MESSAGING_BULLMQ_JOB_NAME_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "send-welcome-email" + * @example "generate-report" + */ +export const MESSAGING_BULLMQ_JOB_NAME = 'messaging.bullmq.job.name'; + +/** + * Type for {@link MESSAGING_BULLMQ_JOB_NAME} messaging.bullmq.job.name + */ +export type MESSAGING_BULLMQ_JOB_NAME_TYPE = string; + +// Path: model/attributes/messaging/messaging__bullmq__job__processed__timestamp.json + +/** + * The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job. `messaging.bullmq.job.processed.timestamp` + * + * Attribute Value Type: `number` {@link MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 1791184722281 + */ +export const MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP = 'messaging.bullmq.job.processed.timestamp'; + +/** + * Type for {@link MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP} messaging.bullmq.job.processed.timestamp + */ +export type MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP_TYPE = number; + +// Path: model/attributes/messaging/messaging__bullmq__job__progress.json + +/** + * The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress(). `messaging.bullmq.job.progress` + * + * Attribute Value Type: `string` {@link MESSAGING_BULLMQ_JOB_PROGRESS_TYPE} + * + * Apply Scrubbing: auto + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "{\"percentage\":50}" + */ +export const MESSAGING_BULLMQ_JOB_PROGRESS = 'messaging.bullmq.job.progress'; + +/** + * Type for {@link MESSAGING_BULLMQ_JOB_PROGRESS} messaging.bullmq.job.progress + */ +export type MESSAGING_BULLMQ_JOB_PROGRESS_TYPE = string; + +// Path: model/attributes/messaging/messaging__bullmq__job__scheduler__id.json + +/** + * The ID of the BullMQ job scheduler that adds the job. `messaging.bullmq.job.scheduler.id` + * + * Attribute Value Type: `string` {@link MESSAGING_BULLMQ_JOB_SCHEDULER_ID_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "daily-report" + */ +export const MESSAGING_BULLMQ_JOB_SCHEDULER_ID = 'messaging.bullmq.job.scheduler.id'; + +/** + * Type for {@link MESSAGING_BULLMQ_JOB_SCHEDULER_ID} messaging.bullmq.job.scheduler.id + */ +export type MESSAGING_BULLMQ_JOB_SCHEDULER_ID_TYPE = string; + +// Path: model/attributes/messaging/messaging__bullmq__job__state.json + +/** + * The state of the BullMQ job that a job metric counts. `messaging.bullmq.job.state` + * + * Attribute Value Type: `string` {@link MESSAGING_BULLMQ_JOB_STATE_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "completed" + * @example "failed" + * @example "delayed" + */ +export const MESSAGING_BULLMQ_JOB_STATE = 'messaging.bullmq.job.state'; + +/** + * Type for {@link MESSAGING_BULLMQ_JOB_STATE} messaging.bullmq.job.state + */ +export type MESSAGING_BULLMQ_JOB_STATE_TYPE = string; + +// Path: model/attributes/messaging/messaging__bullmq__job__status.json + +/** + * The state of the BullMQ job that a job metric counts. `messaging.bullmq.job.status` + * + * Attribute Value Type: `string` {@link MESSAGING_BULLMQ_JOB_STATUS_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "completed" + * @example "failed" + * @example "delayed" + */ +export const MESSAGING_BULLMQ_JOB_STATUS = 'messaging.bullmq.job.status'; + +/** + * Type for {@link MESSAGING_BULLMQ_JOB_STATUS} messaging.bullmq.job.status + */ +export type MESSAGING_BULLMQ_JOB_STATUS_TYPE = string; + +// Path: model/attributes/messaging/messaging__bullmq__job__type.json + +/** + * The job state from which Queue.clean() removes BullMQ jobs. `messaging.bullmq.job.type` + * + * Attribute Value Type: `string` {@link MESSAGING_BULLMQ_JOB_TYPE_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "completed" + * @example "failed" + */ +export const MESSAGING_BULLMQ_JOB_TYPE = 'messaging.bullmq.job.type'; + +/** + * Type for {@link MESSAGING_BULLMQ_JOB_TYPE} messaging.bullmq.job.type + */ +export type MESSAGING_BULLMQ_JOB_TYPE_TYPE = string; + +// Path: model/attributes/messaging/messaging__bullmq__queue__clean__count.json + +/** + * The number of BullMQ jobs that Queue.clean() removed. `messaging.bullmq.queue.clean.count` + * + * Attribute Value Type: `number` {@link MESSAGING_BULLMQ_QUEUE_CLEAN_COUNT_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 25 + */ +export const MESSAGING_BULLMQ_QUEUE_CLEAN_COUNT = 'messaging.bullmq.queue.clean.count'; + +/** + * Type for {@link MESSAGING_BULLMQ_QUEUE_CLEAN_COUNT} messaging.bullmq.queue.clean.count + */ +export type MESSAGING_BULLMQ_QUEUE_CLEAN_COUNT_TYPE = number; + +// Path: model/attributes/messaging/messaging__bullmq__queue__clean__limit.json + +/** + * The maximum number of BullMQ jobs that Queue.clean() removes. `messaging.bullmq.queue.clean.limit` + * + * Attribute Value Type: `number` {@link MESSAGING_BULLMQ_QUEUE_CLEAN_LIMIT_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 1000 + */ +export const MESSAGING_BULLMQ_QUEUE_CLEAN_LIMIT = 'messaging.bullmq.queue.clean.limit'; + +/** + * Type for {@link MESSAGING_BULLMQ_QUEUE_CLEAN_LIMIT} messaging.bullmq.queue.clean.limit + */ +export type MESSAGING_BULLMQ_QUEUE_CLEAN_LIMIT_TYPE = number; + +// Path: model/attributes/messaging/messaging__bullmq__queue__drain__delay.json + +/** + * Whether Queue.drain() also removes the delayed BullMQ jobs. `messaging.bullmq.queue.drain.delay` + * + * Attribute Value Type: `boolean` {@link MESSAGING_BULLMQ_QUEUE_DRAIN_DELAY_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example true + */ +export const MESSAGING_BULLMQ_QUEUE_DRAIN_DELAY = 'messaging.bullmq.queue.drain.delay'; + +/** + * Type for {@link MESSAGING_BULLMQ_QUEUE_DRAIN_DELAY} messaging.bullmq.queue.drain.delay + */ +export type MESSAGING_BULLMQ_QUEUE_DRAIN_DELAY_TYPE = boolean; + +// Path: model/attributes/messaging/messaging__bullmq__queue__event__max__length.json + +/** + * The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream. `messaging.bullmq.queue.event.max.length` + * + * Attribute Value Type: `number` {@link MESSAGING_BULLMQ_QUEUE_EVENT_MAX_LENGTH_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 10000 + */ +export const MESSAGING_BULLMQ_QUEUE_EVENT_MAX_LENGTH = 'messaging.bullmq.queue.event.max.length'; + +/** + * Type for {@link MESSAGING_BULLMQ_QUEUE_EVENT_MAX_LENGTH} messaging.bullmq.queue.event.max.length + */ +export type MESSAGING_BULLMQ_QUEUE_EVENT_MAX_LENGTH_TYPE = number; + +// Path: model/attributes/messaging/messaging__bullmq__queue__grace.json + +/** + * The grace period in milliseconds that Queue.clean() uses. Only BullMQ jobs that are older are removed. `messaging.bullmq.queue.grace` + * + * Attribute Value Type: `number` {@link MESSAGING_BULLMQ_QUEUE_GRACE_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 60000 + */ +export const MESSAGING_BULLMQ_QUEUE_GRACE = 'messaging.bullmq.queue.grace'; + +/** + * Type for {@link MESSAGING_BULLMQ_QUEUE_GRACE} messaging.bullmq.queue.grace + */ +export type MESSAGING_BULLMQ_QUEUE_GRACE_TYPE = number; + +// Path: model/attributes/messaging/messaging__bullmq__queue__jobs__state.json + +/** + * The BullMQ job state that the queue job count metric counts. `messaging.bullmq.queue.jobs.state` + * + * Attribute Value Type: `string` {@link MESSAGING_BULLMQ_QUEUE_JOBS_STATE_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "waiting" + * @example "active" + * @example "completed" + */ +export const MESSAGING_BULLMQ_QUEUE_JOBS_STATE = 'messaging.bullmq.queue.jobs.state'; + +/** + * Type for {@link MESSAGING_BULLMQ_QUEUE_JOBS_STATE} messaging.bullmq.queue.jobs.state + */ +export type MESSAGING_BULLMQ_QUEUE_JOBS_STATE_TYPE = string; + +// Path: model/attributes/messaging/messaging__bullmq__queue__rate__limit.json + +/** + * The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue. `messaging.bullmq.queue.rate.limit` + * + * Attribute Value Type: `number` {@link MESSAGING_BULLMQ_QUEUE_RATE_LIMIT_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 5000 + */ +export const MESSAGING_BULLMQ_QUEUE_RATE_LIMIT = 'messaging.bullmq.queue.rate.limit'; + +/** + * Type for {@link MESSAGING_BULLMQ_QUEUE_RATE_LIMIT} messaging.bullmq.queue.rate.limit + */ +export type MESSAGING_BULLMQ_QUEUE_RATE_LIMIT_TYPE = number; + +// Path: model/attributes/messaging/messaging__bullmq__worker__do__not__wait__active.json + +/** + * Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish. `messaging.bullmq.worker.do.not.wait.active` + * + * Attribute Value Type: `boolean` {@link MESSAGING_BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example false + */ +export const MESSAGING_BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE = 'messaging.bullmq.worker.do.not.wait.active'; + +/** + * Type for {@link MESSAGING_BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE} messaging.bullmq.worker.do.not.wait.active + */ +export type MESSAGING_BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE_TYPE = boolean; + +// Path: model/attributes/messaging/messaging__bullmq__worker__force__close.json + +/** + * Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish. `messaging.bullmq.worker.force.close` + * + * Attribute Value Type: `boolean` {@link MESSAGING_BULLMQ_WORKER_FORCE_CLOSE_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example false + */ +export const MESSAGING_BULLMQ_WORKER_FORCE_CLOSE = 'messaging.bullmq.worker.force.close'; + +/** + * Type for {@link MESSAGING_BULLMQ_WORKER_FORCE_CLOSE} messaging.bullmq.worker.force.close + */ +export type MESSAGING_BULLMQ_WORKER_FORCE_CLOSE_TYPE = boolean; + +// Path: model/attributes/messaging/messaging__bullmq__worker__id.json + +/** + * The ID that BullMQ generates for the Worker instance. `messaging.bullmq.worker.id` + * + * Attribute Value Type: `string` {@link MESSAGING_BULLMQ_WORKER_ID_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "03327d57-05cc-4528-9d24-c59bf6520039" + */ +export const MESSAGING_BULLMQ_WORKER_ID = 'messaging.bullmq.worker.id'; + +/** + * Type for {@link MESSAGING_BULLMQ_WORKER_ID} messaging.bullmq.worker.id + */ +export type MESSAGING_BULLMQ_WORKER_ID_TYPE = string; + +// Path: model/attributes/messaging/messaging__bullmq__worker__jobs__to__extend__locks.json + +/** + * The IDs of the BullMQ jobs whose locks the Worker extends. `messaging.bullmq.worker.jobs.to.extend.locks` + * + * Attribute Value Type: `Array` {@link MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example ["1","2"] + */ +export const MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS = 'messaging.bullmq.worker.jobs.to.extend.locks'; + +/** + * Type for {@link MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS} messaging.bullmq.worker.jobs.to.extend.locks + */ +export type MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS_TYPE = Array; + +// Path: model/attributes/messaging/messaging__bullmq__worker__name.json + +/** + * The name that the user gives to the BullMQ Worker in its options. `messaging.bullmq.worker.name` + * + * Attribute Value Type: `string` {@link MESSAGING_BULLMQ_WORKER_NAME_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example "email-worker" + */ +export const MESSAGING_BULLMQ_WORKER_NAME = 'messaging.bullmq.worker.name'; + +/** + * Type for {@link MESSAGING_BULLMQ_WORKER_NAME} messaging.bullmq.worker.name + */ +export type MESSAGING_BULLMQ_WORKER_NAME_TYPE = string; + +// Path: model/attributes/messaging/messaging__bullmq__worker__rate__limit.json + +/** + * The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker. `messaging.bullmq.worker.rate.limit` + * + * Attribute Value Type: `number` {@link MESSAGING_BULLMQ_WORKER_RATE_LIMIT_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example 5000 + */ +export const MESSAGING_BULLMQ_WORKER_RATE_LIMIT = 'messaging.bullmq.worker.rate.limit'; + +/** + * Type for {@link MESSAGING_BULLMQ_WORKER_RATE_LIMIT} messaging.bullmq.worker.rate.limit + */ +export type MESSAGING_BULLMQ_WORKER_RATE_LIMIT_TYPE = number; + +// Path: model/attributes/messaging/messaging__bullmq__worker__stalled__jobs.json + +/** + * The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state. `messaging.bullmq.worker.stalled.jobs` + * + * Attribute Value Type: `Array` {@link MESSAGING_BULLMQ_WORKER_STALLED_JOBS_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: No + * Visibility: public + * + * @example ["1","2"] + */ +export const MESSAGING_BULLMQ_WORKER_STALLED_JOBS = 'messaging.bullmq.worker.stalled.jobs'; + +/** + * Type for {@link MESSAGING_BULLMQ_WORKER_STALLED_JOBS} messaging.bullmq.worker.stalled.jobs + */ +export type MESSAGING_BULLMQ_WORKER_STALLED_JOBS_TYPE = Array; + // Path: model/attributes/messaging/messaging__conversation_id.json /** @@ -20734,34 +20734,6 @@ export const ATTRIBUTE_TYPE: Record = { 'browser.web_vital.lcp.value': 'double', 'browser.web_vital.ttfb.request_time': 'double', 'browser.web_vital.ttfb.value': 'double', - 'bullmq.flow.name': 'string', - 'bullmq.job.attempt_finished_timestamp': 'integer', - 'bullmq.job.bulk.names': 'string[]', - 'bullmq.job.deduplication.key': 'string', - 'bullmq.job.finished.timestamp': 'integer', - 'bullmq.job.ids': 'string[]', - 'bullmq.job.key': 'string', - 'bullmq.job.name': 'string', - 'bullmq.job.processed.timestamp': 'integer', - 'bullmq.job.progress': 'string', - 'bullmq.job.scheduler.id': 'string', - 'bullmq.job.state': 'string', - 'bullmq.job.status': 'string', - 'bullmq.job.type': 'string', - 'bullmq.queue.clean.count': 'integer', - 'bullmq.queue.clean.limit': 'integer', - 'bullmq.queue.drain.delay': 'boolean', - 'bullmq.queue.event.max.length': 'integer', - 'bullmq.queue.grace': 'integer', - 'bullmq.queue.jobs.state': 'string', - 'bullmq.queue.rate.limit': 'integer', - 'bullmq.worker.do.not.wait.active': 'boolean', - 'bullmq.worker.force.close': 'boolean', - 'bullmq.worker.id': 'string', - 'bullmq.worker.jobs.to.extend.locks': 'string[]', - 'bullmq.worker.name': 'string', - 'bullmq.worker.rate.limit': 'integer', - 'bullmq.worker.stalled.jobs': 'string[]', 'cache.hit': 'boolean', 'cache.item_age': 'integer', 'cache.item_size': 'integer', @@ -21132,6 +21104,34 @@ export const ATTRIBUTE_TYPE: Record = { 'mcp.transport': 'string', 'mdc.': 'string', 'messaging.batch.message_count': 'integer', + 'messaging.bullmq.flow.name': 'string', + 'messaging.bullmq.job.attempt_finished_timestamp': 'integer', + 'messaging.bullmq.job.bulk.names': 'string[]', + 'messaging.bullmq.job.deduplication.key': 'string', + 'messaging.bullmq.job.finished.timestamp': 'integer', + 'messaging.bullmq.job.ids': 'string[]', + 'messaging.bullmq.job.key': 'string', + 'messaging.bullmq.job.name': 'string', + 'messaging.bullmq.job.processed.timestamp': 'integer', + 'messaging.bullmq.job.progress': 'string', + 'messaging.bullmq.job.scheduler.id': 'string', + 'messaging.bullmq.job.state': 'string', + 'messaging.bullmq.job.status': 'string', + 'messaging.bullmq.job.type': 'string', + 'messaging.bullmq.queue.clean.count': 'integer', + 'messaging.bullmq.queue.clean.limit': 'integer', + 'messaging.bullmq.queue.drain.delay': 'boolean', + 'messaging.bullmq.queue.event.max.length': 'integer', + 'messaging.bullmq.queue.grace': 'integer', + 'messaging.bullmq.queue.jobs.state': 'string', + 'messaging.bullmq.queue.rate.limit': 'integer', + 'messaging.bullmq.worker.do.not.wait.active': 'boolean', + 'messaging.bullmq.worker.force.close': 'boolean', + 'messaging.bullmq.worker.id': 'string', + 'messaging.bullmq.worker.jobs.to.extend.locks': 'string[]', + 'messaging.bullmq.worker.name': 'string', + 'messaging.bullmq.worker.rate.limit': 'integer', + 'messaging.bullmq.worker.stalled.jobs': 'string[]', 'messaging.conversation_id': 'string', 'messaging.destination': 'string', 'messaging.destination.connection': 'string', @@ -21649,34 +21649,6 @@ export type AttributeName = | typeof BROWSER_WEB_VITAL_LCP_VALUE | typeof BROWSER_WEB_VITAL_TTFB_REQUEST_TIME | typeof BROWSER_WEB_VITAL_TTFB_VALUE - | typeof BULLMQ_FLOW_NAME - | typeof BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP - | typeof BULLMQ_JOB_BULK_NAMES - | typeof BULLMQ_JOB_DEDUPLICATION_KEY - | typeof BULLMQ_JOB_FINISHED_TIMESTAMP - | typeof BULLMQ_JOB_IDS - | typeof BULLMQ_JOB_KEY - | typeof BULLMQ_JOB_NAME - | typeof BULLMQ_JOB_PROCESSED_TIMESTAMP - | typeof BULLMQ_JOB_PROGRESS - | typeof BULLMQ_JOB_SCHEDULER_ID - | typeof BULLMQ_JOB_STATE - | typeof BULLMQ_JOB_STATUS - | typeof BULLMQ_JOB_TYPE - | typeof BULLMQ_QUEUE_CLEAN_COUNT - | typeof BULLMQ_QUEUE_CLEAN_LIMIT - | typeof BULLMQ_QUEUE_DRAIN_DELAY - | typeof BULLMQ_QUEUE_EVENT_MAX_LENGTH - | typeof BULLMQ_QUEUE_GRACE - | typeof BULLMQ_QUEUE_JOBS_STATE - | typeof BULLMQ_QUEUE_RATE_LIMIT - | typeof BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE - | typeof BULLMQ_WORKER_FORCE_CLOSE - | typeof BULLMQ_WORKER_ID - | typeof BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS - | typeof BULLMQ_WORKER_NAME - | typeof BULLMQ_WORKER_RATE_LIMIT - | typeof BULLMQ_WORKER_STALLED_JOBS | typeof CACHE_HIT | typeof CACHE_ITEM_AGE | typeof CACHE_ITEM_SIZE @@ -22047,6 +22019,34 @@ export type AttributeName = | typeof MCP_TRANSPORT | typeof MDC_KEY | typeof MESSAGING_BATCH_MESSAGE_COUNT + | typeof MESSAGING_BULLMQ_FLOW_NAME + | typeof MESSAGING_BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP + | typeof MESSAGING_BULLMQ_JOB_BULK_NAMES + | typeof MESSAGING_BULLMQ_JOB_DEDUPLICATION_KEY + | typeof MESSAGING_BULLMQ_JOB_FINISHED_TIMESTAMP + | typeof MESSAGING_BULLMQ_JOB_IDS + | typeof MESSAGING_BULLMQ_JOB_KEY + | typeof MESSAGING_BULLMQ_JOB_NAME + | typeof MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP + | typeof MESSAGING_BULLMQ_JOB_PROGRESS + | typeof MESSAGING_BULLMQ_JOB_SCHEDULER_ID + | typeof MESSAGING_BULLMQ_JOB_STATE + | typeof MESSAGING_BULLMQ_JOB_STATUS + | typeof MESSAGING_BULLMQ_JOB_TYPE + | typeof MESSAGING_BULLMQ_QUEUE_CLEAN_COUNT + | typeof MESSAGING_BULLMQ_QUEUE_CLEAN_LIMIT + | typeof MESSAGING_BULLMQ_QUEUE_DRAIN_DELAY + | typeof MESSAGING_BULLMQ_QUEUE_EVENT_MAX_LENGTH + | typeof MESSAGING_BULLMQ_QUEUE_GRACE + | typeof MESSAGING_BULLMQ_QUEUE_JOBS_STATE + | typeof MESSAGING_BULLMQ_QUEUE_RATE_LIMIT + | typeof MESSAGING_BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE + | typeof MESSAGING_BULLMQ_WORKER_FORCE_CLOSE + | typeof MESSAGING_BULLMQ_WORKER_ID + | typeof MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS + | typeof MESSAGING_BULLMQ_WORKER_NAME + | typeof MESSAGING_BULLMQ_WORKER_RATE_LIMIT + | typeof MESSAGING_BULLMQ_WORKER_STALLED_JOBS | typeof MESSAGING_CONVERSATION_ID | typeof MESSAGING_DESTINATION | typeof MESSAGING_DESTINATION_CONNECTION @@ -25295,421 +25295,6 @@ export const ATTRIBUTE_METADATA: Record = { aliases: ['ttfb'], changelog: [{ version: '0.5.0', prs: [235] }], }, - 'bullmq.flow.name': { - brief: 'The name of the root job of the BullMQ flow that FlowProducer.add() adds.', - type: 'string', - keys: ['bullmq.flow.name'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: 'build-report', - examples: ['build-report'], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.flow.name attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, - 'bullmq.job.attempt_finished_timestamp': { - brief: 'The time in milliseconds since the Unix epoch when the current attempt of the BullMQ job finished.', - type: 'integer', - keys: ['bullmq.job.attempt_finished_timestamp'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: 1791184722406, - examples: [1791184722406], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.attempt_finished_timestamp attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, - 'bullmq.job.bulk.names': { - brief: 'The names of the BullMQ jobs or flows that one bulk operation adds, for example Queue.addBulk().', - type: 'string[]', - keys: ['bullmq.job.bulk.names'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: ['send-welcome-email', 'generate-report'], - examples: [['send-welcome-email', 'generate-report']], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.bulk.names attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, - 'bullmq.job.deduplication.key': { - brief: 'The deduplication ID that Queue.removeDeduplicationKey() removes.', - type: 'string', - keys: ['bullmq.job.deduplication.key'], - applyScrubbing: { - key: 'auto', - }, - isInOtel: false, - visibility: 'public', - example: 'user-42-sync', - examples: ['user-42-sync'], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.deduplication.key attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, - 'bullmq.job.finished.timestamp': { - brief: - 'The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job.', - type: 'integer', - keys: ['bullmq.job.finished.timestamp'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: 1791184722411, - examples: [1791184722411], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.finished.timestamp attribute' }], - additionalContext: [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", - 'BullMQ 5.79.1 sets this attribute. BullMQ 6.3.11 does not.', - ], - }, - 'bullmq.job.ids': { - brief: 'The IDs of the BullMQ jobs that Queue.clean() removed.', - type: 'string[]', - keys: ['bullmq.job.ids'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: ['1', '2', '3'], - examples: [['1', '2', '3']], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.ids attribute' }], - additionalContext: [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", - 'BullMQ 5.79.1 sets this attribute. BullMQ 6.3.11 does not.', - ], - }, - 'bullmq.job.key': { - brief: - 'The key that a BullMQ remove operation for a debounce or repeatable key gets, for example Queue.removeDebounceKey().', - type: 'string', - keys: ['bullmq.job.key'], - applyScrubbing: { - key: 'auto', - }, - isInOtel: false, - visibility: 'public', - example: 'user-42-sync', - examples: ['user-42-sync'], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.key attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, - 'bullmq.job.name': { - brief: 'The name of the BullMQ job, which the user passes to Queue.add() to identify the kind of work.', - type: 'string', - keys: ['bullmq.job.name'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: 'send-welcome-email', - examples: ['send-welcome-email', 'generate-report'], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.name attribute' }], - additionalContext: [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", - 'Also set on the BullMQ job metrics.', - ], - }, - 'bullmq.job.processed.timestamp': { - brief: 'The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job.', - type: 'integer', - keys: ['bullmq.job.processed.timestamp'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: 1791184722281, - examples: [1791184722281], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.processed.timestamp attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, - 'bullmq.job.progress': { - brief: 'The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress().', - type: 'string', - keys: ['bullmq.job.progress'], - applyScrubbing: { - key: 'auto', - }, - isInOtel: false, - visibility: 'public', - example: '{"percentage":50}', - examples: ['{"percentage":50}'], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.progress attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, - 'bullmq.job.scheduler.id': { - brief: 'The ID of the BullMQ job scheduler that adds the job.', - type: 'string', - keys: ['bullmq.job.scheduler.id'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: 'daily-report', - examples: ['daily-report'], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.scheduler.id attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, - 'bullmq.job.state': { - brief: 'The state of the BullMQ job that a job metric counts.', - type: 'string', - keys: ['bullmq.job.state'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: 'completed', - examples: ['completed', 'failed', 'delayed'], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.state attribute' }], - additionalContext: [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", - 'Set on the BullMQ job metrics by BullMQ 6.3.11. BullMQ 5.79.1 sets `bullmq.job.status` instead.', - ], - }, - 'bullmq.job.status': { - brief: 'The state of the BullMQ job that a job metric counts.', - type: 'string', - keys: ['bullmq.job.status'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: 'completed', - examples: ['completed', 'failed', 'delayed'], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.status attribute' }], - additionalContext: [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", - 'Set on the BullMQ job metrics by BullMQ 5.79.1. BullMQ 6.3.11 sets `bullmq.job.state` instead.', - ], - }, - 'bullmq.job.type': { - brief: 'The job state from which Queue.clean() removes BullMQ jobs.', - type: 'string', - keys: ['bullmq.job.type'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: 'completed', - examples: ['completed', 'failed'], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.job.type attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, - 'bullmq.queue.clean.count': { - brief: 'The number of BullMQ jobs that Queue.clean() removed.', - type: 'integer', - keys: ['bullmq.queue.clean.count'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: 25, - examples: [25], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.queue.clean.count attribute' }], - additionalContext: [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", - 'BullMQ 6.3.11 sets this attribute. BullMQ 5.79.1 does not.', - ], - }, - 'bullmq.queue.clean.limit': { - brief: 'The maximum number of BullMQ jobs that Queue.clean() removes.', - type: 'integer', - keys: ['bullmq.queue.clean.limit'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: 1000, - examples: [1000], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.queue.clean.limit attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, - 'bullmq.queue.drain.delay': { - brief: 'Whether Queue.drain() also removes the delayed BullMQ jobs.', - type: 'boolean', - keys: ['bullmq.queue.drain.delay'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: true, - examples: [true], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.queue.drain.delay attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, - 'bullmq.queue.event.max.length': { - brief: 'The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream.', - type: 'integer', - keys: ['bullmq.queue.event.max.length'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: 10000, - examples: [10000], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.queue.event.max.length attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, - 'bullmq.queue.grace': { - brief: 'The grace period in milliseconds that Queue.clean() uses. Only BullMQ jobs that are older are removed.', - type: 'integer', - keys: ['bullmq.queue.grace'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: 60000, - examples: [60000], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.queue.grace attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, - 'bullmq.queue.jobs.state': { - brief: 'The BullMQ job state that the queue job count metric counts.', - type: 'string', - keys: ['bullmq.queue.jobs.state'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: 'waiting', - examples: ['waiting', 'active', 'completed'], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.queue.jobs.state attribute' }], - additionalContext: [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", - 'Set on the BullMQ queue job count metric.', - ], - }, - 'bullmq.queue.rate.limit': { - brief: 'The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue.', - type: 'integer', - keys: ['bullmq.queue.rate.limit'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: 5000, - examples: [5000], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.queue.rate.limit attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, - 'bullmq.worker.do.not.wait.active': { - brief: 'Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish.', - type: 'boolean', - keys: ['bullmq.worker.do.not.wait.active'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: false, - examples: [false], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.worker.do.not.wait.active attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, - 'bullmq.worker.force.close': { - brief: 'Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish.', - type: 'boolean', - keys: ['bullmq.worker.force.close'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: false, - examples: [false], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.worker.force.close attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, - 'bullmq.worker.id': { - brief: 'The ID that BullMQ generates for the Worker instance.', - type: 'string', - keys: ['bullmq.worker.id'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: '03327d57-05cc-4528-9d24-c59bf6520039', - examples: ['03327d57-05cc-4528-9d24-c59bf6520039'], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.worker.id attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, - 'bullmq.worker.jobs.to.extend.locks': { - brief: 'The IDs of the BullMQ jobs whose locks the Worker extends.', - type: 'string[]', - keys: ['bullmq.worker.jobs.to.extend.locks'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: ['1', '2'], - examples: [['1', '2']], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.worker.jobs.to.extend.locks attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, - 'bullmq.worker.name': { - brief: 'The name that the user gives to the BullMQ Worker in its options.', - type: 'string', - keys: ['bullmq.worker.name'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: 'email-worker', - examples: ['email-worker'], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.worker.name attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, - 'bullmq.worker.rate.limit': { - brief: 'The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker.', - type: 'integer', - keys: ['bullmq.worker.rate.limit'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: 5000, - examples: [5000], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.worker.rate.limit attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, - 'bullmq.worker.stalled.jobs': { - brief: 'The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state.', - type: 'string[]', - keys: ['bullmq.worker.stalled.jobs'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: ['1', '2'], - examples: [['1', '2']], - changelog: [{ version: 'next', prs: [690], description: 'Added bullmq.worker.stalled.jobs attribute' }], - additionalContext: ["Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry."], - }, 'cache.hit': { brief: 'If the cache was hit during this span.', type: 'boolean', @@ -31791,6 +31376,475 @@ export const ATTRIBUTE_METADATA: Record = { example: 10, changelog: [{ version: '0.6.0', prs: [341], description: 'Added messaging.batch.message_count attribute' }], }, + 'messaging.bullmq.flow.name': { + brief: 'The name of the root job of the BullMQ flow that FlowProducer.add() adds.', + type: 'string', + keys: ['messaging.bullmq.flow.name'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 'build-report', + examples: ['build-report'], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.flow.name attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.flow.name` attribute of BullMQ's telemetry interface.", + ], + }, + 'messaging.bullmq.job.attempt_finished_timestamp': { + brief: 'The time in milliseconds since the Unix epoch when the current attempt of the BullMQ job finished.', + type: 'integer', + keys: ['messaging.bullmq.job.attempt_finished_timestamp'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 1791184722406, + examples: [1791184722406], + changelog: [ + { version: 'next', prs: [690], description: 'Added messaging.bullmq.job.attempt_finished_timestamp attribute' }, + ], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.job.attempt_finished_timestamp` attribute of BullMQ's telemetry interface.", + ], + }, + 'messaging.bullmq.job.bulk.names': { + brief: 'The names of the BullMQ jobs or flows that one bulk operation adds, for example Queue.addBulk().', + type: 'string[]', + keys: ['messaging.bullmq.job.bulk.names'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: ['send-welcome-email', 'generate-report'], + examples: [['send-welcome-email', 'generate-report']], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.job.bulk.names attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.job.bulk.names` attribute of BullMQ's telemetry interface.", + ], + }, + 'messaging.bullmq.job.deduplication.key': { + brief: 'The deduplication ID that Queue.removeDeduplicationKey() removes.', + type: 'string', + keys: ['messaging.bullmq.job.deduplication.key'], + applyScrubbing: { + key: 'auto', + }, + isInOtel: false, + visibility: 'public', + example: 'user-42-sync', + examples: ['user-42-sync'], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.job.deduplication.key attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.job.deduplication.key` attribute of BullMQ's telemetry interface.", + ], + }, + 'messaging.bullmq.job.finished.timestamp': { + brief: + 'The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job.', + type: 'integer', + keys: ['messaging.bullmq.job.finished.timestamp'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 1791184722411, + examples: [1791184722411], + changelog: [ + { version: 'next', prs: [690], description: 'Added messaging.bullmq.job.finished.timestamp attribute' }, + ], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.job.finished.timestamp` attribute of BullMQ's telemetry interface.", + 'BullMQ 5.79.1 sets this attribute. BullMQ 6.3.11 does not.', + ], + }, + 'messaging.bullmq.job.ids': { + brief: 'The IDs of the BullMQ jobs that Queue.clean() removed.', + type: 'string[]', + keys: ['messaging.bullmq.job.ids'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: ['1', '2', '3'], + examples: [['1', '2', '3']], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.job.ids attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.job.ids` attribute of BullMQ's telemetry interface.", + 'BullMQ 5.79.1 sets this attribute. BullMQ 6.3.11 does not.', + ], + }, + 'messaging.bullmq.job.key': { + brief: + 'The key that a BullMQ remove operation for a debounce or repeatable key gets, for example Queue.removeDebounceKey().', + type: 'string', + keys: ['messaging.bullmq.job.key'], + applyScrubbing: { + key: 'auto', + }, + isInOtel: false, + visibility: 'public', + example: 'user-42-sync', + examples: ['user-42-sync'], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.job.key attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.job.key` attribute of BullMQ's telemetry interface.", + ], + }, + 'messaging.bullmq.job.name': { + brief: 'The name of the BullMQ job, which the user passes to Queue.add() to identify the kind of work.', + type: 'string', + keys: ['messaging.bullmq.job.name'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 'send-welcome-email', + examples: ['send-welcome-email', 'generate-report'], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.job.name attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.job.name` attribute of BullMQ's telemetry interface.", + 'Also set on the BullMQ job metrics.', + ], + }, + 'messaging.bullmq.job.processed.timestamp': { + brief: 'The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job.', + type: 'integer', + keys: ['messaging.bullmq.job.processed.timestamp'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 1791184722281, + examples: [1791184722281], + changelog: [ + { version: 'next', prs: [690], description: 'Added messaging.bullmq.job.processed.timestamp attribute' }, + ], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.job.processed.timestamp` attribute of BullMQ's telemetry interface.", + ], + }, + 'messaging.bullmq.job.progress': { + brief: 'The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress().', + type: 'string', + keys: ['messaging.bullmq.job.progress'], + applyScrubbing: { + key: 'auto', + }, + isInOtel: false, + visibility: 'public', + example: '{"percentage":50}', + examples: ['{"percentage":50}'], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.job.progress attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.job.progress` attribute of BullMQ's telemetry interface.", + ], + }, + 'messaging.bullmq.job.scheduler.id': { + brief: 'The ID of the BullMQ job scheduler that adds the job.', + type: 'string', + keys: ['messaging.bullmq.job.scheduler.id'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 'daily-report', + examples: ['daily-report'], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.job.scheduler.id attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.job.scheduler.id` attribute of BullMQ's telemetry interface.", + ], + }, + 'messaging.bullmq.job.state': { + brief: 'The state of the BullMQ job that a job metric counts.', + type: 'string', + keys: ['messaging.bullmq.job.state'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 'completed', + examples: ['completed', 'failed', 'delayed'], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.job.state attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.job.state` attribute of BullMQ's telemetry interface.", + 'Set on the BullMQ job metrics with BullMQ 6.3.11. With BullMQ 5.79.1, `messaging.bullmq.job.status` is set instead.', + ], + }, + 'messaging.bullmq.job.status': { + brief: 'The state of the BullMQ job that a job metric counts.', + type: 'string', + keys: ['messaging.bullmq.job.status'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 'completed', + examples: ['completed', 'failed', 'delayed'], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.job.status attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.job.status` attribute of BullMQ's telemetry interface.", + 'Set on the BullMQ job metrics with BullMQ 5.79.1. With BullMQ 6.3.11, `messaging.bullmq.job.state` is set instead.', + ], + }, + 'messaging.bullmq.job.type': { + brief: 'The job state from which Queue.clean() removes BullMQ jobs.', + type: 'string', + keys: ['messaging.bullmq.job.type'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 'completed', + examples: ['completed', 'failed'], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.job.type attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.job.type` attribute of BullMQ's telemetry interface.", + ], + }, + 'messaging.bullmq.queue.clean.count': { + brief: 'The number of BullMQ jobs that Queue.clean() removed.', + type: 'integer', + keys: ['messaging.bullmq.queue.clean.count'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 25, + examples: [25], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.queue.clean.count attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.queue.clean.count` attribute of BullMQ's telemetry interface.", + 'BullMQ 6.3.11 sets this attribute. BullMQ 5.79.1 does not.', + ], + }, + 'messaging.bullmq.queue.clean.limit': { + brief: 'The maximum number of BullMQ jobs that Queue.clean() removes.', + type: 'integer', + keys: ['messaging.bullmq.queue.clean.limit'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 1000, + examples: [1000], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.queue.clean.limit attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.queue.clean.limit` attribute of BullMQ's telemetry interface.", + ], + }, + 'messaging.bullmq.queue.drain.delay': { + brief: 'Whether Queue.drain() also removes the delayed BullMQ jobs.', + type: 'boolean', + keys: ['messaging.bullmq.queue.drain.delay'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: true, + examples: [true], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.queue.drain.delay attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.queue.drain.delay` attribute of BullMQ's telemetry interface.", + ], + }, + 'messaging.bullmq.queue.event.max.length': { + brief: 'The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream.', + type: 'integer', + keys: ['messaging.bullmq.queue.event.max.length'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 10000, + examples: [10000], + changelog: [ + { version: 'next', prs: [690], description: 'Added messaging.bullmq.queue.event.max.length attribute' }, + ], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.queue.event.max.length` attribute of BullMQ's telemetry interface.", + ], + }, + 'messaging.bullmq.queue.grace': { + brief: 'The grace period in milliseconds that Queue.clean() uses. Only BullMQ jobs that are older are removed.', + type: 'integer', + keys: ['messaging.bullmq.queue.grace'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 60000, + examples: [60000], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.queue.grace attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.queue.grace` attribute of BullMQ's telemetry interface.", + ], + }, + 'messaging.bullmq.queue.jobs.state': { + brief: 'The BullMQ job state that the queue job count metric counts.', + type: 'string', + keys: ['messaging.bullmq.queue.jobs.state'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 'waiting', + examples: ['waiting', 'active', 'completed'], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.queue.jobs.state attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.queue.jobs.state` attribute of BullMQ's telemetry interface.", + 'Set on the BullMQ queue job count metric.', + ], + }, + 'messaging.bullmq.queue.rate.limit': { + brief: 'The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue.', + type: 'integer', + keys: ['messaging.bullmq.queue.rate.limit'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 5000, + examples: [5000], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.queue.rate.limit attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.queue.rate.limit` attribute of BullMQ's telemetry interface.", + ], + }, + 'messaging.bullmq.worker.do.not.wait.active': { + brief: 'Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish.', + type: 'boolean', + keys: ['messaging.bullmq.worker.do.not.wait.active'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: false, + examples: [false], + changelog: [ + { version: 'next', prs: [690], description: 'Added messaging.bullmq.worker.do.not.wait.active attribute' }, + ], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.worker.do.not.wait.active` attribute of BullMQ's telemetry interface.", + ], + }, + 'messaging.bullmq.worker.force.close': { + brief: 'Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish.', + type: 'boolean', + keys: ['messaging.bullmq.worker.force.close'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: false, + examples: [false], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.worker.force.close attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.worker.force.close` attribute of BullMQ's telemetry interface.", + ], + }, + 'messaging.bullmq.worker.id': { + brief: 'The ID that BullMQ generates for the Worker instance.', + type: 'string', + keys: ['messaging.bullmq.worker.id'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: '03327d57-05cc-4528-9d24-c59bf6520039', + examples: ['03327d57-05cc-4528-9d24-c59bf6520039'], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.worker.id attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.worker.id` attribute of BullMQ's telemetry interface.", + ], + }, + 'messaging.bullmq.worker.jobs.to.extend.locks': { + brief: 'The IDs of the BullMQ jobs whose locks the Worker extends.', + type: 'string[]', + keys: ['messaging.bullmq.worker.jobs.to.extend.locks'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: ['1', '2'], + examples: [['1', '2']], + changelog: [ + { version: 'next', prs: [690], description: 'Added messaging.bullmq.worker.jobs.to.extend.locks attribute' }, + ], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.worker.jobs.to.extend.locks` attribute of BullMQ's telemetry interface.", + ], + }, + 'messaging.bullmq.worker.name': { + brief: 'The name that the user gives to the BullMQ Worker in its options.', + type: 'string', + keys: ['messaging.bullmq.worker.name'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 'email-worker', + examples: ['email-worker'], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.worker.name attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.worker.name` attribute of BullMQ's telemetry interface.", + ], + }, + 'messaging.bullmq.worker.rate.limit': { + brief: 'The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker.', + type: 'integer', + keys: ['messaging.bullmq.worker.rate.limit'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: 5000, + examples: [5000], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.worker.rate.limit attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.worker.rate.limit` attribute of BullMQ's telemetry interface.", + ], + }, + 'messaging.bullmq.worker.stalled.jobs': { + brief: 'The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state.', + type: 'string[]', + keys: ['messaging.bullmq.worker.stalled.jobs'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: false, + visibility: 'public', + example: ['1', '2'], + examples: [['1', '2']], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.worker.stalled.jobs attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute from the `bullmq.worker.stalled.jobs` attribute of BullMQ's telemetry interface.", + ], + }, 'messaging.conversation_id': { brief: 'The conversation ID identifying the conversation to which the message belongs, represented as a string. Sometimes called "Correlation ID".', @@ -37367,34 +37421,6 @@ export type Attributes = { [BROWSER_WEB_VITAL_LCP_VALUE]?: BROWSER_WEB_VITAL_LCP_VALUE_TYPE; [BROWSER_WEB_VITAL_TTFB_REQUEST_TIME]?: BROWSER_WEB_VITAL_TTFB_REQUEST_TIME_TYPE; [BROWSER_WEB_VITAL_TTFB_VALUE]?: BROWSER_WEB_VITAL_TTFB_VALUE_TYPE; - [BULLMQ_FLOW_NAME]?: BULLMQ_FLOW_NAME_TYPE; - [BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP]?: BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP_TYPE; - [BULLMQ_JOB_BULK_NAMES]?: BULLMQ_JOB_BULK_NAMES_TYPE; - [BULLMQ_JOB_DEDUPLICATION_KEY]?: BULLMQ_JOB_DEDUPLICATION_KEY_TYPE; - [BULLMQ_JOB_FINISHED_TIMESTAMP]?: BULLMQ_JOB_FINISHED_TIMESTAMP_TYPE; - [BULLMQ_JOB_IDS]?: BULLMQ_JOB_IDS_TYPE; - [BULLMQ_JOB_KEY]?: BULLMQ_JOB_KEY_TYPE; - [BULLMQ_JOB_NAME]?: BULLMQ_JOB_NAME_TYPE; - [BULLMQ_JOB_PROCESSED_TIMESTAMP]?: BULLMQ_JOB_PROCESSED_TIMESTAMP_TYPE; - [BULLMQ_JOB_PROGRESS]?: BULLMQ_JOB_PROGRESS_TYPE; - [BULLMQ_JOB_SCHEDULER_ID]?: BULLMQ_JOB_SCHEDULER_ID_TYPE; - [BULLMQ_JOB_STATE]?: BULLMQ_JOB_STATE_TYPE; - [BULLMQ_JOB_STATUS]?: BULLMQ_JOB_STATUS_TYPE; - [BULLMQ_JOB_TYPE]?: BULLMQ_JOB_TYPE_TYPE; - [BULLMQ_QUEUE_CLEAN_COUNT]?: BULLMQ_QUEUE_CLEAN_COUNT_TYPE; - [BULLMQ_QUEUE_CLEAN_LIMIT]?: BULLMQ_QUEUE_CLEAN_LIMIT_TYPE; - [BULLMQ_QUEUE_DRAIN_DELAY]?: BULLMQ_QUEUE_DRAIN_DELAY_TYPE; - [BULLMQ_QUEUE_EVENT_MAX_LENGTH]?: BULLMQ_QUEUE_EVENT_MAX_LENGTH_TYPE; - [BULLMQ_QUEUE_GRACE]?: BULLMQ_QUEUE_GRACE_TYPE; - [BULLMQ_QUEUE_JOBS_STATE]?: BULLMQ_QUEUE_JOBS_STATE_TYPE; - [BULLMQ_QUEUE_RATE_LIMIT]?: BULLMQ_QUEUE_RATE_LIMIT_TYPE; - [BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE]?: BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE_TYPE; - [BULLMQ_WORKER_FORCE_CLOSE]?: BULLMQ_WORKER_FORCE_CLOSE_TYPE; - [BULLMQ_WORKER_ID]?: BULLMQ_WORKER_ID_TYPE; - [BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS]?: BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS_TYPE; - [BULLMQ_WORKER_NAME]?: BULLMQ_WORKER_NAME_TYPE; - [BULLMQ_WORKER_RATE_LIMIT]?: BULLMQ_WORKER_RATE_LIMIT_TYPE; - [BULLMQ_WORKER_STALLED_JOBS]?: BULLMQ_WORKER_STALLED_JOBS_TYPE; [CACHE_HIT]?: CACHE_HIT_TYPE; [CACHE_ITEM_AGE]?: CACHE_ITEM_AGE_TYPE; [CACHE_ITEM_SIZE]?: CACHE_ITEM_SIZE_TYPE; @@ -37765,6 +37791,34 @@ export type Attributes = { [MCP_TRANSPORT]?: MCP_TRANSPORT_TYPE; [MDC_KEY]?: MDC_KEY_TYPE; [MESSAGING_BATCH_MESSAGE_COUNT]?: MESSAGING_BATCH_MESSAGE_COUNT_TYPE; + [MESSAGING_BULLMQ_FLOW_NAME]?: MESSAGING_BULLMQ_FLOW_NAME_TYPE; + [MESSAGING_BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP]?: MESSAGING_BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP_TYPE; + [MESSAGING_BULLMQ_JOB_BULK_NAMES]?: MESSAGING_BULLMQ_JOB_BULK_NAMES_TYPE; + [MESSAGING_BULLMQ_JOB_DEDUPLICATION_KEY]?: MESSAGING_BULLMQ_JOB_DEDUPLICATION_KEY_TYPE; + [MESSAGING_BULLMQ_JOB_FINISHED_TIMESTAMP]?: MESSAGING_BULLMQ_JOB_FINISHED_TIMESTAMP_TYPE; + [MESSAGING_BULLMQ_JOB_IDS]?: MESSAGING_BULLMQ_JOB_IDS_TYPE; + [MESSAGING_BULLMQ_JOB_KEY]?: MESSAGING_BULLMQ_JOB_KEY_TYPE; + [MESSAGING_BULLMQ_JOB_NAME]?: MESSAGING_BULLMQ_JOB_NAME_TYPE; + [MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP]?: MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP_TYPE; + [MESSAGING_BULLMQ_JOB_PROGRESS]?: MESSAGING_BULLMQ_JOB_PROGRESS_TYPE; + [MESSAGING_BULLMQ_JOB_SCHEDULER_ID]?: MESSAGING_BULLMQ_JOB_SCHEDULER_ID_TYPE; + [MESSAGING_BULLMQ_JOB_STATE]?: MESSAGING_BULLMQ_JOB_STATE_TYPE; + [MESSAGING_BULLMQ_JOB_STATUS]?: MESSAGING_BULLMQ_JOB_STATUS_TYPE; + [MESSAGING_BULLMQ_JOB_TYPE]?: MESSAGING_BULLMQ_JOB_TYPE_TYPE; + [MESSAGING_BULLMQ_QUEUE_CLEAN_COUNT]?: MESSAGING_BULLMQ_QUEUE_CLEAN_COUNT_TYPE; + [MESSAGING_BULLMQ_QUEUE_CLEAN_LIMIT]?: MESSAGING_BULLMQ_QUEUE_CLEAN_LIMIT_TYPE; + [MESSAGING_BULLMQ_QUEUE_DRAIN_DELAY]?: MESSAGING_BULLMQ_QUEUE_DRAIN_DELAY_TYPE; + [MESSAGING_BULLMQ_QUEUE_EVENT_MAX_LENGTH]?: MESSAGING_BULLMQ_QUEUE_EVENT_MAX_LENGTH_TYPE; + [MESSAGING_BULLMQ_QUEUE_GRACE]?: MESSAGING_BULLMQ_QUEUE_GRACE_TYPE; + [MESSAGING_BULLMQ_QUEUE_JOBS_STATE]?: MESSAGING_BULLMQ_QUEUE_JOBS_STATE_TYPE; + [MESSAGING_BULLMQ_QUEUE_RATE_LIMIT]?: MESSAGING_BULLMQ_QUEUE_RATE_LIMIT_TYPE; + [MESSAGING_BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE]?: MESSAGING_BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE_TYPE; + [MESSAGING_BULLMQ_WORKER_FORCE_CLOSE]?: MESSAGING_BULLMQ_WORKER_FORCE_CLOSE_TYPE; + [MESSAGING_BULLMQ_WORKER_ID]?: MESSAGING_BULLMQ_WORKER_ID_TYPE; + [MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS]?: MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS_TYPE; + [MESSAGING_BULLMQ_WORKER_NAME]?: MESSAGING_BULLMQ_WORKER_NAME_TYPE; + [MESSAGING_BULLMQ_WORKER_RATE_LIMIT]?: MESSAGING_BULLMQ_WORKER_RATE_LIMIT_TYPE; + [MESSAGING_BULLMQ_WORKER_STALLED_JOBS]?: MESSAGING_BULLMQ_WORKER_STALLED_JOBS_TYPE; [MESSAGING_CONVERSATION_ID]?: MESSAGING_CONVERSATION_ID_TYPE; [MESSAGING_DESTINATION]?: MESSAGING_DESTINATION_TYPE; [MESSAGING_DESTINATION_CONNECTION]?: MESSAGING_DESTINATION_CONNECTION_TYPE; diff --git a/javascript/sentry-conventions/src/search.ts b/javascript/sentry-conventions/src/search.ts index 862a3d678..a9fd26aba 100644 --- a/javascript/sentry-conventions/src/search.ts +++ b/javascript/sentry-conventions/src/search.ts @@ -1073,146 +1073,6 @@ export const SEARCH_BROWSER__WEB_VITAL__TTFB__REQUEST_TIME = 'browser.web_vital. */ export const SEARCH_BROWSER__WEB_VITAL__TTFB__VALUE = 'browser.web_vital.ttfb.value'; -/** - * Search name for {@link attributes.BULLMQ_FLOW_NAME}. `bullmq.flow.name` - */ -export const SEARCH_BULLMQ__FLOW__NAME = 'bullmq.flow.name'; - -/** - * Search name for {@link attributes.BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP}. `bullmq.job.attempt_finished_timestamp` - */ -export const SEARCH_BULLMQ__JOB__ATTEMPT_FINISHED_TIMESTAMP = 'bullmq.job.attempt_finished_timestamp'; - -/** - * Search name for {@link attributes.BULLMQ_JOB_BULK_NAMES}. `bullmq.job.bulk.names` - */ -export const SEARCH_BULLMQ__JOB__BULK__NAMES = 'bullmq.job.bulk.names'; - -/** - * Search name for {@link attributes.BULLMQ_JOB_DEDUPLICATION_KEY}. `bullmq.job.deduplication.key` - */ -export const SEARCH_BULLMQ__JOB__DEDUPLICATION__KEY = 'bullmq.job.deduplication.key'; - -/** - * Search name for {@link attributes.BULLMQ_JOB_FINISHED_TIMESTAMP}. `bullmq.job.finished.timestamp` - */ -export const SEARCH_BULLMQ__JOB__FINISHED__TIMESTAMP = 'bullmq.job.finished.timestamp'; - -/** - * Search name for {@link attributes.BULLMQ_JOB_IDS}. `bullmq.job.ids` - */ -export const SEARCH_BULLMQ__JOB__IDS = 'bullmq.job.ids'; - -/** - * Search name for {@link attributes.BULLMQ_JOB_KEY}. `bullmq.job.key` - */ -export const SEARCH_BULLMQ__JOB__KEY = 'bullmq.job.key'; - -/** - * Search name for {@link attributes.BULLMQ_JOB_NAME}. `bullmq.job.name` - */ -export const SEARCH_BULLMQ__JOB__NAME = 'bullmq.job.name'; - -/** - * Search name for {@link attributes.BULLMQ_JOB_PROCESSED_TIMESTAMP}. `bullmq.job.processed.timestamp` - */ -export const SEARCH_BULLMQ__JOB__PROCESSED__TIMESTAMP = 'bullmq.job.processed.timestamp'; - -/** - * Search name for {@link attributes.BULLMQ_JOB_PROGRESS}. `bullmq.job.progress` - */ -export const SEARCH_BULLMQ__JOB__PROGRESS = 'bullmq.job.progress'; - -/** - * Search name for {@link attributes.BULLMQ_JOB_SCHEDULER_ID}. `bullmq.job.scheduler.id` - */ -export const SEARCH_BULLMQ__JOB__SCHEDULER__ID = 'bullmq.job.scheduler.id'; - -/** - * Search name for {@link attributes.BULLMQ_JOB_STATE}. `bullmq.job.state` - */ -export const SEARCH_BULLMQ__JOB__STATE = 'bullmq.job.state'; - -/** - * Search name for {@link attributes.BULLMQ_JOB_STATUS}. `bullmq.job.status` - */ -export const SEARCH_BULLMQ__JOB__STATUS = 'bullmq.job.status'; - -/** - * Search name for {@link attributes.BULLMQ_JOB_TYPE}. `bullmq.job.type` - */ -export const SEARCH_BULLMQ__JOB__TYPE = 'bullmq.job.type'; - -/** - * Search name for {@link attributes.BULLMQ_QUEUE_CLEAN_COUNT}. `bullmq.queue.clean.count` - */ -export const SEARCH_BULLMQ__QUEUE__CLEAN__COUNT = 'bullmq.queue.clean.count'; - -/** - * Search name for {@link attributes.BULLMQ_QUEUE_CLEAN_LIMIT}. `bullmq.queue.clean.limit` - */ -export const SEARCH_BULLMQ__QUEUE__CLEAN__LIMIT = 'bullmq.queue.clean.limit'; - -/** - * Search name for {@link attributes.BULLMQ_QUEUE_DRAIN_DELAY}. `bullmq.queue.drain.delay` - */ -export const SEARCH_BULLMQ__QUEUE__DRAIN__DELAY = 'bullmq.queue.drain.delay'; - -/** - * Search name for {@link attributes.BULLMQ_QUEUE_EVENT_MAX_LENGTH}. `bullmq.queue.event.max.length` - */ -export const SEARCH_BULLMQ__QUEUE__EVENT__MAX__LENGTH = 'bullmq.queue.event.max.length'; - -/** - * Search name for {@link attributes.BULLMQ_QUEUE_GRACE}. `bullmq.queue.grace` - */ -export const SEARCH_BULLMQ__QUEUE__GRACE = 'bullmq.queue.grace'; - -/** - * Search name for {@link attributes.BULLMQ_QUEUE_JOBS_STATE}. `bullmq.queue.jobs.state` - */ -export const SEARCH_BULLMQ__QUEUE__JOBS__STATE = 'bullmq.queue.jobs.state'; - -/** - * Search name for {@link attributes.BULLMQ_QUEUE_RATE_LIMIT}. `bullmq.queue.rate.limit` - */ -export const SEARCH_BULLMQ__QUEUE__RATE__LIMIT = 'bullmq.queue.rate.limit'; - -/** - * Search name for {@link attributes.BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE}. `bullmq.worker.do.not.wait.active` - */ -export const SEARCH_BULLMQ__WORKER__DO__NOT__WAIT__ACTIVE = 'bullmq.worker.do.not.wait.active'; - -/** - * Search name for {@link attributes.BULLMQ_WORKER_FORCE_CLOSE}. `bullmq.worker.force.close` - */ -export const SEARCH_BULLMQ__WORKER__FORCE__CLOSE = 'bullmq.worker.force.close'; - -/** - * Search name for {@link attributes.BULLMQ_WORKER_ID}. `bullmq.worker.id` - */ -export const SEARCH_BULLMQ__WORKER__ID = 'bullmq.worker.id'; - -/** - * Search name for {@link attributes.BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS}. `bullmq.worker.jobs.to.extend.locks` - */ -export const SEARCH_BULLMQ__WORKER__JOBS__TO__EXTEND__LOCKS = 'bullmq.worker.jobs.to.extend.locks'; - -/** - * Search name for {@link attributes.BULLMQ_WORKER_NAME}. `bullmq.worker.name` - */ -export const SEARCH_BULLMQ__WORKER__NAME = 'bullmq.worker.name'; - -/** - * Search name for {@link attributes.BULLMQ_WORKER_RATE_LIMIT}. `bullmq.worker.rate.limit` - */ -export const SEARCH_BULLMQ__WORKER__RATE__LIMIT = 'bullmq.worker.rate.limit'; - -/** - * Search name for {@link attributes.BULLMQ_WORKER_STALLED_JOBS}. `bullmq.worker.stalled.jobs` - */ -export const SEARCH_BULLMQ__WORKER__STALLED__JOBS = 'bullmq.worker.stalled.jobs'; - /** * Search name for {@link attributes.CACHE_HIT}. `cache.hit` */ @@ -3261,6 +3121,147 @@ export const SEARCH_MDC__KEY = 'mdc.'; */ export const SEARCH_MESSAGING__BATCH__MESSAGE_COUNT = 'messaging.batch.message_count'; +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_FLOW_NAME}. `messaging.bullmq.flow.name` + */ +export const SEARCH_MESSAGING__BULLMQ__FLOW__NAME = 'messaging.bullmq.flow.name'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP}. `messaging.bullmq.job.attempt_finished_timestamp` + */ +export const SEARCH_MESSAGING__BULLMQ__JOB__ATTEMPT_FINISHED_TIMESTAMP = + 'messaging.bullmq.job.attempt_finished_timestamp'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_JOB_BULK_NAMES}. `messaging.bullmq.job.bulk.names` + */ +export const SEARCH_MESSAGING__BULLMQ__JOB__BULK__NAMES = 'messaging.bullmq.job.bulk.names'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_JOB_DEDUPLICATION_KEY}. `messaging.bullmq.job.deduplication.key` + */ +export const SEARCH_MESSAGING__BULLMQ__JOB__DEDUPLICATION__KEY = 'messaging.bullmq.job.deduplication.key'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_JOB_FINISHED_TIMESTAMP}. `messaging.bullmq.job.finished.timestamp` + */ +export const SEARCH_MESSAGING__BULLMQ__JOB__FINISHED__TIMESTAMP = 'messaging.bullmq.job.finished.timestamp'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_JOB_IDS}. `messaging.bullmq.job.ids` + */ +export const SEARCH_MESSAGING__BULLMQ__JOB__IDS = 'messaging.bullmq.job.ids'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_JOB_KEY}. `messaging.bullmq.job.key` + */ +export const SEARCH_MESSAGING__BULLMQ__JOB__KEY = 'messaging.bullmq.job.key'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_JOB_NAME}. `messaging.bullmq.job.name` + */ +export const SEARCH_MESSAGING__BULLMQ__JOB__NAME = 'messaging.bullmq.job.name'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP}. `messaging.bullmq.job.processed.timestamp` + */ +export const SEARCH_MESSAGING__BULLMQ__JOB__PROCESSED__TIMESTAMP = 'messaging.bullmq.job.processed.timestamp'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_JOB_PROGRESS}. `messaging.bullmq.job.progress` + */ +export const SEARCH_MESSAGING__BULLMQ__JOB__PROGRESS = 'messaging.bullmq.job.progress'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_JOB_SCHEDULER_ID}. `messaging.bullmq.job.scheduler.id` + */ +export const SEARCH_MESSAGING__BULLMQ__JOB__SCHEDULER__ID = 'messaging.bullmq.job.scheduler.id'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_JOB_STATE}. `messaging.bullmq.job.state` + */ +export const SEARCH_MESSAGING__BULLMQ__JOB__STATE = 'messaging.bullmq.job.state'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_JOB_STATUS}. `messaging.bullmq.job.status` + */ +export const SEARCH_MESSAGING__BULLMQ__JOB__STATUS = 'messaging.bullmq.job.status'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_JOB_TYPE}. `messaging.bullmq.job.type` + */ +export const SEARCH_MESSAGING__BULLMQ__JOB__TYPE = 'messaging.bullmq.job.type'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_QUEUE_CLEAN_COUNT}. `messaging.bullmq.queue.clean.count` + */ +export const SEARCH_MESSAGING__BULLMQ__QUEUE__CLEAN__COUNT = 'messaging.bullmq.queue.clean.count'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_QUEUE_CLEAN_LIMIT}. `messaging.bullmq.queue.clean.limit` + */ +export const SEARCH_MESSAGING__BULLMQ__QUEUE__CLEAN__LIMIT = 'messaging.bullmq.queue.clean.limit'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_QUEUE_DRAIN_DELAY}. `messaging.bullmq.queue.drain.delay` + */ +export const SEARCH_MESSAGING__BULLMQ__QUEUE__DRAIN__DELAY = 'messaging.bullmq.queue.drain.delay'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_QUEUE_EVENT_MAX_LENGTH}. `messaging.bullmq.queue.event.max.length` + */ +export const SEARCH_MESSAGING__BULLMQ__QUEUE__EVENT__MAX__LENGTH = 'messaging.bullmq.queue.event.max.length'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_QUEUE_GRACE}. `messaging.bullmq.queue.grace` + */ +export const SEARCH_MESSAGING__BULLMQ__QUEUE__GRACE = 'messaging.bullmq.queue.grace'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_QUEUE_JOBS_STATE}. `messaging.bullmq.queue.jobs.state` + */ +export const SEARCH_MESSAGING__BULLMQ__QUEUE__JOBS__STATE = 'messaging.bullmq.queue.jobs.state'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_QUEUE_RATE_LIMIT}. `messaging.bullmq.queue.rate.limit` + */ +export const SEARCH_MESSAGING__BULLMQ__QUEUE__RATE__LIMIT = 'messaging.bullmq.queue.rate.limit'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE}. `messaging.bullmq.worker.do.not.wait.active` + */ +export const SEARCH_MESSAGING__BULLMQ__WORKER__DO__NOT__WAIT__ACTIVE = 'messaging.bullmq.worker.do.not.wait.active'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_WORKER_FORCE_CLOSE}. `messaging.bullmq.worker.force.close` + */ +export const SEARCH_MESSAGING__BULLMQ__WORKER__FORCE__CLOSE = 'messaging.bullmq.worker.force.close'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_WORKER_ID}. `messaging.bullmq.worker.id` + */ +export const SEARCH_MESSAGING__BULLMQ__WORKER__ID = 'messaging.bullmq.worker.id'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS}. `messaging.bullmq.worker.jobs.to.extend.locks` + */ +export const SEARCH_MESSAGING__BULLMQ__WORKER__JOBS__TO__EXTEND__LOCKS = 'messaging.bullmq.worker.jobs.to.extend.locks'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_WORKER_NAME}. `messaging.bullmq.worker.name` + */ +export const SEARCH_MESSAGING__BULLMQ__WORKER__NAME = 'messaging.bullmq.worker.name'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_WORKER_RATE_LIMIT}. `messaging.bullmq.worker.rate.limit` + */ +export const SEARCH_MESSAGING__BULLMQ__WORKER__RATE__LIMIT = 'messaging.bullmq.worker.rate.limit'; + +/** + * Search name for {@link attributes.MESSAGING_BULLMQ_WORKER_STALLED_JOBS}. `messaging.bullmq.worker.stalled.jobs` + */ +export const SEARCH_MESSAGING__BULLMQ__WORKER__STALLED__JOBS = 'messaging.bullmq.worker.stalled.jobs'; + /** * Search name for {@link attributes.MESSAGING_CONVERSATION_ID}. `messaging.conversation_id` * @@ -5437,34 +5438,6 @@ export type AttributeSearchName = | typeof SEARCH_BROWSER__WEB_VITAL__LCP__VALUE | typeof SEARCH_BROWSER__WEB_VITAL__TTFB__REQUEST_TIME | typeof SEARCH_BROWSER__WEB_VITAL__TTFB__VALUE - | typeof SEARCH_BULLMQ__FLOW__NAME - | typeof SEARCH_BULLMQ__JOB__ATTEMPT_FINISHED_TIMESTAMP - | typeof SEARCH_BULLMQ__JOB__BULK__NAMES - | typeof SEARCH_BULLMQ__JOB__DEDUPLICATION__KEY - | typeof SEARCH_BULLMQ__JOB__FINISHED__TIMESTAMP - | typeof SEARCH_BULLMQ__JOB__IDS - | typeof SEARCH_BULLMQ__JOB__KEY - | typeof SEARCH_BULLMQ__JOB__NAME - | typeof SEARCH_BULLMQ__JOB__PROCESSED__TIMESTAMP - | typeof SEARCH_BULLMQ__JOB__PROGRESS - | typeof SEARCH_BULLMQ__JOB__SCHEDULER__ID - | typeof SEARCH_BULLMQ__JOB__STATE - | typeof SEARCH_BULLMQ__JOB__STATUS - | typeof SEARCH_BULLMQ__JOB__TYPE - | typeof SEARCH_BULLMQ__QUEUE__CLEAN__COUNT - | typeof SEARCH_BULLMQ__QUEUE__CLEAN__LIMIT - | typeof SEARCH_BULLMQ__QUEUE__DRAIN__DELAY - | typeof SEARCH_BULLMQ__QUEUE__EVENT__MAX__LENGTH - | typeof SEARCH_BULLMQ__QUEUE__GRACE - | typeof SEARCH_BULLMQ__QUEUE__JOBS__STATE - | typeof SEARCH_BULLMQ__QUEUE__RATE__LIMIT - | typeof SEARCH_BULLMQ__WORKER__DO__NOT__WAIT__ACTIVE - | typeof SEARCH_BULLMQ__WORKER__FORCE__CLOSE - | typeof SEARCH_BULLMQ__WORKER__ID - | typeof SEARCH_BULLMQ__WORKER__JOBS__TO__EXTEND__LOCKS - | typeof SEARCH_BULLMQ__WORKER__NAME - | typeof SEARCH_BULLMQ__WORKER__RATE__LIMIT - | typeof SEARCH_BULLMQ__WORKER__STALLED__JOBS | typeof SEARCH_CACHE__HIT | typeof SEARCH_CACHE__ITEM_AGE | typeof SEARCH_CACHE__ITEM_SIZE @@ -5838,6 +5811,34 @@ export type AttributeSearchName = | typeof SEARCH_MCP__TRANSPORT | typeof SEARCH_MDC__KEY | typeof SEARCH_MESSAGING__BATCH__MESSAGE_COUNT + | typeof SEARCH_MESSAGING__BULLMQ__FLOW__NAME + | typeof SEARCH_MESSAGING__BULLMQ__JOB__ATTEMPT_FINISHED_TIMESTAMP + | typeof SEARCH_MESSAGING__BULLMQ__JOB__BULK__NAMES + | typeof SEARCH_MESSAGING__BULLMQ__JOB__DEDUPLICATION__KEY + | typeof SEARCH_MESSAGING__BULLMQ__JOB__FINISHED__TIMESTAMP + | typeof SEARCH_MESSAGING__BULLMQ__JOB__IDS + | typeof SEARCH_MESSAGING__BULLMQ__JOB__KEY + | typeof SEARCH_MESSAGING__BULLMQ__JOB__NAME + | typeof SEARCH_MESSAGING__BULLMQ__JOB__PROCESSED__TIMESTAMP + | typeof SEARCH_MESSAGING__BULLMQ__JOB__PROGRESS + | typeof SEARCH_MESSAGING__BULLMQ__JOB__SCHEDULER__ID + | typeof SEARCH_MESSAGING__BULLMQ__JOB__STATE + | typeof SEARCH_MESSAGING__BULLMQ__JOB__STATUS + | typeof SEARCH_MESSAGING__BULLMQ__JOB__TYPE + | typeof SEARCH_MESSAGING__BULLMQ__QUEUE__CLEAN__COUNT + | typeof SEARCH_MESSAGING__BULLMQ__QUEUE__CLEAN__LIMIT + | typeof SEARCH_MESSAGING__BULLMQ__QUEUE__DRAIN__DELAY + | typeof SEARCH_MESSAGING__BULLMQ__QUEUE__EVENT__MAX__LENGTH + | typeof SEARCH_MESSAGING__BULLMQ__QUEUE__GRACE + | typeof SEARCH_MESSAGING__BULLMQ__QUEUE__JOBS__STATE + | typeof SEARCH_MESSAGING__BULLMQ__QUEUE__RATE__LIMIT + | typeof SEARCH_MESSAGING__BULLMQ__WORKER__DO__NOT__WAIT__ACTIVE + | typeof SEARCH_MESSAGING__BULLMQ__WORKER__FORCE__CLOSE + | typeof SEARCH_MESSAGING__BULLMQ__WORKER__ID + | typeof SEARCH_MESSAGING__BULLMQ__WORKER__JOBS__TO__EXTEND__LOCKS + | typeof SEARCH_MESSAGING__BULLMQ__WORKER__NAME + | typeof SEARCH_MESSAGING__BULLMQ__WORKER__RATE__LIMIT + | typeof SEARCH_MESSAGING__BULLMQ__WORKER__STALLED__JOBS | typeof SEARCH_MESSAGING__CONVERSATION_ID | typeof SEARCH_MESSAGING__DESTINATION | typeof SEARCH_MESSAGING__DESTINATION__CONNECTION @@ -7410,176 +7411,6 @@ export const ATTRIBUTE_SEARCH_METADATA: Record brief: 'The value of the recorded Time To First Byte (TTFB) web vital in Milliseconds', deprecationChain: ['browser.web_vital.ttfb.value', 'ttfb'], }, - 'bullmq.flow.name': { - canonicalName: 'bullmq.flow.name', - type: 'string', - brief: 'The name of the root job of the BullMQ flow that FlowProducer.add() adds.', - deprecationChain: ['bullmq.flow.name'], - }, - 'bullmq.job.attempt_finished_timestamp': { - canonicalName: 'bullmq.job.attempt_finished_timestamp', - type: 'integer', - brief: 'The time in milliseconds since the Unix epoch when the current attempt of the BullMQ job finished.', - deprecationChain: ['bullmq.job.attempt_finished_timestamp'], - }, - 'bullmq.job.bulk.names': { - canonicalName: 'bullmq.job.bulk.names', - type: 'string[]', - brief: 'The names of the BullMQ jobs or flows that one bulk operation adds, for example Queue.addBulk().', - deprecationChain: ['bullmq.job.bulk.names'], - }, - 'bullmq.job.deduplication.key': { - canonicalName: 'bullmq.job.deduplication.key', - type: 'string', - brief: 'The deduplication ID that Queue.removeDeduplicationKey() removes.', - deprecationChain: ['bullmq.job.deduplication.key'], - }, - 'bullmq.job.finished.timestamp': { - canonicalName: 'bullmq.job.finished.timestamp', - type: 'integer', - brief: - 'The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job.', - deprecationChain: ['bullmq.job.finished.timestamp'], - }, - 'bullmq.job.ids': { - canonicalName: 'bullmq.job.ids', - type: 'string[]', - brief: 'The IDs of the BullMQ jobs that Queue.clean() removed.', - deprecationChain: ['bullmq.job.ids'], - }, - 'bullmq.job.key': { - canonicalName: 'bullmq.job.key', - type: 'string', - brief: - 'The key that a BullMQ remove operation for a debounce or repeatable key gets, for example Queue.removeDebounceKey().', - deprecationChain: ['bullmq.job.key'], - }, - 'bullmq.job.name': { - canonicalName: 'bullmq.job.name', - type: 'string', - brief: 'The name of the BullMQ job, which the user passes to Queue.add() to identify the kind of work.', - deprecationChain: ['bullmq.job.name'], - }, - 'bullmq.job.processed.timestamp': { - canonicalName: 'bullmq.job.processed.timestamp', - type: 'integer', - brief: 'The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job.', - deprecationChain: ['bullmq.job.processed.timestamp'], - }, - 'bullmq.job.progress': { - canonicalName: 'bullmq.job.progress', - type: 'string', - brief: 'The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress().', - deprecationChain: ['bullmq.job.progress'], - }, - 'bullmq.job.scheduler.id': { - canonicalName: 'bullmq.job.scheduler.id', - type: 'string', - brief: 'The ID of the BullMQ job scheduler that adds the job.', - deprecationChain: ['bullmq.job.scheduler.id'], - }, - 'bullmq.job.state': { - canonicalName: 'bullmq.job.state', - type: 'string', - brief: 'The state of the BullMQ job that a job metric counts.', - deprecationChain: ['bullmq.job.state'], - }, - 'bullmq.job.status': { - canonicalName: 'bullmq.job.status', - type: 'string', - brief: 'The state of the BullMQ job that a job metric counts.', - deprecationChain: ['bullmq.job.status'], - }, - 'bullmq.job.type': { - canonicalName: 'bullmq.job.type', - type: 'string', - brief: 'The job state from which Queue.clean() removes BullMQ jobs.', - deprecationChain: ['bullmq.job.type'], - }, - 'bullmq.queue.clean.count': { - canonicalName: 'bullmq.queue.clean.count', - type: 'integer', - brief: 'The number of BullMQ jobs that Queue.clean() removed.', - deprecationChain: ['bullmq.queue.clean.count'], - }, - 'bullmq.queue.clean.limit': { - canonicalName: 'bullmq.queue.clean.limit', - type: 'integer', - brief: 'The maximum number of BullMQ jobs that Queue.clean() removes.', - deprecationChain: ['bullmq.queue.clean.limit'], - }, - 'bullmq.queue.drain.delay': { - canonicalName: 'bullmq.queue.drain.delay', - type: 'boolean', - brief: 'Whether Queue.drain() also removes the delayed BullMQ jobs.', - deprecationChain: ['bullmq.queue.drain.delay'], - }, - 'bullmq.queue.event.max.length': { - canonicalName: 'bullmq.queue.event.max.length', - type: 'integer', - brief: 'The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream.', - deprecationChain: ['bullmq.queue.event.max.length'], - }, - 'bullmq.queue.grace': { - canonicalName: 'bullmq.queue.grace', - type: 'integer', - brief: 'The grace period in milliseconds that Queue.clean() uses. Only BullMQ jobs that are older are removed.', - deprecationChain: ['bullmq.queue.grace'], - }, - 'bullmq.queue.jobs.state': { - canonicalName: 'bullmq.queue.jobs.state', - type: 'string', - brief: 'The BullMQ job state that the queue job count metric counts.', - deprecationChain: ['bullmq.queue.jobs.state'], - }, - 'bullmq.queue.rate.limit': { - canonicalName: 'bullmq.queue.rate.limit', - type: 'integer', - brief: 'The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue.', - deprecationChain: ['bullmq.queue.rate.limit'], - }, - 'bullmq.worker.do.not.wait.active': { - canonicalName: 'bullmq.worker.do.not.wait.active', - type: 'boolean', - brief: 'Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish.', - deprecationChain: ['bullmq.worker.do.not.wait.active'], - }, - 'bullmq.worker.force.close': { - canonicalName: 'bullmq.worker.force.close', - type: 'boolean', - brief: 'Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish.', - deprecationChain: ['bullmq.worker.force.close'], - }, - 'bullmq.worker.id': { - canonicalName: 'bullmq.worker.id', - type: 'string', - brief: 'The ID that BullMQ generates for the Worker instance.', - deprecationChain: ['bullmq.worker.id'], - }, - 'bullmq.worker.jobs.to.extend.locks': { - canonicalName: 'bullmq.worker.jobs.to.extend.locks', - type: 'string[]', - brief: 'The IDs of the BullMQ jobs whose locks the Worker extends.', - deprecationChain: ['bullmq.worker.jobs.to.extend.locks'], - }, - 'bullmq.worker.name': { - canonicalName: 'bullmq.worker.name', - type: 'string', - brief: 'The name that the user gives to the BullMQ Worker in its options.', - deprecationChain: ['bullmq.worker.name'], - }, - 'bullmq.worker.rate.limit': { - canonicalName: 'bullmq.worker.rate.limit', - type: 'integer', - brief: 'The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker.', - deprecationChain: ['bullmq.worker.rate.limit'], - }, - 'bullmq.worker.stalled.jobs': { - canonicalName: 'bullmq.worker.stalled.jobs', - type: 'string[]', - brief: 'The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state.', - deprecationChain: ['bullmq.worker.stalled.jobs'], - }, 'cache.hit': { canonicalName: 'cache.hit', type: 'boolean', @@ -10027,6 +9858,176 @@ export const ATTRIBUTE_SEARCH_METADATA: Record brief: 'The number of messages sent, received, or processed in the scope of the batching operation.', deprecationChain: ['messaging.batch.message_count'], }, + 'messaging.bullmq.flow.name': { + canonicalName: 'messaging.bullmq.flow.name', + type: 'string', + brief: 'The name of the root job of the BullMQ flow that FlowProducer.add() adds.', + deprecationChain: ['messaging.bullmq.flow.name'], + }, + 'messaging.bullmq.job.attempt_finished_timestamp': { + canonicalName: 'messaging.bullmq.job.attempt_finished_timestamp', + type: 'integer', + brief: 'The time in milliseconds since the Unix epoch when the current attempt of the BullMQ job finished.', + deprecationChain: ['messaging.bullmq.job.attempt_finished_timestamp'], + }, + 'messaging.bullmq.job.bulk.names': { + canonicalName: 'messaging.bullmq.job.bulk.names', + type: 'string[]', + brief: 'The names of the BullMQ jobs or flows that one bulk operation adds, for example Queue.addBulk().', + deprecationChain: ['messaging.bullmq.job.bulk.names'], + }, + 'messaging.bullmq.job.deduplication.key': { + canonicalName: 'messaging.bullmq.job.deduplication.key', + type: 'string', + brief: 'The deduplication ID that Queue.removeDeduplicationKey() removes.', + deprecationChain: ['messaging.bullmq.job.deduplication.key'], + }, + 'messaging.bullmq.job.finished.timestamp': { + canonicalName: 'messaging.bullmq.job.finished.timestamp', + type: 'integer', + brief: + 'The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job.', + deprecationChain: ['messaging.bullmq.job.finished.timestamp'], + }, + 'messaging.bullmq.job.ids': { + canonicalName: 'messaging.bullmq.job.ids', + type: 'string[]', + brief: 'The IDs of the BullMQ jobs that Queue.clean() removed.', + deprecationChain: ['messaging.bullmq.job.ids'], + }, + 'messaging.bullmq.job.key': { + canonicalName: 'messaging.bullmq.job.key', + type: 'string', + brief: + 'The key that a BullMQ remove operation for a debounce or repeatable key gets, for example Queue.removeDebounceKey().', + deprecationChain: ['messaging.bullmq.job.key'], + }, + 'messaging.bullmq.job.name': { + canonicalName: 'messaging.bullmq.job.name', + type: 'string', + brief: 'The name of the BullMQ job, which the user passes to Queue.add() to identify the kind of work.', + deprecationChain: ['messaging.bullmq.job.name'], + }, + 'messaging.bullmq.job.processed.timestamp': { + canonicalName: 'messaging.bullmq.job.processed.timestamp', + type: 'integer', + brief: 'The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job.', + deprecationChain: ['messaging.bullmq.job.processed.timestamp'], + }, + 'messaging.bullmq.job.progress': { + canonicalName: 'messaging.bullmq.job.progress', + type: 'string', + brief: 'The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress().', + deprecationChain: ['messaging.bullmq.job.progress'], + }, + 'messaging.bullmq.job.scheduler.id': { + canonicalName: 'messaging.bullmq.job.scheduler.id', + type: 'string', + brief: 'The ID of the BullMQ job scheduler that adds the job.', + deprecationChain: ['messaging.bullmq.job.scheduler.id'], + }, + 'messaging.bullmq.job.state': { + canonicalName: 'messaging.bullmq.job.state', + type: 'string', + brief: 'The state of the BullMQ job that a job metric counts.', + deprecationChain: ['messaging.bullmq.job.state'], + }, + 'messaging.bullmq.job.status': { + canonicalName: 'messaging.bullmq.job.status', + type: 'string', + brief: 'The state of the BullMQ job that a job metric counts.', + deprecationChain: ['messaging.bullmq.job.status'], + }, + 'messaging.bullmq.job.type': { + canonicalName: 'messaging.bullmq.job.type', + type: 'string', + brief: 'The job state from which Queue.clean() removes BullMQ jobs.', + deprecationChain: ['messaging.bullmq.job.type'], + }, + 'messaging.bullmq.queue.clean.count': { + canonicalName: 'messaging.bullmq.queue.clean.count', + type: 'integer', + brief: 'The number of BullMQ jobs that Queue.clean() removed.', + deprecationChain: ['messaging.bullmq.queue.clean.count'], + }, + 'messaging.bullmq.queue.clean.limit': { + canonicalName: 'messaging.bullmq.queue.clean.limit', + type: 'integer', + brief: 'The maximum number of BullMQ jobs that Queue.clean() removes.', + deprecationChain: ['messaging.bullmq.queue.clean.limit'], + }, + 'messaging.bullmq.queue.drain.delay': { + canonicalName: 'messaging.bullmq.queue.drain.delay', + type: 'boolean', + brief: 'Whether Queue.drain() also removes the delayed BullMQ jobs.', + deprecationChain: ['messaging.bullmq.queue.drain.delay'], + }, + 'messaging.bullmq.queue.event.max.length': { + canonicalName: 'messaging.bullmq.queue.event.max.length', + type: 'integer', + brief: 'The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream.', + deprecationChain: ['messaging.bullmq.queue.event.max.length'], + }, + 'messaging.bullmq.queue.grace': { + canonicalName: 'messaging.bullmq.queue.grace', + type: 'integer', + brief: 'The grace period in milliseconds that Queue.clean() uses. Only BullMQ jobs that are older are removed.', + deprecationChain: ['messaging.bullmq.queue.grace'], + }, + 'messaging.bullmq.queue.jobs.state': { + canonicalName: 'messaging.bullmq.queue.jobs.state', + type: 'string', + brief: 'The BullMQ job state that the queue job count metric counts.', + deprecationChain: ['messaging.bullmq.queue.jobs.state'], + }, + 'messaging.bullmq.queue.rate.limit': { + canonicalName: 'messaging.bullmq.queue.rate.limit', + type: 'integer', + brief: 'The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue.', + deprecationChain: ['messaging.bullmq.queue.rate.limit'], + }, + 'messaging.bullmq.worker.do.not.wait.active': { + canonicalName: 'messaging.bullmq.worker.do.not.wait.active', + type: 'boolean', + brief: 'Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish.', + deprecationChain: ['messaging.bullmq.worker.do.not.wait.active'], + }, + 'messaging.bullmq.worker.force.close': { + canonicalName: 'messaging.bullmq.worker.force.close', + type: 'boolean', + brief: 'Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish.', + deprecationChain: ['messaging.bullmq.worker.force.close'], + }, + 'messaging.bullmq.worker.id': { + canonicalName: 'messaging.bullmq.worker.id', + type: 'string', + brief: 'The ID that BullMQ generates for the Worker instance.', + deprecationChain: ['messaging.bullmq.worker.id'], + }, + 'messaging.bullmq.worker.jobs.to.extend.locks': { + canonicalName: 'messaging.bullmq.worker.jobs.to.extend.locks', + type: 'string[]', + brief: 'The IDs of the BullMQ jobs whose locks the Worker extends.', + deprecationChain: ['messaging.bullmq.worker.jobs.to.extend.locks'], + }, + 'messaging.bullmq.worker.name': { + canonicalName: 'messaging.bullmq.worker.name', + type: 'string', + brief: 'The name that the user gives to the BullMQ Worker in its options.', + deprecationChain: ['messaging.bullmq.worker.name'], + }, + 'messaging.bullmq.worker.rate.limit': { + canonicalName: 'messaging.bullmq.worker.rate.limit', + type: 'integer', + brief: 'The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker.', + deprecationChain: ['messaging.bullmq.worker.rate.limit'], + }, + 'messaging.bullmq.worker.stalled.jobs': { + canonicalName: 'messaging.bullmq.worker.stalled.jobs', + type: 'string[]', + brief: 'The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state.', + deprecationChain: ['messaging.bullmq.worker.stalled.jobs'], + }, 'messaging.conversation_id': { canonicalName: 'messaging.message.conversation_id', type: 'string', diff --git a/model/attributes/bullmq/bullmq__flow__name.json b/model/attributes/messaging/messaging__bullmq__flow__name.json similarity index 61% rename from model/attributes/bullmq/bullmq__flow__name.json rename to model/attributes/messaging/messaging__bullmq__flow__name.json index ddd6e9f09..1d5a1a8d3 100644 --- a/model/attributes/bullmq/bullmq__flow__name.json +++ b/model/attributes/messaging/messaging__bullmq__flow__name.json @@ -1,5 +1,5 @@ { - "key": "bullmq.flow.name", + "key": "messaging.bullmq.flow.name", "brief": "The name of the root job of the BullMQ flow that FlowProducer.add() adds.", "type": "string", "apply_scrubbing": { @@ -9,13 +9,13 @@ "visibility": "public", "examples": ["build-report"], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "The Sentry SDK sets this attribute from the `bullmq.flow.name` attribute of BullMQ's telemetry interface." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.flow.name attribute" + "description": "Added messaging.bullmq.flow.name attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__job__attempt_finished_timestamp.json b/model/attributes/messaging/messaging__bullmq__job__attempt_finished_timestamp.json similarity index 57% rename from model/attributes/bullmq/bullmq__job__attempt_finished_timestamp.json rename to model/attributes/messaging/messaging__bullmq__job__attempt_finished_timestamp.json index 6f3cf0ebe..287b31463 100644 --- a/model/attributes/bullmq/bullmq__job__attempt_finished_timestamp.json +++ b/model/attributes/messaging/messaging__bullmq__job__attempt_finished_timestamp.json @@ -1,5 +1,5 @@ { - "key": "bullmq.job.attempt_finished_timestamp", + "key": "messaging.bullmq.job.attempt_finished_timestamp", "brief": "The time in milliseconds since the Unix epoch when the current attempt of the BullMQ job finished.", "type": "integer", "apply_scrubbing": { @@ -9,13 +9,13 @@ "visibility": "public", "examples": [1791184722406], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "The Sentry SDK sets this attribute from the `bullmq.job.attempt_finished_timestamp` attribute of BullMQ's telemetry interface." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.job.attempt_finished_timestamp attribute" + "description": "Added messaging.bullmq.job.attempt_finished_timestamp attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__job__bulk__names.json b/model/attributes/messaging/messaging__bullmq__job__bulk__names.json similarity index 63% rename from model/attributes/bullmq/bullmq__job__bulk__names.json rename to model/attributes/messaging/messaging__bullmq__job__bulk__names.json index 5e1ba7ac7..8f50fba16 100644 --- a/model/attributes/bullmq/bullmq__job__bulk__names.json +++ b/model/attributes/messaging/messaging__bullmq__job__bulk__names.json @@ -1,5 +1,5 @@ { - "key": "bullmq.job.bulk.names", + "key": "messaging.bullmq.job.bulk.names", "brief": "The names of the BullMQ jobs or flows that one bulk operation adds, for example Queue.addBulk().", "type": "string[]", "apply_scrubbing": { @@ -9,13 +9,13 @@ "visibility": "public", "examples": [["send-welcome-email", "generate-report"]], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "The Sentry SDK sets this attribute from the `bullmq.job.bulk.names` attribute of BullMQ's telemetry interface." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.job.bulk.names attribute" + "description": "Added messaging.bullmq.job.bulk.names attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__job__deduplication__key.json b/model/attributes/messaging/messaging__bullmq__job__deduplication__key.json similarity index 57% rename from model/attributes/bullmq/bullmq__job__deduplication__key.json rename to model/attributes/messaging/messaging__bullmq__job__deduplication__key.json index 8a96b5e16..9bf37ee9f 100644 --- a/model/attributes/bullmq/bullmq__job__deduplication__key.json +++ b/model/attributes/messaging/messaging__bullmq__job__deduplication__key.json @@ -1,5 +1,5 @@ { - "key": "bullmq.job.deduplication.key", + "key": "messaging.bullmq.job.deduplication.key", "brief": "The deduplication ID that Queue.removeDeduplicationKey() removes.", "type": "string", "apply_scrubbing": { @@ -9,13 +9,13 @@ "visibility": "public", "examples": ["user-42-sync"], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "The Sentry SDK sets this attribute from the `bullmq.job.deduplication.key` attribute of BullMQ's telemetry interface." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.job.deduplication.key attribute" + "description": "Added messaging.bullmq.job.deduplication.key attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__job__finished__timestamp.json b/model/attributes/messaging/messaging__bullmq__job__finished__timestamp.json similarity index 63% rename from model/attributes/bullmq/bullmq__job__finished__timestamp.json rename to model/attributes/messaging/messaging__bullmq__job__finished__timestamp.json index 708e811c1..b8e2ba534 100644 --- a/model/attributes/bullmq/bullmq__job__finished__timestamp.json +++ b/model/attributes/messaging/messaging__bullmq__job__finished__timestamp.json @@ -1,5 +1,5 @@ { - "key": "bullmq.job.finished.timestamp", + "key": "messaging.bullmq.job.finished.timestamp", "brief": "The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job.", "type": "integer", "apply_scrubbing": { @@ -9,14 +9,14 @@ "visibility": "public", "examples": [1791184722411], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + "The Sentry SDK sets this attribute from the `bullmq.job.finished.timestamp` attribute of BullMQ's telemetry interface.", "BullMQ 5.79.1 sets this attribute. BullMQ 6.3.11 does not." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.job.finished.timestamp attribute" + "description": "Added messaging.bullmq.job.finished.timestamp attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__job__ids.json b/model/attributes/messaging/messaging__bullmq__job__ids.json similarity index 65% rename from model/attributes/bullmq/bullmq__job__ids.json rename to model/attributes/messaging/messaging__bullmq__job__ids.json index 70f9ca4dc..774d6b93c 100644 --- a/model/attributes/bullmq/bullmq__job__ids.json +++ b/model/attributes/messaging/messaging__bullmq__job__ids.json @@ -1,5 +1,5 @@ { - "key": "bullmq.job.ids", + "key": "messaging.bullmq.job.ids", "brief": "The IDs of the BullMQ jobs that Queue.clean() removed.", "type": "string[]", "apply_scrubbing": { @@ -9,14 +9,14 @@ "visibility": "public", "examples": [["1", "2", "3"]], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + "The Sentry SDK sets this attribute from the `bullmq.job.ids` attribute of BullMQ's telemetry interface.", "BullMQ 5.79.1 sets this attribute. BullMQ 6.3.11 does not." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.job.ids attribute" + "description": "Added messaging.bullmq.job.ids attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__job__key.json b/model/attributes/messaging/messaging__bullmq__job__key.json similarity index 64% rename from model/attributes/bullmq/bullmq__job__key.json rename to model/attributes/messaging/messaging__bullmq__job__key.json index c67e3d36d..60a4696eb 100644 --- a/model/attributes/bullmq/bullmq__job__key.json +++ b/model/attributes/messaging/messaging__bullmq__job__key.json @@ -1,5 +1,5 @@ { - "key": "bullmq.job.key", + "key": "messaging.bullmq.job.key", "brief": "The key that a BullMQ remove operation for a debounce or repeatable key gets, for example Queue.removeDebounceKey().", "type": "string", "apply_scrubbing": { @@ -9,13 +9,13 @@ "visibility": "public", "examples": ["user-42-sync"], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "The Sentry SDK sets this attribute from the `bullmq.job.key` attribute of BullMQ's telemetry interface." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.job.key attribute" + "description": "Added messaging.bullmq.job.key attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__job__name.json b/model/attributes/messaging/messaging__bullmq__job__name.json similarity index 67% rename from model/attributes/bullmq/bullmq__job__name.json rename to model/attributes/messaging/messaging__bullmq__job__name.json index c19d2cf31..f9c96e52a 100644 --- a/model/attributes/bullmq/bullmq__job__name.json +++ b/model/attributes/messaging/messaging__bullmq__job__name.json @@ -1,5 +1,5 @@ { - "key": "bullmq.job.name", + "key": "messaging.bullmq.job.name", "brief": "The name of the BullMQ job, which the user passes to Queue.add() to identify the kind of work.", "type": "string", "apply_scrubbing": { @@ -9,14 +9,14 @@ "visibility": "public", "examples": ["send-welcome-email", "generate-report"], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + "The Sentry SDK sets this attribute from the `bullmq.job.name` attribute of BullMQ's telemetry interface.", "Also set on the BullMQ job metrics." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.job.name attribute" + "description": "Added messaging.bullmq.job.name attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__job__processed__timestamp.json b/model/attributes/messaging/messaging__bullmq__job__processed__timestamp.json similarity index 59% rename from model/attributes/bullmq/bullmq__job__processed__timestamp.json rename to model/attributes/messaging/messaging__bullmq__job__processed__timestamp.json index 742f928fe..b881347e7 100644 --- a/model/attributes/bullmq/bullmq__job__processed__timestamp.json +++ b/model/attributes/messaging/messaging__bullmq__job__processed__timestamp.json @@ -1,5 +1,5 @@ { - "key": "bullmq.job.processed.timestamp", + "key": "messaging.bullmq.job.processed.timestamp", "brief": "The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job.", "type": "integer", "apply_scrubbing": { @@ -9,13 +9,13 @@ "visibility": "public", "examples": [1791184722281], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "The Sentry SDK sets this attribute from the `bullmq.job.processed.timestamp` attribute of BullMQ's telemetry interface." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.job.processed.timestamp attribute" + "description": "Added messaging.bullmq.job.processed.timestamp attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__job__progress.json b/model/attributes/messaging/messaging__bullmq__job__progress.json similarity index 62% rename from model/attributes/bullmq/bullmq__job__progress.json rename to model/attributes/messaging/messaging__bullmq__job__progress.json index bbf7a4bd7..825cc27ff 100644 --- a/model/attributes/bullmq/bullmq__job__progress.json +++ b/model/attributes/messaging/messaging__bullmq__job__progress.json @@ -1,5 +1,5 @@ { - "key": "bullmq.job.progress", + "key": "messaging.bullmq.job.progress", "brief": "The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress().", "type": "string", "apply_scrubbing": { @@ -9,13 +9,13 @@ "visibility": "public", "examples": ["{\"percentage\":50}"], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "The Sentry SDK sets this attribute from the `bullmq.job.progress` attribute of BullMQ's telemetry interface." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.job.progress attribute" + "description": "Added messaging.bullmq.job.progress attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__job__scheduler__id.json b/model/attributes/messaging/messaging__bullmq__job__scheduler__id.json similarity index 58% rename from model/attributes/bullmq/bullmq__job__scheduler__id.json rename to model/attributes/messaging/messaging__bullmq__job__scheduler__id.json index f86c06982..d47659824 100644 --- a/model/attributes/bullmq/bullmq__job__scheduler__id.json +++ b/model/attributes/messaging/messaging__bullmq__job__scheduler__id.json @@ -1,5 +1,5 @@ { - "key": "bullmq.job.scheduler.id", + "key": "messaging.bullmq.job.scheduler.id", "brief": "The ID of the BullMQ job scheduler that adds the job.", "type": "string", "apply_scrubbing": { @@ -9,13 +9,13 @@ "visibility": "public", "examples": ["daily-report"], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "The Sentry SDK sets this attribute from the `bullmq.job.scheduler.id` attribute of BullMQ's telemetry interface." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.job.scheduler.id attribute" + "description": "Added messaging.bullmq.job.scheduler.id attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__job__status.json b/model/attributes/messaging/messaging__bullmq__job__state.json similarity index 50% rename from model/attributes/bullmq/bullmq__job__status.json rename to model/attributes/messaging/messaging__bullmq__job__state.json index 69aa3be72..f74d034ae 100644 --- a/model/attributes/bullmq/bullmq__job__status.json +++ b/model/attributes/messaging/messaging__bullmq__job__state.json @@ -1,5 +1,5 @@ { - "key": "bullmq.job.status", + "key": "messaging.bullmq.job.state", "brief": "The state of the BullMQ job that a job metric counts.", "type": "string", "apply_scrubbing": { @@ -9,14 +9,14 @@ "visibility": "public", "examples": ["completed", "failed", "delayed"], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", - "Set on the BullMQ job metrics by BullMQ 5.79.1. BullMQ 6.3.11 sets `bullmq.job.state` instead." + "The Sentry SDK sets this attribute from the `bullmq.job.state` attribute of BullMQ's telemetry interface.", + "Set on the BullMQ job metrics with BullMQ 6.3.11. With BullMQ 5.79.1, `messaging.bullmq.job.status` is set instead." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.job.status attribute" + "description": "Added messaging.bullmq.job.state attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__job__state.json b/model/attributes/messaging/messaging__bullmq__job__status.json similarity index 50% rename from model/attributes/bullmq/bullmq__job__state.json rename to model/attributes/messaging/messaging__bullmq__job__status.json index 84c181a3a..9cbd92317 100644 --- a/model/attributes/bullmq/bullmq__job__state.json +++ b/model/attributes/messaging/messaging__bullmq__job__status.json @@ -1,5 +1,5 @@ { - "key": "bullmq.job.state", + "key": "messaging.bullmq.job.status", "brief": "The state of the BullMQ job that a job metric counts.", "type": "string", "apply_scrubbing": { @@ -9,14 +9,14 @@ "visibility": "public", "examples": ["completed", "failed", "delayed"], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", - "Set on the BullMQ job metrics by BullMQ 6.3.11. BullMQ 5.79.1 sets `bullmq.job.status` instead." + "The Sentry SDK sets this attribute from the `bullmq.job.status` attribute of BullMQ's telemetry interface.", + "Set on the BullMQ job metrics with BullMQ 5.79.1. With BullMQ 6.3.11, `messaging.bullmq.job.state` is set instead." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.job.state attribute" + "description": "Added messaging.bullmq.job.status attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__job__type.json b/model/attributes/messaging/messaging__bullmq__job__type.json similarity index 61% rename from model/attributes/bullmq/bullmq__job__type.json rename to model/attributes/messaging/messaging__bullmq__job__type.json index 4686e36db..bea37fff7 100644 --- a/model/attributes/bullmq/bullmq__job__type.json +++ b/model/attributes/messaging/messaging__bullmq__job__type.json @@ -1,5 +1,5 @@ { - "key": "bullmq.job.type", + "key": "messaging.bullmq.job.type", "brief": "The job state from which Queue.clean() removes BullMQ jobs.", "type": "string", "apply_scrubbing": { @@ -9,13 +9,13 @@ "visibility": "public", "examples": ["completed", "failed"], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "The Sentry SDK sets this attribute from the `bullmq.job.type` attribute of BullMQ's telemetry interface." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.job.type attribute" + "description": "Added messaging.bullmq.job.type attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__queue__clean__count.json b/model/attributes/messaging/messaging__bullmq__queue__clean__count.json similarity index 61% rename from model/attributes/bullmq/bullmq__queue__clean__count.json rename to model/attributes/messaging/messaging__bullmq__queue__clean__count.json index afd2b1697..75d97a343 100644 --- a/model/attributes/bullmq/bullmq__queue__clean__count.json +++ b/model/attributes/messaging/messaging__bullmq__queue__clean__count.json @@ -1,5 +1,5 @@ { - "key": "bullmq.queue.clean.count", + "key": "messaging.bullmq.queue.clean.count", "brief": "The number of BullMQ jobs that Queue.clean() removed.", "type": "integer", "apply_scrubbing": { @@ -9,14 +9,14 @@ "visibility": "public", "examples": [25], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + "The Sentry SDK sets this attribute from the `bullmq.queue.clean.count` attribute of BullMQ's telemetry interface.", "BullMQ 6.3.11 sets this attribute. BullMQ 5.79.1 does not." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.queue.clean.count attribute" + "description": "Added messaging.bullmq.queue.clean.count attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__queue__clean__limit.json b/model/attributes/messaging/messaging__bullmq__queue__clean__limit.json similarity index 57% rename from model/attributes/bullmq/bullmq__queue__clean__limit.json rename to model/attributes/messaging/messaging__bullmq__queue__clean__limit.json index 7a9084b87..ae0aef97b 100644 --- a/model/attributes/bullmq/bullmq__queue__clean__limit.json +++ b/model/attributes/messaging/messaging__bullmq__queue__clean__limit.json @@ -1,5 +1,5 @@ { - "key": "bullmq.queue.clean.limit", + "key": "messaging.bullmq.queue.clean.limit", "brief": "The maximum number of BullMQ jobs that Queue.clean() removes.", "type": "integer", "apply_scrubbing": { @@ -9,13 +9,13 @@ "visibility": "public", "examples": [1000], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "The Sentry SDK sets this attribute from the `bullmq.queue.clean.limit` attribute of BullMQ's telemetry interface." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.queue.clean.limit attribute" + "description": "Added messaging.bullmq.queue.clean.limit attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__queue__drain__delay.json b/model/attributes/messaging/messaging__bullmq__queue__drain__delay.json similarity index 57% rename from model/attributes/bullmq/bullmq__queue__drain__delay.json rename to model/attributes/messaging/messaging__bullmq__queue__drain__delay.json index ffb42832e..1ee3313a7 100644 --- a/model/attributes/bullmq/bullmq__queue__drain__delay.json +++ b/model/attributes/messaging/messaging__bullmq__queue__drain__delay.json @@ -1,5 +1,5 @@ { - "key": "bullmq.queue.drain.delay", + "key": "messaging.bullmq.queue.drain.delay", "brief": "Whether Queue.drain() also removes the delayed BullMQ jobs.", "type": "boolean", "apply_scrubbing": { @@ -9,13 +9,13 @@ "visibility": "public", "examples": [true], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "The Sentry SDK sets this attribute from the `bullmq.queue.drain.delay` attribute of BullMQ's telemetry interface." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.queue.drain.delay attribute" + "description": "Added messaging.bullmq.queue.drain.delay attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__queue__event__max__length.json b/model/attributes/messaging/messaging__bullmq__queue__event__max__length.json similarity index 58% rename from model/attributes/bullmq/bullmq__queue__event__max__length.json rename to model/attributes/messaging/messaging__bullmq__queue__event__max__length.json index aab0747f9..7a121788b 100644 --- a/model/attributes/bullmq/bullmq__queue__event__max__length.json +++ b/model/attributes/messaging/messaging__bullmq__queue__event__max__length.json @@ -1,5 +1,5 @@ { - "key": "bullmq.queue.event.max.length", + "key": "messaging.bullmq.queue.event.max.length", "brief": "The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream.", "type": "integer", "apply_scrubbing": { @@ -9,13 +9,13 @@ "visibility": "public", "examples": [10000], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "The Sentry SDK sets this attribute from the `bullmq.queue.event.max.length` attribute of BullMQ's telemetry interface." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.queue.event.max.length attribute" + "description": "Added messaging.bullmq.queue.event.max.length attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__queue__grace.json b/model/attributes/messaging/messaging__bullmq__queue__grace.json similarity index 62% rename from model/attributes/bullmq/bullmq__queue__grace.json rename to model/attributes/messaging/messaging__bullmq__queue__grace.json index 44aa8aaf6..7b1a5852a 100644 --- a/model/attributes/bullmq/bullmq__queue__grace.json +++ b/model/attributes/messaging/messaging__bullmq__queue__grace.json @@ -1,5 +1,5 @@ { - "key": "bullmq.queue.grace", + "key": "messaging.bullmq.queue.grace", "brief": "The grace period in milliseconds that Queue.clean() uses. Only BullMQ jobs that are older are removed.", "type": "integer", "apply_scrubbing": { @@ -9,13 +9,13 @@ "visibility": "public", "examples": [60000], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "The Sentry SDK sets this attribute from the `bullmq.queue.grace` attribute of BullMQ's telemetry interface." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.queue.grace attribute" + "description": "Added messaging.bullmq.queue.grace attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__queue__jobs__state.json b/model/attributes/messaging/messaging__bullmq__queue__jobs__state.json similarity index 62% rename from model/attributes/bullmq/bullmq__queue__jobs__state.json rename to model/attributes/messaging/messaging__bullmq__queue__jobs__state.json index e58c5330d..6303ce2cd 100644 --- a/model/attributes/bullmq/bullmq__queue__jobs__state.json +++ b/model/attributes/messaging/messaging__bullmq__queue__jobs__state.json @@ -1,5 +1,5 @@ { - "key": "bullmq.queue.jobs.state", + "key": "messaging.bullmq.queue.jobs.state", "brief": "The BullMQ job state that the queue job count metric counts.", "type": "string", "apply_scrubbing": { @@ -9,14 +9,14 @@ "visibility": "public", "examples": ["waiting", "active", "completed"], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", + "The Sentry SDK sets this attribute from the `bullmq.queue.jobs.state` attribute of BullMQ's telemetry interface.", "Set on the BullMQ queue job count metric." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.queue.jobs.state attribute" + "description": "Added messaging.bullmq.queue.jobs.state attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__queue__rate__limit.json b/model/attributes/messaging/messaging__bullmq__queue__rate__limit.json similarity index 59% rename from model/attributes/bullmq/bullmq__queue__rate__limit.json rename to model/attributes/messaging/messaging__bullmq__queue__rate__limit.json index d26ed1245..1fec8bcc1 100644 --- a/model/attributes/bullmq/bullmq__queue__rate__limit.json +++ b/model/attributes/messaging/messaging__bullmq__queue__rate__limit.json @@ -1,5 +1,5 @@ { - "key": "bullmq.queue.rate.limit", + "key": "messaging.bullmq.queue.rate.limit", "brief": "The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue.", "type": "integer", "apply_scrubbing": { @@ -9,13 +9,13 @@ "visibility": "public", "examples": [5000], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "The Sentry SDK sets this attribute from the `bullmq.queue.rate.limit` attribute of BullMQ's telemetry interface." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.queue.rate.limit attribute" + "description": "Added messaging.bullmq.queue.rate.limit attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__worker__do__not__wait__active.json b/model/attributes/messaging/messaging__bullmq__worker__do__not__wait__active.json similarity index 57% rename from model/attributes/bullmq/bullmq__worker__do__not__wait__active.json rename to model/attributes/messaging/messaging__bullmq__worker__do__not__wait__active.json index 63cb2de48..73391499b 100644 --- a/model/attributes/bullmq/bullmq__worker__do__not__wait__active.json +++ b/model/attributes/messaging/messaging__bullmq__worker__do__not__wait__active.json @@ -1,5 +1,5 @@ { - "key": "bullmq.worker.do.not.wait.active", + "key": "messaging.bullmq.worker.do.not.wait.active", "brief": "Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish.", "type": "boolean", "apply_scrubbing": { @@ -9,13 +9,13 @@ "visibility": "public", "examples": [false], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "The Sentry SDK sets this attribute from the `bullmq.worker.do.not.wait.active` attribute of BullMQ's telemetry interface." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.worker.do.not.wait.active attribute" + "description": "Added messaging.bullmq.worker.do.not.wait.active attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__worker__force__close.json b/model/attributes/messaging/messaging__bullmq__worker__force__close.json similarity index 59% rename from model/attributes/bullmq/bullmq__worker__force__close.json rename to model/attributes/messaging/messaging__bullmq__worker__force__close.json index ba33657c8..849329678 100644 --- a/model/attributes/bullmq/bullmq__worker__force__close.json +++ b/model/attributes/messaging/messaging__bullmq__worker__force__close.json @@ -1,5 +1,5 @@ { - "key": "bullmq.worker.force.close", + "key": "messaging.bullmq.worker.force.close", "brief": "Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish.", "type": "boolean", "apply_scrubbing": { @@ -9,13 +9,13 @@ "visibility": "public", "examples": [false], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "The Sentry SDK sets this attribute from the `bullmq.worker.force.close` attribute of BullMQ's telemetry interface." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.worker.force.close attribute" + "description": "Added messaging.bullmq.worker.force.close attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__worker__id.json b/model/attributes/messaging/messaging__bullmq__worker__id.json similarity index 61% rename from model/attributes/bullmq/bullmq__worker__id.json rename to model/attributes/messaging/messaging__bullmq__worker__id.json index 2cf790190..027b35e98 100644 --- a/model/attributes/bullmq/bullmq__worker__id.json +++ b/model/attributes/messaging/messaging__bullmq__worker__id.json @@ -1,5 +1,5 @@ { - "key": "bullmq.worker.id", + "key": "messaging.bullmq.worker.id", "brief": "The ID that BullMQ generates for the Worker instance.", "type": "string", "apply_scrubbing": { @@ -9,13 +9,13 @@ "visibility": "public", "examples": ["03327d57-05cc-4528-9d24-c59bf6520039"], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "The Sentry SDK sets this attribute from the `bullmq.worker.id` attribute of BullMQ's telemetry interface." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.worker.id attribute" + "description": "Added messaging.bullmq.worker.id attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__worker__jobs__to__extend__locks.json b/model/attributes/messaging/messaging__bullmq__worker__jobs__to__extend__locks.json similarity index 55% rename from model/attributes/bullmq/bullmq__worker__jobs__to__extend__locks.json rename to model/attributes/messaging/messaging__bullmq__worker__jobs__to__extend__locks.json index da3e66aeb..bcf9c35ab 100644 --- a/model/attributes/bullmq/bullmq__worker__jobs__to__extend__locks.json +++ b/model/attributes/messaging/messaging__bullmq__worker__jobs__to__extend__locks.json @@ -1,5 +1,5 @@ { - "key": "bullmq.worker.jobs.to.extend.locks", + "key": "messaging.bullmq.worker.jobs.to.extend.locks", "brief": "The IDs of the BullMQ jobs whose locks the Worker extends.", "type": "string[]", "apply_scrubbing": { @@ -9,13 +9,13 @@ "visibility": "public", "examples": [["1", "2"]], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "The Sentry SDK sets this attribute from the `bullmq.worker.jobs.to.extend.locks` attribute of BullMQ's telemetry interface." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.worker.jobs.to.extend.locks attribute" + "description": "Added messaging.bullmq.worker.jobs.to.extend.locks attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__worker__name.json b/model/attributes/messaging/messaging__bullmq__worker__name.json similarity index 60% rename from model/attributes/bullmq/bullmq__worker__name.json rename to model/attributes/messaging/messaging__bullmq__worker__name.json index 4daab5544..5156d3e8b 100644 --- a/model/attributes/bullmq/bullmq__worker__name.json +++ b/model/attributes/messaging/messaging__bullmq__worker__name.json @@ -1,5 +1,5 @@ { - "key": "bullmq.worker.name", + "key": "messaging.bullmq.worker.name", "brief": "The name that the user gives to the BullMQ Worker in its options.", "type": "string", "apply_scrubbing": { @@ -9,13 +9,13 @@ "visibility": "public", "examples": ["email-worker"], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "The Sentry SDK sets this attribute from the `bullmq.worker.name` attribute of BullMQ's telemetry interface." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.worker.name attribute" + "description": "Added messaging.bullmq.worker.name attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__worker__rate__limit.json b/model/attributes/messaging/messaging__bullmq__worker__rate__limit.json similarity index 59% rename from model/attributes/bullmq/bullmq__worker__rate__limit.json rename to model/attributes/messaging/messaging__bullmq__worker__rate__limit.json index c57850b24..09bf20e58 100644 --- a/model/attributes/bullmq/bullmq__worker__rate__limit.json +++ b/model/attributes/messaging/messaging__bullmq__worker__rate__limit.json @@ -1,5 +1,5 @@ { - "key": "bullmq.worker.rate.limit", + "key": "messaging.bullmq.worker.rate.limit", "brief": "The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker.", "type": "integer", "apply_scrubbing": { @@ -9,13 +9,13 @@ "visibility": "public", "examples": [5000], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "The Sentry SDK sets this attribute from the `bullmq.worker.rate.limit` attribute of BullMQ's telemetry interface." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.worker.rate.limit attribute" + "description": "Added messaging.bullmq.worker.rate.limit attribute" } ] } diff --git a/model/attributes/bullmq/bullmq__worker__stalled__jobs.json b/model/attributes/messaging/messaging__bullmq__worker__stalled__jobs.json similarity index 58% rename from model/attributes/bullmq/bullmq__worker__stalled__jobs.json rename to model/attributes/messaging/messaging__bullmq__worker__stalled__jobs.json index 5760ff7c4..bfcf17d33 100644 --- a/model/attributes/bullmq/bullmq__worker__stalled__jobs.json +++ b/model/attributes/messaging/messaging__bullmq__worker__stalled__jobs.json @@ -1,5 +1,5 @@ { - "key": "bullmq.worker.stalled.jobs", + "key": "messaging.bullmq.worker.stalled.jobs", "brief": "The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state.", "type": "string[]", "apply_scrubbing": { @@ -9,13 +9,13 @@ "visibility": "public", "examples": [["1", "2"]], "additional_context": [ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "The Sentry SDK sets this attribute from the `bullmq.worker.stalled.jobs` attribute of BullMQ's telemetry interface." ], "changelog": [ { "version": "next", "prs": [690], - "description": "Added bullmq.worker.stalled.jobs attribute" + "description": "Added messaging.bullmq.worker.stalled.jobs attribute" } ] } diff --git a/model/metrics/bullmq/bullmq__job__duration.json b/model/metrics/bullmq/bullmq__job__duration.json index 033fffbab..5eadcd6f5 100644 --- a/model/metrics/bullmq/bullmq__job__duration.json +++ b/model/metrics/bullmq/bullmq__job__duration.json @@ -5,5 +5,10 @@ "unit": "millisecond", "is_in_otel": false, "requirement_level": "opt_in", - "attributes": ["messaging.destination.name", "bullmq.job.name", "bullmq.job.status", "bullmq.job.state"] + "attributes": [ + "messaging.destination.name", + "messaging.bullmq.job.name", + "messaging.bullmq.job.status", + "messaging.bullmq.job.state" + ] } diff --git a/model/metrics/bullmq/bullmq__jobs__completed.json b/model/metrics/bullmq/bullmq__jobs__completed.json index 47e184944..5355d73f6 100644 --- a/model/metrics/bullmq/bullmq__jobs__completed.json +++ b/model/metrics/bullmq/bullmq__jobs__completed.json @@ -5,5 +5,10 @@ "unit": "none", "is_in_otel": false, "requirement_level": "opt_in", - "attributes": ["messaging.destination.name", "bullmq.job.name", "bullmq.job.status", "bullmq.job.state"] + "attributes": [ + "messaging.destination.name", + "messaging.bullmq.job.name", + "messaging.bullmq.job.status", + "messaging.bullmq.job.state" + ] } diff --git a/model/metrics/bullmq/bullmq__jobs__delayed.json b/model/metrics/bullmq/bullmq__jobs__delayed.json index 5aa108f30..49d02f774 100644 --- a/model/metrics/bullmq/bullmq__jobs__delayed.json +++ b/model/metrics/bullmq/bullmq__jobs__delayed.json @@ -5,5 +5,10 @@ "unit": "none", "is_in_otel": false, "requirement_level": "opt_in", - "attributes": ["messaging.destination.name", "bullmq.job.name", "bullmq.job.status", "bullmq.job.state"] + "attributes": [ + "messaging.destination.name", + "messaging.bullmq.job.name", + "messaging.bullmq.job.status", + "messaging.bullmq.job.state" + ] } diff --git a/model/metrics/bullmq/bullmq__jobs__failed.json b/model/metrics/bullmq/bullmq__jobs__failed.json index 16f3f50cd..f649fbc3b 100644 --- a/model/metrics/bullmq/bullmq__jobs__failed.json +++ b/model/metrics/bullmq/bullmq__jobs__failed.json @@ -5,5 +5,10 @@ "unit": "none", "is_in_otel": false, "requirement_level": "opt_in", - "attributes": ["messaging.destination.name", "bullmq.job.name", "bullmq.job.status", "bullmq.job.state"] + "attributes": [ + "messaging.destination.name", + "messaging.bullmq.job.name", + "messaging.bullmq.job.status", + "messaging.bullmq.job.state" + ] } diff --git a/model/metrics/bullmq/bullmq__jobs__retried.json b/model/metrics/bullmq/bullmq__jobs__retried.json index d09a9649d..29f5307a1 100644 --- a/model/metrics/bullmq/bullmq__jobs__retried.json +++ b/model/metrics/bullmq/bullmq__jobs__retried.json @@ -5,5 +5,10 @@ "unit": "none", "is_in_otel": false, "requirement_level": "opt_in", - "attributes": ["messaging.destination.name", "bullmq.job.name", "bullmq.job.status", "bullmq.job.state"] + "attributes": [ + "messaging.destination.name", + "messaging.bullmq.job.name", + "messaging.bullmq.job.status", + "messaging.bullmq.job.state" + ] } diff --git a/model/metrics/bullmq/bullmq__jobs__waiting.json b/model/metrics/bullmq/bullmq__jobs__waiting.json index 17a940b32..9417dbaaa 100644 --- a/model/metrics/bullmq/bullmq__jobs__waiting.json +++ b/model/metrics/bullmq/bullmq__jobs__waiting.json @@ -5,5 +5,10 @@ "unit": "none", "is_in_otel": false, "requirement_level": "opt_in", - "attributes": ["messaging.destination.name", "bullmq.job.name", "bullmq.job.status", "bullmq.job.state"] + "attributes": [ + "messaging.destination.name", + "messaging.bullmq.job.name", + "messaging.bullmq.job.status", + "messaging.bullmq.job.state" + ] } diff --git a/model/metrics/bullmq/bullmq__jobs__waiting_children.json b/model/metrics/bullmq/bullmq__jobs__waiting_children.json index a0eaeb5b2..6f5ecefeb 100644 --- a/model/metrics/bullmq/bullmq__jobs__waiting_children.json +++ b/model/metrics/bullmq/bullmq__jobs__waiting_children.json @@ -5,5 +5,10 @@ "unit": "none", "is_in_otel": false, "requirement_level": "opt_in", - "attributes": ["messaging.destination.name", "bullmq.job.name", "bullmq.job.status", "bullmq.job.state"] + "attributes": [ + "messaging.destination.name", + "messaging.bullmq.job.name", + "messaging.bullmq.job.status", + "messaging.bullmq.job.state" + ] } diff --git a/model/metrics/bullmq/bullmq__queue__jobs.json b/model/metrics/bullmq/bullmq__queue__jobs.json index f26f46b3e..0b00b5d42 100644 --- a/model/metrics/bullmq/bullmq__queue__jobs.json +++ b/model/metrics/bullmq/bullmq__queue__jobs.json @@ -5,5 +5,5 @@ "unit": "none", "is_in_otel": false, "requirement_level": "opt_in", - "attributes": ["messaging.destination.name", "bullmq.queue.jobs.state"] + "attributes": ["messaging.destination.name", "messaging.bullmq.queue.jobs.state"] } diff --git a/python/src/sentry_conventions/attributes.py b/python/src/sentry_conventions/attributes.py index a7de80362..6b5329ef8 100644 --- a/python/src/sentry_conventions/attributes.py +++ b/python/src/sentry_conventions/attributes.py @@ -2759,5001 +2759,5025 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: 194.3322 """ - # Path: model/attributes/bullmq/bullmq__flow__name.json - BULLMQ_FLOW_NAME: Literal["bullmq.flow.name"] = "bullmq.flow.name" - """The name of the root job of the BullMQ flow that FlowProducer.add() adds. + # Path: model/attributes/cache/cache__hit.json + CACHE_HIT: Literal["cache.hit"] = "cache.hit" + """If the cache was hit during this span. - Type: str + Type: bool Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "build-report" + Example: true """ - # Path: model/attributes/bullmq/bullmq__job__attempt_finished_timestamp.json - BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP: Literal[ - "bullmq.job.attempt_finished_timestamp" - ] = "bullmq.job.attempt_finished_timestamp" - """The time in milliseconds since the Unix epoch when the current attempt of the BullMQ job finished. + # Path: model/attributes/cache/cache__item_age.json + CACHE_ITEM_AGE: Literal["cache.item_age"] = "cache.item_age" + """The age of the cache entry in seconds, measured at read time. Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 1791184722406 + Example: 5 + Example: 3600 """ - # Path: model/attributes/bullmq/bullmq__job__bulk__names.json - BULLMQ_JOB_BULK_NAMES: Literal["bullmq.job.bulk.names"] = "bullmq.job.bulk.names" - """The names of the BullMQ jobs or flows that one bulk operation adds, for example Queue.addBulk(). + # Path: model/attributes/cache/cache__item_size.json + CACHE_ITEM_SIZE: Literal["cache.item_size"] = "cache.item_size" + """The size of the requested item in the cache. In bytes. + + Type: int + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: 58 + """ + + # Path: model/attributes/cache/cache__key.json + CACHE_KEY: Literal["cache.key"] = "cache.key" + """The key of the cache accessed. Type: List[str] Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: ["send-welcome-email","generate-report"] + Example: ["my-cache-key","my-other-cache-key"] """ - # Path: model/attributes/bullmq/bullmq__job__deduplication__key.json - BULLMQ_JOB_DEDUPLICATION_KEY: Literal["bullmq.job.deduplication.key"] = ( - "bullmq.job.deduplication.key" - ) - """The deduplication ID that Queue.removeDeduplicationKey() removes. + # Path: model/attributes/cache/cache__operation.json + CACHE_OPERATION: Literal["cache.operation"] = "cache.operation" + """The operation being performed on the cache. Type: str - Apply Scrubbing: auto + Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "user-42-sync" + Example: "get" + Example: "put" + Example: "remove" """ - # Path: model/attributes/bullmq/bullmq__job__finished__timestamp.json - BULLMQ_JOB_FINISHED_TIMESTAMP: Literal["bullmq.job.finished.timestamp"] = ( - "bullmq.job.finished.timestamp" - ) - """The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job. + # Path: model/attributes/cache/cache__tags.json + CACHE_TAGS: Literal["cache.tags"] = "cache.tags" + """The tags attached to the cache entry. Tags group entries so a cache can invalidate them together. + + Type: List[str] + Apply Scrubbing: auto - Applications pick tag values freely and often build them from record identifiers such as a user id. + Defined in OTEL: No + Visibility: public + Example: ["blog-posts","post-42"] + Example: ["products"] + """ + + # Path: model/attributes/cache/cache__ttl.json + CACHE_TTL: Literal["cache.ttl"] = "cache.ttl" + """The ttl (maximum lifetime) of the cache in seconds Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 1791184722411 + Example: 120 """ - # Path: model/attributes/bullmq/bullmq__job__ids.json - BULLMQ_JOB_IDS: Literal["bullmq.job.ids"] = "bullmq.job.ids" - """The IDs of the BullMQ jobs that Queue.clean() removed. + # Path: model/attributes/cache/cache__write.json + CACHE_WRITE: Literal["cache.write"] = "cache.write" + """If the cache operation resulted in a write to the cache. - Type: List[str] + Type: bool Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: ["1","2","3"] + Example: true """ - # Path: model/attributes/bullmq/bullmq__job__key.json - BULLMQ_JOB_KEY: Literal["bullmq.job.key"] = "bullmq.job.key" - """The key that a BullMQ remove operation for a debounce or repeatable key gets, for example Queue.removeDebounceKey(). + # Path: model/attributes/channel.json + CHANNEL: Literal["channel"] = "channel" + """The channel name that is being used. Type: str - Apply Scrubbing: auto + Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "user-42-sync" + Example: "mail" """ - # Path: model/attributes/bullmq/bullmq__job__name.json - BULLMQ_JOB_NAME: Literal["bullmq.job.name"] = "bullmq.job.name" - """The name of the BullMQ job, which the user passes to Queue.add() to identify the kind of work. + # Path: model/attributes/client/client__address.json + CLIENT_ADDRESS: Literal["client.address"] = "client.address" + """Client address - domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name. Type: str - Apply Scrubbing: manual - Defined in OTEL: No + Apply Scrubbing: auto + Defined in OTEL: Yes Visibility: public - Example: "send-welcome-email" - Example: "generate-report" + Aliases: http.client_ip + Example: "example.com" """ - # Path: model/attributes/bullmq/bullmq__job__processed__timestamp.json - BULLMQ_JOB_PROCESSED_TIMESTAMP: Literal["bullmq.job.processed.timestamp"] = ( - "bullmq.job.processed.timestamp" - ) - """The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job. + # Path: model/attributes/client/client__port.json + CLIENT_PORT: Literal["client.port"] = "client.port" + """Client port number. Type: int Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: 1791184722281 + Example: 5432 """ - # Path: model/attributes/bullmq/bullmq__job__progress.json - BULLMQ_JOB_PROGRESS: Literal["bullmq.job.progress"] = "bullmq.job.progress" - """The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress(). + # Path: model/attributes/cloud/cloud__account__id.json + CLOUD_ACCOUNT_ID: Literal["cloud.account.id"] = "cloud.account.id" + """The cloud account ID the resource is assigned to Type: str - Apply Scrubbing: auto - Defined in OTEL: No + Apply Scrubbing: manual + Defined in OTEL: Yes Visibility: public - Example: "{\"percentage\":50}" + Example: "123456789012" """ - # Path: model/attributes/bullmq/bullmq__job__scheduler__id.json - BULLMQ_JOB_SCHEDULER_ID: Literal["bullmq.job.scheduler.id"] = ( - "bullmq.job.scheduler.id" + # Path: model/attributes/cloud/cloud__availability_zone.json + CLOUD_AVAILABILITY_ZONE: Literal["cloud.availability_zone"] = ( + "cloud.availability_zone" ) - """The ID of the BullMQ job scheduler that adds the job. + """Cloud regions often have multiple, isolated locations known as zones to increase availability Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: "daily-report" + Example: "us-east-1c" """ - # Path: model/attributes/bullmq/bullmq__job__state.json - BULLMQ_JOB_STATE: Literal["bullmq.job.state"] = "bullmq.job.state" - """The state of the BullMQ job that a job metric counts. + # Path: model/attributes/cloud/cloud__platform.json + CLOUD_PLATFORM: Literal["cloud.platform"] = "cloud.platform" + """The cloud platform in use Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: "completed" - Example: "failed" - Example: "delayed" + Example: "aws_lambda" """ - # Path: model/attributes/bullmq/bullmq__job__status.json - BULLMQ_JOB_STATUS: Literal["bullmq.job.status"] = "bullmq.job.status" - """The state of the BullMQ job that a job metric counts. + # Path: model/attributes/cloud/cloud__provider.json + CLOUD_PROVIDER: Literal["cloud.provider"] = "cloud.provider" + """Name of the cloud provider Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: "completed" - Example: "failed" - Example: "delayed" + Example: "aws" """ - # Path: model/attributes/bullmq/bullmq__job__type.json - BULLMQ_JOB_TYPE: Literal["bullmq.job.type"] = "bullmq.job.type" - """The job state from which Queue.clean() removes BullMQ jobs. + # Path: model/attributes/cloud/cloud__region.json + CLOUD_REGION: Literal["cloud.region"] = "cloud.region" + """The geographical region the resource is running Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: "completed" - Example: "failed" + Aliases: aws_region, gcp_region + Example: "us-east-1" """ - # Path: model/attributes/bullmq/bullmq__queue__clean__count.json - BULLMQ_QUEUE_CLEAN_COUNT: Literal["bullmq.queue.clean.count"] = ( - "bullmq.queue.clean.count" - ) - """The number of BullMQ jobs that Queue.clean() removed. + # Path: model/attributes/cloud/cloud__resource_id.json + CLOUD_RESOURCE_ID: Literal["cloud.resource_id"] = "cloud.resource_id" + """Cloud provider-specific native identifier of the monitored cloud resource - Type: int + Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: 25 + Aliases: faas.id + Example: "arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function" """ - # Path: model/attributes/bullmq/bullmq__queue__clean__limit.json - BULLMQ_QUEUE_CLEAN_LIMIT: Literal["bullmq.queue.clean.limit"] = ( - "bullmq.queue.clean.limit" - ) - """The maximum number of BullMQ jobs that Queue.clean() removes. + # Path: model/attributes/cloudflare/cloudflare__d1__duration.json + CLOUDFLARE_D1_DURATION: Literal["cloudflare.d1.duration"] = "cloudflare.d1.duration" + """The duration of a Cloudflare D1 operation. Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 1000 + Example: 543 """ - # Path: model/attributes/bullmq/bullmq__queue__drain__delay.json - BULLMQ_QUEUE_DRAIN_DELAY: Literal["bullmq.queue.drain.delay"] = ( - "bullmq.queue.drain.delay" + # Path: model/attributes/cloudflare/cloudflare__d1__query_type.json + CLOUDFLARE_D1_QUERY_TYPE: Literal["cloudflare.d1.query_type"] = ( + "cloudflare.d1.query_type" ) - """Whether Queue.drain() also removes the delayed BullMQ jobs. + """The type of query executed in a Cloudflare D1 operation - Type: bool + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: true + Aliases: db.operation.name, db.operation, redis.command + DEPRECATED: Use db.operation.name instead + Example: "run" """ - # Path: model/attributes/bullmq/bullmq__queue__event__max__length.json - BULLMQ_QUEUE_EVENT_MAX_LENGTH: Literal["bullmq.queue.event.max.length"] = ( - "bullmq.queue.event.max.length" + # Path: model/attributes/cloudflare/cloudflare__d1__rows_read.json + CLOUDFLARE_D1_ROWS_READ: Literal["cloudflare.d1.rows_read"] = ( + "cloudflare.d1.rows_read" ) - """The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream. + """The number of rows read in a Cloudflare D1 operation. Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 10000 + Example: 12 """ - # Path: model/attributes/bullmq/bullmq__queue__grace.json - BULLMQ_QUEUE_GRACE: Literal["bullmq.queue.grace"] = "bullmq.queue.grace" - """The grace period in milliseconds that Queue.clean() uses. Only BullMQ jobs that are older are removed. + # Path: model/attributes/cloudflare/cloudflare__d1__rows_written.json + CLOUDFLARE_D1_ROWS_WRITTEN: Literal["cloudflare.d1.rows_written"] = ( + "cloudflare.d1.rows_written" + ) + """The number of rows written in a Cloudflare D1 operation. Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 60000 + Example: 12 """ - # Path: model/attributes/bullmq/bullmq__queue__jobs__state.json - BULLMQ_QUEUE_JOBS_STATE: Literal["bullmq.queue.jobs.state"] = ( - "bullmq.queue.jobs.state" - ) - """The BullMQ job state that the queue job count metric counts. + # Path: model/attributes/cloudflare/cloudflare__durable_object__query__bindings.json + CLOUDFLARE_DURABLE_OBJECT_QUERY_BINDINGS: Literal[ + "cloudflare.durable_object.query.bindings" + ] = "cloudflare.durable_object.query.bindings" + """The number of bound parameters passed to the SQL exec call. - Type: str + Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "waiting" - Example: "active" - Example: "completed" + Example: 2 """ - # Path: model/attributes/bullmq/bullmq__queue__rate__limit.json - BULLMQ_QUEUE_RATE_LIMIT: Literal["bullmq.queue.rate.limit"] = ( - "bullmq.queue.rate.limit" - ) - """The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue. + # Path: model/attributes/cloudflare/cloudflare__durable_object__response__rows_read.json + CLOUDFLARE_DURABLE_OBJECT_RESPONSE_ROWS_READ: Literal[ + "cloudflare.durable_object.response.rows_read" + ] = "cloudflare.durable_object.response.rows_read" + """The number of rows read by a Cloudflare Durable Object SQL operation. Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 5000 + Example: 12 """ - # Path: model/attributes/bullmq/bullmq__worker__do__not__wait__active.json - BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE: Literal["bullmq.worker.do.not.wait.active"] = ( - "bullmq.worker.do.not.wait.active" - ) - """Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish. + # Path: model/attributes/cloudflare/cloudflare__durable_object__response__rows_written.json + CLOUDFLARE_DURABLE_OBJECT_RESPONSE_ROWS_WRITTEN: Literal[ + "cloudflare.durable_object.response.rows_written" + ] = "cloudflare.durable_object.response.rows_written" + """The number of rows written by a Cloudflare Durable Object SQL operation. - Type: bool + Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: false + Example: 1 """ - # Path: model/attributes/bullmq/bullmq__worker__force__close.json - BULLMQ_WORKER_FORCE_CLOSE: Literal["bullmq.worker.force.close"] = ( - "bullmq.worker.force.close" - ) - """Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish. + # Path: model/attributes/cloudflare/cloudflare__r2__bucket.json + CLOUDFLARE_R2_BUCKET: Literal["cloudflare.r2.bucket"] = "cloudflare.r2.bucket" + """The name of the Cloudflare R2 bucket binding - Type: bool + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: false + Example: "MY_BUCKET" """ - # Path: model/attributes/bullmq/bullmq__worker__id.json - BULLMQ_WORKER_ID: Literal["bullmq.worker.id"] = "bullmq.worker.id" - """The ID that BullMQ generates for the Worker instance. + # Path: model/attributes/cloudflare/cloudflare__r2__operation.json + CLOUDFLARE_R2_OPERATION: Literal["cloudflare.r2.operation"] = ( + "cloudflare.r2.operation" + ) + """The R2 API operation being performed Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "03327d57-05cc-4528-9d24-c59bf6520039" + Example: "GetObject" """ - # Path: model/attributes/bullmq/bullmq__worker__jobs__to__extend__locks.json - BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS: Literal[ - "bullmq.worker.jobs.to.extend.locks" - ] = "bullmq.worker.jobs.to.extend.locks" - """The IDs of the BullMQ jobs whose locks the Worker extends. + # Path: model/attributes/cloudflare/cloudflare__r2__request__delimiter.json + CLOUDFLARE_R2_REQUEST_DELIMITER: Literal["cloudflare.r2.request.delimiter"] = ( + "cloudflare.r2.request.delimiter" + ) + """The delimiter used to group objects in an R2 list operation - Type: List[str] + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: ["1","2"] + Example: "/" """ - # Path: model/attributes/bullmq/bullmq__worker__name.json - BULLMQ_WORKER_NAME: Literal["bullmq.worker.name"] = "bullmq.worker.name" - """The name that the user gives to the BullMQ Worker in its options. - - Type: str + # Path: model/attributes/cloudflare/cloudflare__r2__request__key.json + CLOUDFLARE_R2_REQUEST_KEY: Literal["cloudflare.r2.request.key"] = ( + "cloudflare.r2.request.key" + ) + """The object key used in the R2 operation + + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "email-worker" + Example: "my-file.txt" """ - # Path: model/attributes/bullmq/bullmq__worker__rate__limit.json - BULLMQ_WORKER_RATE_LIMIT: Literal["bullmq.worker.rate.limit"] = ( - "bullmq.worker.rate.limit" + # Path: model/attributes/cloudflare/cloudflare__r2__request__part_number.json + CLOUDFLARE_R2_REQUEST_PART_NUMBER: Literal["cloudflare.r2.request.part_number"] = ( + "cloudflare.r2.request.part_number" ) - """The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker. + """The part number in a multipart upload operation Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 5000 + Example: 1 """ - # Path: model/attributes/bullmq/bullmq__worker__stalled__jobs.json - BULLMQ_WORKER_STALLED_JOBS: Literal["bullmq.worker.stalled.jobs"] = ( - "bullmq.worker.stalled.jobs" + # Path: model/attributes/cloudflare/cloudflare__r2__request__prefix.json + CLOUDFLARE_R2_REQUEST_PREFIX: Literal["cloudflare.r2.request.prefix"] = ( + "cloudflare.r2.request.prefix" ) - """The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state. + """The prefix used to filter objects in an R2 list operation - Type: List[str] + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: ["1","2"] + Example: "images/" """ - # Path: model/attributes/cache/cache__hit.json - CACHE_HIT: Literal["cache.hit"] = "cache.hit" - """If the cache was hit during this span. + # Path: model/attributes/cloudflare/cloudflare__workflow__attempt.json + CLOUDFLARE_WORKFLOW_ATTEMPT: Literal["cloudflare.workflow.attempt"] = ( + "cloudflare.workflow.attempt" + ) + """The current attempt number for a Cloudflare Workflow step - Type: bool + Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: true + Example: 1 """ - # Path: model/attributes/cache/cache__item_age.json - CACHE_ITEM_AGE: Literal["cache.item_age"] = "cache.item_age" - """The age of the cache entry in seconds, measured at read time. + # Path: model/attributes/cloudflare/cloudflare__workflow__retries__backoff.json + CLOUDFLARE_WORKFLOW_RETRIES_BACKOFF: Literal[ + "cloudflare.workflow.retries.backoff" + ] = "cloudflare.workflow.retries.backoff" + """The backoff strategy for Cloudflare Workflow step retries - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 5 - Example: 3600 + Example: "exponential" """ - # Path: model/attributes/cache/cache__item_size.json - CACHE_ITEM_SIZE: Literal["cache.item_size"] = "cache.item_size" - """The size of the requested item in the cache. In bytes. + # Path: model/attributes/cloudflare/cloudflare__workflow__retries__delay.json + CLOUDFLARE_WORKFLOW_RETRIES_DELAY: Literal["cloudflare.workflow.retries.delay"] = ( + "cloudflare.workflow.retries.delay" + ) + """The delay between Cloudflare Workflow step retries - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 58 + Example: "5 seconds" """ - # Path: model/attributes/cache/cache__key.json - CACHE_KEY: Literal["cache.key"] = "cache.key" - """The key of the cache accessed. + # Path: model/attributes/cloudflare/cloudflare__workflow__retries__limit.json + CLOUDFLARE_WORKFLOW_RETRIES_LIMIT: Literal["cloudflare.workflow.retries.limit"] = ( + "cloudflare.workflow.retries.limit" + ) + """The maximum number of retries for a Cloudflare Workflow step - Type: List[str] + Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: ["my-cache-key","my-other-cache-key"] + Example: 3 """ - # Path: model/attributes/cache/cache__operation.json - CACHE_OPERATION: Literal["cache.operation"] = "cache.operation" - """The operation being performed on the cache. + # Path: model/attributes/cloudflare/cloudflare__workflow__timeout.json + CLOUDFLARE_WORKFLOW_TIMEOUT: Literal["cloudflare.workflow.timeout"] = ( + "cloudflare.workflow.timeout" + ) + """The timeout duration for a Cloudflare Workflow step Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "get" - Example: "put" - Example: "remove" - """ - - # Path: model/attributes/cache/cache__tags.json - CACHE_TAGS: Literal["cache.tags"] = "cache.tags" - """The tags attached to the cache entry. Tags group entries so a cache can invalidate them together. - - Type: List[str] - Apply Scrubbing: auto - Applications pick tag values freely and often build them from record identifiers such as a user id. - Defined in OTEL: No - Visibility: public - Example: ["blog-posts","post-42"] - Example: ["products"] + Example: "1 minute" """ - # Path: model/attributes/cache/cache__ttl.json - CACHE_TTL: Literal["cache.ttl"] = "cache.ttl" - """The ttl (maximum lifetime) of the cache in seconds + # Path: model/attributes/cls/cls__source__[key].json + CLS_SOURCE_KEY: Literal["cls.source."] = "cls.source." + """The HTML elements or components responsible for the layout shift. is a numeric index from 1 to N - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 120 + Has Dynamic Suffix: true + Aliases: browser.web_vital.cls.source. + DEPRECATED: Use browser.web_vital.cls.source. instead - The CLS source is now recorded as a browser.web_vital.cls.source. attribute. + Example: "body > div#app" """ - # Path: model/attributes/cache/cache__write.json - CACHE_WRITE: Literal["cache.write"] = "cache.write" - """If the cache operation resulted in a write to the cache. + # Path: model/attributes/cls.json + CLS: Literal["cls"] = "cls" + """The value of the recorded Cumulative Layout Shift (CLS) web vital - Type: bool + Type: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: true + Aliases: browser.web_vital.cls.value + DEPRECATED: Use browser.web_vital.cls.value instead - The CLS web vital is now recorded as a browser.web_vital.cls.value attribute. + Example: 0.2361 """ - # Path: model/attributes/channel.json - CHANNEL: Literal["channel"] = "channel" - """The channel name that is being used. + # Path: model/attributes/code/code__file__path.json + CODE_FILE_PATH: Literal["code.file.path"] = "code.file.path" + """The source code file name that identifies the code unit as uniquely as possible (preferably an absolute file path). Type: str Apply Scrubbing: manual - Defined in OTEL: No - Visibility: public - Example: "mail" - """ - - # Path: model/attributes/client/client__address.json - CLIENT_ADDRESS: Literal["client.address"] = "client.address" - """Client address - domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name. - - Type: str - Apply Scrubbing: auto Defined in OTEL: Yes Visibility: public - Aliases: http.client_ip - Example: "example.com" + Aliases: code.filepath, sveltekit.load.node_id + Example: "/app/myapplication/http/handler/server.py" """ - # Path: model/attributes/client/client__port.json - CLIENT_PORT: Literal["client.port"] = "client.port" - """Client port number. + # Path: model/attributes/code/code__filepath.json + CODE_FILEPATH: Literal["code.filepath"] = "code.filepath" + """The source code file name that identifies the code unit as uniquely as possible (preferably an absolute file path). - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Example: 5432 + Aliases: code.file.path, sveltekit.load.node_id + DEPRECATED: Use code.file.path instead + Example: "/app/myapplication/http/handler/server.py" """ - # Path: model/attributes/cloud/cloud__account__id.json - CLOUD_ACCOUNT_ID: Literal["cloud.account.id"] = "cloud.account.id" - """The cloud account ID the resource is assigned to + # Path: model/attributes/code/code__function.json + CODE_FUNCTION: Literal["code.function"] = "code.function" + """The method or function name, or equivalent (usually rightmost part of the code unit's name). Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Example: "123456789012" + Aliases: code.function.name, django.function_name + Example: "server_request" """ - # Path: model/attributes/cloud/cloud__availability_zone.json - CLOUD_AVAILABILITY_ZONE: Literal["cloud.availability_zone"] = ( - "cloud.availability_zone" - ) - """Cloud regions often have multiple, isolated locations known as zones to increase availability + # Path: model/attributes/code/code__function__name.json + CODE_FUNCTION_NAME: Literal["code.function.name"] = "code.function.name" + """The method or function fully-qualified name without arguments. Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Example: "us-east-1c" + Aliases: code.function, django.function_name + Example: "server_request" """ - # Path: model/attributes/cloud/cloud__platform.json - CLOUD_PLATFORM: Literal["cloud.platform"] = "cloud.platform" - """The cloud platform in use + # Path: model/attributes/code/code__line__number.json + CODE_LINE_NUMBER: Literal["code.line.number"] = "code.line.number" + """The line number in code.filepath best representing the operation. It SHOULD point within the code unit named in code.function - Type: str + Type: int Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Example: "aws_lambda" + Aliases: code.lineno + Example: 42 """ - # Path: model/attributes/cloud/cloud__provider.json - CLOUD_PROVIDER: Literal["cloud.provider"] = "cloud.provider" - """Name of the cloud provider + # Path: model/attributes/code/code__lineno.json + CODE_LINENO: Literal["code.lineno"] = "code.lineno" + """The line number in code.filepath best representing the operation. It SHOULD point within the code unit named in code.function - Type: str + Type: int Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Example: "aws" + Aliases: code.line.number + DEPRECATED: Use code.line.number instead + Example: 42 """ - # Path: model/attributes/cloud/cloud__region.json - CLOUD_REGION: Literal["cloud.region"] = "cloud.region" - """The geographical region the resource is running + # Path: model/attributes/code/code__namespace.json + CODE_NAMESPACE: Literal["code.namespace"] = "code.namespace" + """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: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: aws_region, gcp_region - Example: "us-east-1" + Example: "http.handler" """ - # Path: model/attributes/cloud/cloud__resource_id.json - CLOUD_RESOURCE_ID: Literal["cloud.resource_id"] = "cloud.resource_id" - """Cloud provider-specific native identifier of the monitored cloud resource + # Path: model/attributes/code.json + CODE: Literal["code"] = "code" + """Status code of the RPC returned by the RPC server or generated by the client. Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: faas.id - Example: "arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function" + Aliases: rpc.grpc.status_code, rpc.response.status_code + DEPRECATED: Use rpc.response.status_code instead + Example: "DEADLINE_EXCEEDED" """ - # Path: model/attributes/cloudflare/cloudflare__d1__duration.json - CLOUDFLARE_D1_DURATION: Literal["cloudflare.d1.duration"] = "cloudflare.d1.duration" - """The duration of a Cloudflare D1 operation. + # Path: model/attributes/connection/connection__rtt.json + CONNECTION_RTT: Literal["connection.rtt"] = "connection.rtt" + """Specifies the estimated effective round-trip time of the current connection, in milliseconds. Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 543 + Aliases: network.connection.rtt + DEPRECATED: Use network.connection.rtt instead - Old attribute name (no official namespace), to be replaced with network.connection.rtt for span-first future + Example: 100 """ - # Path: model/attributes/cloudflare/cloudflare__d1__query_type.json - CLOUDFLARE_D1_QUERY_TYPE: Literal["cloudflare.d1.query_type"] = ( - "cloudflare.d1.query_type" - ) - """The type of query executed in a Cloudflare D1 operation + # Path: model/attributes/connectionType.json + CONNECTIONTYPE: Literal["connectionType"] = "connectionType" + """Specifies the type of the current connection (e.g. wifi, ethernet, cellular , etc). Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: db.operation.name, db.operation, redis.command - DEPRECATED: Use db.operation.name instead - Example: "run" + Aliases: network.connection.type, device.connection_type + DEPRECATED: Use network.connection.type instead - Old namespace-less attribute, to be replaced with network.connection.type for span-first future + Example: "wifi" """ - # Path: model/attributes/cloudflare/cloudflare__d1__rows_read.json - CLOUDFLARE_D1_ROWS_READ: Literal["cloudflare.d1.rows_read"] = ( - "cloudflare.d1.rows_read" - ) - """The number of rows read in a Cloudflare D1 operation. + # Path: model/attributes/culture/culture__calendar.json + CULTURE_CALENDAR: Literal["culture.calendar"] = "culture.calendar" + """The calendar system used by the culture. - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 12 - """ - - # Path: model/attributes/cloudflare/cloudflare__d1__rows_written.json - CLOUDFLARE_D1_ROWS_WRITTEN: Literal["cloudflare.d1.rows_written"] = ( - "cloudflare.d1.rows_written" - ) - """The number of rows written in a Cloudflare D1 operation. - - Type: int - Apply Scrubbing: manual - Defined in OTEL: No - Visibility: public - Example: 12 - """ - - # Path: model/attributes/cloudflare/cloudflare__durable_object__query__bindings.json - CLOUDFLARE_DURABLE_OBJECT_QUERY_BINDINGS: Literal[ - "cloudflare.durable_object.query.bindings" - ] = "cloudflare.durable_object.query.bindings" - """The number of bound parameters passed to the SQL exec call. - - Type: int - Apply Scrubbing: manual - Defined in OTEL: No - Visibility: public - Example: 2 + Example: "GregorianCalendar" """ - # Path: model/attributes/cloudflare/cloudflare__durable_object__response__rows_read.json - CLOUDFLARE_DURABLE_OBJECT_RESPONSE_ROWS_READ: Literal[ - "cloudflare.durable_object.response.rows_read" - ] = "cloudflare.durable_object.response.rows_read" - """The number of rows read by a Cloudflare Durable Object SQL operation. + # Path: model/attributes/culture/culture__display_name.json + CULTURE_DISPLAY_NAME: Literal["culture.display_name"] = "culture.display_name" + """Human readable name of the culture. - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 12 + Example: "English (United States)" """ - # Path: model/attributes/cloudflare/cloudflare__durable_object__response__rows_written.json - CLOUDFLARE_DURABLE_OBJECT_RESPONSE_ROWS_WRITTEN: Literal[ - "cloudflare.durable_object.response.rows_written" - ] = "cloudflare.durable_object.response.rows_written" - """The number of rows written by a Cloudflare Durable Object SQL operation. + # Path: model/attributes/culture/culture__is_24_hour_format.json + CULTURE_IS_24_HOUR_FORMAT: Literal["culture.is_24_hour_format"] = ( + "culture.is_24_hour_format" + ) + """Whether the culture uses 24-hour time format. - Type: int + Type: bool Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 1 + Example: true """ - # Path: model/attributes/cloudflare/cloudflare__r2__bucket.json - CLOUDFLARE_R2_BUCKET: Literal["cloudflare.r2.bucket"] = "cloudflare.r2.bucket" - """The name of the Cloudflare R2 bucket binding + # Path: model/attributes/culture/culture__locale.json + CULTURE_LOCALE: Literal["culture.locale"] = "culture.locale" + """The locale identifier following RFC 4646. Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "MY_BUCKET" + Example: "en-US" """ - # Path: model/attributes/cloudflare/cloudflare__r2__operation.json - CLOUDFLARE_R2_OPERATION: Literal["cloudflare.r2.operation"] = ( - "cloudflare.r2.operation" - ) - """The R2 API operation being performed + # Path: model/attributes/culture/culture__timezone.json + CULTURE_TIMEZONE: Literal["culture.timezone"] = "culture.timezone" + """The timezone of the culture, as a geographic timezone identifier. Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "GetObject" + Example: "Europe/Vienna" """ - # Path: model/attributes/cloudflare/cloudflare__r2__request__delimiter.json - CLOUDFLARE_R2_REQUEST_DELIMITER: Literal["cloudflare.r2.request.delimiter"] = ( - "cloudflare.r2.request.delimiter" - ) - """The delimiter used to group objects in an R2 list operation + # Path: model/attributes/db/db__collection__name.json + DB_COLLECTION_NAME: Literal["db.collection.name"] = "db.collection.name" + """The name of a collection (table, container) within the database. Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: "/" + Aliases: db.mongodb.collection + Example: "users" """ - # Path: model/attributes/cloudflare/cloudflare__r2__request__key.json - CLOUDFLARE_R2_REQUEST_KEY: Literal["cloudflare.r2.request.key"] = ( - "cloudflare.r2.request.key" - ) - """The object key used in the R2 operation + # Path: model/attributes/db/db__connection_string.json + DB_CONNECTION_STRING: Literal["db.connection_string"] = "db.connection_string" + """The connection string used to connect to the database. Type: str - Apply Scrubbing: manual - Defined in OTEL: No + Apply Scrubbing: auto + Defined in OTEL: Yes Visibility: public - Example: "my-file.txt" + DEPRECATED: No replacement at this time - This attribute is deprecated. The connection is described by server.address and server.port instead, so the value cannot be copied to a single replacement attribute. + Example: "redis://localhost:6379" """ - # Path: model/attributes/cloudflare/cloudflare__r2__request__part_number.json - CLOUDFLARE_R2_REQUEST_PART_NUMBER: Literal["cloudflare.r2.request.part_number"] = ( - "cloudflare.r2.request.part_number" - ) - """The part number in a multipart upload operation + # Path: model/attributes/db/db__driver__name.json + DB_DRIVER_NAME: Literal["db.driver.name"] = "db.driver.name" + """The name of the driver used for the database connection. - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 1 + Example: "psycopg2" """ - # Path: model/attributes/cloudflare/cloudflare__r2__request__prefix.json - CLOUDFLARE_R2_REQUEST_PREFIX: Literal["cloudflare.r2.request.prefix"] = ( - "cloudflare.r2.request.prefix" - ) - """The prefix used to filter objects in an R2 list operation + # Path: model/attributes/db/db__mongodb__collection.json + DB_MONGODB_COLLECTION: Literal["db.mongodb.collection"] = "db.mongodb.collection" + """The MongoDB collection being accessed. Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "images/" + Aliases: db.collection.name + DEPRECATED: Use db.collection.name instead - This attribute is being deprecated in favor of db.collection.name, which is the OTel-aligned replacement. + Example: "users" """ - # Path: model/attributes/cloudflare/cloudflare__workflow__attempt.json - CLOUDFLARE_WORKFLOW_ATTEMPT: Literal["cloudflare.workflow.attempt"] = ( - "cloudflare.workflow.attempt" - ) - """The current attempt number for a Cloudflare Workflow step + # Path: model/attributes/db/db__name.json + DB_NAME: Literal["db.name"] = "db.name" + """The name of the database being accessed. - Type: int + Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: 1 + Aliases: db.namespace + DEPRECATED: Use db.namespace instead + Example: "customers" """ - # Path: model/attributes/cloudflare/cloudflare__workflow__retries__backoff.json - CLOUDFLARE_WORKFLOW_RETRIES_BACKOFF: Literal[ - "cloudflare.workflow.retries.backoff" - ] = "cloudflare.workflow.retries.backoff" - """The backoff strategy for Cloudflare Workflow step retries + # Path: model/attributes/db/db__namespace.json + DB_NAMESPACE: Literal["db.namespace"] = "db.namespace" + """The name of the database being accessed. Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: "exponential" + Aliases: db.name + Example: "customers" """ - # Path: model/attributes/cloudflare/cloudflare__workflow__retries__delay.json - CLOUDFLARE_WORKFLOW_RETRIES_DELAY: Literal["cloudflare.workflow.retries.delay"] = ( - "cloudflare.workflow.retries.delay" - ) - """The delay between Cloudflare Workflow step retries + # Path: model/attributes/db/db__operation.json + DB_OPERATION: Literal["db.operation"] = "db.operation" + """The name of the operation being executed. Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: "5 seconds" + Aliases: db.operation.name, cloudflare.d1.query_type, redis.command + DEPRECATED: Use db.operation.name instead + Example: "SELECT" """ - # Path: model/attributes/cloudflare/cloudflare__workflow__retries__limit.json - CLOUDFLARE_WORKFLOW_RETRIES_LIMIT: Literal["cloudflare.workflow.retries.limit"] = ( - "cloudflare.workflow.retries.limit" + # Path: model/attributes/db/db__operation__batch__size.json + DB_OPERATION_BATCH_SIZE: Literal["db.operation.batch.size"] = ( + "db.operation.batch.size" ) - """The maximum number of retries for a Cloudflare Workflow step + """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: int Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public Example: 3 """ - # Path: model/attributes/cloudflare/cloudflare__workflow__timeout.json - CLOUDFLARE_WORKFLOW_TIMEOUT: Literal["cloudflare.workflow.timeout"] = ( - "cloudflare.workflow.timeout" - ) - """The timeout duration for a Cloudflare Workflow step + # Path: model/attributes/db/db__operation__name.json + DB_OPERATION_NAME: Literal["db.operation.name"] = "db.operation.name" + """The name of the operation being executed. Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: "1 minute" + Aliases: db.operation, cloudflare.d1.query_type, redis.command + Example: "SELECT" """ - # Path: model/attributes/cls/cls__source__[key].json - CLS_SOURCE_KEY: Literal["cls.source."] = "cls.source." - """The HTML elements or components responsible for the layout shift. is a numeric index from 1 to N + # Path: model/attributes/db/db__params.json + DB_PARAMS: Literal["db.params"] = "db.params" + """The query bindings for a database request. Type: str - Apply Scrubbing: manual + Apply Scrubbing: auto Defined in OTEL: No Visibility: public - Has Dynamic Suffix: true - Aliases: browser.web_vital.cls.source. - DEPRECATED: Use browser.web_vital.cls.source. instead - The CLS source is now recorded as a browser.web_vital.cls.source. attribute. - Example: "body > div#app" + DEPRECATED: Use db.query.parameter. instead - Instead of adding every binding in the db.params attribute, add them as individual entries with db.query.parameter.. + Example: "[{\"x\": 100}]" """ - # Path: model/attributes/cls.json - CLS: Literal["cls"] = "cls" - """The value of the recorded Cumulative Layout Shift (CLS) web vital + # Path: model/attributes/db/db__query__parameter__[key].json + DB_QUERY_PARAMETER_KEY: Literal["db.query.parameter."] = ( + "db.query.parameter." + ) + """A query parameter used in db.query.text, with being the parameter name, and the attribute value being a string representation of the parameter value. - Type: float - Apply Scrubbing: manual - Defined in OTEL: No + Type: str + Apply Scrubbing: auto + Defined in OTEL: Yes Visibility: public - Aliases: browser.web_vital.cls.value - DEPRECATED: Use browser.web_vital.cls.value instead - The CLS web vital is now recorded as a browser.web_vital.cls.value attribute. - Example: 0.2361 + Has Dynamic Suffix: true + Example: "db.query.parameter.foo='123'" """ - # Path: model/attributes/code/code__file__path.json - CODE_FILE_PATH: Literal["code.file.path"] = "code.file.path" - """The source code file name that identifies the code unit as uniquely as possible (preferably an absolute file path). + # Path: model/attributes/db/db__query__summary.json + DB_QUERY_SUMMARY: Literal["db.query.summary"] = "db.query.summary" + """A shortened representation of operation(s) in the full query. This attribute must be low-cardinality and should only contain the operation table names. Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: code.filepath, sveltekit.load.node_id - Example: "/app/myapplication/http/handler/server.py" + Example: "SELECT users" + Example: "INSERT products; UPDATE orders" """ - # Path: model/attributes/code/code__filepath.json - CODE_FILEPATH: Literal["code.filepath"] = "code.filepath" - """The source code file name that identifies the code unit as uniquely as possible (preferably an absolute file path). + # Path: model/attributes/db/db__query__text.json + DB_QUERY_TEXT: Literal["db.query.text"] = "db.query.text" + """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.` to add the parameter value. Type: str - Apply Scrubbing: manual + Apply Scrubbing: auto Defined in OTEL: Yes Visibility: public - Aliases: code.file.path, sveltekit.load.node_id - DEPRECATED: Use code.file.path instead - Example: "/app/myapplication/http/handler/server.py" + Aliases: db.statement, query + Example: "SELECT * FROM users WHERE id = $1" """ - # Path: model/attributes/code/code__function.json - CODE_FUNCTION: Literal["code.function"] = "code.function" - """The method or function name, or equivalent (usually rightmost part of the code unit's name). + # Path: model/attributes/db/db__redis__connection.json + DB_REDIS_CONNECTION: Literal["db.redis.connection"] = "db.redis.connection" + """The redis connection name. Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: code.function.name, django.function_name - Example: "server_request" + Example: "my-redis-instance" """ - # Path: model/attributes/code/code__function__name.json - CODE_FUNCTION_NAME: Literal["code.function.name"] = "code.function.name" - """The method or function fully-qualified name without arguments. + # Path: model/attributes/db/db__redis__key.json + DB_REDIS_KEY: Literal["db.redis.key"] = "db.redis.key" + """The key the Redis command is operating on. Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: code.function, django.function_name - Example: "server_request" + Aliases: redis.key + Example: "user:2047:city" """ - # Path: model/attributes/code/code__line__number.json - CODE_LINE_NUMBER: Literal["code.line.number"] = "code.line.number" - """The line number in code.filepath best representing the operation. It SHOULD point within the code unit named in code.function + # Path: model/attributes/db/db__redis__parameters.json + DB_REDIS_PARAMETERS: Literal["db.redis.parameters"] = "db.redis.parameters" + """The array of command parameters given to a redis command. - Type: int - Apply Scrubbing: manual - Defined in OTEL: Yes + Type: List[str] + Apply Scrubbing: auto + Defined in OTEL: No Visibility: public - Aliases: code.lineno - Example: 42 + Example: ["test","*"] """ - # Path: model/attributes/code/code__lineno.json - CODE_LINENO: Literal["code.lineno"] = "code.lineno" - """The line number in code.filepath best representing the operation. It SHOULD point within the code unit named in code.function + # Path: model/attributes/db/db__response__status_code.json + DB_RESPONSE_STATUS_CODE: Literal["db.response.status_code"] = ( + "db.response.status_code" + ) + """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: int + Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: code.line.number - DEPRECATED: Use code.line.number instead - Example: 42 + Example: "ORA-17002" """ - # Path: model/attributes/code/code__namespace.json - CODE_NAMESPACE: Literal["code.namespace"] = "code.namespace" - """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. + # Path: model/attributes/db/db__sql__bindings.json + DB_SQL_BINDINGS: Literal["db.sql.bindings"] = "db.sql.bindings" + """The array of query bindings. + + Type: List[str] + Apply Scrubbing: auto + Defined in OTEL: No + Visibility: public + DEPRECATED: Use db.query.parameter. instead - Instead of adding every binding in the db.sql.bindings attribute, add them as individual entires with db.query.parameter.. + Example: ["1","foo"] + """ + + # Path: model/attributes/db/db__statement.json + DB_STATEMENT: Literal["db.statement"] = "db.statement" + """The database statement being executed. Type: str - Apply Scrubbing: manual + Apply Scrubbing: auto Defined in OTEL: Yes Visibility: public - Example: "http.handler" + Aliases: db.query.text, query + DEPRECATED: Use db.query.text instead - While this attribute never specifically required parameterization, the replacement, db.query.text, does. + Example: "SELECT * FROM users WHERE id = $1" """ - # Path: model/attributes/code.json - CODE: Literal["code"] = "code" - """Status code of the RPC returned by the RPC server or generated by the client. + # Path: model/attributes/db/db__stored_procedure__name.json + DB_STORED_PROCEDURE_NAME: Literal["db.stored_procedure.name"] = ( + "db.stored_procedure.name" + ) + """The name of a stored procedure being called. Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Aliases: rpc.grpc.status_code, rpc.response.status_code - DEPRECATED: Use rpc.response.status_code instead - Example: "DEADLINE_EXCEEDED" + Example: "GetUserById" """ - # Path: model/attributes/connection/connection__rtt.json - CONNECTION_RTT: Literal["connection.rtt"] = "connection.rtt" - """Specifies the estimated effective round-trip time of the current connection, in milliseconds. + # Path: model/attributes/db/db__system.json + DB_SYSTEM: Literal["db.system"] = "db.system" + """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. - Type: int + Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Aliases: network.connection.rtt - DEPRECATED: Use network.connection.rtt instead - Old attribute name (no official namespace), to be replaced with network.connection.rtt for span-first future - Example: 100 + Aliases: db.system.name + DEPRECATED: Use db.system.name instead + Example: "postgresql" """ - # Path: model/attributes/connectionType.json - CONNECTIONTYPE: Literal["connectionType"] = "connectionType" - """Specifies the type of the current connection (e.g. wifi, ethernet, cellular , etc). + # Path: model/attributes/db/db__system__name.json + DB_SYSTEM_NAME: Literal["db.system.name"] = "db.system.name" + """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. Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Aliases: network.connection.type, device.connection_type - DEPRECATED: Use network.connection.type instead - Old namespace-less attribute, to be replaced with network.connection.type for span-first future - Example: "wifi" + Aliases: db.system + Example: "postgresql" """ - # Path: model/attributes/culture/culture__calendar.json - CULTURE_CALENDAR: Literal["culture.calendar"] = "culture.calendar" - """The calendar system used by the culture. + # Path: model/attributes/db/db__user.json + DB_USER: Literal["db.user"] = "db.user" + """The database user. Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: "GregorianCalendar" + Example: "fancy_user" """ - # Path: model/attributes/culture/culture__display_name.json - CULTURE_DISPLAY_NAME: Literal["culture.display_name"] = "culture.display_name" - """Human readable name of the culture. + # Path: model/attributes/device/device__archs.json + DEVICE_ARCHS: Literal["device.archs"] = "device.archs" + """The CPU architectures of the device. - Type: str + Type: List[str] Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "English (United States)" + Example: ["arm64-v8a","armeabi-v7a","armeabi"] """ - # Path: model/attributes/culture/culture__is_24_hour_format.json - CULTURE_IS_24_HOUR_FORMAT: Literal["culture.is_24_hour_format"] = ( - "culture.is_24_hour_format" - ) - """Whether the culture uses 24-hour time format. + # Path: model/attributes/device/device__battery_level.json + DEVICE_BATTERY_LEVEL: Literal["device.battery_level"] = "device.battery_level" + """The battery level of the device as a percentage (0-100). - Type: bool + Type: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: true + Example: 100 """ - # Path: model/attributes/culture/culture__locale.json - CULTURE_LOCALE: Literal["culture.locale"] = "culture.locale" - """The locale identifier following RFC 4646. + # Path: model/attributes/device/device__battery_temperature.json + DEVICE_BATTERY_TEMPERATURE: Literal["device.battery_temperature"] = ( + "device.battery_temperature" + ) + """The battery temperature of the device in Celsius. - Type: str + Type: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "en-US" + Example: 25 """ - # Path: model/attributes/culture/culture__timezone.json - CULTURE_TIMEZONE: Literal["culture.timezone"] = "culture.timezone" - """The timezone of the culture, as a geographic timezone identifier. + # Path: model/attributes/device/device__boot_time.json + DEVICE_BOOT_TIME: Literal["device.boot_time"] = "device.boot_time" + """A formatted UTC timestamp when the system was booted. Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "Europe/Vienna" + Example: "2018-02-08T12:52:12Z" """ - # Path: model/attributes/db/db__collection__name.json - DB_COLLECTION_NAME: Literal["db.collection.name"] = "db.collection.name" - """The name of a collection (table, container) within the database. + # Path: model/attributes/device/device__brand.json + DEVICE_BRAND: Literal["device.brand"] = "device.brand" + """The brand of the device. Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: db.mongodb.collection - Example: "users" + Example: "Apple" """ - # Path: model/attributes/db/db__connection_string.json - DB_CONNECTION_STRING: Literal["db.connection_string"] = "db.connection_string" - """The connection string used to connect to the database. + # Path: model/attributes/device/device__charging.json + DEVICE_CHARGING: Literal["device.charging"] = "device.charging" + """Whether the device was charging or not. - Type: str - Apply Scrubbing: auto - Defined in OTEL: Yes + Type: bool + Apply Scrubbing: manual + Defined in OTEL: No Visibility: public - DEPRECATED: No replacement at this time - This attribute is deprecated. The connection is described by server.address and server.port instead, so the value cannot be copied to a single replacement attribute. - Example: "redis://localhost:6379" + Example: false """ - # Path: model/attributes/db/db__driver__name.json - DB_DRIVER_NAME: Literal["db.driver.name"] = "db.driver.name" - """The name of the driver used for the database connection. + # Path: model/attributes/device/device__chipset.json + DEVICE_CHIPSET: Literal["device.chipset"] = "device.chipset" + """The chipset of the device. Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "psycopg2" + Example: "Qualcomm SM8550" """ - # Path: model/attributes/db/db__mongodb__collection.json - DB_MONGODB_COLLECTION: Literal["db.mongodb.collection"] = "db.mongodb.collection" - """The MongoDB collection being accessed. + # Path: model/attributes/device/device__class.json + DEVICE_CLASS: Literal["device.class"] = "device.class" + """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: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: db.collection.name - DEPRECATED: Use db.collection.name instead - This attribute is being deprecated in favor of db.collection.name, which is the OTel-aligned replacement. - Example: "users" + Example: "medium" """ - # Path: model/attributes/db/db__name.json - DB_NAME: Literal["db.name"] = "db.name" - """The name of the database being accessed. + # Path: model/attributes/device/device__connection_type.json + DEVICE_CONNECTION_TYPE: Literal["device.connection_type"] = "device.connection_type" + """The internet connection type currently being used by the device. Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: db.namespace - DEPRECATED: Use db.namespace instead - Example: "customers" + Aliases: network.connection.type, connectionType + DEPRECATED: Use network.connection.type instead - This attribute is being deprecated in favor of network.connection.type + Example: "wifi" """ - # Path: model/attributes/db/db__namespace.json - DB_NAMESPACE: Literal["db.namespace"] = "db.namespace" - """The name of the database being accessed. + # Path: model/attributes/device/device__cpu_description.json + DEVICE_CPU_DESCRIPTION: Literal["device.cpu_description"] = "device.cpu_description" + """A description of the CPU of the device. Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: db.name - Example: "customers" + Example: "Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz" """ - # Path: model/attributes/db/db__operation.json - DB_OPERATION: Literal["db.operation"] = "db.operation" - """The name of the operation being executed. + # Path: model/attributes/device/device__external_free_storage.json + DEVICE_EXTERNAL_FREE_STORAGE: Literal["device.external_free_storage"] = ( + "device.external_free_storage" + ) + """External storage free size in bytes. - Type: str + Type: int Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: db.operation.name, cloudflare.d1.query_type, redis.command - DEPRECATED: Use db.operation.name instead - Example: "SELECT" + Example: 67108864000 """ - # Path: model/attributes/db/db__operation__batch__size.json - DB_OPERATION_BATCH_SIZE: Literal["db.operation.batch.size"] = ( - "db.operation.batch.size" + # Path: model/attributes/device/device__external_storage_size.json + DEVICE_EXTERNAL_STORAGE_SIZE: Literal["device.external_storage_size"] = ( + "device.external_storage_size" ) - """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. + """External storage total size in bytes. Type: int Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: 3 + Example: 134217728000 """ - # Path: model/attributes/db/db__operation__name.json - DB_OPERATION_NAME: Literal["db.operation.name"] = "db.operation.name" - """The name of the operation being executed. + # Path: model/attributes/device/device__family.json + DEVICE_FAMILY: Literal["device.family"] = "device.family" + """The family of the device. Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: db.operation, cloudflare.d1.query_type, redis.command - Example: "SELECT" + Example: "iPhone" """ - # Path: model/attributes/db/db__params.json - DB_PARAMS: Literal["db.params"] = "db.params" - """The query bindings for a database request. + # Path: model/attributes/device/device__free_memory.json + DEVICE_FREE_MEMORY: Literal["device.free_memory"] = "device.free_memory" + """Free system memory in bytes. - Type: str - Apply Scrubbing: auto + Type: int + Apply Scrubbing: manual Defined in OTEL: No Visibility: public - DEPRECATED: Use db.query.parameter. instead - Instead of adding every binding in the db.params attribute, add them as individual entries with db.query.parameter.. - Example: "[{\"x\": 100}]" + Example: 2147483648 """ - # Path: model/attributes/db/db__query__parameter__[key].json - DB_QUERY_PARAMETER_KEY: Literal["db.query.parameter."] = ( - "db.query.parameter." - ) - """A query parameter used in db.query.text, with being the parameter name, and the attribute value being a string representation of the parameter value. + # Path: model/attributes/device/device__free_storage.json + DEVICE_FREE_STORAGE: Literal["device.free_storage"] = "device.free_storage" + """Free device storage in bytes. - Type: str - Apply Scrubbing: auto - Defined in OTEL: Yes + Type: int + Apply Scrubbing: manual + Defined in OTEL: No Visibility: public - Has Dynamic Suffix: true - Example: "db.query.parameter.foo='123'" + Example: 107374182400 """ - # Path: model/attributes/db/db__query__summary.json - DB_QUERY_SUMMARY: Literal["db.query.summary"] = "db.query.summary" - """A shortened representation of operation(s) in the full query. This attribute must be low-cardinality and should only contain the operation table names. + # Path: model/attributes/device/device__id.json + DEVICE_ID: Literal["device.id"] = "device.id" + """Unique device identifier. Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Example: "SELECT users" - Example: "INSERT products; UPDATE orders" + Example: "a1b2c3d4-e5f6-7890-abcd-ef1234567890" """ - # Path: model/attributes/db/db__query__text.json - DB_QUERY_TEXT: Literal["db.query.text"] = "db.query.text" - """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.` to add the parameter value. + # Path: model/attributes/device/device__locale.json + DEVICE_LOCALE: Literal["device.locale"] = "device.locale" + """The locale of the device. Type: str - Apply Scrubbing: auto - Defined in OTEL: Yes + Apply Scrubbing: manual + Defined in OTEL: No Visibility: public - Aliases: db.statement, query - Example: "SELECT * FROM users WHERE id = $1" + Example: "en-US" """ - # Path: model/attributes/db/db__redis__connection.json - DB_REDIS_CONNECTION: Literal["db.redis.connection"] = "db.redis.connection" - """The redis connection name. + # Path: model/attributes/device/device__low_memory.json + DEVICE_LOW_MEMORY: Literal["device.low_memory"] = "device.low_memory" + """Whether the device was low on memory. - Type: str + Type: bool Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "my-redis-instance" + Example: false """ - # Path: model/attributes/db/db__redis__key.json - DB_REDIS_KEY: Literal["db.redis.key"] = "db.redis.key" - """The key the Redis command is operating on. + # Path: model/attributes/device/device__low_power_mode.json + DEVICE_LOW_POWER_MODE: Literal["device.low_power_mode"] = "device.low_power_mode" + """Whether the device is in Low Power Mode. - Type: str + Type: bool Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: redis.key - Example: "user:2047:city" + Example: true """ - # Path: model/attributes/db/db__redis__parameters.json - DB_REDIS_PARAMETERS: Literal["db.redis.parameters"] = "db.redis.parameters" - """The array of command parameters given to a redis command. + # Path: model/attributes/device/device__manufacturer.json + DEVICE_MANUFACTURER: Literal["device.manufacturer"] = "device.manufacturer" + """The manufacturer of the device. - Type: List[str] - Apply Scrubbing: auto - Defined in OTEL: No + Type: str + Apply Scrubbing: manual + Defined in OTEL: Yes Visibility: public - Example: ["test","*"] + Example: "Google" """ - # Path: model/attributes/db/db__response__status_code.json - DB_RESPONSE_STATUS_CODE: Literal["db.response.status_code"] = ( - "db.response.status_code" + # Path: model/attributes/device/device__memory__estimated_capacity.json + DEVICE_MEMORY_ESTIMATED_CAPACITY: Literal["device.memory.estimated_capacity"] = ( + "device.memory.estimated_capacity" ) - """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. + """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: str + Type: int Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: "ORA-17002" + Aliases: deviceMemory + Example: 8 """ - # Path: model/attributes/db/db__sql__bindings.json - DB_SQL_BINDINGS: Literal["db.sql.bindings"] = "db.sql.bindings" - """The array of query bindings. + # Path: model/attributes/device/device__memory_size.json + DEVICE_MEMORY_SIZE: Literal["device.memory_size"] = "device.memory_size" + """Total system memory available in bytes. - Type: List[str] - Apply Scrubbing: auto + Type: int + Apply Scrubbing: manual Defined in OTEL: No Visibility: public - DEPRECATED: Use db.query.parameter. instead - Instead of adding every binding in the db.sql.bindings attribute, add them as individual entires with db.query.parameter.. - Example: ["1","foo"] + Example: 17179869184 """ - # Path: model/attributes/db/db__statement.json - DB_STATEMENT: Literal["db.statement"] = "db.statement" - """The database statement being executed. + # Path: model/attributes/device/device__model.json + DEVICE_MODEL: Literal["device.model"] = "device.model" + """The model of the device. Type: str - Apply Scrubbing: auto - Defined in OTEL: Yes + Apply Scrubbing: manual + Defined in OTEL: No Visibility: public - Aliases: db.query.text, query - DEPRECATED: Use db.query.text instead - While this attribute never specifically required parameterization, the replacement, db.query.text, does. - Example: "SELECT * FROM users WHERE id = $1" + Example: "iPhone 15 Pro Max" """ - # Path: model/attributes/db/db__stored_procedure__name.json - DB_STORED_PROCEDURE_NAME: Literal["db.stored_procedure.name"] = ( - "db.stored_procedure.name" - ) - """The name of a stored procedure being called. + # Path: model/attributes/device/device__model_id.json + DEVICE_MODEL_ID: Literal["device.model_id"] = "device.model_id" + """An internal hardware revision to identify the device exactly. Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: "GetUserById" + Example: "N861AP" """ - # Path: model/attributes/db/db__system.json - DB_SYSTEM: Literal["db.system"] = "db.system" - """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. + # Path: model/attributes/device/device__name.json + DEVICE_NAME: Literal["device.name"] = "device.name" + """The user-assigned name of the mobile device. Type: str - Apply Scrubbing: manual - Defined in OTEL: Yes + Apply Scrubbing: auto + Defined in OTEL: No Visibility: public - Aliases: db.system.name - DEPRECATED: Use db.system.name instead - Example: "postgresql" + Example: "localhost" """ - # Path: model/attributes/db/db__system__name.json - DB_SYSTEM_NAME: Literal["db.system.name"] = "db.system.name" - """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. + # Path: model/attributes/device/device__online.json + DEVICE_ONLINE: Literal["device.online"] = "device.online" + """Whether the device was online or not. - Type: str + Type: bool Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: db.system - Example: "postgresql" + Example: true """ - # Path: model/attributes/db/db__user.json - DB_USER: Literal["db.user"] = "db.user" - """The database user. + # Path: model/attributes/device/device__orientation.json + DEVICE_ORIENTATION: Literal["device.orientation"] = "device.orientation" + """The orientation of the device, either "portrait" or "landscape". Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: "fancy_user" + Example: "portrait" """ - # Path: model/attributes/device/device__archs.json - DEVICE_ARCHS: Literal["device.archs"] = "device.archs" - """The CPU architectures of the device. + # Path: model/attributes/device/device__processor_count.json + DEVICE_PROCESSOR_COUNT: Literal["device.processor_count"] = "device.processor_count" + """Number of "logical processors". - Type: List[str] + Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: ["arm64-v8a","armeabi-v7a","armeabi"] + Aliases: hardwareConcurrency + Example: 8 """ - # Path: model/attributes/device/device__battery_level.json - DEVICE_BATTERY_LEVEL: Literal["device.battery_level"] = "device.battery_level" - """The battery level of the device as a percentage (0-100). + # Path: model/attributes/device/device__processor_frequency.json + DEVICE_PROCESSOR_FREQUENCY: Literal["device.processor_frequency"] = ( + "device.processor_frequency" + ) + """Processor frequency in MHz. Type: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 100 + Example: 2400 """ - # Path: model/attributes/device/device__battery_temperature.json - DEVICE_BATTERY_TEMPERATURE: Literal["device.battery_temperature"] = ( - "device.battery_temperature" - ) - """The battery temperature of the device in Celsius. + # Path: model/attributes/device/device__screen_density.json + DEVICE_SCREEN_DENSITY: Literal["device.screen_density"] = "device.screen_density" + """The screen density of the device. Type: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 25 + Example: 2.625 """ - # Path: model/attributes/device/device__boot_time.json - DEVICE_BOOT_TIME: Literal["device.boot_time"] = "device.boot_time" - """A formatted UTC timestamp when the system was booted. + # Path: model/attributes/device/device__screen_dpi.json + DEVICE_SCREEN_DPI: Literal["device.screen_dpi"] = "device.screen_dpi" + """The screen density in dots-per-inch (DPI) of the device. - Type: str + Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "2018-02-08T12:52:12Z" + Example: 420 """ - # Path: model/attributes/device/device__brand.json - DEVICE_BRAND: Literal["device.brand"] = "device.brand" - """The brand of the device. + # Path: model/attributes/device/device__screen_height_pixels.json + DEVICE_SCREEN_HEIGHT_PIXELS: Literal["device.screen_height_pixels"] = ( + "device.screen_height_pixels" + ) + """The height of the device screen in pixels. - Type: str + Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "Apple" + Example: 2400 """ - # Path: model/attributes/device/device__charging.json - DEVICE_CHARGING: Literal["device.charging"] = "device.charging" - """Whether the device was charging or not. + # Path: model/attributes/device/device__screen_width_pixels.json + DEVICE_SCREEN_WIDTH_PIXELS: Literal["device.screen_width_pixels"] = ( + "device.screen_width_pixels" + ) + """The width of the device screen in pixels. - Type: bool + Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: false + Example: 1080 """ - # Path: model/attributes/device/device__chipset.json - DEVICE_CHIPSET: Literal["device.chipset"] = "device.chipset" - """The chipset of the device. + # Path: model/attributes/device/device__simulator.json + DEVICE_SIMULATOR: Literal["device.simulator"] = "device.simulator" + """Whether the device is a simulator or an actual device. - Type: str + Type: bool Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "Qualcomm SM8550" + Example: false """ - # Path: model/attributes/device/device__class.json - DEVICE_CLASS: Literal["device.class"] = "device.class" - """The classification of the device. For example, `low`, `medium`, or `high`. Typically inferred by Relay - SDKs generally do not need to set this directly. + # Path: model/attributes/device/device__storage_size.json + DEVICE_STORAGE_SIZE: Literal["device.storage_size"] = "device.storage_size" + """Total device storage in bytes. - Type: str + Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "medium" + Example: 274877906944 """ - # Path: model/attributes/device/device__connection_type.json - DEVICE_CONNECTION_TYPE: Literal["device.connection_type"] = "device.connection_type" - """The internet connection type currently being used by the device. + # Path: model/attributes/device/device__thermal_state.json + DEVICE_THERMAL_STATE: Literal["device.thermal_state"] = "device.thermal_state" + """The thermal state of the device. Based on Apple's `ProcessInfo.ThermalState` enum. Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: network.connection.type, connectionType - DEPRECATED: Use network.connection.type instead - This attribute is being deprecated in favor of network.connection.type - Example: "wifi" + Well-defined Values: + - `nominal` + - `fair` + - `serious` + - `critical` + Example: "nominal" """ - # Path: model/attributes/device/device__cpu_description.json - DEVICE_CPU_DESCRIPTION: Literal["device.cpu_description"] = "device.cpu_description" - """A description of the CPU of the device. + # Path: model/attributes/device/device__timezone.json + DEVICE_TIMEZONE: Literal["device.timezone"] = "device.timezone" + """The timezone of the device. Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz" + Example: "Europe/Vienna" """ - # Path: model/attributes/device/device__external_free_storage.json - DEVICE_EXTERNAL_FREE_STORAGE: Literal["device.external_free_storage"] = ( - "device.external_free_storage" - ) - """External storage free size in bytes. + # Path: model/attributes/device/device__usable_memory.json + DEVICE_USABLE_MEMORY: Literal["device.usable_memory"] = "device.usable_memory" + """Memory usable for the app in bytes. Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 67108864000 + Example: 2147483648 """ - # Path: model/attributes/device/device__external_storage_size.json - DEVICE_EXTERNAL_STORAGE_SIZE: Literal["device.external_storage_size"] = ( - "device.external_storage_size" - ) - """External storage total size in bytes. + # Path: model/attributes/deviceMemory.json + DEVICEMEMORY: Literal["deviceMemory"] = "deviceMemory" + """The estimated total memory capacity of the device, only a rough estimation in gigabytes. - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 134217728000 + Aliases: device.memory.estimated_capacity + DEPRECATED: Use device.memory.estimated_capacity instead - Old namespace-less attribute, to be replaced with device.memory.estimated_capacity for span-first future + Example: "8 GB" """ - # Path: model/attributes/device/device__family.json - DEVICE_FAMILY: Literal["device.family"] = "device.family" - """The family of the device. + # Path: model/attributes/dist.json + DIST: Literal["dist"] = "dist" + """The sentry dist. Type: str - Apply Scrubbing: manual + Apply Scrubbing: never Defined in OTEL: No Visibility: public - Example: "iPhone" + Aliases: sentry.dist + DEPRECATED: Use sentry.dist instead - This attribute is being deprecated in favor of sentry.dist. + Example: "1.0" """ - # Path: model/attributes/device/device__free_memory.json - DEVICE_FREE_MEMORY: Literal["device.free_memory"] = "device.free_memory" - """Free system memory in bytes. + # Path: model/attributes/django/django__function_name.json + DJANGO_FUNCTION_NAME: Literal["django.function_name"] = "django.function_name" + """The fully qualified name of a function used in a Django context. - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 2147483648 + Aliases: code.function.name, code.function + DEPRECATED: Use code.function.name instead - This attribute is being deprecated in favor of code.function.name, which is the framework-agnostic replacement. + Example: "django.contrib.sessions.middleware.SessionMiddleware" """ - # Path: model/attributes/device/device__free_storage.json - DEVICE_FREE_STORAGE: Literal["device.free_storage"] = "device.free_storage" - """Free device storage in bytes. + # Path: model/attributes/django/django__middleware_name.json + DJANGO_MIDDLEWARE_NAME: Literal["django.middleware_name"] = "django.middleware_name" + """The name of the Django middleware. - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 107374182400 + Aliases: middleware.name + DEPRECATED: Use middleware.name instead - This attribute is being deprecated in favor of middleware.name, which is the framework-agnostic replacement. + Example: "AuthenticationMiddleware" """ - # Path: model/attributes/device/device__id.json - DEVICE_ID: Literal["device.id"] = "device.id" - """Unique device identifier. + # Path: model/attributes/effectiveConnectionType.json + EFFECTIVECONNECTIONTYPE: Literal["effectiveConnectionType"] = ( + "effectiveConnectionType" + ) + """Specifies the estimated effective type of the current connection (e.g. slow-2g, 2g, 3g, 4g). Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: "a1b2c3d4-e5f6-7890-abcd-ef1234567890" + Aliases: network.connection.effective_type + DEPRECATED: Use network.connection.effective_type instead - Old namespace-less attribute, to be replaced with network.connection.effective_type for span-first future + Example: "4g" """ - # Path: model/attributes/device/device__locale.json - DEVICE_LOCALE: Literal["device.locale"] = "device.locale" - """The locale of the device. + # Path: model/attributes/environment.json + ENVIRONMENT: Literal["environment"] = "environment" + """The sentry environment. Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "en-US" + Aliases: sentry.environment + DEPRECATED: Use sentry.environment instead + Example: "production" """ - # Path: model/attributes/device/device__low_memory.json - DEVICE_LOW_MEMORY: Literal["device.low_memory"] = "device.low_memory" - """Whether the device was low on memory. + # Path: model/attributes/error/error__type.json + ERROR_TYPE: Literal["error.type"] = "error.type" + """Describes a class of error the operation ended with. - Type: bool + Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: false + Example: "timeout" """ - # Path: model/attributes/device/device__low_power_mode.json - DEVICE_LOW_POWER_MODE: Literal["device.low_power_mode"] = "device.low_power_mode" - """Whether the device is in Low Power Mode. + # Path: model/attributes/event/event__id.json + EVENT_ID: Literal["event.id"] = "event.id" + """The unique identifier for this event (log record) - Type: bool + Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: true + Example: 1234567890 """ - # Path: model/attributes/device/device__manufacturer.json - DEVICE_MANUFACTURER: Literal["device.manufacturer"] = "device.manufacturer" - """The manufacturer of the device. + # Path: model/attributes/event/event__name.json + EVENT_NAME: Literal["event.name"] = "event.name" + """The name that uniquely identifies this event (log record) Type: str Apply Scrubbing: manual - Defined in OTEL: Yes - Visibility: public - Example: "Google" - """ - - # Path: model/attributes/device/device__memory__estimated_capacity.json - DEVICE_MEMORY_ESTIMATED_CAPACITY: Literal["device.memory.estimated_capacity"] = ( - "device.memory.estimated_capacity" - ) - """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: int - Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: deviceMemory - Example: 8 + Example: "Process Payload" """ - # Path: model/attributes/device/device__memory_size.json - DEVICE_MEMORY_SIZE: Literal["device.memory_size"] = "device.memory_size" - """Total system memory available in bytes. + # Path: model/attributes/exception/exception__escaped.json + EXCEPTION_ESCAPED: Literal["exception.escaped"] = "exception.escaped" + """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: int + Type: bool Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: 17179869184 + Example: true """ - # Path: model/attributes/device/device__model.json - DEVICE_MODEL: Literal["device.model"] = "device.model" - """The model of the device. + # Path: model/attributes/exception/exception__message.json + EXCEPTION_MESSAGE: Literal["exception.message"] = "exception.message" + """The error message. Type: str - Apply Scrubbing: manual - Defined in OTEL: No + Apply Scrubbing: auto + Defined in OTEL: Yes Visibility: public - Example: "iPhone 15 Pro Max" + Example: "ENOENT: no such file or directory" """ - # Path: model/attributes/device/device__model_id.json - DEVICE_MODEL_ID: Literal["device.model_id"] = "device.model_id" - """An internal hardware revision to identify the device exactly. + # Path: model/attributes/exception/exception__stacktrace.json + EXCEPTION_STACKTRACE: Literal["exception.stacktrace"] = "exception.stacktrace" + """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: str - Apply Scrubbing: manual - Defined in OTEL: No + Apply Scrubbing: auto + Defined in OTEL: Yes Visibility: public - Example: "N861AP" + 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)" """ - # Path: model/attributes/device/device__name.json - DEVICE_NAME: Literal["device.name"] = "device.name" - """The user-assigned name of the mobile device. + # Path: model/attributes/exception/exception__type.json + EXCEPTION_TYPE: Literal["exception.type"] = "exception.type" + """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: str - Apply Scrubbing: auto - Defined in OTEL: No + Apply Scrubbing: manual + Defined in OTEL: Yes Visibility: public - Example: "localhost" + Example: "OSError" """ - # Path: model/attributes/device/device__online.json - DEVICE_ONLINE: Literal["device.online"] = "device.online" - """Whether the device was online or not. + # Path: model/attributes/faas/faas__coldstart.json + FAAS_COLDSTART: Literal["faas.coldstart"] = "faas.coldstart" + """A boolean that is true if the serverless function is executed for the first time (aka cold-start). Type: bool Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public Example: true """ - # Path: model/attributes/device/device__orientation.json - DEVICE_ORIENTATION: Literal["device.orientation"] = "device.orientation" - """The orientation of the device, either "portrait" or "landscape". + # Path: model/attributes/faas/faas__cron.json + FAAS_CRON: Literal["faas.cron"] = "faas.cron" + """A string containing the schedule period as Cron Expression. Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: "portrait" + Example: "0/5 * * * ? *" """ - # Path: model/attributes/device/device__processor_count.json - DEVICE_PROCESSOR_COUNT: Literal["device.processor_count"] = "device.processor_count" - """Number of "logical processors". + # Path: model/attributes/faas/faas__duration_in_ms.json + FAAS_DURATION_IN_MS: Literal["faas.duration_in_ms"] = "faas.duration_in_ms" + """The duration a function took to run, in milliseconds. Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: hardwareConcurrency - Example: 8 + Example: 120 """ - # Path: model/attributes/device/device__processor_frequency.json - DEVICE_PROCESSOR_FREQUENCY: Literal["device.processor_frequency"] = ( - "device.processor_frequency" - ) - """Processor frequency in MHz. + # Path: model/attributes/faas/faas__entry_point.json + FAAS_ENTRY_POINT: Literal["faas.entry_point"] = "faas.entry_point" + """The code that's run when the cloud provider invokes your function. - Type: float + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 2400 + Example: "my_main_function" """ - # Path: model/attributes/device/device__screen_density.json - DEVICE_SCREEN_DENSITY: Literal["device.screen_density"] = "device.screen_density" - """The screen density of the device. + # Path: model/attributes/faas/faas__execution.json + FAAS_EXECUTION: Literal["faas.execution"] = "faas.execution" + """The execution ID of the current function execution. - Type: float + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 2.625 + Aliases: faas.invocation_id, aws.lambda.aws_request_id + DEPRECATED: Use faas.invocation_id instead - This attribute is being deprecated in favor of faas.invocation_id, which is the OTel-aligned replacement. + Example: "af9d5aa4-a685-4c5f-a22b-444f80b3cc28" """ - # Path: model/attributes/device/device__screen_dpi.json - DEVICE_SCREEN_DPI: Literal["device.screen_dpi"] = "device.screen_dpi" - """The screen density in dots-per-inch (DPI) of the device. + # Path: model/attributes/faas/faas__id.json + FAAS_ID: Literal["faas.id"] = "faas.id" + """The unique ID of the single function that this runtime instance executes. - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 420 + Aliases: cloud.resource_id + DEPRECATED: Use cloud.resource_id instead - 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). + Example: "arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function" """ - # Path: model/attributes/device/device__screen_height_pixels.json - DEVICE_SCREEN_HEIGHT_PIXELS: Literal["device.screen_height_pixels"] = ( - "device.screen_height_pixels" - ) - """The height of the device screen in pixels. + # Path: model/attributes/faas/faas__identity.json + FAAS_IDENTITY: Literal["faas.identity"] = "faas.identity" + """The Service Account (GCP), IAM Execution Role (AWS), or Managed Identity (Azure) used by the serverless function when interacting with other cloud services - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 2400 + Example: "name@project.iam.gserviceaccount.com (GCP), arn:aws:iam::123456789012:role/role-name (AWS), 00000000-0000-0000-0000-000000000000 (Azure)" """ - # Path: model/attributes/device/device__screen_width_pixels.json - DEVICE_SCREEN_WIDTH_PIXELS: Literal["device.screen_width_pixels"] = ( - "device.screen_width_pixels" - ) - """The width of the device screen in pixels. + # Path: model/attributes/faas/faas__invocation_id.json + FAAS_INVOCATION_ID: Literal["faas.invocation_id"] = "faas.invocation_id" + """The invocation ID of the current function invocation. - Type: int + Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: 1080 + Aliases: aws.lambda.aws_request_id, faas.execution + Example: "af9d5aa4-a685-4c5f-a22b-444f80b3cc28" """ - # Path: model/attributes/device/device__simulator.json - DEVICE_SIMULATOR: Literal["device.simulator"] = "device.simulator" - """Whether the device is a simulator or an actual device. + # Path: model/attributes/faas/faas__invoked_name.json + FAAS_INVOKED_NAME: Literal["faas.invoked_name"] = "faas.invoked_name" + """The name of the invoked function. - Type: bool + Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: false + Example: "my-function" """ - # Path: model/attributes/device/device__storage_size.json - DEVICE_STORAGE_SIZE: Literal["device.storage_size"] = "device.storage_size" - """Total device storage in bytes. + # Path: model/attributes/faas/faas__invoked_provider.json + FAAS_INVOKED_PROVIDER: Literal["faas.invoked_provider"] = "faas.invoked_provider" + """The cloud provider of the invoked function. - Type: int + Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: 274877906944 + Example: "aws" """ - # Path: model/attributes/device/device__thermal_state.json - DEVICE_THERMAL_STATE: Literal["device.thermal_state"] = "device.thermal_state" - """The thermal state of the device. Based on Apple's `ProcessInfo.ThermalState` enum. + # Path: model/attributes/faas/faas__invoked_region.json + FAAS_INVOKED_REGION: Literal["faas.invoked_region"] = "faas.invoked_region" + """The cloud region of the invoked function. Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Well-defined Values: - - `nominal` - - `fair` - - `serious` - - `critical` - Example: "nominal" + Example: "eu-central-1" """ - # Path: model/attributes/device/device__timezone.json - DEVICE_TIMEZONE: Literal["device.timezone"] = "device.timezone" - """The timezone of the device. + # Path: model/attributes/faas/faas__name.json + FAAS_NAME: Literal["faas.name"] = "faas.name" + """The name of the serverless function Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: "Europe/Vienna" + Aliases: aws.lambda.function_name + Example: "my_function" """ - # Path: model/attributes/device/device__usable_memory.json - DEVICE_USABLE_MEMORY: Literal["device.usable_memory"] = "device.usable_memory" - """Memory usable for the app in bytes. + # Path: model/attributes/faas/faas__time.json + FAAS_TIME: Literal["faas.time"] = "faas.time" + """A string containing the function invocation time in the ISO 8601 format expressed in UTC. - Type: int + Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: 2147483648 + Example: "2020-01-23T13:47:06Z" """ - # Path: model/attributes/deviceMemory.json - DEVICEMEMORY: Literal["deviceMemory"] = "deviceMemory" - """The estimated total memory capacity of the device, only a rough estimation in gigabytes. + # Path: model/attributes/faas/faas__trigger.json + FAAS_TRIGGER: Literal["faas.trigger"] = "faas.trigger" + """Type of the trigger which caused this function invocation. Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Aliases: device.memory.estimated_capacity - DEPRECATED: Use device.memory.estimated_capacity instead - Old namespace-less attribute, to be replaced with device.memory.estimated_capacity for span-first future - Example: "8 GB" + Example: "timer" """ - # Path: model/attributes/dist.json - DIST: Literal["dist"] = "dist" - """The sentry dist. + # Path: model/attributes/faas/faas__version.json + FAAS_VERSION: Literal["faas.version"] = "faas.version" + """The version of the function that was invoked Type: str - Apply Scrubbing: never - Defined in OTEL: No + Apply Scrubbing: manual + Defined in OTEL: Yes Visibility: public - Aliases: sentry.dist - DEPRECATED: Use sentry.dist instead - This attribute is being deprecated in favor of sentry.dist. - Example: "1.0" + Aliases: aws.lambda.function_version + Example: "$LATEST" """ - # Path: model/attributes/django/django__function_name.json - DJANGO_FUNCTION_NAME: Literal["django.function_name"] = "django.function_name" - """The fully qualified name of a function used in a Django context. + # Path: model/attributes/fcp.json + FCP: Literal["fcp"] = "fcp" + """The time it takes for the browser to render the first piece of meaningful content on the screen - Type: str + Type: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: code.function.name, code.function - DEPRECATED: Use code.function.name instead - This attribute is being deprecated in favor of code.function.name, which is the framework-agnostic replacement. - Example: "django.contrib.sessions.middleware.SessionMiddleware" + Aliases: browser.web_vital.fcp.value + DEPRECATED: Use browser.web_vital.fcp.value instead - This attribute is being deprecated in favor of browser.web_vital.fcp.value + Example: 547.6951 """ - # Path: model/attributes/django/django__middleware_name.json - DJANGO_MIDDLEWARE_NAME: Literal["django.middleware_name"] = "django.middleware_name" - """The name of the Django middleware. + # Path: model/attributes/file/file__path.json + FILE_PATH: Literal["file.path"] = "file.path" + """Path to the file. Type: str - Apply Scrubbing: manual - Defined in OTEL: No + Apply Scrubbing: auto - File paths can contain end-user paths (e.g. from stack traces) that may be sensitive. + Defined in OTEL: Yes Visibility: public - Aliases: middleware.name - DEPRECATED: Use middleware.name instead - This attribute is being deprecated in favor of middleware.name, which is the framework-agnostic replacement. - Example: "AuthenticationMiddleware" + Example: "/home/user/example.txt" """ - # Path: model/attributes/effectiveConnectionType.json - EFFECTIVECONNECTIONTYPE: Literal["effectiveConnectionType"] = ( - "effectiveConnectionType" - ) - """Specifies the estimated effective type of the current connection (e.g. slow-2g, 2g, 3g, 4g). + # Path: model/attributes/file/file__size.json + FILE_SIZE: Literal["file.size"] = "file.size" + """File size in bytes. - Type: str + Type: int Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Aliases: network.connection.effective_type - DEPRECATED: Use network.connection.effective_type instead - Old namespace-less attribute, to be replaced with network.connection.effective_type for span-first future - Example: "4g" + Example: 1024 """ - # Path: model/attributes/environment.json - ENVIRONMENT: Literal["environment"] = "environment" - """The sentry environment. + # Path: model/attributes/flag/flag__evaluation__[key].json + FLAG_EVALUATION_KEY: Literal["flag.evaluation."] = "flag.evaluation." + """An instance of a feature flag evaluation. The value of this attribute is the boolean representing the evaluation result. The suffix is the name of the feature flag. - Type: str + Type: bool Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: sentry.environment - DEPRECATED: Use sentry.environment instead - Example: "production" + Has Dynamic Suffix: true + Example: "flag.evaluation.is_new_ui=true" """ - # Path: model/attributes/error/error__type.json - ERROR_TYPE: Literal["error.type"] = "error.type" - """Describes a class of error the operation ended with. + # Path: model/attributes/fp.json + FP: Literal["fp"] = "fp" + """The time it takes for the browser to render the first pixel on the screen - Type: str + Type: float Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: "timeout" + Aliases: browser.web_vital.fp.value + DEPRECATED: Use browser.web_vital.fp.value instead - This attribute is being deprecated in favor of browser.web_vital.fp.value + Example: 477.1926 """ - # Path: model/attributes/event/event__id.json - EVENT_ID: Literal["event.id"] = "event.id" - """The unique identifier for this event (log record) + # Path: model/attributes/frames/frames__delay.json + FRAMES_DELAY: Literal["frames.delay"] = "frames.delay" + """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: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 1234567890 + Aliases: app.vitals.frames.delay.value + DEPRECATED: Use app.vitals.frames.delay.value instead - Replaced by app.vitals.frames.delay.value to align with the app.vitals.* namespace for mobile performance attributes + Example: 5 """ - # Path: model/attributes/event/event__name.json - EVENT_NAME: Literal["event.name"] = "event.name" - """The name that uniquely identifies this event (log record) + # Path: model/attributes/frames/frames__frozen.json + FRAMES_FROZEN: Literal["frames.frozen"] = "frames.frozen" + """The number of frozen frames rendered during the lifetime of the span. - Type: str + Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "Process Payload" + Aliases: app.vitals.frames.frozen.count, sentry.frames.frozen + DEPRECATED: Use app.vitals.frames.frozen.count instead - Replaced by app.vitals.frames.frozen.count to align with the app.vitals.* namespace for mobile performance attributes + Example: 3 """ - # Path: model/attributes/exception/exception__escaped.json - EXCEPTION_ESCAPED: Literal["exception.escaped"] = "exception.escaped" - """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. + # Path: model/attributes/frames/frames__slow.json + FRAMES_SLOW: Literal["frames.slow"] = "frames.slow" + """The number of slow frames rendered during the lifetime of the span. - Type: bool + Type: int Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: true + Aliases: app.vitals.frames.slow.count, sentry.frames.slow + DEPRECATED: Use app.vitals.frames.slow.count instead - Replaced by app.vitals.frames.slow.count to align with the app.vitals.* namespace for mobile performance attributes + Example: 1 """ - # Path: model/attributes/exception/exception__message.json - EXCEPTION_MESSAGE: Literal["exception.message"] = "exception.message" - """The error message. + # Path: model/attributes/frames/frames__total.json + FRAMES_TOTAL: Literal["frames.total"] = "frames.total" + """The number of total frames rendered during the lifetime of the span. - Type: str - Apply Scrubbing: auto - Defined in OTEL: Yes - Visibility: public - Example: "ENOENT: no such file or directory" - """ - - # Path: model/attributes/exception/exception__stacktrace.json - EXCEPTION_STACKTRACE: Literal["exception.stacktrace"] = "exception.stacktrace" - """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: str - Apply Scrubbing: auto - Defined in OTEL: Yes + Type: int + Apply Scrubbing: manual + Defined in OTEL: No 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)" + Aliases: app.vitals.frames.total.count, sentry.frames.total + DEPRECATED: Use app.vitals.frames.total.count instead - Replaced by app.vitals.frames.total.count to align with the app.vitals.* namespace for mobile performance attributes + Example: 60 """ - # Path: model/attributes/exception/exception__type.json - EXCEPTION_TYPE: Literal["exception.type"] = "exception.type" - """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. + # Path: model/attributes/frames_frozen_rate.json + FRAMES_FROZEN_RATE: Literal["frames_frozen_rate"] = "frames_frozen_rate" + """The rate of frozen frames, or `app.vitals.frames.frozen.count` divided by `app.vitals.frames.total.count`. This is computed by Relay. - Type: str + Type: float Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: "OSError" + Aliases: app.vitals.frames.frozen.rate + DEPRECATED: Use app.vitals.frames.frozen.rate instead - Replaced by app.vitals.frames.frozen.rate to align with the app.vitals.* namespace for mobile performance attributes """ - # Path: model/attributes/faas/faas__coldstart.json - FAAS_COLDSTART: Literal["faas.coldstart"] = "faas.coldstart" - """A boolean that is true if the serverless function is executed for the first time (aka cold-start). + # Path: model/attributes/frames_slow_rate.json + FRAMES_SLOW_RATE: Literal["frames_slow_rate"] = "frames_slow_rate" + """The rate of slow frames, or `app.vitals.frames.slow.count` divided by `app.vitals.frames.total.count`. This is computed by Relay. - Type: bool + Type: float Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: true + Aliases: app.vitals.frames.slow.rate + DEPRECATED: Use app.vitals.frames.slow.rate instead - Replaced by app.vitals.frames.slow.rate to align with the app.vitals.* namespace for mobile performance attributes """ - # Path: model/attributes/faas/faas__cron.json - FAAS_CRON: Literal["faas.cron"] = "faas.cron" - """A string containing the schedule period as Cron Expression. + # Path: model/attributes/fs_error.json + FS_ERROR: Literal["fs_error"] = "fs_error" + """The error message of a file system error. Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: "0/5 * * * ? *" + DEPRECATED: Use error.type instead - This attribute is not part of the OpenTelemetry specification and error.type fits much better. The value changes from the full error message to the syscall error code, so the old value cannot be copied over. + Example: "ENOENT: no such file or directory" """ - # Path: model/attributes/faas/faas__duration_in_ms.json - FAAS_DURATION_IN_MS: Literal["faas.duration_in_ms"] = "faas.duration_in_ms" - """The duration a function took to run, in milliseconds. + # Path: model/attributes/gcp/gcp__function__context__event_id.json + GCP_FUNCTION_CONTEXT_EVENT_ID: Literal["gcp.function.context.event_id"] = ( + "gcp.function.context.event_id" + ) + """The event ID from the legacy GCP Cloud Function context (1st gen) - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 120 + Example: "1234567890" """ - # Path: model/attributes/faas/faas__entry_point.json - FAAS_ENTRY_POINT: Literal["faas.entry_point"] = "faas.entry_point" - """The code that's run when the cloud provider invokes your function. + # Path: model/attributes/gcp/gcp__function__context__event_type.json + GCP_FUNCTION_CONTEXT_EVENT_TYPE: Literal["gcp.function.context.event_type"] = ( + "gcp.function.context.event_type" + ) + """The type of the GCP Cloud Function event Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "my_main_function" + Example: "google.pubsub.topic.publish" """ - # Path: model/attributes/faas/faas__execution.json - FAAS_EXECUTION: Literal["faas.execution"] = "faas.execution" - """The execution ID of the current function execution. + # Path: model/attributes/gcp/gcp__function__context__id.json + GCP_FUNCTION_CONTEXT_ID: Literal["gcp.function.context.id"] = ( + "gcp.function.context.id" + ) + """The unique event ID from the GCP CloudEvents context (2nd gen Cloud Functions) Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: faas.invocation_id, aws.lambda.aws_request_id - DEPRECATED: Use faas.invocation_id instead - This attribute is being deprecated in favor of faas.invocation_id, which is the OTel-aligned replacement. - Example: "af9d5aa4-a685-4c5f-a22b-444f80b3cc28" + Example: "1234567890" """ - # Path: model/attributes/faas/faas__id.json - FAAS_ID: Literal["faas.id"] = "faas.id" - """The unique ID of the single function that this runtime instance executes. + # Path: model/attributes/gcp/gcp__function__context__resource.json + GCP_FUNCTION_CONTEXT_RESOURCE: Literal["gcp.function.context.resource"] = ( + "gcp.function.context.resource" + ) + """The resource that triggered the GCP Cloud Function event Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: cloud.resource_id - DEPRECATED: Use cloud.resource_id instead - 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). - Example: "arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function" + Example: "projects/my-project/topics/my-topic" """ - # Path: model/attributes/faas/faas__identity.json - FAAS_IDENTITY: Literal["faas.identity"] = "faas.identity" - """The Service Account (GCP), IAM Execution Role (AWS), or Managed Identity (Azure) used by the serverless function when interacting with other cloud services + # Path: model/attributes/gcp/gcp__function__context__source.json + GCP_FUNCTION_CONTEXT_SOURCE: Literal["gcp.function.context.source"] = ( + "gcp.function.context.source" + ) + """The source of the GCP Cloud Function event Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "name@project.iam.gserviceaccount.com (GCP), arn:aws:iam::123456789012:role/role-name (AWS), 00000000-0000-0000-0000-000000000000 (Azure)" + Example: "//pubsub.googleapis.com/projects/my-project/topics/my-topic" """ - # Path: model/attributes/faas/faas__invocation_id.json - FAAS_INVOCATION_ID: Literal["faas.invocation_id"] = "faas.invocation_id" - """The invocation ID of the current function invocation. + # Path: model/attributes/gcp/gcp__function__context__specversion.json + GCP_FUNCTION_CONTEXT_SPECVERSION: Literal["gcp.function.context.specversion"] = ( + "gcp.function.context.specversion" + ) + """The CloudEvents specification version of the GCP Cloud Function event Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: aws.lambda.aws_request_id, faas.execution - Example: "af9d5aa4-a685-4c5f-a22b-444f80b3cc28" + Example: "1.0" """ - # Path: model/attributes/faas/faas__invoked_name.json - FAAS_INVOKED_NAME: Literal["faas.invoked_name"] = "faas.invoked_name" - """The name of the invoked function. + # Path: model/attributes/gcp/gcp__function__context__time.json + GCP_FUNCTION_CONTEXT_TIME: Literal["gcp.function.context.time"] = ( + "gcp.function.context.time" + ) + """The timestamp of the GCP Cloud Function event Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: "my-function" + Example: "2024-01-01T00:00:00.000Z" """ - # Path: model/attributes/faas/faas__invoked_provider.json - FAAS_INVOKED_PROVIDER: Literal["faas.invoked_provider"] = "faas.invoked_provider" - """The cloud provider of the invoked function. + # Path: model/attributes/gcp/gcp__function__context__timestamp.json + GCP_FUNCTION_CONTEXT_TIMESTAMP: Literal["gcp.function.context.timestamp"] = ( + "gcp.function.context.timestamp" + ) + """The legacy timestamp of the GCP Cloud Function event Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: "aws" + Example: "2024-01-01T00:00:00.000Z" """ - # Path: model/attributes/faas/faas__invoked_region.json - FAAS_INVOKED_REGION: Literal["faas.invoked_region"] = "faas.invoked_region" - """The cloud region of the invoked function. + # Path: model/attributes/gcp/gcp__function__context__type.json + GCP_FUNCTION_CONTEXT_TYPE: Literal["gcp.function.context.type"] = ( + "gcp.function.context.type" + ) + """The type of the GCP Cloud Function event context Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: "eu-central-1" + Example: "cloud_functions.context" """ - # Path: model/attributes/faas/faas__name.json - FAAS_NAME: Literal["faas.name"] = "faas.name" - """The name of the serverless function + # Path: model/attributes/gcp/gcp__project__id.json + GCP_PROJECT_ID: Literal["gcp.project.id"] = "gcp.project.id" + """The ID of the project in GCP that this resource is associated with Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: aws.lambda.function_name - Example: "my_function" + Example: "my-project-123" """ - # Path: model/attributes/faas/faas__time.json - FAAS_TIME: Literal["faas.time"] = "faas.time" - """A string containing the function invocation time in the ISO 8601 format expressed in UTC. + # Path: model/attributes/gcp_region.json + GCP_REGION: Literal["gcp_region"] = "gcp_region" + """The geographical region the GCP resource is running Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: "2020-01-23T13:47:06Z" + Aliases: cloud.region, aws_region + DEPRECATED: Use cloud.region instead + Example: "us-east-1" """ - # Path: model/attributes/faas/faas__trigger.json - FAAS_TRIGGER: Literal["faas.trigger"] = "faas.trigger" - """Type of the trigger which caused this function invocation. + # Path: model/attributes/gen_ai/gen_ai__agent__name.json + GEN_AI_AGENT_NAME: Literal["gen_ai.agent.name"] = "gen_ai.agent.name" + """The name of the agent being used. Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Example: "timer" + Example: "ResearchAssistant" """ - # Path: model/attributes/faas/faas__version.json - FAAS_VERSION: Literal["faas.version"] = "faas.version" - """The version of the function that was invoked + # Path: model/attributes/gen_ai/gen_ai__context__utilization.json + GEN_AI_CONTEXT_UTILIZATION: Literal["gen_ai.context.utilization"] = ( + "gen_ai.context.utilization" + ) + """The fraction of the model context window utilized by this generation. - Type: str + Type: float Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: aws.lambda.function_version - Example: "$LATEST" + Example: 0.75 """ - # Path: model/attributes/fcp.json - FCP: Literal["fcp"] = "fcp" - """The time it takes for the browser to render the first piece of meaningful content on the screen + # Path: model/attributes/gen_ai/gen_ai__context__window_size.json + GEN_AI_CONTEXT_WINDOW_SIZE: Literal["gen_ai.context.window_size"] = ( + "gen_ai.context.window_size" + ) + """The maximum context window size supported by the model for this generation. - Type: float + Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: browser.web_vital.fcp.value - DEPRECATED: Use browser.web_vital.fcp.value instead - This attribute is being deprecated in favor of browser.web_vital.fcp.value - Example: 547.6951 + Example: 128000 """ - # Path: model/attributes/file/file__path.json - FILE_PATH: Literal["file.path"] = "file.path" - """Path to the file. + # Path: model/attributes/gen_ai/gen_ai__conversation__id.json + GEN_AI_CONVERSATION_ID: Literal["gen_ai.conversation.id"] = "gen_ai.conversation.id" + """The unique identifier for a conversation (session, thread), used to store and correlate messages within this conversation. Type: str - Apply Scrubbing: auto - File paths can contain end-user paths (e.g. from stack traces) that may be sensitive. + Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Example: "/home/user/example.txt" + Example: "conv_5j66UpCpwteGg4YSxUnt7lPY" """ - # Path: model/attributes/file/file__size.json - FILE_SIZE: Literal["file.size"] = "file.size" - """File size in bytes. + # Path: model/attributes/gen_ai/gen_ai__cost__cache_creation__input_tokens.json + GEN_AI_COST_CACHE_CREATION_INPUT_TOKENS: Literal[ + "gen_ai.cost.cache_creation.input_tokens" + ] = "gen_ai.cost.cache_creation.input_tokens" + """The cost of input tokens written to cache in USD. - Type: int + Type: float Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: 1024 + Example: 12.34 """ - # Path: model/attributes/flag/flag__evaluation__[key].json - FLAG_EVALUATION_KEY: Literal["flag.evaluation."] = "flag.evaluation." - """An instance of a feature flag evaluation. The value of this attribute is the boolean representing the evaluation result. The suffix is the name of the feature flag. + # Path: model/attributes/gen_ai/gen_ai__cost__cache_read__input_tokens.json + GEN_AI_COST_CACHE_READ_INPUT_TOKENS: Literal[ + "gen_ai.cost.cache_read.input_tokens" + ] = "gen_ai.cost.cache_read.input_tokens" + """The cost of cached input tokens in USD. - Type: bool + Type: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Has Dynamic Suffix: true - Example: "flag.evaluation.is_new_ui=true" + Example: 12.34 """ - # Path: model/attributes/fp.json - FP: Literal["fp"] = "fp" - """The time it takes for the browser to render the first pixel on the screen + # Path: model/attributes/gen_ai/gen_ai__cost__input_tokens.json + GEN_AI_COST_INPUT_TOKENS: Literal["gen_ai.cost.input_tokens"] = ( + "gen_ai.cost.input_tokens" + ) + """The total cost of all input tokens in USD (includes cached and cache creation tokens). Type: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: browser.web_vital.fp.value - DEPRECATED: Use browser.web_vital.fp.value instead - This attribute is being deprecated in favor of browser.web_vital.fp.value - Example: 477.1926 + Example: 123.45 """ - # Path: model/attributes/frames/frames__delay.json - FRAMES_DELAY: Literal["frames.delay"] = "frames.delay" - """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/). + # Path: model/attributes/gen_ai/gen_ai__cost__output_tokens.json + GEN_AI_COST_OUTPUT_TOKENS: Literal["gen_ai.cost.output_tokens"] = ( + "gen_ai.cost.output_tokens" + ) + """The total cost of all output tokens in USD (includes reasoning tokens). - Type: int + Type: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: app.vitals.frames.delay.value - DEPRECATED: Use app.vitals.frames.delay.value instead - Replaced by app.vitals.frames.delay.value to align with the app.vitals.* namespace for mobile performance attributes - Example: 5 + Example: 123.45 """ - # Path: model/attributes/frames/frames__frozen.json - FRAMES_FROZEN: Literal["frames.frozen"] = "frames.frozen" - """The number of frozen frames rendered during the lifetime of the span. + # Path: model/attributes/gen_ai/gen_ai__cost__reasoning__output_tokens.json + GEN_AI_COST_REASONING_OUTPUT_TOKENS: Literal[ + "gen_ai.cost.reasoning.output_tokens" + ] = "gen_ai.cost.reasoning.output_tokens" + """The cost of reasoning output tokens in USD. - Type: int + Type: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: app.vitals.frames.frozen.count, sentry.frames.frozen - DEPRECATED: Use app.vitals.frames.frozen.count instead - Replaced by app.vitals.frames.frozen.count to align with the app.vitals.* namespace for mobile performance attributes - Example: 3 + Example: 12.34 """ - # Path: model/attributes/frames/frames__slow.json - FRAMES_SLOW: Literal["frames.slow"] = "frames.slow" - """The number of slow frames rendered during the lifetime of the span. + # Path: model/attributes/gen_ai/gen_ai__cost__total_tokens.json + GEN_AI_COST_TOTAL_TOKENS: Literal["gen_ai.cost.total_tokens"] = ( + "gen_ai.cost.total_tokens" + ) + """The total cost for the tokens used. - Type: int + Type: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: app.vitals.frames.slow.count, sentry.frames.slow - DEPRECATED: Use app.vitals.frames.slow.count instead - Replaced by app.vitals.frames.slow.count to align with the app.vitals.* namespace for mobile performance attributes - Example: 1 + Aliases: ai.total_cost + Example: 12.34 """ - # Path: model/attributes/frames/frames__total.json - FRAMES_TOTAL: Literal["frames.total"] = "frames.total" - """The number of total frames rendered during the lifetime of the span. + # Path: model/attributes/gen_ai/gen_ai__embeddings__input.json + GEN_AI_EMBEDDINGS_INPUT: Literal["gen_ai.embeddings.input"] = ( + "gen_ai.embeddings.input" + ) + """The input to the embeddings model. - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: app.vitals.frames.total.count, sentry.frames.total - DEPRECATED: Use app.vitals.frames.total.count instead - Replaced by app.vitals.frames.total.count to align with the app.vitals.* namespace for mobile performance attributes - Example: 60 + Example: "What's the weather in Paris?" """ - # Path: model/attributes/frames_frozen_rate.json - FRAMES_FROZEN_RATE: Literal["frames_frozen_rate"] = "frames_frozen_rate" - """The rate of frozen frames, or `app.vitals.frames.frozen.count` divided by `app.vitals.frames.total.count`. This is computed by Relay. + # Path: model/attributes/gen_ai/gen_ai__function_id.json + GEN_AI_FUNCTION_ID: Literal["gen_ai.function_id"] = "gen_ai.function_id" + """Framework-specific tracing label for the execution of a function or other unit of execution in a generative AI system. - Type: float + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: app.vitals.frames.frozen.rate - DEPRECATED: Use app.vitals.frames.frozen.rate instead - Replaced by app.vitals.frames.frozen.rate to align with the app.vitals.* namespace for mobile performance attributes + Example: "my-awesome-function" """ - # Path: model/attributes/frames_slow_rate.json - FRAMES_SLOW_RATE: Literal["frames_slow_rate"] = "frames_slow_rate" - """The rate of slow frames, or `app.vitals.frames.slow.count` divided by `app.vitals.frames.total.count`. This is computed by Relay. + # Path: model/attributes/gen_ai/gen_ai__input__messages.json + GEN_AI_INPUT_MESSAGES: Literal["gen_ai.input.messages"] = "gen_ai.input.messages" + """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:"..."}`. For `gen_ai.evaluate` operations, the array holds one object `{type: "evaluation", state: ..., questions: {...}}` with the evaluated state and the questions keyed by name, as the caller passed them. - Type: float + Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Aliases: app.vitals.frames.slow.rate - DEPRECATED: Use app.vitals.frames.slow.rate instead - Replaced by app.vitals.frames.slow.rate to align with the app.vitals.* namespace for mobile performance attributes + Aliases: ai.texts, ai.prompt.messages, gen_ai.prompt, ai.prompt + 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\"}]}]" """ - # Path: model/attributes/fs_error.json - FS_ERROR: Literal["fs_error"] = "fs_error" - """The error message of a file system error. + # Path: model/attributes/gen_ai/gen_ai__memory__query__text.json + GEN_AI_MEMORY_QUERY_TEXT: Literal["gen_ai.memory.query.text"] = ( + "gen_ai.memory.query.text" + ) + """The search query used to retrieve memories. Only applicable to 'search_memory'. Opt-in: instrumentations SHOULD NOT capture this by default and SHOULD gate it behind explicit user opt-in, as it may contain sensitive information. Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - DEPRECATED: Use error.type instead - This attribute is not part of the OpenTelemetry specification and error.type fits much better. The value changes from the full error message to the syscall error code, so the old value cannot be copied over. - Example: "ENOENT: no such file or directory" + Example: "user dietary preferences" + Example: "past flight bookings" """ - # Path: model/attributes/gcp/gcp__function__context__event_id.json - GCP_FUNCTION_CONTEXT_EVENT_ID: Literal["gcp.function.context.event_id"] = ( - "gcp.function.context.event_id" + # Path: model/attributes/gen_ai/gen_ai__memory__record__count.json + GEN_AI_MEMORY_RECORD_COUNT: Literal["gen_ai.memory.record.count"] = ( + "gen_ai.memory.record.count" ) - """The event ID from the legacy GCP Cloud Function context (1st gen) + """The number of memory records relevant to the operation. For 'search_memory' this is the number returned; for 'create_memory', 'update_memory', 'upsert_memory' and 'delete_memory' it is the number the operation attempted to create, modify, create-or-update, or delete respectively. - Type: str + Type: int Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: "1234567890" + Example: 3 """ - # Path: model/attributes/gcp/gcp__function__context__event_type.json - GCP_FUNCTION_CONTEXT_EVENT_TYPE: Literal["gcp.function.context.event_type"] = ( - "gcp.function.context.event_type" + # Path: model/attributes/gen_ai/gen_ai__memory__record__id.json + GEN_AI_MEMORY_RECORD_ID: Literal["gen_ai.memory.record.id"] = ( + "gen_ai.memory.record.id" ) - """The type of the GCP Cloud Function event + """The unique identifier of the memory record. Set when the operation applies to a specific memory record. For 'delete_memory', its absence may indicate the operation intends to delete all memory records in the store. Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: "google.pubsub.topic.publish" + Example: "mem_5j66UpCpwteGg4YSxUnt7lPY" """ - # Path: model/attributes/gcp/gcp__function__context__id.json - GCP_FUNCTION_CONTEXT_ID: Literal["gcp.function.context.id"] = ( - "gcp.function.context.id" - ) - """The unique event ID from the GCP CloudEvents context (2nd gen Cloud Functions) + # Path: model/attributes/gen_ai/gen_ai__memory__records.json + GEN_AI_MEMORY_RECORDS: Literal["gen_ai.memory.records"] = "gen_ai.memory.records" + """The memory records stored or retrieved in a memory operation. Stringified JSON array; each element follows the OTel MemoryRecord schema: {content (required), id, metadata, score}. Opt-in: instrumentations SHOULD NOT capture this by default and SHOULD gate it behind explicit user opt-in, as it may contain sensitive information including user/PII data. Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: "1234567890" + Example: "[{\"content\": \"User prefers dark mode\", \"id\": \"mem_123\", \"score\": 0.95}, {\"content\": {\"preference\": \"vegetarian meals\", \"confidence\": 0.9}, \"metadata\": {\"source\": \"profile\"}}]" """ - # Path: model/attributes/gcp/gcp__function__context__resource.json - GCP_FUNCTION_CONTEXT_RESOURCE: Literal["gcp.function.context.resource"] = ( - "gcp.function.context.resource" - ) - """The resource that triggered the GCP Cloud Function event + # Path: model/attributes/gen_ai/gen_ai__memory__store__id.json + GEN_AI_MEMORY_STORE_ID: Literal["gen_ai.memory.store.id"] = "gen_ai.memory.store.id" + """The unique identifier of the memory store the operation targets. What this maps to is implementation-specific (e.g. a collection, namespace, or vector index) and SHOULD be documented per integration. Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: "projects/my-project/topics/my-topic" + Example: "ms_abc123" + Example: "user-preferences-store" + Example: "seer-knowledge" """ - # Path: model/attributes/gcp/gcp__function__context__source.json - GCP_FUNCTION_CONTEXT_SOURCE: Literal["gcp.function.context.source"] = ( - "gcp.function.context.source" - ) - """The source of the GCP Cloud Function event + # Path: model/attributes/gen_ai/gen_ai__operation__name.json + GEN_AI_OPERATION_NAME: Literal["gen_ai.operation.name"] = "gen_ai.operation.name" + """The name of the operation being performed. Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: "//pubsub.googleapis.com/projects/my-project/topics/my-topic" + Well-defined Values: + - `chat` + - `create_agent` + - `create_memory` + - `create_memory_store` + - `delete_memory` + - `delete_memory_store` + - `embeddings` + - `evaluate` + - `execute_tool` + - `generate_content` + - `invoke_agent` + - `search_memory` + - `text_completion` + - `update_memory` + - `upsert_memory` + Example: "chat" """ - # Path: model/attributes/gcp/gcp__function__context__specversion.json - GCP_FUNCTION_CONTEXT_SPECVERSION: Literal["gcp.function.context.specversion"] = ( - "gcp.function.context.specversion" - ) - """The CloudEvents specification version of the GCP Cloud Function event + # Path: model/attributes/gen_ai/gen_ai__operation__type.json + GEN_AI_OPERATION_TYPE: Literal["gen_ai.operation.type"] = "gen_ai.operation.type" + """The type of AI operation. Added during ingestion based on span.op and gen_ai.operation.type. Used to filter and aggregate data in the UI Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "1.0" + Well-defined Values: + - `agent` - invoke_agent and create_agent spans + - `ai_client` - any LLM call + - `tool` - execute_tool spans + - `handoff` - handoff spans + - `memory` - gen_ai.memory.client spans + - `other` - input and output processors, skill loading, guardrails etc. + Example: "tool" """ - # Path: model/attributes/gcp/gcp__function__context__time.json - GCP_FUNCTION_CONTEXT_TIME: Literal["gcp.function.context.time"] = ( - "gcp.function.context.time" - ) - """The timestamp of the GCP Cloud Function event + # Path: model/attributes/gen_ai/gen_ai__output__messages.json + GEN_AI_OUTPUT_MESSAGES: Literal["gen_ai.output.messages"] = "gen_ai.output.messages" + """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. For `gen_ai.evaluate` operations, the array holds one object `{type: "evaluation", answers: {...}}` with the answers keyed by question name, as the provider returned them. Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: "2024-01-01T00:00:00.000Z" + Aliases: ai.response.toolCalls, ai.response.text + Example: "[{\"role\": \"assistant\", \"parts\": [{\"type\": \"text\", \"content\": \"The weather in Paris is currently rainy with a temperature of 57°F.\"}], \"finish_reason\": \"stop\"}]" """ - # Path: model/attributes/gcp/gcp__function__context__timestamp.json - GCP_FUNCTION_CONTEXT_TIMESTAMP: Literal["gcp.function.context.timestamp"] = ( - "gcp.function.context.timestamp" - ) - """The legacy timestamp of the GCP Cloud Function event + # Path: model/attributes/gen_ai/gen_ai__pipeline__name.json + GEN_AI_PIPELINE_NAME: Literal["gen_ai.pipeline.name"] = "gen_ai.pipeline.name" + """Name of the AI pipeline or chain being executed. Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "2024-01-01T00:00:00.000Z" + Aliases: ai.pipeline.name, langchain.chain.name + Example: "Autofix Pipeline" """ - # Path: model/attributes/gcp/gcp__function__context__type.json - GCP_FUNCTION_CONTEXT_TYPE: Literal["gcp.function.context.type"] = ( - "gcp.function.context.type" - ) - """The type of the GCP Cloud Function event context + # Path: model/attributes/gen_ai/gen_ai__prompt.json + GEN_AI_PROMPT: Literal["gen_ai.prompt"] = "gen_ai.prompt" + """The input messages sent to the model Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: "cloud_functions.context" + Aliases: gen_ai.input.messages, ai.texts, ai.prompt.messages, ai.prompt + DEPRECATED: Use gen_ai.input.messages instead - Deprecated from OTEL, use gen_ai.input.messages with the new format instead. + Example: "[{\"role\": \"user\", \"message\": \"hello\"}]" """ - # Path: model/attributes/gcp/gcp__project__id.json - GCP_PROJECT_ID: Literal["gcp.project.id"] = "gcp.project.id" - """The ID of the project in GCP that this resource is associated with + # Path: model/attributes/gen_ai/gen_ai__prompt__name.json + GEN_AI_PROMPT_NAME: Literal["gen_ai.prompt.name"] = "gen_ai.prompt.name" + """The name of the prompt that uniquely identifies it. Type: str - Apply Scrubbing: manual - Defined in OTEL: No + Apply Scrubbing: manual - Prompt names may reveal user behavior patterns or sensitive operations + Defined in OTEL: Yes Visibility: public - Example: "my-project-123" + Aliases: mcp.prompt.name + Example: "summarize_text" """ - # Path: model/attributes/gcp_region.json - GCP_REGION: Literal["gcp_region"] = "gcp_region" - """The geographical region the GCP resource is running + # Path: model/attributes/gen_ai/gen_ai__prompt__variable__[key].json + GEN_AI_PROMPT_VARIABLE_KEY: Literal["gen_ai.prompt.variable."] = ( + "gen_ai.prompt.variable." + ) + """Variables supplied to the prompt template. The is the variable name, and the value is the variable value serialized as a string. Type: str - Apply Scrubbing: manual - Defined in OTEL: No + Apply Scrubbing: auto - Prompt variables contain user input and may include sensitive information + Defined in OTEL: Yes Visibility: public - Aliases: cloud.region, aws_region - DEPRECATED: Use cloud.region instead - Example: "us-east-1" + Has Dynamic Suffix: true + Example: "gen_ai.prompt.variable.language='French'" + Example: "gen_ai.prompt.variable.topic='weather'" """ - # Path: model/attributes/gen_ai/gen_ai__agent__name.json - GEN_AI_AGENT_NAME: Literal["gen_ai.agent.name"] = "gen_ai.agent.name" - """The name of the agent being used. + # Path: model/attributes/gen_ai/gen_ai__provider__name.json + GEN_AI_PROVIDER_NAME: Literal["gen_ai.provider.name"] = "gen_ai.provider.name" + """The Generative AI provider as identified by the client or server instrumentation. Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Example: "ResearchAssistant" + Aliases: ai.model.provider, gen_ai.system + Example: "openai" """ - # Path: model/attributes/gen_ai/gen_ai__context__utilization.json - GEN_AI_CONTEXT_UTILIZATION: Literal["gen_ai.context.utilization"] = ( - "gen_ai.context.utilization" + # Path: model/attributes/gen_ai/gen_ai__request__available_tools.json + GEN_AI_REQUEST_AVAILABLE_TOOLS: Literal["gen_ai.request.available_tools"] = ( + "gen_ai.request.available_tools" ) - """The fraction of the model context window utilized by this generation. + """The available tools for the model. It has to be a stringified version of an array of objects. - Type: float + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 0.75 + Aliases: gen_ai.tool.definitions + DEPRECATED: Use gen_ai.tool.definitions instead + Example: "[{\"name\": \"get_weather\", \"description\": \"Get the weather for a given location\"}, {\"name\": \"get_news\", \"description\": \"Get the news for a given topic\"}]" """ - # Path: model/attributes/gen_ai/gen_ai__context__window_size.json - GEN_AI_CONTEXT_WINDOW_SIZE: Literal["gen_ai.context.window_size"] = ( - "gen_ai.context.window_size" + # Path: model/attributes/gen_ai/gen_ai__request__frequency_penalty.json + GEN_AI_REQUEST_FREQUENCY_PENALTY: Literal["gen_ai.request.frequency_penalty"] = ( + "gen_ai.request.frequency_penalty" ) - """The maximum context window size supported by the model for this generation. + """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: int + Type: float Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: 128000 + Aliases: ai.frequency_penalty + Example: 0.5 """ - # Path: model/attributes/gen_ai/gen_ai__conversation__id.json - GEN_AI_CONVERSATION_ID: Literal["gen_ai.conversation.id"] = "gen_ai.conversation.id" - """The unique identifier for a conversation (session, thread), used to store and correlate messages within this conversation. + # Path: model/attributes/gen_ai/gen_ai__request__max_tokens.json + GEN_AI_REQUEST_MAX_TOKENS: Literal["gen_ai.request.max_tokens"] = ( + "gen_ai.request.max_tokens" + ) + """The maximum number of tokens to generate in the response. - Type: str + Type: int Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Example: "conv_5j66UpCpwteGg4YSxUnt7lPY" + Example: 2048 """ - # Path: model/attributes/gen_ai/gen_ai__cost__cache_creation__input_tokens.json - GEN_AI_COST_CACHE_CREATION_INPUT_TOKENS: Literal[ - "gen_ai.cost.cache_creation.input_tokens" - ] = "gen_ai.cost.cache_creation.input_tokens" - """The cost of input tokens written to cache in USD. + # Path: model/attributes/gen_ai/gen_ai__request__messages.json + GEN_AI_REQUEST_MESSAGES: Literal["gen_ai.request.messages"] = ( + "gen_ai.request.messages" + ) + """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: float + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 12.34 + Aliases: ai.input_messages + DEPRECATED: Use gen_ai.input.messages instead + 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\"}}]" """ - # Path: model/attributes/gen_ai/gen_ai__cost__cache_read__input_tokens.json - GEN_AI_COST_CACHE_READ_INPUT_TOKENS: Literal[ - "gen_ai.cost.cache_read.input_tokens" - ] = "gen_ai.cost.cache_read.input_tokens" - """The cost of cached input tokens in USD. + # Path: model/attributes/gen_ai/gen_ai__request__model.json + GEN_AI_REQUEST_MODEL: Literal["gen_ai.request.model"] = "gen_ai.request.model" + """The model identifier being used for the request. - Type: float + Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: 12.34 + Aliases: ai.model_id, ai.model.id + Example: "gpt-4-turbo-preview" """ - # Path: model/attributes/gen_ai/gen_ai__cost__input_tokens.json - GEN_AI_COST_INPUT_TOKENS: Literal["gen_ai.cost.input_tokens"] = ( - "gen_ai.cost.input_tokens" + # Path: model/attributes/gen_ai/gen_ai__request__presence_penalty.json + GEN_AI_REQUEST_PRESENCE_PENALTY: Literal["gen_ai.request.presence_penalty"] = ( + "gen_ai.request.presence_penalty" ) - """The total cost of all input tokens in USD (includes cached and cache creation tokens). + """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. Type: float Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: 123.45 + Aliases: ai.presence_penalty + Example: 0.5 """ - # Path: model/attributes/gen_ai/gen_ai__cost__output_tokens.json - GEN_AI_COST_OUTPUT_TOKENS: Literal["gen_ai.cost.output_tokens"] = ( - "gen_ai.cost.output_tokens" + # Path: model/attributes/gen_ai/gen_ai__request__reasoning__level.json + GEN_AI_REQUEST_REASONING_LEVEL: Literal["gen_ai.request.reasoning.level"] = ( + "gen_ai.request.reasoning.level" ) - """The total cost of all output tokens in USD (includes reasoning tokens). + """The reasoning or thinking effort level requested for a GenAI model. - Type: float + Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: 123.45 + Example: "high" """ - # Path: model/attributes/gen_ai/gen_ai__cost__reasoning__output_tokens.json - GEN_AI_COST_REASONING_OUTPUT_TOKENS: Literal[ - "gen_ai.cost.reasoning.output_tokens" - ] = "gen_ai.cost.reasoning.output_tokens" - """The cost of reasoning output tokens in USD. + # Path: model/attributes/gen_ai/gen_ai__request__schema.json + GEN_AI_REQUEST_SCHEMA: Literal["gen_ai.request.schema"] = "gen_ai.request.schema" + """The stringified JSON schema the model output must conform to. - Type: float + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 12.34 + DEPRECATED: No replacement at this time - This attribute is deprecated. The Sentry conventions have no replacement for the requested output schema. + Example: "{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}}}" """ - # Path: model/attributes/gen_ai/gen_ai__cost__total_tokens.json - GEN_AI_COST_TOTAL_TOKENS: Literal["gen_ai.cost.total_tokens"] = ( - "gen_ai.cost.total_tokens" - ) - """The total cost for the tokens used. + # Path: model/attributes/gen_ai/gen_ai__request__seed.json + GEN_AI_REQUEST_SEED: Literal["gen_ai.request.seed"] = "gen_ai.request.seed" + """The seed, ideally models given the same seed and same other parameters will produce the exact same output. - Type: float + Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Aliases: ai.total_cost - Example: 12.34 + Aliases: ai.seed + Example: "1234567890" """ - # Path: model/attributes/gen_ai/gen_ai__embeddings__input.json - GEN_AI_EMBEDDINGS_INPUT: Literal["gen_ai.embeddings.input"] = ( - "gen_ai.embeddings.input" + # Path: model/attributes/gen_ai/gen_ai__request__stop_sequences.json + GEN_AI_REQUEST_STOP_SEQUENCES: Literal["gen_ai.request.stop_sequences"] = ( + "gen_ai.request.stop_sequences" ) - """The input to the embeddings model. + """List of sequences that the model will use to stop generating further tokens. - Type: str + Type: List[str] Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: "What's the weather in Paris?" + Example: ["forest","lived"] """ - # Path: model/attributes/gen_ai/gen_ai__function_id.json - GEN_AI_FUNCTION_ID: Literal["gen_ai.function_id"] = "gen_ai.function_id" - """Framework-specific tracing label for the execution of a function or other unit of execution in a generative AI system. + # Path: model/attributes/gen_ai/gen_ai__request__temperature.json + GEN_AI_REQUEST_TEMPERATURE: Literal["gen_ai.request.temperature"] = ( + "gen_ai.request.temperature" + ) + """For an AI model call, the temperature parameter. Temperature essentially means how random the output will be. - Type: str + Type: float Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: "my-awesome-function" + Aliases: ai.temperature + Example: 0.1 """ - # Path: model/attributes/gen_ai/gen_ai__input__messages.json - GEN_AI_INPUT_MESSAGES: Literal["gen_ai.input.messages"] = "gen_ai.input.messages" - """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:"..."}`. For `gen_ai.evaluate` operations, the array holds one object `{type: "evaluation", state: ..., questions: {...}}` with the evaluated state and the questions keyed by name, as the caller passed them. + # Path: model/attributes/gen_ai/gen_ai__request__top_k.json + GEN_AI_REQUEST_TOP_K: Literal["gen_ai.request.top_k"] = "gen_ai.request.top_k" + """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: str + Type: int Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: ai.texts, ai.prompt.messages, gen_ai.prompt, ai.prompt - 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\"}]}]" + Aliases: ai.top_k + Example: 35 """ - # Path: model/attributes/gen_ai/gen_ai__memory__query__text.json - GEN_AI_MEMORY_QUERY_TEXT: Literal["gen_ai.memory.query.text"] = ( - "gen_ai.memory.query.text" - ) - """The search query used to retrieve memories. Only applicable to 'search_memory'. Opt-in: instrumentations SHOULD NOT capture this by default and SHOULD gate it behind explicit user opt-in, as it may contain sensitive information. + # Path: model/attributes/gen_ai/gen_ai__request__top_p.json + GEN_AI_REQUEST_TOP_P: Literal["gen_ai.request.top_p"] = "gen_ai.request.top_p" + """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: str + Type: float Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Example: "user dietary preferences" - Example: "past flight bookings" + Aliases: ai.top_p + Example: 0.7 """ - # Path: model/attributes/gen_ai/gen_ai__memory__record__count.json - GEN_AI_MEMORY_RECORD_COUNT: Literal["gen_ai.memory.record.count"] = ( - "gen_ai.memory.record.count" + # Path: model/attributes/gen_ai/gen_ai__response__finish_reason.json + GEN_AI_RESPONSE_FINISH_REASON: Literal["gen_ai.response.finish_reason"] = ( + "gen_ai.response.finish_reason" ) - """The number of memory records relevant to the operation. For 'search_memory' this is the number returned; for 'create_memory', 'update_memory', 'upsert_memory' and 'delete_memory' it is the number the operation attempted to create, modify, create-or-update, or delete respectively. + """The reason why the model stopped generating (singular form). - Type: int + Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: 3 + Aliases: gen_ai.response.finish_reasons + DEPRECATED: Use gen_ai.response.finish_reasons instead + Example: "COMPLETE" """ - # Path: model/attributes/gen_ai/gen_ai__memory__record__id.json - GEN_AI_MEMORY_RECORD_ID: Literal["gen_ai.memory.record.id"] = ( - "gen_ai.memory.record.id" + # Path: model/attributes/gen_ai/gen_ai__response__finish_reasons.json + GEN_AI_RESPONSE_FINISH_REASONS: Literal["gen_ai.response.finish_reasons"] = ( + "gen_ai.response.finish_reasons" ) - """The unique identifier of the memory record. Set when the operation applies to a specific memory record. For 'delete_memory', its absence may indicate the operation intends to delete all memory records in the store. + """The reason why the model stopped generating. Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Example: "mem_5j66UpCpwteGg4YSxUnt7lPY" + Aliases: ai.finish_reason, gen_ai.response.finish_reason + Example: "COMPLETE" """ - # Path: model/attributes/gen_ai/gen_ai__memory__records.json - GEN_AI_MEMORY_RECORDS: Literal["gen_ai.memory.records"] = "gen_ai.memory.records" - """The memory records stored or retrieved in a memory operation. Stringified JSON array; each element follows the OTel MemoryRecord schema: {content (required), id, metadata, score}. Opt-in: instrumentations SHOULD NOT capture this by default and SHOULD gate it behind explicit user opt-in, as it may contain sensitive information including user/PII data. + # Path: model/attributes/gen_ai/gen_ai__response__id.json + GEN_AI_RESPONSE_ID: Literal["gen_ai.response.id"] = "gen_ai.response.id" + """Unique identifier for the completion. Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Example: "[{\"content\": \"User prefers dark mode\", \"id\": \"mem_123\", \"score\": 0.95}, {\"content\": {\"preference\": \"vegetarian meals\", \"confidence\": 0.9}, \"metadata\": {\"source\": \"profile\"}}]" + Aliases: ai.generation_id, ai.response.id + Example: "gen_123abc" """ - # Path: model/attributes/gen_ai/gen_ai__memory__store__id.json - GEN_AI_MEMORY_STORE_ID: Literal["gen_ai.memory.store.id"] = "gen_ai.memory.store.id" - """The unique identifier of the memory store the operation targets. What this maps to is implementation-specific (e.g. a collection, namespace, or vector index) and SHOULD be documented per integration. + # Path: model/attributes/gen_ai/gen_ai__response__model.json + GEN_AI_RESPONSE_MODEL: Literal["gen_ai.response.model"] = "gen_ai.response.model" + """The vendor-specific ID of the model used. Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Example: "ms_abc123" - Example: "user-preferences-store" - Example: "seer-knowledge" + Aliases: ai.response.model + Example: "gpt-4" """ - # Path: model/attributes/gen_ai/gen_ai__operation__name.json - GEN_AI_OPERATION_NAME: Literal["gen_ai.operation.name"] = "gen_ai.operation.name" - """The name of the operation being performed. + # Path: model/attributes/gen_ai/gen_ai__response__object.json + GEN_AI_RESPONSE_OBJECT: Literal["gen_ai.response.object"] = "gen_ai.response.object" + """The type of the object returned by the model. Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Well-defined Values: - - `chat` - - `create_agent` - - `create_memory` - - `create_memory_store` - - `delete_memory` - - `delete_memory_store` - - `embeddings` - - `evaluate` - - `execute_tool` - - `generate_content` - - `invoke_agent` - - `search_memory` - - `text_completion` - - `update_memory` - - `upsert_memory` - Example: "chat" + DEPRECATED: No replacement at this time - This attribute is deprecated. The Sentry conventions have no replacement for the raw response object type. + Example: "chat.completion" """ - # Path: model/attributes/gen_ai/gen_ai__operation__type.json - GEN_AI_OPERATION_TYPE: Literal["gen_ai.operation.type"] = "gen_ai.operation.type" - """The type of AI operation. Added during ingestion based on span.op and gen_ai.operation.type. Used to filter and aggregate data in the UI + # Path: model/attributes/gen_ai/gen_ai__response__streaming.json + GEN_AI_RESPONSE_STREAMING: Literal["gen_ai.response.streaming"] = ( + "gen_ai.response.streaming" + ) + """Whether or not the AI model call's response was streamed back asynchronously - Type: str + Type: bool Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Well-defined Values: - - `agent` - invoke_agent and create_agent spans - - `ai_client` - any LLM call - - `tool` - execute_tool spans - - `handoff` - handoff spans - - `memory` - gen_ai.memory.client spans - - `other` - input and output processors, skill loading, guardrails etc. - Example: "tool" + Aliases: ai.streaming + Example: true """ - # Path: model/attributes/gen_ai/gen_ai__output__messages.json - GEN_AI_OUTPUT_MESSAGES: Literal["gen_ai.output.messages"] = "gen_ai.output.messages" - """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. For `gen_ai.evaluate` operations, the array holds one object `{type: "evaluation", answers: {...}}` with the answers keyed by question name, as the provider returned them. + # Path: model/attributes/gen_ai/gen_ai__response__text.json + GEN_AI_RESPONSE_TEXT: Literal["gen_ai.response.text"] = "gen_ai.response.text" + """The model's response text messages. It has to be a stringified version of an array of response text messages. Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: ai.response.toolCalls, ai.response.text - Example: "[{\"role\": \"assistant\", \"parts\": [{\"type\": \"text\", \"content\": \"The weather in Paris is currently rainy with a temperature of 57°F.\"}], \"finish_reason\": \"stop\"}]" + DEPRECATED: Use gen_ai.output.messages instead + 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\"]" """ - # Path: model/attributes/gen_ai/gen_ai__pipeline__name.json - GEN_AI_PIPELINE_NAME: Literal["gen_ai.pipeline.name"] = "gen_ai.pipeline.name" - """Name of the AI pipeline or chain being executed. + # Path: model/attributes/gen_ai/gen_ai__response__time_to_first_chunk.json + GEN_AI_RESPONSE_TIME_TO_FIRST_CHUNK: Literal[ + "gen_ai.response.time_to_first_chunk" + ] = "gen_ai.response.time_to_first_chunk" + """Time in seconds when the first response content chunk arrived in streaming responses. - Type: str + Type: float Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Aliases: ai.pipeline.name, langchain.chain.name - Example: "Autofix Pipeline" + Aliases: gen_ai.response.time_to_first_token + Example: 0.6853435 """ - # Path: model/attributes/gen_ai/gen_ai__prompt.json - GEN_AI_PROMPT: Literal["gen_ai.prompt"] = "gen_ai.prompt" - """The input messages sent to the model + # Path: model/attributes/gen_ai/gen_ai__response__time_to_first_token.json + GEN_AI_RESPONSE_TIME_TO_FIRST_TOKEN: Literal[ + "gen_ai.response.time_to_first_token" + ] = "gen_ai.response.time_to_first_token" + """Time in seconds when the first response content chunk arrived in streaming responses. - Type: str + Type: float Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: gen_ai.input.messages, ai.texts, ai.prompt.messages, ai.prompt - DEPRECATED: Use gen_ai.input.messages instead - Deprecated from OTEL, use gen_ai.input.messages with the new format instead. - Example: "[{\"role\": \"user\", \"message\": \"hello\"}]" + Aliases: gen_ai.response.time_to_first_chunk + DEPRECATED: Use gen_ai.response.time_to_first_chunk instead + Example: 0.6853435 """ - # Path: model/attributes/gen_ai/gen_ai__prompt__name.json - GEN_AI_PROMPT_NAME: Literal["gen_ai.prompt.name"] = "gen_ai.prompt.name" - """The name of the prompt that uniquely identifies it. + # Path: model/attributes/gen_ai/gen_ai__response__tokens_per_second.json + GEN_AI_RESPONSE_TOKENS_PER_SECOND: Literal["gen_ai.response.tokens_per_second"] = ( + "gen_ai.response.tokens_per_second" + ) + """The total output tokens per seconds throughput - Type: str - Apply Scrubbing: manual - Prompt names may reveal user behavior patterns or sensitive operations - Defined in OTEL: Yes + Type: float + Apply Scrubbing: manual + Defined in OTEL: No Visibility: public - Aliases: mcp.prompt.name - Example: "summarize_text" + Example: 12345.67 """ - # Path: model/attributes/gen_ai/gen_ai__prompt__variable__[key].json - GEN_AI_PROMPT_VARIABLE_KEY: Literal["gen_ai.prompt.variable."] = ( - "gen_ai.prompt.variable." + # Path: model/attributes/gen_ai/gen_ai__response__tool_calls.json + GEN_AI_RESPONSE_TOOL_CALLS: Literal["gen_ai.response.tool_calls"] = ( + "gen_ai.response.tool_calls" ) - """Variables supplied to the prompt template. The is the variable name, and the value is the variable value serialized as a string. + """The tool calls in the model's response. It has to be a stringified version of an array of objects. Type: str - Apply Scrubbing: auto - Prompt variables contain user input and may include sensitive information - Defined in OTEL: Yes + Apply Scrubbing: manual + Defined in OTEL: No Visibility: public - Has Dynamic Suffix: true - Example: "gen_ai.prompt.variable.language='French'" - Example: "gen_ai.prompt.variable.topic='weather'" + DEPRECATED: Use gen_ai.output.messages instead + Example: "[{\"name\": \"get_weather\", \"arguments\": {\"location\": \"Paris\"}}]" """ - # Path: model/attributes/gen_ai/gen_ai__provider__name.json - GEN_AI_PROVIDER_NAME: Literal["gen_ai.provider.name"] = "gen_ai.provider.name" - """The Generative AI provider as identified by the client or server instrumentation. + # Path: model/attributes/gen_ai/gen_ai__system.json + GEN_AI_SYSTEM: Literal["gen_ai.system"] = "gen_ai.system" + """The provider of the model. Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: ai.model.provider, gen_ai.system + Aliases: ai.model.provider, gen_ai.provider.name + DEPRECATED: Use gen_ai.provider.name instead Example: "openai" """ - # Path: model/attributes/gen_ai/gen_ai__request__available_tools.json - GEN_AI_REQUEST_AVAILABLE_TOOLS: Literal["gen_ai.request.available_tools"] = ( - "gen_ai.request.available_tools" - ) - """The available tools for the model. It has to be a stringified version of an array of objects. + # Path: model/attributes/gen_ai/gen_ai__system__message.json + GEN_AI_SYSTEM_MESSAGE: Literal["gen_ai.system.message"] = "gen_ai.system.message" + """The system instructions passed to the model. Type: str - Apply Scrubbing: manual + Apply Scrubbing: auto Defined in OTEL: No Visibility: public - Aliases: gen_ai.tool.definitions - DEPRECATED: Use gen_ai.tool.definitions instead - Example: "[{\"name\": \"get_weather\", \"description\": \"Get the weather for a given location\"}, {\"name\": \"get_news\", \"description\": \"Get the news for a given topic\"}]" + DEPRECATED: Use gen_ai.system_instructions instead + Example: "You are a helpful assistant" """ - # Path: model/attributes/gen_ai/gen_ai__request__frequency_penalty.json - GEN_AI_REQUEST_FREQUENCY_PENALTY: Literal["gen_ai.request.frequency_penalty"] = ( - "gen_ai.request.frequency_penalty" + # Path: model/attributes/gen_ai/gen_ai__system_instructions.json + GEN_AI_SYSTEM_INSTRUCTIONS: Literal["gen_ai.system_instructions"] = ( + "gen_ai.system_instructions" ) - """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. + """The system instructions passed to the model. - Type: float + Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: ai.frequency_penalty - Example: 0.5 + Aliases: ai.preamble + Example: "You are a helpful assistant" """ - # Path: model/attributes/gen_ai/gen_ai__request__max_tokens.json - GEN_AI_REQUEST_MAX_TOKENS: Literal["gen_ai.request.max_tokens"] = ( - "gen_ai.request.max_tokens" + # Path: model/attributes/gen_ai/gen_ai__tool__call__arguments.json + GEN_AI_TOOL_CALL_ARGUMENTS: Literal["gen_ai.tool.call.arguments"] = ( + "gen_ai.tool.call.arguments" ) - """The maximum number of tokens to generate in the response. + """The arguments of the tool call. It has to be a stringified version of the arguments to the tool. - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Example: 2048 + Aliases: gen_ai.tool.input, ai.toolCall.args + Example: "{\"location\": \"Paris\"}" """ - # Path: model/attributes/gen_ai/gen_ai__request__messages.json - GEN_AI_REQUEST_MESSAGES: Literal["gen_ai.request.messages"] = ( - "gen_ai.request.messages" + # Path: model/attributes/gen_ai/gen_ai__tool__call__result.json + GEN_AI_TOOL_CALL_RESULT: Literal["gen_ai.tool.call.result"] = ( + "gen_ai.tool.call.result" ) - """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:"..."}`. + """The result of the tool call. It has to be a stringified version of the result of the tool. Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Aliases: ai.input_messages - DEPRECATED: Use gen_ai.input.messages instead - 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\"}}]" + Aliases: gen_ai.tool.output, gen_ai.tool.message, mcp.tool.result.content, ai.toolCall.result, anthropic.tool_result.content + Example: "rainy, 57°F" """ - # Path: model/attributes/gen_ai/gen_ai__request__model.json - GEN_AI_REQUEST_MODEL: Literal["gen_ai.request.model"] = "gen_ai.request.model" - """The model identifier being used for the request. + # Path: model/attributes/gen_ai/gen_ai__tool__definitions.json + GEN_AI_TOOL_DEFINITIONS: Literal["gen_ai.tool.definitions"] = ( + "gen_ai.tool.definitions" + ) + """The list of source system tool definitions available to the GenAI agent or model. Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: ai.model_id, ai.model.id - Example: "gpt-4-turbo-preview" + Aliases: gen_ai.request.available_tools + 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\"]}}]" """ - # Path: model/attributes/gen_ai/gen_ai__request__presence_penalty.json - GEN_AI_REQUEST_PRESENCE_PENALTY: Literal["gen_ai.request.presence_penalty"] = ( - "gen_ai.request.presence_penalty" + # Path: model/attributes/gen_ai/gen_ai__tool__description.json + GEN_AI_TOOL_DESCRIPTION: Literal["gen_ai.tool.description"] = ( + "gen_ai.tool.description" ) - """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. + """The description of the tool being used. - Type: float + Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: ai.presence_penalty - Example: 0.5 + Example: "Searches the web for current information about a topic" """ - # Path: model/attributes/gen_ai/gen_ai__request__reasoning__level.json - GEN_AI_REQUEST_REASONING_LEVEL: Literal["gen_ai.request.reasoning.level"] = ( - "gen_ai.request.reasoning.level" - ) - """The reasoning or thinking effort level requested for a GenAI model. + # Path: model/attributes/gen_ai/gen_ai__tool__input.json + GEN_AI_TOOL_INPUT: Literal["gen_ai.tool.input"] = "gen_ai.tool.input" + """The input of the tool being used. It has to be a stringified version of the input to the tool. Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: "high" + Aliases: gen_ai.tool.call.arguments, ai.toolCall.args + DEPRECATED: Use gen_ai.tool.call.arguments instead + Example: "{\"location\": \"Paris\"}" """ - # Path: model/attributes/gen_ai/gen_ai__request__schema.json - GEN_AI_REQUEST_SCHEMA: Literal["gen_ai.request.schema"] = "gen_ai.request.schema" - """The stringified JSON schema the model output must conform to. + # Path: model/attributes/gen_ai/gen_ai__tool__message.json + GEN_AI_TOOL_MESSAGE: Literal["gen_ai.tool.message"] = "gen_ai.tool.message" + """The response from a tool or function call passed to the model. Type: str - Apply Scrubbing: manual + Apply Scrubbing: auto Defined in OTEL: No Visibility: public - DEPRECATED: No replacement at this time - This attribute is deprecated. The Sentry conventions have no replacement for the requested output schema. - Example: "{\"type\":\"object\",\"properties\":{\"city\":{\"type\":\"string\"}}}" + Aliases: gen_ai.tool.call.result, gen_ai.tool.output, mcp.tool.result.content, ai.toolCall.result, anthropic.tool_result.content + DEPRECATED: Use gen_ai.tool.call.result instead + Example: "rainy, 57°F" """ - # Path: model/attributes/gen_ai/gen_ai__request__seed.json - GEN_AI_REQUEST_SEED: Literal["gen_ai.request.seed"] = "gen_ai.request.seed" - """The seed, ideally models given the same seed and same other parameters will produce the exact same output. + # Path: model/attributes/gen_ai/gen_ai__tool__name.json + GEN_AI_TOOL_NAME: Literal["gen_ai.tool.name"] = "gen_ai.tool.name" + """Name of the tool utilized by the agent. Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: ai.seed - Example: "1234567890" + Aliases: ai.function_call, mcp.tool.name + Example: "Flights" """ - # Path: model/attributes/gen_ai/gen_ai__request__stop_sequences.json - GEN_AI_REQUEST_STOP_SEQUENCES: Literal["gen_ai.request.stop_sequences"] = ( - "gen_ai.request.stop_sequences" - ) - """List of sequences that the model will use to stop generating further tokens. + # Path: model/attributes/gen_ai/gen_ai__tool__output.json + GEN_AI_TOOL_OUTPUT: Literal["gen_ai.tool.output"] = "gen_ai.tool.output" + """The output of the tool being used. It has to be a stringified version of the output of the tool. - Type: List[str] + Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: ["forest","lived"] + Aliases: gen_ai.tool.call.result, gen_ai.tool.message, mcp.tool.result.content, ai.toolCall.result, anthropic.tool_result.content + DEPRECATED: Use gen_ai.tool.call.result instead + Example: "rainy, 57°F" """ - # Path: model/attributes/gen_ai/gen_ai__request__temperature.json - GEN_AI_REQUEST_TEMPERATURE: Literal["gen_ai.request.temperature"] = ( - "gen_ai.request.temperature" - ) - """For an AI model call, the temperature parameter. Temperature essentially means how random the output will be. + # Path: model/attributes/gen_ai/gen_ai__tool__type.json + GEN_AI_TOOL_TYPE: Literal["gen_ai.tool.type"] = "gen_ai.tool.type" + """The type of tool being used. - Type: float + Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: ai.temperature - Example: 0.1 + DEPRECATED: No replacement at this time - The gen_ai.tool.type attribute is deprecated and should no longer be set. + Example: "function" """ - # Path: model/attributes/gen_ai/gen_ai__request__top_k.json - GEN_AI_REQUEST_TOP_K: Literal["gen_ai.request.top_k"] = "gen_ai.request.top_k" - """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). + # Path: model/attributes/gen_ai/gen_ai__usage__cache_creation__input_tokens.json + GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS: Literal[ + "gen_ai.usage.cache_creation.input_tokens" + ] = "gen_ai.usage.cache_creation.input_tokens" + """The number of tokens written to the cache when processing the AI input (prompt). Type: int Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: ai.top_k - Example: 35 + Aliases: gen_ai.usage.input_tokens.cache_write, gen_ai.usage.cache_creation_input_tokens + Example: 100 """ - # Path: model/attributes/gen_ai/gen_ai__request__top_p.json - GEN_AI_REQUEST_TOP_P: Literal["gen_ai.request.top_p"] = "gen_ai.request.top_p" - """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). + # Path: model/attributes/gen_ai/gen_ai__usage__cache_creation_input_tokens.json + _GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS: Literal[ + "gen_ai.usage.cache_creation_input_tokens" + ] = "gen_ai.usage.cache_creation_input_tokens" + """The number of tokens written to the cache when processing the AI input (prompt). - Type: float + Type: int + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Aliases: gen_ai.usage.cache_creation.input_tokens, gen_ai.usage.input_tokens.cache_write + DEPRECATED: Use gen_ai.usage.cache_creation.input_tokens instead - This attribute is being deprecated in favor of gen_ai.usage.cache_creation.input_tokens. + Example: 100 + """ + + # Path: model/attributes/gen_ai/gen_ai__usage__cache_read__input_tokens.json + GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS: Literal[ + "gen_ai.usage.cache_read.input_tokens" + ] = "gen_ai.usage.cache_read.input_tokens" + """The number of cached tokens used to process the AI input (prompt). + + Type: int Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: ai.top_p - Example: 0.7 + Aliases: gen_ai.usage.input_tokens.cached, gen_ai.usage.cache_read_input_tokens + Example: 50 """ - # Path: model/attributes/gen_ai/gen_ai__response__finish_reason.json - GEN_AI_RESPONSE_FINISH_REASON: Literal["gen_ai.response.finish_reason"] = ( - "gen_ai.response.finish_reason" - ) - """The reason why the model stopped generating (singular form). + # Path: model/attributes/gen_ai/gen_ai__usage__cache_read_input_tokens.json + _GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS: Literal[ + "gen_ai.usage.cache_read_input_tokens" + ] = "gen_ai.usage.cache_read_input_tokens" + """The number of cached tokens used to process the AI input (prompt). - Type: str + Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: gen_ai.response.finish_reasons - DEPRECATED: Use gen_ai.response.finish_reasons instead - Example: "COMPLETE" + Aliases: gen_ai.usage.cache_read.input_tokens, gen_ai.usage.input_tokens.cached + DEPRECATED: Use gen_ai.usage.cache_read.input_tokens instead - This attribute is being deprecated in favor of gen_ai.usage.cache_read.input_tokens. + Example: 50 """ - # Path: model/attributes/gen_ai/gen_ai__response__finish_reasons.json - GEN_AI_RESPONSE_FINISH_REASONS: Literal["gen_ai.response.finish_reasons"] = ( - "gen_ai.response.finish_reasons" + # Path: model/attributes/gen_ai/gen_ai__usage__completion_tokens.json + GEN_AI_USAGE_COMPLETION_TOKENS: Literal["gen_ai.usage.completion_tokens"] = ( + "gen_ai.usage.completion_tokens" ) - """The reason why the model stopped generating. + """The number of tokens used in the GenAI response (completion). - Type: str + Type: int Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: ai.finish_reason, gen_ai.response.finish_reason - Example: "COMPLETE" + Aliases: ai.completion_tokens.used, gen_ai.usage.output_tokens + DEPRECATED: Use gen_ai.usage.output_tokens instead + Example: 10 """ - # Path: model/attributes/gen_ai/gen_ai__response__id.json - GEN_AI_RESPONSE_ID: Literal["gen_ai.response.id"] = "gen_ai.response.id" - """Unique identifier for the completion. + # Path: model/attributes/gen_ai/gen_ai__usage__input_tokens.json + GEN_AI_USAGE_INPUT_TOKENS: Literal["gen_ai.usage.input_tokens"] = ( + "gen_ai.usage.input_tokens" + ) + """The number of tokens used to process the AI input (prompt) including cached input tokens. - Type: str + Type: int Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: ai.generation_id, ai.response.id - Example: "gen_123abc" + Aliases: ai.prompt_tokens.used, gen_ai.usage.prompt_tokens + Example: 10 """ - # Path: model/attributes/gen_ai/gen_ai__response__model.json - GEN_AI_RESPONSE_MODEL: Literal["gen_ai.response.model"] = "gen_ai.response.model" - """The vendor-specific ID of the model used. + # Path: model/attributes/gen_ai/gen_ai__usage__input_tokens__cache_write.json + GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE: Literal[ + "gen_ai.usage.input_tokens.cache_write" + ] = "gen_ai.usage.input_tokens.cache_write" + """The number of tokens written to the cache when processing the AI input (prompt). - Type: str + Type: int Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: ai.response.model - Example: "gpt-4" + Aliases: gen_ai.usage.cache_creation.input_tokens, gen_ai.usage.cache_creation_input_tokens + DEPRECATED: Use gen_ai.usage.cache_creation.input_tokens instead + Example: 100 """ - # Path: model/attributes/gen_ai/gen_ai__response__object.json - GEN_AI_RESPONSE_OBJECT: Literal["gen_ai.response.object"] = "gen_ai.response.object" - """The type of the object returned by the model. + # Path: model/attributes/gen_ai/gen_ai__usage__input_tokens__cached.json + GEN_AI_USAGE_INPUT_TOKENS_CACHED: Literal["gen_ai.usage.input_tokens.cached"] = ( + "gen_ai.usage.input_tokens.cached" + ) + """The number of cached tokens used to process the AI input (prompt). - Type: str + Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - DEPRECATED: No replacement at this time - This attribute is deprecated. The Sentry conventions have no replacement for the raw response object type. - Example: "chat.completion" + Aliases: gen_ai.usage.cache_read.input_tokens, gen_ai.usage.cache_read_input_tokens + DEPRECATED: Use gen_ai.usage.cache_read.input_tokens instead + Example: 50 """ - # Path: model/attributes/gen_ai/gen_ai__response__streaming.json - GEN_AI_RESPONSE_STREAMING: Literal["gen_ai.response.streaming"] = ( - "gen_ai.response.streaming" + # Path: model/attributes/gen_ai/gen_ai__usage__output_tokens.json + GEN_AI_USAGE_OUTPUT_TOKENS: Literal["gen_ai.usage.output_tokens"] = ( + "gen_ai.usage.output_tokens" ) - """Whether or not the AI model call's response was streamed back asynchronously + """The number of tokens used for creating the AI output (including reasoning tokens). - Type: bool + Type: int Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Aliases: ai.streaming - Example: true + Aliases: ai.completion_tokens.used, gen_ai.usage.completion_tokens + Example: 10 """ - # Path: model/attributes/gen_ai/gen_ai__response__text.json - GEN_AI_RESPONSE_TEXT: Literal["gen_ai.response.text"] = "gen_ai.response.text" - """The model's response text messages. It has to be a stringified version of an array of response text messages. + # Path: model/attributes/gen_ai/gen_ai__usage__output_tokens__reasoning.json + GEN_AI_USAGE_OUTPUT_TOKENS_REASONING: Literal[ + "gen_ai.usage.output_tokens.reasoning" + ] = "gen_ai.usage.output_tokens.reasoning" + """The number of tokens used for reasoning to create the AI output. - Type: str + Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - DEPRECATED: Use gen_ai.output.messages instead - 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\"]" + Aliases: gen_ai.usage.reasoning.output_tokens + DEPRECATED: Use gen_ai.usage.reasoning.output_tokens instead + Example: 75 """ - # Path: model/attributes/gen_ai/gen_ai__response__time_to_first_chunk.json - GEN_AI_RESPONSE_TIME_TO_FIRST_CHUNK: Literal[ - "gen_ai.response.time_to_first_chunk" - ] = "gen_ai.response.time_to_first_chunk" - """Time in seconds when the first response content chunk arrived in streaming responses. + # Path: model/attributes/gen_ai/gen_ai__usage__prompt_tokens.json + GEN_AI_USAGE_PROMPT_TOKENS: Literal["gen_ai.usage.prompt_tokens"] = ( + "gen_ai.usage.prompt_tokens" + ) + """The number of tokens used in the GenAI input (prompt). - Type: float + Type: int Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: gen_ai.response.time_to_first_token - Example: 0.6853435 + Aliases: ai.prompt_tokens.used, gen_ai.usage.input_tokens + DEPRECATED: Use gen_ai.usage.input_tokens instead + Example: 20 """ - # Path: model/attributes/gen_ai/gen_ai__response__time_to_first_token.json - GEN_AI_RESPONSE_TIME_TO_FIRST_TOKEN: Literal[ - "gen_ai.response.time_to_first_token" - ] = "gen_ai.response.time_to_first_token" - """Time in seconds when the first response content chunk arrived in streaming responses. + # Path: model/attributes/gen_ai/gen_ai__usage__reasoning__output_tokens.json + GEN_AI_USAGE_REASONING_OUTPUT_TOKENS: Literal[ + "gen_ai.usage.reasoning.output_tokens" + ] = "gen_ai.usage.reasoning.output_tokens" + """The number of tokens used for reasoning to create the AI output. - Type: float + Type: int Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Aliases: gen_ai.response.time_to_first_chunk - DEPRECATED: Use gen_ai.response.time_to_first_chunk instead - Example: 0.6853435 + Aliases: gen_ai.usage.output_tokens.reasoning + Example: 75 """ - # Path: model/attributes/gen_ai/gen_ai__response__tokens_per_second.json - GEN_AI_RESPONSE_TOKENS_PER_SECOND: Literal["gen_ai.response.tokens_per_second"] = ( - "gen_ai.response.tokens_per_second" + # Path: model/attributes/gen_ai/gen_ai__usage__total_tokens.json + GEN_AI_USAGE_TOTAL_TOKENS: Literal["gen_ai.usage.total_tokens"] = ( + "gen_ai.usage.total_tokens" ) - """The total output tokens per seconds throughput + """The total number of tokens used to process the prompt. (input tokens plus output todkens) - Type: float + Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 12345.67 + Aliases: ai.total_tokens.used, ai.usage.tokens + Example: 20 """ - # Path: model/attributes/gen_ai/gen_ai__response__tool_calls.json - GEN_AI_RESPONSE_TOOL_CALLS: Literal["gen_ai.response.tool_calls"] = ( - "gen_ai.response.tool_calls" - ) - """The tool calls in the model's response. It has to be a stringified version of an array of objects. + # Path: model/attributes/graphql/graphql__document.json + GRAPHQL_DOCUMENT: Literal["graphql.document"] = "graphql.document" + """The GraphQL document being executed. Type: str - Apply Scrubbing: manual - Defined in OTEL: No + Apply Scrubbing: auto - The document may contain sensitive information in arguments or variables. Instrumentation should redact sensitive information when possible. + Defined in OTEL: Yes Visibility: public - DEPRECATED: Use gen_ai.output.messages instead - Example: "[{\"name\": \"get_weather\", \"arguments\": {\"location\": \"Paris\"}}]" + Aliases: graphql.source + Example: "query findBookById { bookById(id: ?) { name } }" """ - # Path: model/attributes/gen_ai/gen_ai__system.json - GEN_AI_SYSTEM: Literal["gen_ai.system"] = "gen_ai.system" - """The provider of the model. + # Path: model/attributes/graphql/graphql__operation__name.json + GRAPHQL_OPERATION_NAME: Literal["graphql.operation.name"] = "graphql.operation.name" + """The name of the operation being executed. Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: ai.model.provider, gen_ai.provider.name - DEPRECATED: Use gen_ai.provider.name instead - Example: "openai" + Example: "findBookById" """ - # Path: model/attributes/gen_ai/gen_ai__system__message.json - GEN_AI_SYSTEM_MESSAGE: Literal["gen_ai.system.message"] = "gen_ai.system.message" - """The system instructions passed to the model. + # Path: model/attributes/graphql/graphql__operation__type.json + GRAPHQL_OPERATION_TYPE: Literal["graphql.operation.type"] = "graphql.operation.type" + """The type of the operation being executed. Type: str - Apply Scrubbing: auto - Defined in OTEL: No + Apply Scrubbing: manual + Defined in OTEL: Yes Visibility: public - DEPRECATED: Use gen_ai.system_instructions instead - Example: "You are a helpful assistant" + Example: "query" """ - # Path: model/attributes/gen_ai/gen_ai__system_instructions.json - GEN_AI_SYSTEM_INSTRUCTIONS: Literal["gen_ai.system_instructions"] = ( - "gen_ai.system_instructions" + # Path: model/attributes/graphql/graphql__processing__type.json + GRAPHQL_PROCESSING_TYPE: Literal["graphql.processing.type"] = ( + "graphql.processing.type" ) - """The system instructions passed to the model. + """The type of processing represented by this span. Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: ai.preamble - Example: "You are a helpful assistant" + Example: "parse" + Example: "validate" + Example: "execute" + Example: "resolve" """ - # Path: model/attributes/gen_ai/gen_ai__tool__call__arguments.json - GEN_AI_TOOL_CALL_ARGUMENTS: Literal["gen_ai.tool.call.arguments"] = ( - "gen_ai.tool.call.arguments" - ) - """The arguments of the tool call. It has to be a stringified version of the arguments to the tool. + # Path: model/attributes/graphql/graphql__source.json + GRAPHQL_SOURCE: Literal["graphql.source"] = "graphql.source" + """The GraphQL document being executed. Type: str - Apply Scrubbing: manual - Defined in OTEL: Yes + Apply Scrubbing: auto + Defined in OTEL: No Visibility: public - Aliases: gen_ai.tool.input, ai.toolCall.args - Example: "{\"location\": \"Paris\"}" + Aliases: graphql.document + DEPRECATED: Use graphql.document instead - This attribute is being deprecated in favor of graphql.document, which is the OpenTelemetry name for the same value. + Example: "query findBookById { bookById(id: ?) { name } }" """ - # Path: model/attributes/gen_ai/gen_ai__tool__call__result.json - GEN_AI_TOOL_CALL_RESULT: Literal["gen_ai.tool.call.result"] = ( - "gen_ai.tool.call.result" - ) - """The result of the tool call. It has to be a stringified version of the result of the tool. + # Path: model/attributes/grpc/grpc__error__bad_request__field_violations.json + GRPC_ERROR_BAD_REQUEST_FIELD_VIOLATIONS: Literal[ + "grpc.error.bad_request.field_violations" + ] = "grpc.error.bad_request.field_violations" + """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. - Type: str + Type: List[str] Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: gen_ai.tool.output, gen_ai.tool.message, mcp.tool.result.content, ai.toolCall.result, anthropic.tool_result.content - Example: "rainy, 57°F" + 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\"}}"] """ - # Path: model/attributes/gen_ai/gen_ai__tool__definitions.json - GEN_AI_TOOL_DEFINITIONS: Literal["gen_ai.tool.definitions"] = ( - "gen_ai.tool.definitions" + # Path: model/attributes/grpc/grpc__error__debug_info__detail.json + GRPC_ERROR_DEBUG_INFO_DETAIL: Literal["grpc.error.debug_info.detail"] = ( + "grpc.error.debug_info.detail" ) - """The list of source system tool definitions available to the GenAI agent or model. + """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. Type: str - Apply Scrubbing: manual - Defined in OTEL: Yes + Apply Scrubbing: auto + Defined in OTEL: No Visibility: public - Aliases: gen_ai.request.available_tools - 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\"]}}]" + Example: "at com.example.Service.method(Service.java:42)" """ - # Path: model/attributes/gen_ai/gen_ai__tool__description.json - GEN_AI_TOOL_DESCRIPTION: Literal["gen_ai.tool.description"] = ( - "gen_ai.tool.description" - ) - """The description of the tool being used. + # Path: model/attributes/grpc/grpc__error__debug_info__stack_entries.json + GRPC_ERROR_DEBUG_INFO_STACK_ENTRIES: Literal[ + "grpc.error.debug_info.stack_entries" + ] = "grpc.error.debug_info.stack_entries" + """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. - Type: str - Apply Scrubbing: manual - Defined in OTEL: Yes + Type: List[str] + Apply Scrubbing: auto + Defined in OTEL: No Visibility: public - Example: "Searches the web for current information about a topic" + Example: ["com.example.Service.method(Service.java:42)","com.example.Server.handle(Server.java:100)"] """ - # Path: model/attributes/gen_ai/gen_ai__tool__input.json - GEN_AI_TOOL_INPUT: Literal["gen_ai.tool.input"] = "gen_ai.tool.input" - """The input of the tool being used. It has to be a stringified version of the input to the tool. + # Path: model/attributes/grpc/grpc__error__error_info__domain.json + GRPC_ERROR_ERROR_INFO_DOMAIN: Literal["grpc.error.error_info.domain"] = ( + "grpc.error.error_info.domain" + ) + """The logical grouping to which the gRPC error reason belongs, from the google.rpc.ErrorInfo error detail. Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: gen_ai.tool.call.arguments, ai.toolCall.args - DEPRECATED: Use gen_ai.tool.call.arguments instead - Example: "{\"location\": \"Paris\"}" + Example: "example.sentry.io" """ - # Path: model/attributes/gen_ai/gen_ai__tool__message.json - GEN_AI_TOOL_MESSAGE: Literal["gen_ai.tool.message"] = "gen_ai.tool.message" - """The response from a tool or function call passed to the model. + # Path: model/attributes/grpc/grpc__error__error_info__metadata__[key].json + GRPC_ERROR_ERROR_INFO_METADATA_KEY: Literal[ + "grpc.error.error_info.metadata." + ] = "grpc.error.error_info.metadata." + """Additional structured metadata attached to a google.rpc.ErrorInfo error detail, with being the metadata key name. SDKs should only send this attribute when sendDefaultPii is enabled or dataCollection is configured accordingly. Type: str Apply Scrubbing: auto Defined in OTEL: No Visibility: public - Aliases: gen_ai.tool.call.result, gen_ai.tool.output, mcp.tool.result.content, ai.toolCall.result, anthropic.tool_result.content - DEPRECATED: Use gen_ai.tool.call.result instead - Example: "rainy, 57°F" + Has Dynamic Suffix: true + Example: "grpc.error.error_info.metadata.user_id='123'" """ - # Path: model/attributes/gen_ai/gen_ai__tool__name.json - GEN_AI_TOOL_NAME: Literal["gen_ai.tool.name"] = "gen_ai.tool.name" - """Name of the tool utilized by the agent. + # Path: model/attributes/grpc/grpc__error__error_info__reason.json + GRPC_ERROR_ERROR_INFO_REASON: Literal["grpc.error.error_info.reason"] = ( + "grpc.error.error_info.reason" + ) + """The reason for the gRPC error, as defined by the service that generated it, from the google.rpc.ErrorInfo error detail. Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: ai.function_call, mcp.tool.name - Example: "Flights" + Example: "FIELD_INVALID" """ - # Path: model/attributes/gen_ai/gen_ai__tool__output.json - GEN_AI_TOOL_OUTPUT: Literal["gen_ai.tool.output"] = "gen_ai.tool.output" - """The output of the tool being used. It has to be a stringified version of the output of the tool. + # Path: model/attributes/grpc/grpc__error__precondition_failure__violations.json + GRPC_ERROR_PRECONDITION_FAILURE_VIOLATIONS: Literal[ + "grpc.error.precondition_failure.violations" + ] = "grpc.error.precondition_failure.violations" + """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: str - Apply Scrubbing: manual + Type: List[str] + Apply Scrubbing: auto Defined in OTEL: No Visibility: public - Aliases: gen_ai.tool.call.result, gen_ai.tool.message, mcp.tool.result.content, ai.toolCall.result, anthropic.tool_result.content - DEPRECATED: Use gen_ai.tool.call.result instead - Example: "rainy, 57°F" + Example: ["{\"type\":\"TOS\",\"subject\":\"example.com/user/123\",\"description\":\"User must accept the terms of service\"}"] """ - # Path: model/attributes/gen_ai/gen_ai__tool__type.json - GEN_AI_TOOL_TYPE: Literal["gen_ai.tool.type"] = "gen_ai.tool.type" - """The type of tool being used. + # Path: model/attributes/grpc/grpc__error__quota_failure__violations.json + GRPC_ERROR_QUOTA_FAILURE_VIOLATIONS: Literal[ + "grpc.error.quota_failure.violations" + ] = "grpc.error.quota_failure.violations" + """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: str - Apply Scrubbing: manual - Defined in OTEL: Yes + Type: List[str] + Apply Scrubbing: auto + Defined in OTEL: No Visibility: public - DEPRECATED: No replacement at this time - The gen_ai.tool.type attribute is deprecated and should no longer be set. - Example: "function" + 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}"] """ - # Path: model/attributes/gen_ai/gen_ai__usage__cache_creation__input_tokens.json - GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS: Literal[ - "gen_ai.usage.cache_creation.input_tokens" - ] = "gen_ai.usage.cache_creation.input_tokens" - """The number of tokens written to the cache when processing the AI input (prompt). + # Path: model/attributes/grpc/grpc__error__resource_info__description.json + GRPC_ERROR_RESOURCE_INFO_DESCRIPTION: Literal[ + "grpc.error.resource_info.description" + ] = "grpc.error.resource_info.description" + """A description of the error that occurred while accessing the resource, from a google.rpc.ResourceInfo error detail. - Type: int + Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: gen_ai.usage.input_tokens.cache_write, gen_ai.usage.cache_creation_input_tokens - Example: 100 + Example: "Instance is not ready for the request." """ - # Path: model/attributes/gen_ai/gen_ai__usage__cache_creation_input_tokens.json - _GEN_AI_USAGE_CACHE_CREATION_INPUT_TOKENS: Literal[ - "gen_ai.usage.cache_creation_input_tokens" - ] = "gen_ai.usage.cache_creation_input_tokens" - """The number of tokens written to the cache when processing the AI input (prompt). + # Path: model/attributes/grpc/grpc__error__resource_info__owner.json + GRPC_ERROR_RESOURCE_INFO_OWNER: Literal["grpc.error.resource_info.owner"] = ( + "grpc.error.resource_info.owner" + ) + """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: int - Apply Scrubbing: manual + Type: str + Apply Scrubbing: auto Defined in OTEL: No Visibility: public - Aliases: gen_ai.usage.cache_creation.input_tokens, gen_ai.usage.input_tokens.cache_write - DEPRECATED: Use gen_ai.usage.cache_creation.input_tokens instead - This attribute is being deprecated in favor of gen_ai.usage.cache_creation.input_tokens. - Example: 100 + Example: "user@example.com" """ - # Path: model/attributes/gen_ai/gen_ai__usage__cache_read__input_tokens.json - GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS: Literal[ - "gen_ai.usage.cache_read.input_tokens" - ] = "gen_ai.usage.cache_read.input_tokens" - """The number of cached tokens used to process the AI input (prompt). + # Path: model/attributes/grpc/grpc__error__resource_info__resource_name.json + GRPC_ERROR_RESOURCE_INFO_RESOURCE_NAME: Literal[ + "grpc.error.resource_info.resource_name" + ] = "grpc.error.resource_info.resource_name" + """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: int - Apply Scrubbing: manual - Defined in OTEL: Yes + Type: str + Apply Scrubbing: auto + Defined in OTEL: No Visibility: public - Aliases: gen_ai.usage.input_tokens.cached, gen_ai.usage.cache_read_input_tokens - Example: 50 + Example: "projects/example/instances/example-instance" """ - # Path: model/attributes/gen_ai/gen_ai__usage__cache_read_input_tokens.json - _GEN_AI_USAGE_CACHE_READ_INPUT_TOKENS: Literal[ - "gen_ai.usage.cache_read_input_tokens" - ] = "gen_ai.usage.cache_read_input_tokens" - """The number of cached tokens used to process the AI input (prompt). + # Path: model/attributes/grpc/grpc__error__resource_info__resource_type.json + GRPC_ERROR_RESOURCE_INFO_RESOURCE_TYPE: Literal[ + "grpc.error.resource_info.resource_type" + ] = "grpc.error.resource_info.resource_type" + """The type of resource being accessed, from a google.rpc.ResourceInfo error detail. - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: gen_ai.usage.cache_read.input_tokens, gen_ai.usage.input_tokens.cached - DEPRECATED: Use gen_ai.usage.cache_read.input_tokens instead - This attribute is being deprecated in favor of gen_ai.usage.cache_read.input_tokens. - Example: 50 + Example: "database" """ - # Path: model/attributes/gen_ai/gen_ai__usage__completion_tokens.json - GEN_AI_USAGE_COMPLETION_TOKENS: Literal["gen_ai.usage.completion_tokens"] = ( - "gen_ai.usage.completion_tokens" - ) - """The number of tokens used in the GenAI response (completion). + # Path: model/attributes/grpc/grpc__error__retry_info__retry_delay_ms.json + GRPC_ERROR_RETRY_INFO_RETRY_DELAY_MS: Literal[ + "grpc.error.retry_info.retry_delay_ms" + ] = "grpc.error.retry_info.retry_delay_ms" + """How long the client should wait before retrying the gRPC call, in milliseconds, from the google.rpc.RetryInfo error detail. Type: int Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: ai.completion_tokens.used, gen_ai.usage.output_tokens - DEPRECATED: Use gen_ai.usage.output_tokens instead - Example: 10 + Example: 5000 """ - # Path: model/attributes/gen_ai/gen_ai__usage__input_tokens.json - GEN_AI_USAGE_INPUT_TOKENS: Literal["gen_ai.usage.input_tokens"] = ( - "gen_ai.usage.input_tokens" - ) - """The number of tokens used to process the AI input (prompt) including cached input tokens. + # Path: model/attributes/hardwareConcurrency.json + HARDWARECONCURRENCY: Literal["hardwareConcurrency"] = "hardwareConcurrency" + """The number of logical CPU cores available. - Type: int + Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: ai.prompt_tokens.used, gen_ai.usage.prompt_tokens - Example: 10 + Aliases: device.processor_count + DEPRECATED: Use device.processor_count instead - Old namespace-less attribute, to be replaced with device.processor_count for span-first future + Example: "14" """ - # Path: model/attributes/gen_ai/gen_ai__usage__input_tokens__cache_write.json - GEN_AI_USAGE_INPUT_TOKENS_CACHE_WRITE: Literal[ - "gen_ai.usage.input_tokens.cache_write" - ] = "gen_ai.usage.input_tokens.cache_write" - """The number of tokens written to the cache when processing the AI input (prompt). + # Path: model/attributes/http/http__client_ip.json + HTTP_CLIENT_IP: Literal["http.client_ip"] = "http.client_ip" + """Client address - domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name. - Type: int - Apply Scrubbing: manual - Defined in OTEL: No + Type: str + Apply Scrubbing: auto + Defined in OTEL: Yes Visibility: public - Aliases: gen_ai.usage.cache_creation.input_tokens, gen_ai.usage.cache_creation_input_tokens - DEPRECATED: Use gen_ai.usage.cache_creation.input_tokens instead - Example: 100 + Aliases: client.address + DEPRECATED: Use client.address instead + Example: "example.com" """ - # Path: model/attributes/gen_ai/gen_ai__usage__input_tokens__cached.json - GEN_AI_USAGE_INPUT_TOKENS_CACHED: Literal["gen_ai.usage.input_tokens.cached"] = ( - "gen_ai.usage.input_tokens.cached" - ) - """The number of cached tokens used to process the AI input (prompt). + # Path: model/attributes/http/http__decoded_response_content_length.json + HTTP_DECODED_RESPONSE_CONTENT_LENGTH: Literal[ + "http.decoded_response_content_length" + ] = "http.decoded_response_content_length" + """The decoded body size of the response (in bytes). Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: gen_ai.usage.cache_read.input_tokens, gen_ai.usage.cache_read_input_tokens - DEPRECATED: Use gen_ai.usage.cache_read.input_tokens instead - Example: 50 + Aliases: http.response.body.decoded_size, http.response_content_length_uncompressed + DEPRECATED: Use http.response.body.decoded_size instead + Example: 456 """ - # Path: model/attributes/gen_ai/gen_ai__usage__output_tokens.json - GEN_AI_USAGE_OUTPUT_TOKENS: Literal["gen_ai.usage.output_tokens"] = ( - "gen_ai.usage.output_tokens" - ) - """The number of tokens used for creating the AI output (including reasoning tokens). + # Path: model/attributes/http/http__flavor.json + HTTP_FLAVOR: Literal["http.flavor"] = "http.flavor" + """The actual version of the protocol used for network communication. - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: ai.completion_tokens.used, gen_ai.usage.completion_tokens - Example: 10 + Aliases: network.protocol.version, net.protocol.version, messaging.protocol_version + DEPRECATED: Use network.protocol.version instead + Example: "1.1" """ - # Path: model/attributes/gen_ai/gen_ai__usage__output_tokens__reasoning.json - GEN_AI_USAGE_OUTPUT_TOKENS_REASONING: Literal[ - "gen_ai.usage.output_tokens.reasoning" - ] = "gen_ai.usage.output_tokens.reasoning" - """The number of tokens used for reasoning to create the AI output. + # Path: model/attributes/http/http__fragment.json + HTTP_FRAGMENT: Literal["http.fragment"] = "http.fragment" + """The fragments present in the URI. Note that this contains the leading # character, while the `url.fragment` attribute does not. - Type: int - Apply Scrubbing: manual + Type: str + Apply Scrubbing: auto Defined in OTEL: No Visibility: public - Aliases: gen_ai.usage.reasoning.output_tokens - DEPRECATED: Use gen_ai.usage.reasoning.output_tokens instead - Example: 75 + Example: "#details" """ - # Path: model/attributes/gen_ai/gen_ai__usage__prompt_tokens.json - GEN_AI_USAGE_PROMPT_TOKENS: Literal["gen_ai.usage.prompt_tokens"] = ( - "gen_ai.usage.prompt_tokens" - ) - """The number of tokens used in the GenAI input (prompt). + # Path: model/attributes/http/http__host.json + HTTP_HOST: Literal["http.host"] = "http.host" + """The domain name. - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: ai.prompt_tokens.used, gen_ai.usage.input_tokens - DEPRECATED: Use gen_ai.usage.input_tokens instead - Example: 20 + Aliases: address, server.address, client.address, http.server_name, net.host.name, server_name, net.peer.name + DEPRECATED: Use server.address instead - Deprecated, use one of `server.address` or `client.address`, depending on the usage + Example: "example.com" """ - # Path: model/attributes/gen_ai/gen_ai__usage__reasoning__output_tokens.json - GEN_AI_USAGE_REASONING_OUTPUT_TOKENS: Literal[ - "gen_ai.usage.reasoning.output_tokens" - ] = "gen_ai.usage.reasoning.output_tokens" - """The number of tokens used for reasoning to create the AI output. + # Path: model/attributes/http/http__method.json + HTTP_METHOD: Literal["http.method"] = "http.method" + """The HTTP method used. - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: gen_ai.usage.output_tokens.reasoning - Example: 75 + Aliases: http.request.method, http.request_method, method + DEPRECATED: Use http.request.method instead + Example: "GET" """ - # Path: model/attributes/gen_ai/gen_ai__usage__total_tokens.json - GEN_AI_USAGE_TOTAL_TOKENS: Literal["gen_ai.usage.total_tokens"] = ( - "gen_ai.usage.total_tokens" - ) - """The total number of tokens used to process the prompt. (input tokens plus output todkens) + # Path: model/attributes/http/http__query.json + HTTP_QUERY: Literal["http.query"] = "http.query" + """The query string present in the URL. Note that this contains the leading ? character, while the `url.query` attribute does not. - Type: int - Apply Scrubbing: manual + Type: str + Apply Scrubbing: auto - Query string values can contain sensitive information. Clients should attempt to scrub parameters that might contain sensitive information. Defined in OTEL: No Visibility: public - Aliases: ai.total_tokens.used, ai.usage.tokens - Example: 20 + Example: "?foo=bar&bar=baz" """ - # Path: model/attributes/graphql/graphql__document.json - GRAPHQL_DOCUMENT: Literal["graphql.document"] = "graphql.document" - """The GraphQL document being executed. + # Path: model/attributes/http/http__request__body__data.json + HTTP_REQUEST_BODY_DATA: Literal["http.request.body.data"] = "http.request.body.data" + """HTTP request body data. Can be given as string or structural data of any format. Type: str - Apply Scrubbing: auto - The document may contain sensitive information in arguments or variables. Instrumentation should redact sensitive information when possible. - Defined in OTEL: Yes + Apply Scrubbing: auto + Defined in OTEL: No Visibility: public - Aliases: graphql.source - Example: "query findBookById { bookById(id: ?) { name } }" + Example: "[{\"role\": \"user\", \"message\": \"hello\"}]" """ - # Path: model/attributes/graphql/graphql__operation__name.json - GRAPHQL_OPERATION_NAME: Literal["graphql.operation.name"] = "graphql.operation.name" - """The name of the operation being executed. + # Path: model/attributes/http/http__request__body__decoded_size.json + HTTP_REQUEST_BODY_DECODED_SIZE: Literal["http.request.body.decoded_size"] = ( + "http.request.body.decoded_size" + ) + """The decoded body size of the request (in bytes). - Type: str + Type: int Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: "findBookById" + Aliases: http.request_content_length_uncompressed + Example: 456 """ - # Path: model/attributes/graphql/graphql__operation__type.json - GRAPHQL_OPERATION_TYPE: Literal["graphql.operation.type"] = "graphql.operation.type" - """The type of the operation being executed. + # Path: model/attributes/http/http__request__body__size.json + HTTP_REQUEST_BODY_SIZE: Literal["http.request.body.size"] = "http.request.body.size" + """The encoded body size of the request (in bytes). - Type: str + Type: int Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Example: "query" + Aliases: http.request_content_length + Example: 123 """ - # Path: model/attributes/graphql/graphql__processing__type.json - GRAPHQL_PROCESSING_TYPE: Literal["graphql.processing.type"] = ( - "graphql.processing.type" + # Path: model/attributes/http/http__request__connect_start.json + HTTP_REQUEST_CONNECT_START: Literal["http.request.connect_start"] = ( + "http.request.connect_start" ) - """The type of processing represented by this span. + """The UNIX timestamp representing the time immediately before the user agent starts establishing the connection to the server to retrieve the resource. - Type: str + Type: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "parse" - Example: "validate" - Example: "execute" - Example: "resolve" - """ - - # Path: model/attributes/graphql/graphql__source.json - GRAPHQL_SOURCE: Literal["graphql.source"] = "graphql.source" - """The GraphQL document being executed. - - Type: str - Apply Scrubbing: auto - Defined in OTEL: No - Visibility: public - Aliases: graphql.document - DEPRECATED: Use graphql.document instead - This attribute is being deprecated in favor of graphql.document, which is the OpenTelemetry name for the same value. - Example: "query findBookById { bookById(id: ?) { name } }" + Example: 1732829555.111 """ - # Path: model/attributes/grpc/grpc__error__bad_request__field_violations.json - GRPC_ERROR_BAD_REQUEST_FIELD_VIOLATIONS: Literal[ - "grpc.error.bad_request.field_violations" - ] = "grpc.error.bad_request.field_violations" - """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. + # Path: model/attributes/http/http__request__connection_end.json + HTTP_REQUEST_CONNECTION_END: Literal["http.request.connection_end"] = ( + "http.request.connection_end" + ) + """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: List[str] + Type: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - 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\"}}"] + Example: 1732829555.15 """ - # Path: model/attributes/grpc/grpc__error__debug_info__detail.json - GRPC_ERROR_DEBUG_INFO_DETAIL: Literal["grpc.error.debug_info.detail"] = ( - "grpc.error.debug_info.detail" + # Path: model/attributes/http/http__request__domain_lookup_end.json + HTTP_REQUEST_DOMAIN_LOOKUP_END: Literal["http.request.domain_lookup_end"] = ( + "http.request.domain_lookup_end" ) - """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 UNIX timestamp representing the time immediately after the browser finishes the domain-name lookup for the resource. - Type: str - Apply Scrubbing: auto + Type: float + Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "at com.example.Service.method(Service.java:42)" + Example: 1732829555.201 """ - # Path: model/attributes/grpc/grpc__error__debug_info__stack_entries.json - GRPC_ERROR_DEBUG_INFO_STACK_ENTRIES: Literal[ - "grpc.error.debug_info.stack_entries" - ] = "grpc.error.debug_info.stack_entries" - """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. + # Path: model/attributes/http/http__request__domain_lookup_start.json + HTTP_REQUEST_DOMAIN_LOOKUP_START: Literal["http.request.domain_lookup_start"] = ( + "http.request.domain_lookup_start" + ) + """The UNIX timestamp representing the time immediately before the browser starts the domain name lookup for the resource. - Type: List[str] - Apply Scrubbing: auto + Type: float + Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: ["com.example.Service.method(Service.java:42)","com.example.Server.handle(Server.java:100)"] + Example: 1732829555.322 """ - # Path: model/attributes/grpc/grpc__error__error_info__domain.json - GRPC_ERROR_ERROR_INFO_DOMAIN: Literal["grpc.error.error_info.domain"] = ( - "grpc.error.error_info.domain" + # Path: model/attributes/http/http__request__fetch_start.json + HTTP_REQUEST_FETCH_START: Literal["http.request.fetch_start"] = ( + "http.request.fetch_start" ) - """The logical grouping to which the gRPC error reason belongs, from the google.rpc.ErrorInfo error detail. + """The UNIX timestamp representing the time immediately before the browser starts to fetch the resource. - Type: str + Type: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "example.sentry.io" + Example: 1732829555.389 """ - # Path: model/attributes/grpc/grpc__error__error_info__metadata__[key].json - GRPC_ERROR_ERROR_INFO_METADATA_KEY: Literal[ - "grpc.error.error_info.metadata." - ] = "grpc.error.error_info.metadata." - """Additional structured metadata attached to a google.rpc.ErrorInfo error detail, with being the metadata key name. SDKs should only send this attribute when sendDefaultPii is enabled or dataCollection is configured accordingly. + # Path: model/attributes/http/http__request__header__[key].json + HTTP_REQUEST_HEADER_KEY: Literal["http.request.header."] = ( + "http.request.header." + ) + """HTTP request headers, being the lower-cased, but otherwise unchanged HTTP Header name, the value being the header values. - Type: str + Type: List[str] Apply Scrubbing: auto - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public Has Dynamic Suffix: true - Example: "grpc.error.error_info.metadata.user_id='123'" + Example: "http.request.header.custom-header=['foo', 'bar']" + Example: "http.request.header.content-length=['123']" """ - # Path: model/attributes/grpc/grpc__error__error_info__reason.json - GRPC_ERROR_ERROR_INFO_REASON: Literal["grpc.error.error_info.reason"] = ( - "grpc.error.error_info.reason" - ) - """The reason for the gRPC error, as defined by the service that generated it, from the google.rpc.ErrorInfo error detail. + # Path: model/attributes/http/http__request__method.json + HTTP_REQUEST_METHOD: Literal["http.request.method"] = "http.request.method" + """The HTTP method used. Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: "FIELD_INVALID" + Aliases: method, http.method, http.request_method + Example: "GET" """ - # Path: model/attributes/grpc/grpc__error__precondition_failure__violations.json - GRPC_ERROR_PRECONDITION_FAILURE_VIOLATIONS: Literal[ - "grpc.error.precondition_failure.violations" - ] = "grpc.error.precondition_failure.violations" - """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. + # Path: model/attributes/http/http__request__redirect_end.json + HTTP_REQUEST_REDIRECT_END: Literal["http.request.redirect_end"] = ( + "http.request.redirect_end" + ) + """The UNIX timestamp representing the timestamp immediately after receiving the last byte of the response of the last redirect - Type: List[str] - Apply Scrubbing: auto + Type: float + Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: ["{\"type\":\"TOS\",\"subject\":\"example.com/user/123\",\"description\":\"User must accept the terms of service\"}"] + Example: 1732829558.502 """ - # Path: model/attributes/grpc/grpc__error__quota_failure__violations.json - GRPC_ERROR_QUOTA_FAILURE_VIOLATIONS: Literal[ - "grpc.error.quota_failure.violations" - ] = "grpc.error.quota_failure.violations" - """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. + # Path: model/attributes/http/http__request__redirect_start.json + HTTP_REQUEST_REDIRECT_START: Literal["http.request.redirect_start"] = ( + "http.request.redirect_start" + ) + """The UNIX timestamp representing the start time of the fetch which that initiates the redirect. - Type: List[str] - Apply Scrubbing: auto + Type: float + Apply Scrubbing: manual Defined in OTEL: No 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}"] + Example: 1732829555.495 """ - # Path: model/attributes/grpc/grpc__error__resource_info__description.json - GRPC_ERROR_RESOURCE_INFO_DESCRIPTION: Literal[ - "grpc.error.resource_info.description" - ] = "grpc.error.resource_info.description" - """A description of the error that occurred while accessing the resource, from a google.rpc.ResourceInfo error detail. + # Path: model/attributes/http/http__request__request_start.json + HTTP_REQUEST_REQUEST_START: Literal["http.request.request_start"] = ( + "http.request.request_start" + ) + """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: str + Type: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "Instance is not ready for the request." + Example: 1732829555.51 """ - # Path: model/attributes/grpc/grpc__error__resource_info__owner.json - GRPC_ERROR_RESOURCE_INFO_OWNER: Literal["grpc.error.resource_info.owner"] = ( - "grpc.error.resource_info.owner" + # Path: model/attributes/http/http__request__resend_count.json + HTTP_REQUEST_RESEND_COUNT: Literal["http.request.resend_count"] = ( + "http.request.resend_count" ) - """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. + """The ordinal number of request resending attempt (for any reason, including redirects). - Type: str - Apply Scrubbing: auto + Type: int + Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "user@example.com" + Example: 2 """ - # Path: model/attributes/grpc/grpc__error__resource_info__resource_name.json - GRPC_ERROR_RESOURCE_INFO_RESOURCE_NAME: Literal[ - "grpc.error.resource_info.resource_name" - ] = "grpc.error.resource_info.resource_name" - """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. + # Path: model/attributes/http/http__request__response_end.json + HTTP_REQUEST_RESPONSE_END: Literal["http.request.response_end"] = ( + "http.request.response_end" + ) + """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: str - Apply Scrubbing: auto + Type: float + Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "projects/example/instances/example-instance" + Example: 1732829555.89 """ - # Path: model/attributes/grpc/grpc__error__resource_info__resource_type.json - GRPC_ERROR_RESOURCE_INFO_RESOURCE_TYPE: Literal[ - "grpc.error.resource_info.resource_type" - ] = "grpc.error.resource_info.resource_type" - """The type of resource being accessed, from a google.rpc.ResourceInfo error detail. + # Path: model/attributes/http/http__request__response_start.json + HTTP_REQUEST_RESPONSE_START: Literal["http.request.response_start"] = ( + "http.request.response_start" + ) + """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: str + Type: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "database" + Example: 1732829555.7 """ - # Path: model/attributes/grpc/grpc__error__retry_info__retry_delay_ms.json - GRPC_ERROR_RETRY_INFO_RETRY_DELAY_MS: Literal[ - "grpc.error.retry_info.retry_delay_ms" - ] = "grpc.error.retry_info.retry_delay_ms" - """How long the client should wait before retrying the gRPC call, in milliseconds, from the google.rpc.RetryInfo error detail. + # Path: model/attributes/http/http__request__same_origin.json + HTTP_REQUEST_SAME_ORIGIN: Literal["http.request.same_origin"] = ( + "http.request.same_origin" + ) + """Indicates that a URL has the same origin as the current page's origin in the browser. - Type: int + Type: bool Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 5000 + Aliases: url.same_origin + Example: true """ - # Path: model/attributes/hardwareConcurrency.json - HARDWARECONCURRENCY: Literal["hardwareConcurrency"] = "hardwareConcurrency" - """The number of logical CPU cores available. + # Path: model/attributes/http/http__request__secure_connection_start.json + HTTP_REQUEST_SECURE_CONNECTION_START: Literal[ + "http.request.secure_connection_start" + ] = "http.request.secure_connection_start" + """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: str + Type: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: device.processor_count - DEPRECATED: Use device.processor_count instead - Old namespace-less attribute, to be replaced with device.processor_count for span-first future - Example: "14" + Example: 1732829555.73 """ - # Path: model/attributes/http/http__client_ip.json - HTTP_CLIENT_IP: Literal["http.client_ip"] = "http.client_ip" - """Client address - domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name. + # Path: model/attributes/http/http__request__time_to_first_byte.json + HTTP_REQUEST_TIME_TO_FIRST_BYTE: Literal["http.request.time_to_first_byte"] = ( + "http.request.time_to_first_byte" + ) + """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: str - Apply Scrubbing: auto - Defined in OTEL: Yes + Type: float + Apply Scrubbing: manual + Defined in OTEL: No Visibility: public - Aliases: client.address - DEPRECATED: Use client.address instead - Example: "example.com" + Example: 1.032 """ - # Path: model/attributes/http/http__decoded_response_content_length.json - HTTP_DECODED_RESPONSE_CONTENT_LENGTH: Literal[ - "http.decoded_response_content_length" - ] = "http.decoded_response_content_length" - """The decoded body size of the response (in bytes). + # Path: model/attributes/http/http__request__worker_start.json + HTTP_REQUEST_WORKER_START: Literal["http.request.worker_start"] = ( + "http.request.worker_start" + ) + """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: int + Type: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: http.response.body.decoded_size, http.response_content_length_uncompressed - DEPRECATED: Use http.response.body.decoded_size instead - Example: 456 + Example: 1732829553.68 """ - # Path: model/attributes/http/http__flavor.json - HTTP_FLAVOR: Literal["http.flavor"] = "http.flavor" - """The actual version of the protocol used for network communication. + # Path: model/attributes/http/http__request_content_length.json + HTTP_REQUEST_CONTENT_LENGTH: Literal["http.request_content_length"] = ( + "http.request_content_length" + ) + """The encoded body size of the request (in bytes). - Type: str + Type: int Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: network.protocol.version, net.protocol.version, messaging.protocol_version - DEPRECATED: Use network.protocol.version instead - Example: "1.1" - """ - - # Path: model/attributes/http/http__fragment.json - HTTP_FRAGMENT: Literal["http.fragment"] = "http.fragment" - """The fragments present in the URI. Note that this contains the leading # character, while the `url.fragment` attribute does not. - - Type: str - Apply Scrubbing: auto - Defined in OTEL: No - Visibility: public - Example: "#details" + Aliases: http.request.body.size + DEPRECATED: Use http.request.body.size instead + Example: 123 """ - # Path: model/attributes/http/http__host.json - HTTP_HOST: Literal["http.host"] = "http.host" - """The domain name. + # Path: model/attributes/http/http__request_content_length_uncompressed.json + HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED: Literal[ + "http.request_content_length_uncompressed" + ] = "http.request_content_length_uncompressed" + """The decoded body size of the request (in bytes). - Type: str + Type: int Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: address, server.address, client.address, http.server_name, net.host.name, server_name, net.peer.name - DEPRECATED: Use server.address instead - Deprecated, use one of `server.address` or `client.address`, depending on the usage - Example: "example.com" + Aliases: http.request.body.decoded_size + DEPRECATED: Use http.request.body.decoded_size instead + Example: 456 """ - # Path: model/attributes/http/http__method.json - HTTP_METHOD: Literal["http.method"] = "http.method" + # Path: model/attributes/http/http__request_method.json + _HTTP_REQUEST_METHOD: Literal["http.request_method"] = "http.request_method" """The HTTP method used. Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: http.request.method, http.request_method, method + Aliases: method, http.method, http.request.method DEPRECATED: Use http.request.method instead Example: "GET" """ - # Path: model/attributes/http/http__query.json - HTTP_QUERY: Literal["http.query"] = "http.query" - """The query string present in the URL. Note that this contains the leading ? character, while the `url.query` attribute does not. + # Path: model/attributes/http/http__response__body__decoded_size.json + HTTP_RESPONSE_BODY_DECODED_SIZE: Literal["http.response.body.decoded_size"] = ( + "http.response.body.decoded_size" + ) + """The decoded body size of the response (in bytes). - Type: str - Apply Scrubbing: auto - Query string values can contain sensitive information. Clients should attempt to scrub parameters that might contain sensitive information. + Type: int + Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "?foo=bar&bar=baz" + Aliases: http.decoded_response_content_length, http.response_content_length_uncompressed + Example: 456 """ - # Path: model/attributes/http/http__request__body__data.json - HTTP_REQUEST_BODY_DATA: Literal["http.request.body.data"] = "http.request.body.data" - """HTTP request body data. Can be given as string or structural data of any format. + # Path: model/attributes/http/http__response__body__size.json + HTTP_RESPONSE_BODY_SIZE: Literal["http.response.body.size"] = ( + "http.response.body.size" + ) + """The encoded body size of the response (in bytes). - Type: str - Apply Scrubbing: auto - Defined in OTEL: No + Type: int + Apply Scrubbing: manual + Defined in OTEL: Yes Visibility: public - Example: "[{\"role\": \"user\", \"message\": \"hello\"}]" + Aliases: http.response_content_length, http.response.header.content-length + Example: 123 """ - # Path: model/attributes/http/http__request__body__decoded_size.json - HTTP_REQUEST_BODY_DECODED_SIZE: Literal["http.request.body.decoded_size"] = ( - "http.request.body.decoded_size" + # Path: model/attributes/http/http__response__header__[key].json + HTTP_RESPONSE_HEADER_KEY: Literal["http.response.header."] = ( + "http.response.header." ) - """The decoded body size of the request (in bytes). + """HTTP response headers, being the lower-cased, but otherwise unchanged HTTP Header name, the value being the header values. - Type: int + Type: List[str] + Apply Scrubbing: auto + Defined in OTEL: Yes + Visibility: public + Has Dynamic Suffix: true + Example: "http.response.header.custom-header=['foo', 'bar']" + Example: "http.response.header.content-length=['123']" + """ + + # Path: model/attributes/http/http__response__header__content-length.json + HTTP_RESPONSE_HEADER_CONTENT_LENGTH: Literal[ + "http.response.header.content-length" + ] = "http.response.header.content-length" + """The size of the message body sent to the recipient (in bytes) + + Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Aliases: http.request_content_length_uncompressed - Example: 456 + Aliases: http.response_content_length, http.response.body.size + Example: "http.response.header.custom-header=['foo', 'bar']" """ - # Path: model/attributes/http/http__request__body__size.json - HTTP_REQUEST_BODY_SIZE: Literal["http.request.body.size"] = "http.request.body.size" - """The encoded body size of the request (in bytes). + # Path: model/attributes/http/http__response__size.json + HTTP_RESPONSE_SIZE: Literal["http.response.size"] = "http.response.size" + """The transfer size of the response (in bytes). Type: int Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: http.request_content_length - Example: 123 + Aliases: http.response_transfer_size + Example: 456 """ - # Path: model/attributes/http/http__request__connect_start.json - HTTP_REQUEST_CONNECT_START: Literal["http.request.connect_start"] = ( - "http.request.connect_start" + # Path: model/attributes/http/http__response__status_code.json + HTTP_RESPONSE_STATUS_CODE: Literal["http.response.status_code"] = ( + "http.response.status_code" ) - """The UNIX timestamp representing the time immediately before the user agent starts establishing the connection to the server to retrieve the resource. + """The status code of the HTTP response. - Type: float + Type: int Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: 1732829555.111 + Aliases: http.status_code + Example: 404 """ - # Path: model/attributes/http/http__request__connection_end.json - HTTP_REQUEST_CONNECTION_END: Literal["http.request.connection_end"] = ( - "http.request.connection_end" + # Path: model/attributes/http/http__response__status_text.json + HTTP_RESPONSE_STATUS_TEXT: Literal["http.response.status_text"] = ( + "http.response.status_text" ) - """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. + """The reason phrase of the HTTP response. - Type: float + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 1732829555.15 + Aliases: http.status_text + Example: "NOT FOUND" """ - # Path: model/attributes/http/http__request__domain_lookup_end.json - HTTP_REQUEST_DOMAIN_LOOKUP_END: Literal["http.request.domain_lookup_end"] = ( - "http.request.domain_lookup_end" + # Path: model/attributes/http/http__response_content_length.json + HTTP_RESPONSE_CONTENT_LENGTH: Literal["http.response_content_length"] = ( + "http.response_content_length" ) - """The UNIX timestamp representing the time immediately after the browser finishes the domain-name lookup for the resource. + """The encoded body size of the response (in bytes). - Type: float + Type: int Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: 1732829555.201 + Aliases: http.response.body.size, http.response.header.content-length + DEPRECATED: Use http.response.body.size instead + Example: 123 """ - # Path: model/attributes/http/http__request__domain_lookup_start.json - HTTP_REQUEST_DOMAIN_LOOKUP_START: Literal["http.request.domain_lookup_start"] = ( - "http.request.domain_lookup_start" - ) - """The UNIX timestamp representing the time immediately before the browser starts the domain name lookup for the resource. + # Path: model/attributes/http/http__response_content_length_uncompressed.json + HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED: Literal[ + "http.response_content_length_uncompressed" + ] = "http.response_content_length_uncompressed" + """The decoded body size of the response (in bytes). - Type: float + Type: int Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: 1732829555.322 + Aliases: http.response.body.decoded_size, http.decoded_response_content_length + DEPRECATED: Use http.response.body.decoded_size instead + Example: 456 """ - # Path: model/attributes/http/http__request__fetch_start.json - HTTP_REQUEST_FETCH_START: Literal["http.request.fetch_start"] = ( - "http.request.fetch_start" + # Path: model/attributes/http/http__response_transfer_size.json + HTTP_RESPONSE_TRANSFER_SIZE: Literal["http.response_transfer_size"] = ( + "http.response_transfer_size" ) - """The UNIX timestamp representing the time immediately before the browser starts to fetch the resource. + """The transfer size of the response (in bytes). - Type: float + Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 1732829555.389 + Aliases: http.response.size + DEPRECATED: Use http.response.size instead + Example: 456 """ - # Path: model/attributes/http/http__request__header__[key].json - HTTP_REQUEST_HEADER_KEY: Literal["http.request.header."] = ( - "http.request.header." - ) - """HTTP request headers, being the lower-cased, but otherwise unchanged HTTP Header name, the value being the header values. + # Path: model/attributes/http/http__route.json + HTTP_ROUTE: Literal["http.route"] = "http.route" + """The matched route, that is, the path template in the format used by the respective server framework. - Type: List[str] - Apply Scrubbing: auto + Type: str + Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Has Dynamic Suffix: true - Example: "http.request.header.custom-header=['foo', 'bar']" - Example: "http.request.header.content-length=['123']" + Aliases: route + Example: "/users/:id" + Example: "my-controller/my-action/{id}" + Example: "/posts" """ - # Path: model/attributes/http/http__request__method.json - HTTP_REQUEST_METHOD: Literal["http.request.method"] = "http.request.method" - """The HTTP method used. + # Path: model/attributes/http/http__scheme.json + HTTP_SCHEME: Literal["http.scheme"] = "http.scheme" + """The URI scheme component identifying the used protocol. Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: method, http.method, http.request_method - Example: "GET" + Aliases: url.scheme + DEPRECATED: Use url.scheme instead + Example: "https" """ - # Path: model/attributes/http/http__request__redirect_end.json - HTTP_REQUEST_REDIRECT_END: Literal["http.request.redirect_end"] = ( - "http.request.redirect_end" + # Path: model/attributes/http/http__server__request__time_in_queue.json + HTTP_SERVER_REQUEST_TIME_IN_QUEUE: Literal["http.server.request.time_in_queue"] = ( + "http.server.request.time_in_queue" ) - """The UNIX timestamp representing the timestamp immediately after receiving the last byte of the response of the last redirect + """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: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 1732829558.502 + Example: 50 """ - # Path: model/attributes/http/http__request__redirect_start.json - HTTP_REQUEST_REDIRECT_START: Literal["http.request.redirect_start"] = ( - "http.request.redirect_start" - ) - """The UNIX timestamp representing the start time of the fetch which that initiates the redirect. + # Path: model/attributes/http/http__server_name.json + HTTP_SERVER_NAME: Literal["http.server_name"] = "http.server_name" + """The server domain name - Type: float + Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: 1732829555.495 + Aliases: address, server.address, net.host.name, http.host, server_name, net.peer.name + DEPRECATED: Use server.address instead + Example: "example.com" """ - # Path: model/attributes/http/http__request__request_start.json - HTTP_REQUEST_REQUEST_START: Literal["http.request.request_start"] = ( - "http.request.request_start" - ) - """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. + # Path: model/attributes/http/http__status_code.json + HTTP_STATUS_CODE: Literal["http.status_code"] = "http.status_code" + """The status code of the HTTP response. - Type: float + Type: int Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: 1732829555.51 + Aliases: http.response.status_code + DEPRECATED: Use http.response.status_code instead + Example: 404 """ - # Path: model/attributes/http/http__request__resend_count.json - HTTP_REQUEST_RESEND_COUNT: Literal["http.request.resend_count"] = ( - "http.request.resend_count" - ) - """The ordinal number of request resending attempt (for any reason, including redirects). + # Path: model/attributes/http/http__status_text.json + HTTP_STATUS_TEXT: Literal["http.status_text"] = "http.status_text" + """The reason phrase of the HTTP response - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 2 + Aliases: http.response.status_text + DEPRECATED: Use http.response.status_text instead + Example: "NOT FOUND" """ - # Path: model/attributes/http/http__request__response_end.json - HTTP_REQUEST_RESPONSE_END: Literal["http.request.response_end"] = ( - "http.request.response_end" - ) - """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. + # Path: model/attributes/http/http__target.json + HTTP_TARGET: Literal["http.target"] = "http.target" + """The pathname and query string of the URL. - Type: float - Apply Scrubbing: manual - Defined in OTEL: No + Type: str + Apply Scrubbing: auto + Defined in OTEL: Yes Visibility: public - Example: 1732829555.89 + DEPRECATED: No replacement at this time - This attribute is being deprecated in favor of url.path, url.query and url.fragment. The value holds all three parts at once, so it has no single replacement. + Example: "/test?foo=bar#buzz" """ - # Path: model/attributes/http/http__request__response_start.json - HTTP_REQUEST_RESPONSE_START: Literal["http.request.response_start"] = ( - "http.request.response_start" - ) - """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. + # Path: model/attributes/http/http__url.json + HTTP_URL: Literal["http.url"] = "http.url" + """The URL of the resource that was fetched. - Type: float - Apply Scrubbing: manual - Defined in OTEL: No + Type: str + Apply Scrubbing: auto + Defined in OTEL: Yes Visibility: public - Example: 1732829555.7 + Aliases: url.full, url, aws.request.url, messaging.url + DEPRECATED: Use url.full instead + Example: "https://example.com/test?foo=bar#buzz" """ - # Path: model/attributes/http/http__request__same_origin.json - HTTP_REQUEST_SAME_ORIGIN: Literal["http.request.same_origin"] = ( - "http.request.same_origin" - ) - """Indicates that a URL has the same origin as the current page's origin in the browser. + # Path: model/attributes/http/http__user_agent.json + HTTP_USER_AGENT: Literal["http.user_agent"] = "http.user_agent" + """Value of the HTTP User-Agent header sent by the client. - Type: bool + Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Aliases: url.same_origin - Example: true + Aliases: user_agent.original + DEPRECATED: Use user_agent.original instead + Example: "Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Mobile/15E148 Safari/604.1" """ - # Path: model/attributes/http/http__request__secure_connection_start.json - HTTP_REQUEST_SECURE_CONNECTION_START: Literal[ - "http.request.secure_connection_start" - ] = "http.request.secure_connection_start" - """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. + # Path: model/attributes/id.json + ID: Literal["id"] = "id" + """A unique identifier for the span. - Type: float - Apply Scrubbing: manual + Type: str + Apply Scrubbing: never Defined in OTEL: No Visibility: public - Example: 1732829555.73 + Example: "f47ac10b58cc4372a5670e02b2c3d479" """ - # Path: model/attributes/http/http__request__time_to_first_byte.json - HTTP_REQUEST_TIME_TO_FIRST_BYTE: Literal["http.request.time_to_first_byte"] = ( - "http.request.time_to_first_byte" - ) - """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 + # Path: model/attributes/inp.json + INP: Literal["inp"] = "inp" + """The value of the recorded Interaction to Next Paint (INP) web vital Type: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 1.032 + Aliases: browser.web_vital.inp.value + DEPRECATED: Use browser.web_vital.inp.value instead - The INP web vital is now recorded as a browser.web_vital.inp.value attribute. + Example: 200 """ - # Path: model/attributes/http/http__request__worker_start.json - HTTP_REQUEST_WORKER_START: Literal["http.request.worker_start"] = ( - "http.request.worker_start" + # Path: model/attributes/jsonrpc/jsonrpc__protocol__version.json + JSONRPC_PROTOCOL_VERSION: Literal["jsonrpc.protocol.version"] = ( + "jsonrpc.protocol.version" ) - """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. + """The version of the JSON-RPC protocol used. - Type: float + Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: 1732829553.68 + Example: "2.0" """ - # Path: model/attributes/http/http__request_content_length.json - HTTP_REQUEST_CONTENT_LENGTH: Literal["http.request_content_length"] = ( - "http.request_content_length" - ) - """The encoded body size of the request (in bytes). + # Path: model/attributes/jsonrpc/jsonrpc__request__id.json + JSONRPC_REQUEST_ID: Literal["jsonrpc.request.id"] = "jsonrpc.request.id" + """The JSON-RPC request identifier, used to correlate a request with its response. - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: http.request.body.size - DEPRECATED: Use http.request.body.size instead - Example: 123 + Aliases: mcp.request.id + Example: "1" """ - # Path: model/attributes/http/http__request_content_length_uncompressed.json - HTTP_REQUEST_CONTENT_LENGTH_UNCOMPRESSED: Literal[ - "http.request_content_length_uncompressed" - ] = "http.request_content_length_uncompressed" - """The decoded body size of the request (in bytes). + # Path: model/attributes/jvm/jvm__gc__action.json + JVM_GC_ACTION: Literal["jvm.gc.action"] = "jvm.gc.action" + """Name of the garbage collector action. - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: http.request.body.decoded_size - DEPRECATED: Use http.request.body.decoded_size instead - Example: 456 + Example: "end of minor GC" """ - # Path: model/attributes/http/http__request_method.json - _HTTP_REQUEST_METHOD: Literal["http.request_method"] = "http.request_method" - """The HTTP method used. + # Path: model/attributes/jvm/jvm__gc__name.json + JVM_GC_NAME: Literal["jvm.gc.name"] = "jvm.gc.name" + """Name of the garbage collector. Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Aliases: method, http.method, http.request.method - DEPRECATED: Use http.request.method instead - Example: "GET" + Example: "G1 Young Generation" """ - # Path: model/attributes/http/http__response__body__decoded_size.json - HTTP_RESPONSE_BODY_DECODED_SIZE: Literal["http.response.body.decoded_size"] = ( - "http.response.body.decoded_size" - ) - """The decoded body size of the response (in bytes). + # Path: model/attributes/jvm/jvm__memory__pool__name.json + JVM_MEMORY_POOL_NAME: Literal["jvm.memory.pool.name"] = "jvm.memory.pool.name" + """Name of the memory pool. - Type: int + Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Aliases: http.decoded_response_content_length, http.response_content_length_uncompressed - Example: 456 + Example: "G1 Old Gen" """ - # Path: model/attributes/http/http__response__body__size.json - HTTP_RESPONSE_BODY_SIZE: Literal["http.response.body.size"] = ( - "http.response.body.size" - ) - """The encoded body size of the response (in bytes). + # Path: model/attributes/jvm/jvm__memory__type.json + JVM_MEMORY_TYPE: Literal["jvm.memory.type"] = "jvm.memory.type" + """Name of the memory pool. - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: http.response_content_length, http.response.header.content-length - Example: 123 + Example: "G1 Old Gen" """ - # Path: model/attributes/http/http__response__header__[key].json - HTTP_RESPONSE_HEADER_KEY: Literal["http.response.header."] = ( - "http.response.header." - ) - """HTTP response headers, being the lower-cased, but otherwise unchanged HTTP Header name, the value being the header values. + # Path: model/attributes/jvm/jvm__thread__daemon.json + JVM_THREAD_DAEMON: Literal["jvm.thread.daemon"] = "jvm.thread.daemon" + """Whether the thread is daemon or not. - Type: List[str] - Apply Scrubbing: auto + Type: bool + Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Has Dynamic Suffix: true - Example: "http.response.header.custom-header=['foo', 'bar']" - Example: "http.response.header.content-length=['123']" + Example: true """ - # Path: model/attributes/http/http__response__header__content-length.json - HTTP_RESPONSE_HEADER_CONTENT_LENGTH: Literal[ - "http.response.header.content-length" - ] = "http.response.header.content-length" - """The size of the message body sent to the recipient (in bytes) + # Path: model/attributes/jvm/jvm__thread__state.json + JVM_THREAD_STATE: Literal["jvm.thread.state"] = "jvm.thread.state" + """State of the thread. Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Aliases: http.response_content_length, http.response.body.size - Example: "http.response.header.custom-header=['foo', 'bar']" + Example: "blocked" """ - # Path: model/attributes/http/http__response__size.json - HTTP_RESPONSE_SIZE: Literal["http.response.size"] = "http.response.size" - """The transfer size of the response (in bytes). + # Path: model/attributes/koa/koa__name.json + KOA_NAME: Literal["koa.name"] = "koa.name" + """The name of the Koa middleware or matched route that handled the request. - Type: int + Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: http.response_transfer_size - Example: 456 + DEPRECATED: No replacement at this time - No single replacement. SDKs should use http.route for router layers and code.function.name for middleware layers instead. + Example: "/users/:id" """ - # Path: model/attributes/http/http__response__status_code.json - HTTP_RESPONSE_STATUS_CODE: Literal["http.response.status_code"] = ( - "http.response.status_code" - ) - """The status code of the HTTP response. + # Path: model/attributes/koa/koa__type.json + KOA_TYPE: Literal["koa.type"] = "koa.type" + """The type of the Koa layer that handled the request. - Type: int + Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: http.status_code - Example: 404 + Example: "router" """ - # Path: model/attributes/http/http__response__status_text.json - HTTP_RESPONSE_STATUS_TEXT: Literal["http.response.status_text"] = ( - "http.response.status_text" - ) - """The reason phrase of the HTTP response. + # Path: model/attributes/langchain/langchain__chain__name.json + LANGCHAIN_CHAIN_NAME: Literal["langchain.chain.name"] = "langchain.chain.name" + """The name of the LangChain chain being executed. Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: http.status_text - Example: "NOT FOUND" + Aliases: gen_ai.pipeline.name, ai.pipeline.name + DEPRECATED: Use gen_ai.pipeline.name instead - This attribute is being deprecated in favor of gen_ai.pipeline.name, which is the SDK-agnostic replacement for the name of the AI pipeline or chain being executed. + Example: "format_prompt" + Example: "RunnableSequence" """ - # Path: model/attributes/http/http__response_content_length.json - HTTP_RESPONSE_CONTENT_LENGTH: Literal["http.response_content_length"] = ( - "http.response_content_length" - ) - """The encoded body size of the response (in bytes). + # Path: model/attributes/lcp/lcp__element.json + LCP_ELEMENT: Literal["lcp.element"] = "lcp.element" + """The dom element responsible for the largest contentful paint. - Type: int + Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: http.response.body.size, http.response.header.content-length - DEPRECATED: Use http.response.body.size instead - Example: 123 + Aliases: browser.web_vital.lcp.element + DEPRECATED: Use browser.web_vital.lcp.element instead - The LCP element is now recorded as a browser.web_vital.lcp.element attribute. + Example: "img" """ - # Path: model/attributes/http/http__response_content_length_uncompressed.json - HTTP_RESPONSE_CONTENT_LENGTH_UNCOMPRESSED: Literal[ - "http.response_content_length_uncompressed" - ] = "http.response_content_length_uncompressed" - """The decoded body size of the response (in bytes). + # Path: model/attributes/lcp/lcp__id.json + LCP_ID: Literal["lcp.id"] = "lcp.id" + """The id of the dom element responsible for the largest contentful paint. - Type: int + Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: http.response.body.decoded_size, http.decoded_response_content_length - DEPRECATED: Use http.response.body.decoded_size instead - Example: 456 + Aliases: browser.web_vital.lcp.id + DEPRECATED: Use browser.web_vital.lcp.id instead - The LCP id is now recorded as a browser.web_vital.lcp.id attribute. + Example: "#hero" """ - # Path: model/attributes/http/http__response_transfer_size.json - HTTP_RESPONSE_TRANSFER_SIZE: Literal["http.response_transfer_size"] = ( - "http.response_transfer_size" - ) - """The transfer size of the response (in bytes). + # Path: model/attributes/lcp/lcp__loadTime.json + LCP_LOADTIME: Literal["lcp.loadTime"] = "lcp.loadTime" + """The time it took for the LCP element to be loaded Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: http.response.size - DEPRECATED: Use http.response.size instead - Example: 456 + Aliases: browser.web_vital.lcp.load_time + DEPRECATED: Use browser.web_vital.lcp.load_time instead - The LCP load time is now recorded as a browser.web_vital.lcp.load_time attribute. + Example: 1402 """ - # Path: model/attributes/http/http__route.json - HTTP_ROUTE: Literal["http.route"] = "http.route" - """The matched route, that is, the path template in the format used by the respective server framework. + # Path: model/attributes/lcp/lcp__renderTime.json + LCP_RENDERTIME: Literal["lcp.renderTime"] = "lcp.renderTime" + """The time it took for the LCP element to be rendered - Type: str + Type: int Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: route - Example: "/users/:id" - Example: "my-controller/my-action/{id}" - Example: "/posts" + Aliases: browser.web_vital.lcp.render_time + DEPRECATED: Use browser.web_vital.lcp.render_time instead - The LCP render time is now recorded as a browser.web_vital.lcp.render_time attribute. + Example: 1685 """ - # Path: model/attributes/http/http__scheme.json - HTTP_SCHEME: Literal["http.scheme"] = "http.scheme" - """The URI scheme component identifying the used protocol. - - Type: str + # Path: model/attributes/lcp/lcp__size.json + LCP_SIZE: Literal["lcp.size"] = "lcp.size" + """The size of the largest contentful paint element. + + Type: int Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: url.scheme - DEPRECATED: Use url.scheme instead - Example: "https" + Aliases: browser.web_vital.lcp.size + DEPRECATED: Use browser.web_vital.lcp.size instead - The LCP size is now recorded as a browser.web_vital.lcp.size attribute. + Example: 1234 """ - # Path: model/attributes/http/http__server__request__time_in_queue.json - HTTP_SERVER_REQUEST_TIME_IN_QUEUE: Literal["http.server.request.time_in_queue"] = ( - "http.server.request.time_in_queue" - ) - """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. + # Path: model/attributes/lcp/lcp__url.json + LCP_URL: Literal["lcp.url"] = "lcp.url" + """The url of the dom element responsible for the largest contentful paint. + + Type: str + Apply Scrubbing: auto + Defined in OTEL: No + Visibility: public + Aliases: browser.web_vital.lcp.url + DEPRECATED: Use browser.web_vital.lcp.url instead - The LCP url is now recorded as a browser.web_vital.lcp.url attribute. + Example: "https://example.com" + """ + + # Path: model/attributes/lcp.json + LCP: Literal["lcp"] = "lcp" + """The value of the recorded Largest Contentful Paint (LCP) web vital Type: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 50 + Aliases: browser.web_vital.lcp.value + DEPRECATED: Use browser.web_vital.lcp.value instead - The LCP web vital is now recorded as a browser.web_vital.lcp.value attribute. + Example: 2500 """ - # Path: model/attributes/http/http__server_name.json - HTTP_SERVER_NAME: Literal["http.server_name"] = "http.server_name" - """The server domain name + # Path: model/attributes/litestar/litestar__middleware_name.json + LITESTAR_MIDDLEWARE_NAME: Literal["litestar.middleware_name"] = ( + "litestar.middleware_name" + ) + """The name of the Litestar middleware. Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: address, server.address, net.host.name, http.host, server_name, net.peer.name - DEPRECATED: Use server.address instead - Example: "example.com" + Aliases: middleware.name + DEPRECATED: Use middleware.name instead - This attribute is being deprecated in favor of middleware.name, which is the framework-agnostic replacement. + Example: "AuthenticationMiddleware" """ - # Path: model/attributes/http/http__status_code.json - HTTP_STATUS_CODE: Literal["http.status_code"] = "http.status_code" - """The status code of the HTTP response. + # Path: model/attributes/logger/logger__name.json + LOGGER_NAME: Literal["logger.name"] = "logger.name" + """The name of the logger that generated this event. - Type: int + Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: http.response.status_code - DEPRECATED: Use http.response.status_code instead - Example: 404 + Example: "myLogger" """ - # Path: model/attributes/http/http__status_text.json - HTTP_STATUS_TEXT: Literal["http.status_text"] = "http.status_text" - """The reason phrase of the HTTP response + # Path: model/attributes/mcp/mcp__auth__client__name.json + MCP_AUTH_CLIENT_NAME: Literal["mcp.auth.client.name"] = "mcp.auth.client.name" + """Registered OAuth client application name associated with the authenticated MCP request. Taken from OAuth client registration metadata (client_name) made available by the authentication layer. This is distinct from the MCP implementation name in mcp.client.name; omit it when the OAuth client name is unavailable. Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: http.response.status_text - DEPRECATED: Use http.response.status_text instead - Example: "NOT FOUND" + Example: "Example Desktop" + Example: "Example CLI" """ - # Path: model/attributes/http/http__target.json - HTTP_TARGET: Literal["http.target"] = "http.target" - """The pathname and query string of the URL. + # Path: model/attributes/mcp/mcp__cancelled__reason.json + MCP_CANCELLED_REASON: Literal["mcp.cancelled.reason"] = "mcp.cancelled.reason" + """Reason for the cancellation of an MCP operation. Type: str - Apply Scrubbing: auto - Defined in OTEL: Yes + Apply Scrubbing: manual - Cancellation reasons may contain user-specific or sensitive information + Defined in OTEL: No Visibility: public - DEPRECATED: No replacement at this time - This attribute is being deprecated in favor of url.path, url.query and url.fragment. The value holds all three parts at once, so it has no single replacement. - Example: "/test?foo=bar#buzz" + Example: "User cancelled the request" """ - # Path: model/attributes/http/http__url.json - HTTP_URL: Literal["http.url"] = "http.url" - """The URL of the resource that was fetched. + # Path: model/attributes/mcp/mcp__cancelled__request_id.json + MCP_CANCELLED_REQUEST_ID: Literal["mcp.cancelled.request_id"] = ( + "mcp.cancelled.request_id" + ) + """Request ID of the cancelled MCP operation. Type: str - Apply Scrubbing: auto - Defined in OTEL: Yes + Apply Scrubbing: manual + Defined in OTEL: No Visibility: public - Aliases: url.full, url, aws.request.url, messaging.url - DEPRECATED: Use url.full instead - Example: "https://example.com/test?foo=bar#buzz" + Example: "123" """ - # Path: model/attributes/http/http__user_agent.json - HTTP_USER_AGENT: Literal["http.user_agent"] = "http.user_agent" - """Value of the HTTP User-Agent header sent by the client. + # Path: model/attributes/mcp/mcp__client__name.json + MCP_CLIENT_NAME: Literal["mcp.client.name"] = "mcp.client.name" + """Name of the MCP client implementation, as declared in clientInfo. This is distinct from the registered OAuth application name in mcp.auth.client.name. Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: user_agent.original - DEPRECATED: Use user_agent.original instead - Example: "Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Mobile/15E148 Safari/604.1" + Example: "example-mcp-client" """ - # Path: model/attributes/id.json - ID: Literal["id"] = "id" - """A unique identifier for the span. + # Path: model/attributes/mcp/mcp__client__title.json + MCP_CLIENT_TITLE: Literal["mcp.client.title"] = "mcp.client.title" + """Display title of the MCP client implementation, as declared in clientInfo. Type: str - Apply Scrubbing: never + Apply Scrubbing: manual - Client titles may reveal user-specific application configurations or custom setups Defined in OTEL: No Visibility: public - Example: "f47ac10b58cc4372a5670e02b2c3d479" + Example: "Example MCP Client" """ - # Path: model/attributes/inp.json - INP: Literal["inp"] = "inp" - """The value of the recorded Interaction to Next Paint (INP) web vital + # Path: model/attributes/mcp/mcp__client__version.json + MCP_CLIENT_VERSION: Literal["mcp.client.version"] = "mcp.client.version" + """Version of the MCP client implementation, as declared in clientInfo. - Type: float + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: browser.web_vital.inp.value - DEPRECATED: Use browser.web_vital.inp.value instead - The INP web vital is now recorded as a browser.web_vital.inp.value attribute. - Example: 200 + Example: "1.0.0" """ - # Path: model/attributes/jsonrpc/jsonrpc__protocol__version.json - JSONRPC_PROTOCOL_VERSION: Literal["jsonrpc.protocol.version"] = ( - "jsonrpc.protocol.version" - ) - """The version of the JSON-RPC protocol used. + # Path: model/attributes/mcp/mcp__lifecycle__phase.json + MCP_LIFECYCLE_PHASE: Literal["mcp.lifecycle.phase"] = "mcp.lifecycle.phase" + """Lifecycle phase indicator for MCP operations. Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: "2.0" + Example: "initialization_complete" """ - # Path: model/attributes/jsonrpc/jsonrpc__request__id.json - JSONRPC_REQUEST_ID: Literal["jsonrpc.request.id"] = "jsonrpc.request.id" - """The JSON-RPC request identifier, used to correlate a request with its response. + # Path: model/attributes/mcp/mcp__logging__data_type.json + MCP_LOGGING_DATA_TYPE: Literal["mcp.logging.data_type"] = "mcp.logging.data_type" + """Data type of the logged message content. Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Aliases: mcp.request.id - Example: "1" + Example: "string" """ - # Path: model/attributes/jvm/jvm__gc__action.json - JVM_GC_ACTION: Literal["jvm.gc.action"] = "jvm.gc.action" - """Name of the garbage collector action. + # Path: model/attributes/mcp/mcp__logging__level.json + MCP_LOGGING_LEVEL: Literal["mcp.logging.level"] = "mcp.logging.level" + """Log level for MCP logging operations. Type: str Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: "end of minor GC" + Example: "info" """ - # Path: model/attributes/jvm/jvm__gc__name.json - JVM_GC_NAME: Literal["jvm.gc.name"] = "jvm.gc.name" - """Name of the garbage collector. + # Path: model/attributes/mcp/mcp__logging__logger.json + MCP_LOGGING_LOGGER: Literal["mcp.logging.logger"] = "mcp.logging.logger" + """Logger name for MCP logging operations. Type: str - Apply Scrubbing: manual - Defined in OTEL: Yes + Apply Scrubbing: manual - Logger names may be user-defined and could contain sensitive information + Defined in OTEL: No Visibility: public - Example: "G1 Young Generation" + Example: "mcp_server" """ - # Path: model/attributes/jvm/jvm__memory__pool__name.json - JVM_MEMORY_POOL_NAME: Literal["jvm.memory.pool.name"] = "jvm.memory.pool.name" - """Name of the memory pool. + # Path: model/attributes/mcp/mcp__logging__message.json + MCP_LOGGING_MESSAGE: Literal["mcp.logging.message"] = "mcp.logging.message" + """Log message content from MCP logging operations. Type: str - Apply Scrubbing: manual - Defined in OTEL: Yes + Apply Scrubbing: auto - Log messages can contain user data + Defined in OTEL: No Visibility: public - Example: "G1 Old Gen" + Example: "Tool execution completed successfully" """ - # Path: model/attributes/jvm/jvm__memory__type.json - JVM_MEMORY_TYPE: Literal["jvm.memory.type"] = "jvm.memory.type" - """Name of the memory pool. + # Path: model/attributes/mcp/mcp__method__name.json + MCP_METHOD_NAME: Literal["mcp.method.name"] = "mcp.method.name" + """The name of the MCP request or notification method being called. Type: str Apply Scrubbing: manual Defined in OTEL: Yes Visibility: public - Example: "G1 Old Gen" + Example: "tools/call" """ - # Path: model/attributes/jvm/jvm__thread__daemon.json - JVM_THREAD_DAEMON: Literal["jvm.thread.daemon"] = "jvm.thread.daemon" - """Whether the thread is daemon or not. + # Path: model/attributes/mcp/mcp__progress__current.json + MCP_PROGRESS_CURRENT: Literal["mcp.progress.current"] = "mcp.progress.current" + """Current progress value of an MCP operation. - Type: bool + Type: float Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: true + Example: 0.2 + Example: 50 """ - # Path: model/attributes/jvm/jvm__thread__state.json - JVM_THREAD_STATE: Literal["jvm.thread.state"] = "jvm.thread.state" - """State of the thread. + # Path: model/attributes/mcp/mcp__progress__message.json + MCP_PROGRESS_MESSAGE: Literal["mcp.progress.message"] = "mcp.progress.message" + """Progress message describing the current state of an MCP operation. Type: str - Apply Scrubbing: manual - Defined in OTEL: Yes + Apply Scrubbing: manual - Progress messages may contain user-specific or sensitive information + Defined in OTEL: No Visibility: public - Example: "blocked" + Example: "Processing 50 of 100 items" """ - # Path: model/attributes/koa/koa__name.json - KOA_NAME: Literal["koa.name"] = "koa.name" - """The name of the Koa middleware or matched route that handled the request. + # Path: model/attributes/mcp/mcp__progress__percentage.json + MCP_PROGRESS_PERCENTAGE: Literal["mcp.progress.percentage"] = ( + "mcp.progress.percentage" + ) + """Calculated progress percentage of an MCP operation. Computed from current/total * 100. - Type: str + Type: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - DEPRECATED: No replacement at this time - No single replacement. SDKs should use http.route for router layers and code.function.name for middleware layers instead. - Example: "/users/:id" + Example: 50 """ - # Path: model/attributes/koa/koa__type.json - KOA_TYPE: Literal["koa.type"] = "koa.type" - """The type of the Koa layer that handled the request. + # Path: model/attributes/mcp/mcp__progress__token.json + MCP_PROGRESS_TOKEN: Literal["mcp.progress.token"] = "mcp.progress.token" + """Token for tracking progress of an MCP operation. Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "router" + Example: "progress-token-123" """ - # Path: model/attributes/langchain/langchain__chain__name.json - LANGCHAIN_CHAIN_NAME: Literal["langchain.chain.name"] = "langchain.chain.name" - """The name of the LangChain chain being executed. + # Path: model/attributes/mcp/mcp__progress__total.json + MCP_PROGRESS_TOTAL: Literal["mcp.progress.total"] = "mcp.progress.total" + """Total progress target value of an MCP operation. - Type: str + Type: float Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: gen_ai.pipeline.name, ai.pipeline.name - DEPRECATED: Use gen_ai.pipeline.name instead - This attribute is being deprecated in favor of gen_ai.pipeline.name, which is the SDK-agnostic replacement for the name of the AI pipeline or chain being executed. - Example: "format_prompt" - Example: "RunnableSequence" + Example: 1 + Example: 100 """ - # Path: model/attributes/lcp/lcp__element.json - LCP_ELEMENT: Literal["lcp.element"] = "lcp.element" - """The dom element responsible for the largest contentful paint. + # Path: model/attributes/mcp/mcp__prompt__name.json + MCP_PROMPT_NAME: Literal["mcp.prompt.name"] = "mcp.prompt.name" + """Name of the MCP prompt template being used. Type: str - Apply Scrubbing: manual + Apply Scrubbing: manual - Prompt names may reveal user behavior patterns or sensitive operations Defined in OTEL: No Visibility: public - Aliases: browser.web_vital.lcp.element - DEPRECATED: Use browser.web_vital.lcp.element instead - The LCP element is now recorded as a browser.web_vital.lcp.element attribute. - Example: "img" + Aliases: gen_ai.prompt.name + DEPRECATED: Use gen_ai.prompt.name instead - OTel uses gen_ai.prompt.name for MCP prompt names + Example: "summarize" """ - # Path: model/attributes/lcp/lcp__id.json - LCP_ID: Literal["lcp.id"] = "lcp.id" - """The id of the dom element responsible for the largest contentful paint. + # Path: model/attributes/mcp/mcp__prompt__result__description.json + MCP_PROMPT_RESULT_DESCRIPTION: Literal["mcp.prompt.result.description"] = ( + "mcp.prompt.result.description" + ) + """Description of the prompt result. Type: str - Apply Scrubbing: manual - Defined in OTEL: No - Visibility: public - Aliases: browser.web_vital.lcp.id - DEPRECATED: Use browser.web_vital.lcp.id instead - The LCP id is now recorded as a browser.web_vital.lcp.id attribute. - Example: "#hero" - """ - - # Path: model/attributes/lcp/lcp__loadTime.json - LCP_LOADTIME: Literal["lcp.loadTime"] = "lcp.loadTime" - """The time it took for the LCP element to be loaded - - Type: int - Apply Scrubbing: manual + Apply Scrubbing: auto Defined in OTEL: No Visibility: public - Aliases: browser.web_vital.lcp.load_time - DEPRECATED: Use browser.web_vital.lcp.load_time instead - The LCP load time is now recorded as a browser.web_vital.lcp.load_time attribute. - Example: 1402 + Example: "A summary of the requested information" """ - # Path: model/attributes/lcp/lcp__renderTime.json - LCP_RENDERTIME: Literal["lcp.renderTime"] = "lcp.renderTime" - """The time it took for the LCP element to be rendered + # Path: model/attributes/mcp/mcp__prompt__result__message_content.json + MCP_PROMPT_RESULT_MESSAGE_CONTENT: Literal["mcp.prompt.result.message_content"] = ( + "mcp.prompt.result.message_content" + ) + """Content of the message in the prompt result. Used for single message results only. - Type: int - Apply Scrubbing: manual + Type: str + Apply Scrubbing: auto Defined in OTEL: No Visibility: public - Aliases: browser.web_vital.lcp.render_time - DEPRECATED: Use browser.web_vital.lcp.render_time instead - The LCP render time is now recorded as a browser.web_vital.lcp.render_time attribute. - Example: 1685 + Example: "Please provide a summary of the document" """ - # Path: model/attributes/lcp/lcp__size.json - LCP_SIZE: Literal["lcp.size"] = "lcp.size" - """The size of the largest contentful paint element. + # Path: model/attributes/mcp/mcp__prompt__result__message_count.json + MCP_PROMPT_RESULT_MESSAGE_COUNT: Literal["mcp.prompt.result.message_count"] = ( + "mcp.prompt.result.message_count" + ) + """Number of messages in the prompt result. Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: browser.web_vital.lcp.size - DEPRECATED: Use browser.web_vital.lcp.size instead - The LCP size is now recorded as a browser.web_vital.lcp.size attribute. - Example: 1234 + Example: 3 """ - # Path: model/attributes/lcp/lcp__url.json - LCP_URL: Literal["lcp.url"] = "lcp.url" - """The url of the dom element responsible for the largest contentful paint. + # Path: model/attributes/mcp/mcp__prompt__result__message_role.json + MCP_PROMPT_RESULT_MESSAGE_ROLE: Literal["mcp.prompt.result.message_role"] = ( + "mcp.prompt.result.message_role" + ) + """Role of the message in the prompt result. Used for single message results only. Type: str - Apply Scrubbing: auto + Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: browser.web_vital.lcp.url - DEPRECATED: Use browser.web_vital.lcp.url instead - The LCP url is now recorded as a browser.web_vital.lcp.url attribute. - Example: "https://example.com" + Example: "user" """ - # Path: model/attributes/lcp.json - LCP: Literal["lcp"] = "lcp" - """The value of the recorded Largest Contentful Paint (LCP) web vital + # Path: model/attributes/mcp/mcp__protocol__ready.json + MCP_PROTOCOL_READY: Literal["mcp.protocol.ready"] = "mcp.protocol.ready" + """Readiness indicator for the legacy MCP initialization handshake. A non-zero value indicates that notifications/initialized has completed initialization. Omit for protocol versions without this handshake. - Type: float + Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: browser.web_vital.lcp.value - DEPRECATED: Use browser.web_vital.lcp.value instead - The LCP web vital is now recorded as a browser.web_vital.lcp.value attribute. - Example: 2500 + Example: 1 """ - # Path: model/attributes/litestar/litestar__middleware_name.json - LITESTAR_MIDDLEWARE_NAME: Literal["litestar.middleware_name"] = ( - "litestar.middleware_name" - ) - """The name of the Litestar middleware. + # Path: model/attributes/mcp/mcp__protocol__version.json + MCP_PROTOCOL_VERSION: Literal["mcp.protocol.version"] = "mcp.protocol.version" + """Version of the Model Context Protocol used for the operation. Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Aliases: middleware.name - DEPRECATED: Use middleware.name instead - This attribute is being deprecated in favor of middleware.name, which is the framework-agnostic replacement. - Example: "AuthenticationMiddleware" + Example: "2024-11-05" """ - # Path: model/attributes/logger/logger__name.json - LOGGER_NAME: Literal["logger.name"] = "logger.name" - """The name of the logger that generated this event. + # Path: model/attributes/mcp/mcp__request__argument__[key].json + MCP_REQUEST_ARGUMENT_KEY: Literal["mcp.request.argument."] = ( + "mcp.request.argument." + ) + """MCP request argument with dynamic key suffix. The is replaced with the actual argument name. The value is a JSON-stringified representation of the argument value. Type: str - Apply Scrubbing: manual + Apply Scrubbing: auto - Arguments contain user input Defined in OTEL: No Visibility: public - Example: "myLogger" + Has Dynamic Suffix: true + Example: "mcp.request.argument.query='weather in Paris'" """ - # Path: model/attributes/mcp/mcp__auth__client__name.json - MCP_AUTH_CLIENT_NAME: Literal["mcp.auth.client.name"] = "mcp.auth.client.name" - """Registered OAuth client application name associated with the authenticated MCP request. Taken from OAuth client registration metadata (client_name) made available by the authentication layer. This is distinct from the MCP implementation name in mcp.client.name; omit it when the OAuth client name is unavailable. + # Path: model/attributes/mcp/mcp__request__argument__name.json + MCP_REQUEST_ARGUMENT_NAME: Literal["mcp.request.argument.name"] = ( + "mcp.request.argument.name" + ) + """Name argument from prompts/get MCP request. Type: str - Apply Scrubbing: manual + Apply Scrubbing: auto - Prompt names can contain user input Defined in OTEL: No Visibility: public - Example: "Example Desktop" - Example: "Example CLI" + Example: "summarize" """ - # Path: model/attributes/mcp/mcp__cancelled__reason.json - MCP_CANCELLED_REASON: Literal["mcp.cancelled.reason"] = "mcp.cancelled.reason" - """Reason for the cancellation of an MCP operation. + # Path: model/attributes/mcp/mcp__request__argument__uri.json + MCP_REQUEST_ARGUMENT_URI: Literal["mcp.request.argument.uri"] = ( + "mcp.request.argument.uri" + ) + """URI argument from resources/read MCP request. Type: str - Apply Scrubbing: manual - Cancellation reasons may contain user-specific or sensitive information + Apply Scrubbing: auto - URIs can contain user file paths Defined in OTEL: No Visibility: public - Example: "User cancelled the request" + Example: "file:///path/to/resource" """ - # Path: model/attributes/mcp/mcp__cancelled__request_id.json - MCP_CANCELLED_REQUEST_ID: Literal["mcp.cancelled.request_id"] = ( - "mcp.cancelled.request_id" - ) - """Request ID of the cancelled MCP operation. + # Path: model/attributes/mcp/mcp__request__id.json + MCP_REQUEST_ID: Literal["mcp.request.id"] = "mcp.request.id" + """JSON-RPC request identifier for the MCP request, used to correlate the request with its response. Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "123" + Aliases: jsonrpc.request.id + DEPRECATED: Use jsonrpc.request.id instead - OTel models MCP as JSON-RPC, uses jsonrpc.request.id + Example: "1" """ - # Path: model/attributes/mcp/mcp__client__name.json - MCP_CLIENT_NAME: Literal["mcp.client.name"] = "mcp.client.name" - """Name of the MCP client implementation, as declared in clientInfo. This is distinct from the registered OAuth application name in mcp.auth.client.name. + # Path: model/attributes/mcp/mcp__resource__protocol.json + MCP_RESOURCE_PROTOCOL: Literal["mcp.resource.protocol"] = "mcp.resource.protocol" + """URI scheme of the MCP resource being accessed, extracted from its URI. This is distinct from the network protocol used to communicate with the MCP server. Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "example-mcp-client" + Example: "file" + Example: "postgres" """ - # Path: model/attributes/mcp/mcp__client__title.json - MCP_CLIENT_TITLE: Literal["mcp.client.title"] = "mcp.client.title" - """Display title of the MCP client implementation, as declared in clientInfo. + # Path: model/attributes/mcp/mcp__resource__uri.json + MCP_RESOURCE_URI: Literal["mcp.resource.uri"] = "mcp.resource.uri" + """The resource URI being accessed in an MCP operation. Type: str - Apply Scrubbing: manual - Client titles may reveal user-specific application configurations or custom setups - Defined in OTEL: No + Apply Scrubbing: auto - URIs can contain sensitive file paths + Defined in OTEL: Yes Visibility: public - Example: "Example MCP Client" + Example: "file:///path/to/file.txt" """ - # Path: model/attributes/mcp/mcp__client__version.json - MCP_CLIENT_VERSION: Literal["mcp.client.version"] = "mcp.client.version" - """Version of the MCP client implementation, as declared in clientInfo. + # Path: model/attributes/mcp/mcp__server__name.json + MCP_SERVER_NAME: Literal["mcp.server.name"] = "mcp.server.name" + """Name of the MCP server implementation, as declared in serverInfo. Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "1.0.0" + Example: "example-mcp-server" """ - # Path: model/attributes/mcp/mcp__lifecycle__phase.json - MCP_LIFECYCLE_PHASE: Literal["mcp.lifecycle.phase"] = "mcp.lifecycle.phase" - """Lifecycle phase indicator for MCP operations. + # Path: model/attributes/mcp/mcp__server__title.json + MCP_SERVER_TITLE: Literal["mcp.server.title"] = "mcp.server.title" + """Display title of the MCP server implementation, as declared in serverInfo. Type: str - Apply Scrubbing: manual + Apply Scrubbing: manual - Server titles may reveal user-specific application configurations or custom setups Defined in OTEL: No Visibility: public - Example: "initialization_complete" + Example: "Example MCP Server" """ - # Path: model/attributes/mcp/mcp__logging__data_type.json - MCP_LOGGING_DATA_TYPE: Literal["mcp.logging.data_type"] = "mcp.logging.data_type" - """Data type of the logged message content. + # Path: model/attributes/mcp/mcp__server__version.json + MCP_SERVER_VERSION: Literal["mcp.server.version"] = "mcp.server.version" + """Version of the MCP server implementation, as declared in serverInfo. Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "string" + Example: "0.1.0" """ - # Path: model/attributes/mcp/mcp__logging__level.json - MCP_LOGGING_LEVEL: Literal["mcp.logging.level"] = "mcp.logging.level" - """Log level for MCP logging operations. + # Path: model/attributes/mcp/mcp__session__id.json + MCP_SESSION_ID: Literal["mcp.session.id"] = "mcp.session.id" + """Identifier for an MCP protocol session, when the operation belongs to a session. Type: str Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: "info" + Example: "550e8400-e29b-41d4-a716-446655440000" """ - # Path: model/attributes/mcp/mcp__logging__logger.json - MCP_LOGGING_LOGGER: Literal["mcp.logging.logger"] = "mcp.logging.logger" - """Logger name for MCP logging operations. + # Path: model/attributes/mcp/mcp__tool__name.json + MCP_TOOL_NAME: Literal["mcp.tool.name"] = "mcp.tool.name" + """Name of the MCP tool being called. Type: str - Apply Scrubbing: manual - Logger names may be user-defined and could contain sensitive information + Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "mcp_server" + Aliases: gen_ai.tool.name, ai.function_call + DEPRECATED: Use gen_ai.tool.name instead - OTel uses gen_ai.tool.name for MCP tool names + Example: "calculator" """ - # Path: model/attributes/mcp/mcp__logging__message.json - MCP_LOGGING_MESSAGE: Literal["mcp.logging.message"] = "mcp.logging.message" - """Log message content from MCP logging operations. + # Path: model/attributes/mcp/mcp__tool__result__content.json + MCP_TOOL_RESULT_CONTENT: Literal["mcp.tool.result.content"] = ( + "mcp.tool.result.content" + ) + """The content of the tool result. Type: str - Apply Scrubbing: auto - Log messages can contain user data + Apply Scrubbing: auto - Tool results can contain user data Defined in OTEL: No Visibility: public - Example: "Tool execution completed successfully" + Aliases: gen_ai.tool.call.result, gen_ai.tool.message, gen_ai.tool.output, ai.toolCall.result, anthropic.tool_result.content + DEPRECATED: Use gen_ai.tool.call.result instead - OTel uses gen_ai.tool.call.result for MCP tool results + Example: "{\"output\": \"rainy\", \"toolCallId\": \"1\"}" """ - # Path: model/attributes/mcp/mcp__method__name.json - MCP_METHOD_NAME: Literal["mcp.method.name"] = "mcp.method.name" - """The name of the MCP request or notification method being called. + # Path: model/attributes/mcp/mcp__tool__result__content_count.json + MCP_TOOL_RESULT_CONTENT_COUNT: Literal["mcp.tool.result.content_count"] = ( + "mcp.tool.result.content_count" + ) + """Number of content items in the tool result. - Type: str + Type: int Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: "tools/call" + DEPRECATED: No replacement at this time - A count can be calculcated from the value of the gen_ai.tool.call.result attribute. + Example: 1 """ - # Path: model/attributes/mcp/mcp__progress__current.json - MCP_PROGRESS_CURRENT: Literal["mcp.progress.current"] = "mcp.progress.current" - """Current progress value of an MCP operation. + # Path: model/attributes/mcp/mcp__tool__result__is_error.json + MCP_TOOL_RESULT_IS_ERROR: Literal["mcp.tool.result.is_error"] = ( + "mcp.tool.result.is_error" + ) + """Whether a tool execution resulted in an error. - Type: float + Type: bool Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 0.2 - Example: 50 + DEPRECATED: Use error.type instead - OTel uses error.type set to 'tool_error' when isError is true. Cannot be automatically backfilled due to type mismatch (boolean vs string). + Example: false """ - # Path: model/attributes/mcp/mcp__progress__message.json - MCP_PROGRESS_MESSAGE: Literal["mcp.progress.message"] = "mcp.progress.message" - """Progress message describing the current state of an MCP operation. + # Path: model/attributes/mcp/mcp__transport.json + MCP_TRANSPORT: Literal["mcp.transport"] = "mcp.transport" + """MCP transport implementation name, such as the transport class name. This identifies the implementation, not the network transport or application protocol. Type: str - Apply Scrubbing: manual - Progress messages may contain user-specific or sensitive information + Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "Processing 50 of 100 items" + Example: "StdioServerTransport" + Example: "CustomHTTPTransport" """ - # Path: model/attributes/mcp/mcp__progress__percentage.json - MCP_PROGRESS_PERCENTAGE: Literal["mcp.progress.percentage"] = ( - "mcp.progress.percentage" + # Path: model/attributes/mdc/mdc__[key].json + MDC_KEY: Literal["mdc."] = "mdc." + """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. + + Type: str + Apply Scrubbing: auto + Defined in OTEL: No + Visibility: public + Has Dynamic Suffix: true + Example: "mdc.some_key='some_value'" + """ + + # Path: model/attributes/messaging/messaging__batch__message_count.json + MESSAGING_BATCH_MESSAGE_COUNT: Literal["messaging.batch.message_count"] = ( + "messaging.batch.message_count" ) - """Calculated progress percentage of an MCP operation. Computed from current/total * 100. + """The number of messages sent, received, or processed in the scope of the batching operation. - Type: float + Type: int Apply Scrubbing: manual - Defined in OTEL: No + Defined in OTEL: Yes Visibility: public - Example: 50 + Example: 10 """ - # Path: model/attributes/mcp/mcp__progress__token.json - MCP_PROGRESS_TOKEN: Literal["mcp.progress.token"] = "mcp.progress.token" - """Token for tracking progress of an MCP operation. + # Path: model/attributes/messaging/messaging__bullmq__flow__name.json + MESSAGING_BULLMQ_FLOW_NAME: Literal["messaging.bullmq.flow.name"] = ( + "messaging.bullmq.flow.name" + ) + """The name of the root job of the BullMQ flow that FlowProducer.add() adds. Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "progress-token-123" + Example: "build-report" """ - # Path: model/attributes/mcp/mcp__progress__total.json - MCP_PROGRESS_TOTAL: Literal["mcp.progress.total"] = "mcp.progress.total" - """Total progress target value of an MCP operation. + # Path: model/attributes/messaging/messaging__bullmq__job__attempt_finished_timestamp.json + MESSAGING_BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP: Literal[ + "messaging.bullmq.job.attempt_finished_timestamp" + ] = "messaging.bullmq.job.attempt_finished_timestamp" + """The time in milliseconds since the Unix epoch when the current attempt of the BullMQ job finished. - Type: float + Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 1 - Example: 100 + Example: 1791184722406 """ - # Path: model/attributes/mcp/mcp__prompt__name.json - MCP_PROMPT_NAME: Literal["mcp.prompt.name"] = "mcp.prompt.name" - """Name of the MCP prompt template being used. + # Path: model/attributes/messaging/messaging__bullmq__job__bulk__names.json + MESSAGING_BULLMQ_JOB_BULK_NAMES: Literal["messaging.bullmq.job.bulk.names"] = ( + "messaging.bullmq.job.bulk.names" + ) + """The names of the BullMQ jobs or flows that one bulk operation adds, for example Queue.addBulk(). - Type: str - Apply Scrubbing: manual - Prompt names may reveal user behavior patterns or sensitive operations + Type: List[str] + Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: gen_ai.prompt.name - DEPRECATED: Use gen_ai.prompt.name instead - OTel uses gen_ai.prompt.name for MCP prompt names - Example: "summarize" + Example: ["send-welcome-email","generate-report"] """ - # Path: model/attributes/mcp/mcp__prompt__result__description.json - MCP_PROMPT_RESULT_DESCRIPTION: Literal["mcp.prompt.result.description"] = ( - "mcp.prompt.result.description" - ) - """Description of the prompt result. + # Path: model/attributes/messaging/messaging__bullmq__job__deduplication__key.json + MESSAGING_BULLMQ_JOB_DEDUPLICATION_KEY: Literal[ + "messaging.bullmq.job.deduplication.key" + ] = "messaging.bullmq.job.deduplication.key" + """The deduplication ID that Queue.removeDeduplicationKey() removes. Type: str Apply Scrubbing: auto Defined in OTEL: No Visibility: public - Example: "A summary of the requested information" + Example: "user-42-sync" """ - # Path: model/attributes/mcp/mcp__prompt__result__message_content.json - MCP_PROMPT_RESULT_MESSAGE_CONTENT: Literal["mcp.prompt.result.message_content"] = ( - "mcp.prompt.result.message_content" - ) - """Content of the message in the prompt result. Used for single message results only. + # Path: model/attributes/messaging/messaging__bullmq__job__finished__timestamp.json + MESSAGING_BULLMQ_JOB_FINISHED_TIMESTAMP: Literal[ + "messaging.bullmq.job.finished.timestamp" + ] = "messaging.bullmq.job.finished.timestamp" + """The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job. - Type: str - Apply Scrubbing: auto + Type: int + Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "Please provide a summary of the document" + Example: 1791184722411 """ - # Path: model/attributes/mcp/mcp__prompt__result__message_count.json - MCP_PROMPT_RESULT_MESSAGE_COUNT: Literal["mcp.prompt.result.message_count"] = ( - "mcp.prompt.result.message_count" + # Path: model/attributes/messaging/messaging__bullmq__job__ids.json + MESSAGING_BULLMQ_JOB_IDS: Literal["messaging.bullmq.job.ids"] = ( + "messaging.bullmq.job.ids" ) - """Number of messages in the prompt result. + """The IDs of the BullMQ jobs that Queue.clean() removed. - Type: int + Type: List[str] Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 3 + Example: ["1","2","3"] """ - # Path: model/attributes/mcp/mcp__prompt__result__message_role.json - MCP_PROMPT_RESULT_MESSAGE_ROLE: Literal["mcp.prompt.result.message_role"] = ( - "mcp.prompt.result.message_role" + # Path: model/attributes/messaging/messaging__bullmq__job__key.json + MESSAGING_BULLMQ_JOB_KEY: Literal["messaging.bullmq.job.key"] = ( + "messaging.bullmq.job.key" ) - """Role of the message in the prompt result. Used for single message results only. + """The key that a BullMQ remove operation for a debounce or repeatable key gets, for example Queue.removeDebounceKey(). Type: str - Apply Scrubbing: manual + Apply Scrubbing: auto Defined in OTEL: No Visibility: public - Example: "user" + Example: "user-42-sync" """ - # Path: model/attributes/mcp/mcp__protocol__ready.json - MCP_PROTOCOL_READY: Literal["mcp.protocol.ready"] = "mcp.protocol.ready" - """Readiness indicator for the legacy MCP initialization handshake. A non-zero value indicates that notifications/initialized has completed initialization. Omit for protocol versions without this handshake. + # Path: model/attributes/messaging/messaging__bullmq__job__name.json + MESSAGING_BULLMQ_JOB_NAME: Literal["messaging.bullmq.job.name"] = ( + "messaging.bullmq.job.name" + ) + """The name of the BullMQ job, which the user passes to Queue.add() to identify the kind of work. - Type: int + Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: 1 + Example: "send-welcome-email" + Example: "generate-report" """ - # Path: model/attributes/mcp/mcp__protocol__version.json - MCP_PROTOCOL_VERSION: Literal["mcp.protocol.version"] = "mcp.protocol.version" - """Version of the Model Context Protocol used for the operation. + # Path: model/attributes/messaging/messaging__bullmq__job__processed__timestamp.json + MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP: Literal[ + "messaging.bullmq.job.processed.timestamp" + ] = "messaging.bullmq.job.processed.timestamp" + """The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job. - Type: str + Type: int Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: "2024-11-05" + Example: 1791184722281 """ - # Path: model/attributes/mcp/mcp__request__argument__[key].json - MCP_REQUEST_ARGUMENT_KEY: Literal["mcp.request.argument."] = ( - "mcp.request.argument." + # Path: model/attributes/messaging/messaging__bullmq__job__progress.json + MESSAGING_BULLMQ_JOB_PROGRESS: Literal["messaging.bullmq.job.progress"] = ( + "messaging.bullmq.job.progress" ) - """MCP request argument with dynamic key suffix. The is replaced with the actual argument name. The value is a JSON-stringified representation of the argument value. + """The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress(). Type: str - Apply Scrubbing: auto - Arguments contain user input + Apply Scrubbing: auto Defined in OTEL: No Visibility: public - Has Dynamic Suffix: true - Example: "mcp.request.argument.query='weather in Paris'" + Example: "{\"percentage\":50}" """ - # Path: model/attributes/mcp/mcp__request__argument__name.json - MCP_REQUEST_ARGUMENT_NAME: Literal["mcp.request.argument.name"] = ( - "mcp.request.argument.name" + # Path: model/attributes/messaging/messaging__bullmq__job__scheduler__id.json + MESSAGING_BULLMQ_JOB_SCHEDULER_ID: Literal["messaging.bullmq.job.scheduler.id"] = ( + "messaging.bullmq.job.scheduler.id" ) - """Name argument from prompts/get MCP request. + """The ID of the BullMQ job scheduler that adds the job. Type: str - Apply Scrubbing: auto - Prompt names can contain user input + Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "summarize" + Example: "daily-report" """ - # Path: model/attributes/mcp/mcp__request__argument__uri.json - MCP_REQUEST_ARGUMENT_URI: Literal["mcp.request.argument.uri"] = ( - "mcp.request.argument.uri" + # Path: model/attributes/messaging/messaging__bullmq__job__state.json + MESSAGING_BULLMQ_JOB_STATE: Literal["messaging.bullmq.job.state"] = ( + "messaging.bullmq.job.state" ) - """URI argument from resources/read MCP request. + """The state of the BullMQ job that a job metric counts. Type: str - Apply Scrubbing: auto - URIs can contain user file paths + Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "file:///path/to/resource" + Example: "completed" + Example: "failed" + Example: "delayed" """ - # Path: model/attributes/mcp/mcp__request__id.json - MCP_REQUEST_ID: Literal["mcp.request.id"] = "mcp.request.id" - """JSON-RPC request identifier for the MCP request, used to correlate the request with its response. + # Path: model/attributes/messaging/messaging__bullmq__job__status.json + MESSAGING_BULLMQ_JOB_STATUS: Literal["messaging.bullmq.job.status"] = ( + "messaging.bullmq.job.status" + ) + """The state of the BullMQ job that a job metric counts. Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: jsonrpc.request.id - DEPRECATED: Use jsonrpc.request.id instead - OTel models MCP as JSON-RPC, uses jsonrpc.request.id - Example: "1" + Example: "completed" + Example: "failed" + Example: "delayed" """ - # Path: model/attributes/mcp/mcp__resource__protocol.json - MCP_RESOURCE_PROTOCOL: Literal["mcp.resource.protocol"] = "mcp.resource.protocol" - """URI scheme of the MCP resource being accessed, extracted from its URI. This is distinct from the network protocol used to communicate with the MCP server. + # Path: model/attributes/messaging/messaging__bullmq__job__type.json + MESSAGING_BULLMQ_JOB_TYPE: Literal["messaging.bullmq.job.type"] = ( + "messaging.bullmq.job.type" + ) + """The job state from which Queue.clean() removes BullMQ jobs. Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "file" - Example: "postgres" + Example: "completed" + Example: "failed" """ - # Path: model/attributes/mcp/mcp__resource__uri.json - MCP_RESOURCE_URI: Literal["mcp.resource.uri"] = "mcp.resource.uri" - """The resource URI being accessed in an MCP operation. + # Path: model/attributes/messaging/messaging__bullmq__queue__clean__count.json + MESSAGING_BULLMQ_QUEUE_CLEAN_COUNT: Literal[ + "messaging.bullmq.queue.clean.count" + ] = "messaging.bullmq.queue.clean.count" + """The number of BullMQ jobs that Queue.clean() removed. - Type: str - Apply Scrubbing: auto - URIs can contain sensitive file paths - Defined in OTEL: Yes + Type: int + Apply Scrubbing: manual + Defined in OTEL: No Visibility: public - Example: "file:///path/to/file.txt" + Example: 25 """ - # Path: model/attributes/mcp/mcp__server__name.json - MCP_SERVER_NAME: Literal["mcp.server.name"] = "mcp.server.name" - """Name of the MCP server implementation, as declared in serverInfo. + # Path: model/attributes/messaging/messaging__bullmq__queue__clean__limit.json + MESSAGING_BULLMQ_QUEUE_CLEAN_LIMIT: Literal[ + "messaging.bullmq.queue.clean.limit" + ] = "messaging.bullmq.queue.clean.limit" + """The maximum number of BullMQ jobs that Queue.clean() removes. - Type: str + Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "example-mcp-server" + Example: 1000 """ - # Path: model/attributes/mcp/mcp__server__title.json - MCP_SERVER_TITLE: Literal["mcp.server.title"] = "mcp.server.title" - """Display title of the MCP server implementation, as declared in serverInfo. + # Path: model/attributes/messaging/messaging__bullmq__queue__drain__delay.json + MESSAGING_BULLMQ_QUEUE_DRAIN_DELAY: Literal[ + "messaging.bullmq.queue.drain.delay" + ] = "messaging.bullmq.queue.drain.delay" + """Whether Queue.drain() also removes the delayed BullMQ jobs. - Type: str - Apply Scrubbing: manual - Server titles may reveal user-specific application configurations or custom setups + Type: bool + Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "Example MCP Server" + Example: true """ - # Path: model/attributes/mcp/mcp__server__version.json - MCP_SERVER_VERSION: Literal["mcp.server.version"] = "mcp.server.version" - """Version of the MCP server implementation, as declared in serverInfo. + # Path: model/attributes/messaging/messaging__bullmq__queue__event__max__length.json + MESSAGING_BULLMQ_QUEUE_EVENT_MAX_LENGTH: Literal[ + "messaging.bullmq.queue.event.max.length" + ] = "messaging.bullmq.queue.event.max.length" + """The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream. - Type: str + Type: int Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "0.1.0" + Example: 10000 """ - # Path: model/attributes/mcp/mcp__session__id.json - MCP_SESSION_ID: Literal["mcp.session.id"] = "mcp.session.id" - """Identifier for an MCP protocol session, when the operation belongs to a session. + # Path: model/attributes/messaging/messaging__bullmq__queue__grace.json + MESSAGING_BULLMQ_QUEUE_GRACE: Literal["messaging.bullmq.queue.grace"] = ( + "messaging.bullmq.queue.grace" + ) + """The grace period in milliseconds that Queue.clean() uses. Only BullMQ jobs that are older are removed. - Type: str + Type: int Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: "550e8400-e29b-41d4-a716-446655440000" + Example: 60000 """ - # Path: model/attributes/mcp/mcp__tool__name.json - MCP_TOOL_NAME: Literal["mcp.tool.name"] = "mcp.tool.name" - """Name of the MCP tool being called. + # Path: model/attributes/messaging/messaging__bullmq__queue__jobs__state.json + MESSAGING_BULLMQ_QUEUE_JOBS_STATE: Literal["messaging.bullmq.queue.jobs.state"] = ( + "messaging.bullmq.queue.jobs.state" + ) + """The BullMQ job state that the queue job count metric counts. Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: gen_ai.tool.name, ai.function_call - DEPRECATED: Use gen_ai.tool.name instead - OTel uses gen_ai.tool.name for MCP tool names - Example: "calculator" + Example: "waiting" + Example: "active" + Example: "completed" """ - # Path: model/attributes/mcp/mcp__tool__result__content.json - MCP_TOOL_RESULT_CONTENT: Literal["mcp.tool.result.content"] = ( - "mcp.tool.result.content" + # Path: model/attributes/messaging/messaging__bullmq__queue__rate__limit.json + MESSAGING_BULLMQ_QUEUE_RATE_LIMIT: Literal["messaging.bullmq.queue.rate.limit"] = ( + "messaging.bullmq.queue.rate.limit" ) - """The content of the tool result. + """The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue. - Type: str - Apply Scrubbing: auto - Tool results can contain user data + Type: int + Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Aliases: gen_ai.tool.call.result, gen_ai.tool.message, gen_ai.tool.output, ai.toolCall.result, anthropic.tool_result.content - DEPRECATED: Use gen_ai.tool.call.result instead - OTel uses gen_ai.tool.call.result for MCP tool results - Example: "{\"output\": \"rainy\", \"toolCallId\": \"1\"}" + Example: 5000 """ - # Path: model/attributes/mcp/mcp__tool__result__content_count.json - MCP_TOOL_RESULT_CONTENT_COUNT: Literal["mcp.tool.result.content_count"] = ( - "mcp.tool.result.content_count" - ) - """Number of content items in the tool result. + # Path: model/attributes/messaging/messaging__bullmq__worker__do__not__wait__active.json + MESSAGING_BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE: Literal[ + "messaging.bullmq.worker.do.not.wait.active" + ] = "messaging.bullmq.worker.do.not.wait.active" + """Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish. - Type: int + Type: bool Apply Scrubbing: manual Defined in OTEL: No Visibility: public - DEPRECATED: No replacement at this time - A count can be calculcated from the value of the gen_ai.tool.call.result attribute. - Example: 1 + Example: false """ - # Path: model/attributes/mcp/mcp__tool__result__is_error.json - MCP_TOOL_RESULT_IS_ERROR: Literal["mcp.tool.result.is_error"] = ( - "mcp.tool.result.is_error" - ) - """Whether a tool execution resulted in an error. + # Path: model/attributes/messaging/messaging__bullmq__worker__force__close.json + MESSAGING_BULLMQ_WORKER_FORCE_CLOSE: Literal[ + "messaging.bullmq.worker.force.close" + ] = "messaging.bullmq.worker.force.close" + """Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish. Type: bool Apply Scrubbing: manual Defined in OTEL: No Visibility: public - DEPRECATED: Use error.type instead - OTel uses error.type set to 'tool_error' when isError is true. Cannot be automatically backfilled due to type mismatch (boolean vs string). Example: false """ - # Path: model/attributes/mcp/mcp__transport.json - MCP_TRANSPORT: Literal["mcp.transport"] = "mcp.transport" - """MCP transport implementation name, such as the transport class name. This identifies the implementation, not the network transport or application protocol. + # Path: model/attributes/messaging/messaging__bullmq__worker__id.json + MESSAGING_BULLMQ_WORKER_ID: Literal["messaging.bullmq.worker.id"] = ( + "messaging.bullmq.worker.id" + ) + """The ID that BullMQ generates for the Worker instance. Type: str Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Example: "StdioServerTransport" - Example: "CustomHTTPTransport" + Example: "03327d57-05cc-4528-9d24-c59bf6520039" """ - # Path: model/attributes/mdc/mdc__[key].json - MDC_KEY: Literal["mdc."] = "mdc." - """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. + # Path: model/attributes/messaging/messaging__bullmq__worker__jobs__to__extend__locks.json + MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS: Literal[ + "messaging.bullmq.worker.jobs.to.extend.locks" + ] = "messaging.bullmq.worker.jobs.to.extend.locks" + """The IDs of the BullMQ jobs whose locks the Worker extends. - Type: str - Apply Scrubbing: auto + Type: List[str] + Apply Scrubbing: manual Defined in OTEL: No Visibility: public - Has Dynamic Suffix: true - Example: "mdc.some_key='some_value'" + Example: ["1","2"] """ - # Path: model/attributes/messaging/messaging__batch__message_count.json - MESSAGING_BATCH_MESSAGE_COUNT: Literal["messaging.batch.message_count"] = ( - "messaging.batch.message_count" + # Path: model/attributes/messaging/messaging__bullmq__worker__name.json + MESSAGING_BULLMQ_WORKER_NAME: Literal["messaging.bullmq.worker.name"] = ( + "messaging.bullmq.worker.name" ) - """The number of messages sent, received, or processed in the scope of the batching operation. + """The name that the user gives to the BullMQ Worker in its options. + + Type: str + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: "email-worker" + """ + + # Path: model/attributes/messaging/messaging__bullmq__worker__rate__limit.json + MESSAGING_BULLMQ_WORKER_RATE_LIMIT: Literal[ + "messaging.bullmq.worker.rate.limit" + ] = "messaging.bullmq.worker.rate.limit" + """The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker. Type: int Apply Scrubbing: manual - Defined in OTEL: Yes + Defined in OTEL: No Visibility: public - Example: 10 + Example: 5000 + """ + + # Path: model/attributes/messaging/messaging__bullmq__worker__stalled__jobs.json + MESSAGING_BULLMQ_WORKER_STALLED_JOBS: Literal[ + "messaging.bullmq.worker.stalled.jobs" + ] = "messaging.bullmq.worker.stalled.jobs" + """The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state. + + Type: List[str] + Apply Scrubbing: manual + Defined in OTEL: No + Visibility: public + Example: ["1","2"] """ # Path: model/attributes/messaging/messaging__conversation_id.json @@ -15533,3954 +15557,3860 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ChangelogEntry(version="0.5.0", prs=[235]), ], ), - "bullmq.flow.name": AttributeMetadata( - brief="The name of the root job of the BullMQ flow that FlowProducer.add() adds.", - type=AttributeType.STRING, - keys=("bullmq.flow.name",), + "cache.hit": AttributeMetadata( + brief="If the cache was hit during this span.", + type=AttributeType.BOOLEAN, + keys=("cache.hit",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="build-report", - examples=["build-report"], + example=True, changelog=[ - ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.flow.name attribute", - ), - ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ChangelogEntry(version="0.0.0"), ], ), - "bullmq.job.attempt_finished_timestamp": AttributeMetadata( - brief="The time in milliseconds since the Unix epoch when the current attempt of the BullMQ job finished.", + "cache.item_age": AttributeMetadata( + brief="The age of the cache entry in seconds, measured at read time.", type=AttributeType.INTEGER, - keys=("bullmq.job.attempt_finished_timestamp",), + keys=("cache.item_age",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=1791184722406, - examples=[1791184722406], + example=5, + examples=[5, 3600], changelog=[ ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.job.attempt_finished_timestamp attribute", + version="0.23.0", + prs=[637], + description="Added cache.item_age attribute", ), ], additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "Set on reads that return an entry. Absent on a miss, or when the cache does not report a write time.", + "Clamped to 0. On a shared cache, the writer's clock and the reader's clock can drift far enough to make the age negative.", + "Can exceed `cache.ttl`. A cache that discards an expired entry on read still reports the age of that entry, with `cache.hit: false`.", ], + search_alias=SearchAlias(name="cache.item_age", type="second"), ), - "bullmq.job.bulk.names": AttributeMetadata( - brief="The names of the BullMQ jobs or flows that one bulk operation adds, for example Queue.addBulk().", - type=AttributeType.STRING_ARRAY, - keys=("bullmq.job.bulk.names",), + "cache.item_size": AttributeMetadata( + brief="The size of the requested item in the cache. In bytes.", + type=AttributeType.INTEGER, + keys=("cache.item_size",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=["send-welcome-email", "generate-report"], - examples=[["send-welcome-email", "generate-report"]], + example=58, changelog=[ - ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.job.bulk.names attribute", - ), - ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.0.0"), ], + search_alias=SearchAlias(name="cache.item_size", type="byte"), ), - "bullmq.job.deduplication.key": AttributeMetadata( - brief="The deduplication ID that Queue.removeDeduplicationKey() removes.", - type=AttributeType.STRING, - keys=("bullmq.job.deduplication.key",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + "cache.key": AttributeMetadata( + brief="The key of the cache accessed.", + type=AttributeType.STRING_ARRAY, + keys=("cache.key",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="user-42-sync", - examples=["user-42-sync"], + example=["my-cache-key", "my-other-cache-key"], changelog=[ - ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.job.deduplication.key attribute", - ), - ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ChangelogEntry(version="0.0.0"), ], ), - "bullmq.job.finished.timestamp": AttributeMetadata( - brief="The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job.", - type=AttributeType.INTEGER, - keys=("bullmq.job.finished.timestamp",), + "cache.operation": AttributeMetadata( + brief="The operation being performed on the cache.", + type=AttributeType.STRING, + keys=("cache.operation",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=1791184722411, - examples=[1791184722411], + example="get", + examples=["get", "put", "remove"], changelog=[ - ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.job.finished.timestamp attribute", - ), - ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", - "BullMQ 5.79.1 sets this attribute. BullMQ 6.3.11 does not.", + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), ], ), - "bullmq.job.ids": AttributeMetadata( - brief="The IDs of the BullMQ jobs that Queue.clean() removed.", + "cache.tags": AttributeMetadata( + brief="The tags attached to the cache entry. Tags group entries so a cache can invalidate them together.", type=AttributeType.STRING_ARRAY, - keys=("bullmq.job.ids",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + keys=("cache.tags",), + apply_scrubbing=ApplyScrubbingInfo( + key=ApplyScrubbing.AUTO, + reason="Applications pick tag values freely and often build them from record identifiers such as a user id.", + ), is_in_otel=False, visibility=Visibility.PUBLIC, - example=["1", "2", "3"], - examples=[["1", "2", "3"]], + example=["blog-posts", "post-42"], + examples=[["blog-posts", "post-42"], ["products"]], changelog=[ ChangelogEntry( - version="next", prs=[690], description="Added bullmq.job.ids attribute" + version="0.23.0", prs=[637], description="Added cache.tags attribute" ), ], additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", - "BullMQ 5.79.1 sets this attribute. BullMQ 6.3.11 does not.", + "Cache library examples that support tags: Next.js `cacheTag()`, Symfony `ItemInterface::tag()`, Laravel `Cache::tags()`.", + "HTTP caches take tags from a response header. Cloudflare reads `Cache-Tag`, Fastly reads `Surrogate-Key`.", + "Record only the tags the application declared. Leave out implicit tags that the framework adds itself, for example one tag per route.", + "The tags describe the entry, not the operation. Take them from the entry the cache returned or stored.", ], ), - "bullmq.job.key": AttributeMetadata( - brief="The key that a BullMQ remove operation for a debounce or repeatable key gets, for example Queue.removeDebounceKey().", - type=AttributeType.STRING, - keys=("bullmq.job.key",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + "cache.ttl": AttributeMetadata( + brief="The ttl (maximum lifetime) of the cache in seconds", + type=AttributeType.INTEGER, + keys=("cache.ttl",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="user-42-sync", - examples=["user-42-sync"], + example=120, changelog=[ - ChangelogEntry( - version="next", prs=[690], description="Added bullmq.job.key attribute" - ), - ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.0.0"), ], ), - "bullmq.job.name": AttributeMetadata( - brief="The name of the BullMQ job, which the user passes to Queue.add() to identify the kind of work.", - type=AttributeType.STRING, - keys=("bullmq.job.name",), + "cache.write": AttributeMetadata( + brief="If the cache operation resulted in a write to the cache.", + type=AttributeType.BOOLEAN, + keys=("cache.write",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="send-welcome-email", - examples=["send-welcome-email", "generate-report"], + example=True, changelog=[ - ChangelogEntry( - version="next", prs=[690], description="Added bullmq.job.name attribute" - ), - ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", - "Also set on the BullMQ job metrics.", + ChangelogEntry(version="0.5.0"), ], ), - "bullmq.job.processed.timestamp": AttributeMetadata( - brief="The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job.", - type=AttributeType.INTEGER, - keys=("bullmq.job.processed.timestamp",), + "channel": AttributeMetadata( + brief="The channel name that is being used.", + type=AttributeType.STRING, + keys=("channel",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=1791184722281, - examples=[1791184722281], + example="mail", changelog=[ - ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.job.processed.timestamp attribute", - ), - ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), ], ), - "bullmq.job.progress": AttributeMetadata( - brief="The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress().", + "client.address": AttributeMetadata( + brief="Client address - domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name.", type=AttributeType.STRING, - keys=("bullmq.job.progress",), + keys=( + "client.address", + "http.client_ip", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example='{"percentage":50}', - examples=['{"percentage":50}'], + example="example.com", + aliases=["http.client_ip"], changelog=[ - ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.job.progress attribute", - ), + ChangelogEntry(version="0.1.0", prs=[106, 127]), + ChangelogEntry(version="0.0.0"), ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ), + "client.port": AttributeMetadata( + brief="Client port number.", + type=AttributeType.INTEGER, + keys=("client.port",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=True, + visibility=Visibility.PUBLIC, + example=5432, + changelog=[ + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.0.0"), ], ), - "bullmq.job.scheduler.id": AttributeMetadata( - brief="The ID of the BullMQ job scheduler that adds the job.", + "cloud.account.id": AttributeMetadata( + brief="The cloud account ID the resource is assigned to", type=AttributeType.STRING, - keys=("bullmq.job.scheduler.id",), + keys=("cloud.account.id",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="daily-report", - examples=["daily-report"], + example="123456789012", changelog=[ ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.job.scheduler.id attribute", + version="0.7.0", + prs=[364], + description="Added cloud.account.id attribute", ), ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." - ], ), - "bullmq.job.state": AttributeMetadata( - brief="The state of the BullMQ job that a job metric counts.", + "cloud.availability_zone": AttributeMetadata( + brief="Cloud regions often have multiple, isolated locations known as zones to increase availability", type=AttributeType.STRING, - keys=("bullmq.job.state",), + keys=("cloud.availability_zone",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="completed", - examples=["completed", "failed", "delayed"], + example="us-east-1c", changelog=[ ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.job.state attribute", + version="0.7.0", + prs=[364], + description="Added cloud.availability_zone attribute", ), ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", - "Set on the BullMQ job metrics by BullMQ 6.3.11. BullMQ 5.79.1 sets `bullmq.job.status` instead.", - ], ), - "bullmq.job.status": AttributeMetadata( - brief="The state of the BullMQ job that a job metric counts.", + "cloud.platform": AttributeMetadata( + brief="The cloud platform in use", type=AttributeType.STRING, - keys=("bullmq.job.status",), + keys=("cloud.platform",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="completed", - examples=["completed", "failed", "delayed"], + example="aws_lambda", changelog=[ ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.job.status attribute", + version="0.7.0", prs=[364], description="Added cloud.platform attribute" ), ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", - "Set on the BullMQ job metrics by BullMQ 5.79.1. BullMQ 6.3.11 sets `bullmq.job.state` instead.", - ], ), - "bullmq.job.type": AttributeMetadata( - brief="The job state from which Queue.clean() removes BullMQ jobs.", + "cloud.provider": AttributeMetadata( + brief="Name of the cloud provider", type=AttributeType.STRING, - keys=("bullmq.job.type",), + keys=("cloud.provider",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="completed", - examples=["completed", "failed"], + example="aws", changelog=[ ChangelogEntry( - version="next", prs=[690], description="Added bullmq.job.type attribute" + version="0.7.0", prs=[364], description="Added cloud.provider attribute" ), ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." - ], ), - "bullmq.queue.clean.count": AttributeMetadata( - brief="The number of BullMQ jobs that Queue.clean() removed.", - type=AttributeType.INTEGER, - keys=("bullmq.queue.clean.count",), + "cloud.region": AttributeMetadata( + brief="The geographical region the resource is running", + type=AttributeType.STRING, + keys=( + "cloud.region", + "aws_region", + "gcp_region", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=25, - examples=[25], + example="us-east-1", + aliases=["aws_region", "gcp_region"], changelog=[ ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.queue.clean.count attribute", + version="0.19.0", + prs=[535, 537], + description="Added aws_region and gcp_region as aliases", + ), + ChangelogEntry( + version="0.7.0", prs=[364], description="Added cloud.region attribute" ), - ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", - "BullMQ 6.3.11 sets this attribute. BullMQ 5.79.1 does not.", ], ), - "bullmq.queue.clean.limit": AttributeMetadata( - brief="The maximum number of BullMQ jobs that Queue.clean() removes.", - type=AttributeType.INTEGER, - keys=("bullmq.queue.clean.limit",), + "cloud.resource_id": AttributeMetadata( + brief="Cloud provider-specific native identifier of the monitored cloud resource", + type=AttributeType.STRING, + keys=( + "cloud.resource_id", + "faas.id", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=1000, - examples=[1000], + example="arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function", + aliases=["faas.id"], changelog=[ ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.queue.clean.limit attribute", + version="0.16.0", prs=[475], description="Added faas.id as an alias" ), + ChangelogEntry(version="0.11.1", prs=[414]), ], additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + "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." ], ), - "bullmq.queue.drain.delay": AttributeMetadata( - brief="Whether Queue.drain() also removes the delayed BullMQ jobs.", - type=AttributeType.BOOLEAN, - keys=("bullmq.queue.drain.delay",), + "cloudflare.d1.duration": AttributeMetadata( + brief="The duration of a Cloudflare D1 operation.", + type=AttributeType.INTEGER, + keys=("cloudflare.d1.duration",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=True, - examples=[True], + example=543, changelog=[ - ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.queue.drain.delay attribute", - ), - ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.0.0"), ], ), - "bullmq.queue.event.max.length": AttributeMetadata( - brief="The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream.", - type=AttributeType.INTEGER, - keys=("bullmq.queue.event.max.length",), + "cloudflare.d1.query_type": AttributeMetadata( + brief="The type of query executed in a Cloudflare D1 operation", + type=AttributeType.STRING, + keys=( + "db.operation.name", + "cloudflare.d1.query_type", + "db.operation", + "redis.command", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=10000, - examples=[10000], + example="run", + deprecation=DeprecationInfo( + replacement="db.operation.name", status=DeprecationStatus.BACKFILL + ), + aliases=["db.operation.name", "db.operation", "redis.command"], changelog=[ ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.queue.event.max.length attribute", + version="0.19.0", + prs=[531], + description="Added redis.command as an alias", + ), + ChangelogEntry( + version="0.11.0", + prs=[392], + description="Added cloudflare.d1.query_type attribute", ), - ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." ], ), - "bullmq.queue.grace": AttributeMetadata( - brief="The grace period in milliseconds that Queue.clean() uses. Only BullMQ jobs that are older are removed.", + "cloudflare.d1.rows_read": AttributeMetadata( + brief="The number of rows read in a Cloudflare D1 operation.", type=AttributeType.INTEGER, - keys=("bullmq.queue.grace",), + keys=("cloudflare.d1.rows_read",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=60000, - examples=[60000], + example=12, changelog=[ - ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.queue.grace attribute", - ), - ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.0.0"), ], ), - "bullmq.queue.jobs.state": AttributeMetadata( - brief="The BullMQ job state that the queue job count metric counts.", - type=AttributeType.STRING, - keys=("bullmq.queue.jobs.state",), + "cloudflare.d1.rows_written": AttributeMetadata( + brief="The number of rows written in a Cloudflare D1 operation.", + type=AttributeType.INTEGER, + keys=("cloudflare.d1.rows_written",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="waiting", - examples=["waiting", "active", "completed"], + example=12, changelog=[ - ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.queue.jobs.state attribute", - ), - ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry.", - "Set on the BullMQ queue job count metric.", + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.0.0"), ], ), - "bullmq.queue.rate.limit": AttributeMetadata( - brief="The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue.", + "cloudflare.durable_object.query.bindings": AttributeMetadata( + brief="The number of bound parameters passed to the SQL exec call.", type=AttributeType.INTEGER, - keys=("bullmq.queue.rate.limit",), + keys=("cloudflare.durable_object.query.bindings",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=5000, - examples=[5000], + example=2, changelog=[ ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.queue.rate.limit attribute", + version="0.13.0", + prs=[435], + description="Added cloudflare.durable_object.query.bindings attribute", ), ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." - ], ), - "bullmq.worker.do.not.wait.active": AttributeMetadata( - brief="Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish.", - type=AttributeType.BOOLEAN, - keys=("bullmq.worker.do.not.wait.active",), + "cloudflare.durable_object.response.rows_read": AttributeMetadata( + brief="The number of rows read by a Cloudflare Durable Object SQL operation.", + type=AttributeType.INTEGER, + keys=("cloudflare.durable_object.response.rows_read",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=False, - examples=[False], + example=12, changelog=[ ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.worker.do.not.wait.active attribute", + version="0.13.0", + prs=[435], + description="Added cloudflare.durable_object.response.rows_read attribute", ), ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." - ], ), - "bullmq.worker.force.close": AttributeMetadata( - brief="Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish.", - type=AttributeType.BOOLEAN, - keys=("bullmq.worker.force.close",), + "cloudflare.durable_object.response.rows_written": AttributeMetadata( + brief="The number of rows written by a Cloudflare Durable Object SQL operation.", + type=AttributeType.INTEGER, + keys=("cloudflare.durable_object.response.rows_written",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=False, - examples=[False], + example=1, changelog=[ ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.worker.force.close attribute", + version="0.13.0", + prs=[435], + description="Added cloudflare.durable_object.response.rows_written attribute", ), ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." - ], ), - "bullmq.worker.id": AttributeMetadata( - brief="The ID that BullMQ generates for the Worker instance.", + "cloudflare.r2.bucket": AttributeMetadata( + brief="The name of the Cloudflare R2 bucket binding", type=AttributeType.STRING, - keys=("bullmq.worker.id",), + keys=("cloudflare.r2.bucket",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="03327d57-05cc-4528-9d24-c59bf6520039", - examples=["03327d57-05cc-4528-9d24-c59bf6520039"], + example="MY_BUCKET", changelog=[ ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.worker.id attribute", + version="0.11.1", + prs=[413], + description="Added cloudflare.r2.bucket attribute", ), ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." - ], ), - "bullmq.worker.jobs.to.extend.locks": AttributeMetadata( - brief="The IDs of the BullMQ jobs whose locks the Worker extends.", - type=AttributeType.STRING_ARRAY, - keys=("bullmq.worker.jobs.to.extend.locks",), + "cloudflare.r2.operation": AttributeMetadata( + brief="The R2 API operation being performed", + type=AttributeType.STRING, + keys=("cloudflare.r2.operation",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=["1", "2"], - examples=[["1", "2"]], + example="GetObject", changelog=[ ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.worker.jobs.to.extend.locks attribute", + version="0.11.1", + prs=[413], + description="Added cloudflare.r2.operation attribute", ), ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." - ], ), - "bullmq.worker.name": AttributeMetadata( - brief="The name that the user gives to the BullMQ Worker in its options.", + "cloudflare.r2.request.delimiter": AttributeMetadata( + brief="The delimiter used to group objects in an R2 list operation", type=AttributeType.STRING, - keys=("bullmq.worker.name",), + keys=("cloudflare.r2.request.delimiter",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="email-worker", - examples=["email-worker"], + example="/", changelog=[ ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.worker.name attribute", + version="0.11.1", + prs=[413], + description="Added cloudflare.r2.request.delimiter attribute", ), ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." - ], ), - "bullmq.worker.rate.limit": AttributeMetadata( - brief="The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker.", - type=AttributeType.INTEGER, - keys=("bullmq.worker.rate.limit",), + "cloudflare.r2.request.key": AttributeMetadata( + brief="The object key used in the R2 operation", + type=AttributeType.STRING, + keys=("cloudflare.r2.request.key",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=5000, - examples=[5000], + example="my-file.txt", changelog=[ ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.worker.rate.limit attribute", + version="0.11.1", + prs=[413], + description="Added cloudflare.r2.request.key attribute", ), ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." - ], ), - "bullmq.worker.stalled.jobs": AttributeMetadata( - brief="The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state.", - type=AttributeType.STRING_ARRAY, - keys=("bullmq.worker.stalled.jobs",), + "cloudflare.r2.request.part_number": AttributeMetadata( + brief="The part number in a multipart upload operation", + type=AttributeType.INTEGER, + keys=("cloudflare.r2.request.part_number",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=["1", "2"], - examples=[["1", "2"]], + example=1, changelog=[ ChangelogEntry( - version="next", - prs=[690], - description="Added bullmq.worker.stalled.jobs attribute", + version="0.11.1", + prs=[413], + description="Added cloudflare.r2.request.part_number attribute", ), ], - additional_context=[ - "Added by BullMQ's telemetry interface. The Sentry SDK only forwards the attribute to Sentry." - ], ), - "cache.hit": AttributeMetadata( - brief="If the cache was hit during this span.", - type=AttributeType.BOOLEAN, - keys=("cache.hit",), + "cloudflare.r2.request.prefix": AttributeMetadata( + brief="The prefix used to filter objects in an R2 list operation", + type=AttributeType.STRING, + keys=("cloudflare.r2.request.prefix",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=True, + example="images/", changelog=[ - ChangelogEntry(version="0.0.0"), + ChangelogEntry( + version="0.11.1", + prs=[413], + description="Added cloudflare.r2.request.prefix attribute", + ), ], ), - "cache.item_age": AttributeMetadata( - brief="The age of the cache entry in seconds, measured at read time.", + "cloudflare.workflow.attempt": AttributeMetadata( + brief="The current attempt number for a Cloudflare Workflow step", type=AttributeType.INTEGER, - keys=("cache.item_age",), + keys=("cloudflare.workflow.attempt",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=5, - examples=[5, 3600], + example=1, changelog=[ ChangelogEntry( - version="0.23.0", - prs=[637], - description="Added cache.item_age attribute", + version="0.11.0", + prs=[392], + description="Added cloudflare.workflow.attempt attribute", ), ], - additional_context=[ - "Set on reads that return an entry. Absent on a miss, or when the cache does not report a write time.", - "Clamped to 0. On a shared cache, the writer's clock and the reader's clock can drift far enough to make the age negative.", - "Can exceed `cache.ttl`. A cache that discards an expired entry on read still reports the age of that entry, with `cache.hit: false`.", - ], - search_alias=SearchAlias(name="cache.item_age", type="second"), ), - "cache.item_size": AttributeMetadata( - brief="The size of the requested item in the cache. In bytes.", - type=AttributeType.INTEGER, - keys=("cache.item_size",), + "cloudflare.workflow.retries.backoff": AttributeMetadata( + brief="The backoff strategy for Cloudflare Workflow step retries", + type=AttributeType.STRING, + keys=("cloudflare.workflow.retries.backoff",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=58, + example="exponential", changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry( + version="0.11.0", + prs=[392], + description="Added cloudflare.workflow.retries.backoff attribute", + ), ], - search_alias=SearchAlias(name="cache.item_size", type="byte"), ), - "cache.key": AttributeMetadata( - brief="The key of the cache accessed.", - type=AttributeType.STRING_ARRAY, - keys=("cache.key",), + "cloudflare.workflow.retries.delay": AttributeMetadata( + brief="The delay between Cloudflare Workflow step retries", + type=AttributeType.STRING, + keys=("cloudflare.workflow.retries.delay",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=["my-cache-key", "my-other-cache-key"], + example="5 seconds", changelog=[ - ChangelogEntry(version="0.0.0"), + ChangelogEntry( + version="0.11.0", + prs=[392], + description="Added cloudflare.workflow.retries.delay attribute", + ), ], ), - "cache.operation": AttributeMetadata( - brief="The operation being performed on the cache.", - type=AttributeType.STRING, - keys=("cache.operation",), + "cloudflare.workflow.retries.limit": AttributeMetadata( + brief="The maximum number of retries for a Cloudflare Workflow step", + type=AttributeType.INTEGER, + keys=("cloudflare.workflow.retries.limit",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="get", - examples=["get", "put", "remove"], + example=3, changelog=[ - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry( + version="0.11.0", + prs=[392], + description="Added cloudflare.workflow.retries.limit attribute", + ), ], ), - "cache.tags": AttributeMetadata( - brief="The tags attached to the cache entry. Tags group entries so a cache can invalidate them together.", - type=AttributeType.STRING_ARRAY, - keys=("cache.tags",), - apply_scrubbing=ApplyScrubbingInfo( - key=ApplyScrubbing.AUTO, - reason="Applications pick tag values freely and often build them from record identifiers such as a user id.", - ), + "cloudflare.workflow.timeout": AttributeMetadata( + brief="The timeout duration for a Cloudflare Workflow step", + type=AttributeType.STRING, + keys=("cloudflare.workflow.timeout",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=["blog-posts", "post-42"], - examples=[["blog-posts", "post-42"], ["products"]], + example="1 minute", changelog=[ ChangelogEntry( - version="0.23.0", prs=[637], description="Added cache.tags attribute" + version="0.11.0", + prs=[392], + description="Added cloudflare.workflow.timeout attribute", ), ], - additional_context=[ - "Cache library examples that support tags: Next.js `cacheTag()`, Symfony `ItemInterface::tag()`, Laravel `Cache::tags()`.", - "HTTP caches take tags from a response header. Cloudflare reads `Cache-Tag`, Fastly reads `Surrogate-Key`.", - "Record only the tags the application declared. Leave out implicit tags that the framework adds itself, for example one tag per route.", - "The tags describe the entry, not the operation. Take them from the entry the cache returned or stored.", - ], ), - "cache.ttl": AttributeMetadata( - brief="The ttl (maximum lifetime) of the cache in seconds", - type=AttributeType.INTEGER, - keys=("cache.ttl",), + "cls.source.": AttributeMetadata( + brief="The HTML elements or components responsible for the layout shift. is a numeric index from 1 to N", + type=AttributeType.STRING, + keys=( + "browser.web_vital.cls.source.", + "cls.source.", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=120, + has_dynamic_suffix=True, + example="body > div#app", + deprecation=DeprecationInfo( + replacement="browser.web_vital.cls.source.", + reason="The CLS source is now recorded as a browser.web_vital.cls.source. attribute.", + status=DeprecationStatus.BACKFILL, + ), + aliases=["browser.web_vital.cls.source."], changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.5.0", prs=[234]), ], ), - "cache.write": AttributeMetadata( - brief="If the cache operation resulted in a write to the cache.", - type=AttributeType.BOOLEAN, - keys=("cache.write",), + "cls": AttributeMetadata( + brief="The value of the recorded Cumulative Layout Shift (CLS) web vital", + type=AttributeType.DOUBLE, + keys=( + "browser.web_vital.cls.value", + "cls", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=True, + example=0.2361, + deprecation=DeprecationInfo( + replacement="browser.web_vital.cls.value", + reason="The CLS web vital is now recorded as a browser.web_vital.cls.value attribute.", + status=DeprecationStatus.BACKFILL, + ), + aliases=["browser.web_vital.cls.value"], changelog=[ - ChangelogEntry(version="0.5.0"), + ChangelogEntry( + version="0.5.0", + prs=[229], + description="Added and deprecated attribute to document JS SDK's current behaviour", + ), ], ), - "channel": AttributeMetadata( - brief="The channel name that is being used.", + "code.file.path": AttributeMetadata( + brief="The source code file name that identifies the code unit as uniquely as possible (preferably an absolute file path).", type=AttributeType.STRING, - keys=("channel",), + keys=( + "code.file.path", + "sveltekit.load.node_id", + "code.filepath", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="mail", + example="/app/myapplication/http/handler/server.py", + aliases=["code.filepath", "sveltekit.load.node_id"], changelog=[ - ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry( + version="0.22.0", + prs=[611], + description="Added sveltekit.load.node_id as an alias", + ), ChangelogEntry(version="0.0.0"), ], ), - "client.address": AttributeMetadata( - brief="Client address - domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name.", + "code.filepath": AttributeMetadata( + brief="The source code file name that identifies the code unit as uniquely as possible (preferably an absolute file path).", type=AttributeType.STRING, keys=( - "client.address", - "http.client_ip", - ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), - is_in_otel=True, - visibility=Visibility.PUBLIC, - example="example.com", - aliases=["http.client_ip"], - changelog=[ - ChangelogEntry(version="0.1.0", prs=[106, 127]), - ChangelogEntry(version="0.0.0"), - ], - ), - "client.port": AttributeMetadata( - brief="Client port number.", - type=AttributeType.INTEGER, - keys=("client.port",), + "code.file.path", + "sveltekit.load.node_id", + "code.filepath", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example=5432, + example="/app/myapplication/http/handler/server.py", + deprecation=DeprecationInfo( + replacement="code.file.path", status=DeprecationStatus.BACKFILL + ), + aliases=["code.file.path", "sveltekit.load.node_id"], changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry( + version="0.22.0", + prs=[611], + description="Added sveltekit.load.node_id as an alias", + ), + ChangelogEntry(version="0.1.0", prs=[61]), ChangelogEntry(version="0.0.0"), ], ), - "cloud.account.id": AttributeMetadata( - brief="The cloud account ID the resource is assigned to", + "code.function": AttributeMetadata( + brief="The method or function name, or equivalent (usually rightmost part of the code unit's name).", type=AttributeType.STRING, - keys=("cloud.account.id",), + keys=( + "code.function", + "code.function.name", + "django.function_name", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="123456789012", + example="server_request", + aliases=["code.function.name", "django.function_name"], changelog=[ ChangelogEntry( - version="0.7.0", - prs=[364], - description="Added cloud.account.id attribute", + version="0.19.0", + prs=[538], + description="Added django.function_name as an alias", ), + ChangelogEntry(version="0.1.0", prs=[61, 74]), + ChangelogEntry(version="0.0.0"), ], ), - "cloud.availability_zone": AttributeMetadata( - brief="Cloud regions often have multiple, isolated locations known as zones to increase availability", + "code.function.name": AttributeMetadata( + brief="The method or function fully-qualified name without arguments.", type=AttributeType.STRING, - keys=("cloud.availability_zone",), + keys=( + "code.function.name", + "code.function", + "django.function_name", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="us-east-1c", + example="server_request", + aliases=["code.function", "django.function_name"], changelog=[ ChangelogEntry( - version="0.7.0", - prs=[364], - description="Added cloud.availability_zone attribute", + version="0.19.0", + prs=[538], + description="Added django.function_name as an alias", ), + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), ], ), - "cloud.platform": AttributeMetadata( - brief="The cloud platform in use", - type=AttributeType.STRING, - keys=("cloud.platform",), + "code.line.number": AttributeMetadata( + brief="The line number in code.filepath best representing the operation. It SHOULD point within the code unit named in code.function", + type=AttributeType.INTEGER, + keys=( + "code.line.number", + "code.lineno", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="aws_lambda", + example=42, + aliases=["code.lineno"], changelog=[ - ChangelogEntry( - version="0.7.0", prs=[364], description="Added cloud.platform attribute" - ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.0.0"), ], ), - "cloud.provider": AttributeMetadata( - brief="Name of the cloud provider", - type=AttributeType.STRING, - keys=("cloud.provider",), + "code.lineno": AttributeMetadata( + brief="The line number in code.filepath best representing the operation. It SHOULD point within the code unit named in code.function", + type=AttributeType.INTEGER, + keys=( + "code.line.number", + "code.lineno", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="aws", + example=42, + deprecation=DeprecationInfo( + replacement="code.line.number", status=DeprecationStatus.BACKFILL + ), + aliases=["code.line.number"], changelog=[ - ChangelogEntry( - version="0.7.0", prs=[364], description="Added cloud.provider attribute" - ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[61, 108]), + ChangelogEntry(version="0.0.0"), ], ), - "cloud.region": AttributeMetadata( - brief="The geographical region the resource is running", + "code.namespace": AttributeMetadata( + 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=AttributeType.STRING, - keys=( - "cloud.region", - "aws_region", - "gcp_region", - ), + keys=("code.namespace",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="us-east-1", - aliases=["aws_region", "gcp_region"], + example="http.handler", changelog=[ - ChangelogEntry( - version="0.19.0", - prs=[535, 537], - description="Added aws_region and gcp_region as aliases", - ), - ChangelogEntry( - version="0.7.0", prs=[364], description="Added cloud.region attribute" - ), + ChangelogEntry(version="0.1.0", prs=[61, 74]), + ChangelogEntry(version="0.0.0"), ], ), - "cloud.resource_id": AttributeMetadata( - brief="Cloud provider-specific native identifier of the monitored cloud resource", + "code": AttributeMetadata( + brief="Status code of the RPC returned by the RPC server or generated by the client.", type=AttributeType.STRING, keys=( - "cloud.resource_id", - "faas.id", + "rpc.response.status_code", + "code", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function", - aliases=["faas.id"], + example="DEADLINE_EXCEEDED", + examples=["DEADLINE_EXCEEDED"], + deprecation=DeprecationInfo( + replacement="rpc.response.status_code", status=DeprecationStatus.BACKFILL + ), + aliases=["rpc.grpc.status_code", "rpc.response.status_code"], changelog=[ ChangelogEntry( - version="0.16.0", prs=[475], description="Added faas.id as an alias" + version="0.19.0", prs=[533], description="Added code attribute" ), - ChangelogEntry(version="0.11.1", prs=[414]), - ], - 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." ], ), - "cloudflare.d1.duration": AttributeMetadata( - brief="The duration of a Cloudflare D1 operation.", + "connection.rtt": AttributeMetadata( + brief="Specifies the estimated effective round-trip time of the current connection, in milliseconds.", type=AttributeType.INTEGER, - keys=("cloudflare.d1.duration",), + keys=( + "network.connection.rtt", + "connection.rtt", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=543, + example=100, + deprecation=DeprecationInfo( + replacement="network.connection.rtt", + reason="Old attribute name (no official namespace), to be replaced with network.connection.rtt for span-first future", + status=DeprecationStatus.BACKFILL, + ), + aliases=["network.connection.rtt"], changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry( + version="0.5.0", + prs=[279], + description="Added and deprecated attribute to document JS SDK's current behaviour", + ), ], ), - "cloudflare.d1.query_type": AttributeMetadata( - brief="The type of query executed in a Cloudflare D1 operation", + "connectionType": AttributeMetadata( + brief="Specifies the type of the current connection (e.g. wifi, ethernet, cellular , etc).", type=AttributeType.STRING, keys=( - "db.operation.name", - "cloudflare.d1.query_type", - "db.operation", - "redis.command", + "network.connection.type", + "connectionType", + "device.connection_type", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="run", + example="wifi", deprecation=DeprecationInfo( - replacement="db.operation.name", status=DeprecationStatus.BACKFILL + replacement="network.connection.type", + reason="Old namespace-less attribute, to be replaced with network.connection.type for span-first future", + status=DeprecationStatus.BACKFILL, ), - aliases=["db.operation.name", "db.operation", "redis.command"], + aliases=["network.connection.type", "device.connection_type"], changelog=[ ChangelogEntry( - version="0.19.0", - prs=[531], - description="Added redis.command as an alias", - ), - ChangelogEntry( - version="0.11.0", - prs=[392], - description="Added cloudflare.d1.query_type attribute", + version="0.5.0", + prs=[279], + description="Added and deprecated attribute to document JS SDK's current behaviour", ), ], ), - "cloudflare.d1.rows_read": AttributeMetadata( - brief="The number of rows read in a Cloudflare D1 operation.", - type=AttributeType.INTEGER, - keys=("cloudflare.d1.rows_read",), + "culture.calendar": AttributeMetadata( + brief="The calendar system used by the culture.", + type=AttributeType.STRING, + keys=("culture.calendar",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=12, + example="GregorianCalendar", changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.4.0", prs=[243]), ], ), - "cloudflare.d1.rows_written": AttributeMetadata( - brief="The number of rows written in a Cloudflare D1 operation.", - type=AttributeType.INTEGER, - keys=("cloudflare.d1.rows_written",), + "culture.display_name": AttributeMetadata( + brief="Human readable name of the culture.", + type=AttributeType.STRING, + keys=("culture.display_name",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=12, + example="English (United States)", changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.4.0", prs=[243]), ], ), - "cloudflare.durable_object.query.bindings": AttributeMetadata( - brief="The number of bound parameters passed to the SQL exec call.", - type=AttributeType.INTEGER, - keys=("cloudflare.durable_object.query.bindings",), + "culture.is_24_hour_format": AttributeMetadata( + brief="Whether the culture uses 24-hour time format.", + type=AttributeType.BOOLEAN, + keys=("culture.is_24_hour_format",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=2, + example=True, changelog=[ - ChangelogEntry( - version="0.13.0", - prs=[435], - description="Added cloudflare.durable_object.query.bindings attribute", - ), + ChangelogEntry(version="0.4.0", prs=[243]), ], ), - "cloudflare.durable_object.response.rows_read": AttributeMetadata( - brief="The number of rows read by a Cloudflare Durable Object SQL operation.", - type=AttributeType.INTEGER, - keys=("cloudflare.durable_object.response.rows_read",), + "culture.locale": AttributeMetadata( + brief="The locale identifier following RFC 4646.", + type=AttributeType.STRING, + keys=("culture.locale",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=12, + example="en-US", changelog=[ - ChangelogEntry( - version="0.13.0", - prs=[435], - description="Added cloudflare.durable_object.response.rows_read attribute", - ), + ChangelogEntry(version="0.4.0", prs=[243]), ], ), - "cloudflare.durable_object.response.rows_written": AttributeMetadata( - brief="The number of rows written by a Cloudflare Durable Object SQL operation.", - type=AttributeType.INTEGER, - keys=("cloudflare.durable_object.response.rows_written",), + "culture.timezone": AttributeMetadata( + brief="The timezone of the culture, as a geographic timezone identifier.", + type=AttributeType.STRING, + keys=("culture.timezone",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=1, + example="Europe/Vienna", changelog=[ - ChangelogEntry( - version="0.13.0", - prs=[435], - description="Added cloudflare.durable_object.response.rows_written attribute", - ), + ChangelogEntry(version="0.4.0", prs=[243]), ], ), - "cloudflare.r2.bucket": AttributeMetadata( - brief="The name of the Cloudflare R2 bucket binding", + "db.collection.name": AttributeMetadata( + brief="The name of a collection (table, container) within the database.", type=AttributeType.STRING, - keys=("cloudflare.r2.bucket",), + keys=( + "db.collection.name", + "db.mongodb.collection", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="MY_BUCKET", + example="users", + aliases=["db.mongodb.collection"], changelog=[ ChangelogEntry( - version="0.11.1", - prs=[413], - description="Added cloudflare.r2.bucket attribute", + version="0.19.0", + prs=[483], + description="Added db.mongodb.collection as an alias", ), + ChangelogEntry(version="0.1.0", prs=[106, 127]), + ChangelogEntry(version="0.0.0"), ], ), - "cloudflare.r2.operation": AttributeMetadata( - brief="The R2 API operation being performed", + "db.connection_string": AttributeMetadata( + brief="The connection string used to connect to the database.", type=AttributeType.STRING, - keys=("cloudflare.r2.operation",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + keys=("db.connection_string",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + is_in_otel=True, visibility=Visibility.PUBLIC, - example="GetObject", + example="redis://localhost:6379", + examples=["redis://localhost:6379"], + deprecation=DeprecationInfo( + reason="This attribute is deprecated. The connection is described by server.address and server.port instead, so the value cannot be copied to a single replacement attribute." + ), changelog=[ ChangelogEntry( - version="0.11.1", - prs=[413], - description="Added cloudflare.r2.operation attribute", + version="0.21.0", + prs=[581], + description="Added db.connection_string attribute", ), ], ), - "cloudflare.r2.request.delimiter": AttributeMetadata( - brief="The delimiter used to group objects in an R2 list operation", + "db.driver.name": AttributeMetadata( + brief="The name of the driver used for the database connection.", type=AttributeType.STRING, - keys=("cloudflare.r2.request.delimiter",), + keys=("db.driver.name",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="/", + example="psycopg2", changelog=[ ChangelogEntry( - version="0.11.1", - prs=[413], - description="Added cloudflare.r2.request.delimiter attribute", + version="0.5.0", prs=[297], description="Added db.driver.name attribute" ), ], ), - "cloudflare.r2.request.key": AttributeMetadata( - brief="The object key used in the R2 operation", + "db.mongodb.collection": AttributeMetadata( + brief="The MongoDB collection being accessed.", type=AttributeType.STRING, - keys=("cloudflare.r2.request.key",), + keys=( + "db.collection.name", + "db.mongodb.collection", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="my-file.txt", + example="users", + deprecation=DeprecationInfo( + replacement="db.collection.name", + reason="This attribute is being deprecated in favor of db.collection.name, which is the OTel-aligned replacement.", + status=DeprecationStatus.BACKFILL, + ), + aliases=["db.collection.name"], changelog=[ ChangelogEntry( - version="0.11.1", - prs=[413], - description="Added cloudflare.r2.request.key attribute", + version="0.19.0", + prs=[483], + description="Added db.mongodb.collection attribute, deprecated in favor of db.collection.name", ), ], ), - "cloudflare.r2.request.part_number": AttributeMetadata( - brief="The part number in a multipart upload operation", - type=AttributeType.INTEGER, - keys=("cloudflare.r2.request.part_number",), + "db.name": AttributeMetadata( + brief="The name of the database being accessed.", + type=AttributeType.STRING, + keys=( + "db.namespace", + "db.name", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=1, + example="customers", + deprecation=DeprecationInfo( + replacement="db.namespace", status=DeprecationStatus.BACKFILL + ), + aliases=["db.namespace"], changelog=[ - ChangelogEntry( - version="0.11.1", - prs=[413], - description="Added cloudflare.r2.request.part_number attribute", - ), + ChangelogEntry(version="0.1.0", prs=[61, 127]), + ChangelogEntry(version="0.0.0"), ], ), - "cloudflare.r2.request.prefix": AttributeMetadata( - brief="The prefix used to filter objects in an R2 list operation", + "db.namespace": AttributeMetadata( + brief="The name of the database being accessed.", type=AttributeType.STRING, - keys=("cloudflare.r2.request.prefix",), + keys=( + "db.namespace", + "db.name", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="images/", + example="customers", + aliases=["db.name"], changelog=[ - ChangelogEntry( - version="0.11.1", - prs=[413], - description="Added cloudflare.r2.request.prefix attribute", - ), + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), ], ), - "cloudflare.workflow.attempt": AttributeMetadata( - brief="The current attempt number for a Cloudflare Workflow step", - type=AttributeType.INTEGER, - keys=("cloudflare.workflow.attempt",), + "db.operation": AttributeMetadata( + brief="The name of the operation being executed.", + type=AttributeType.STRING, + keys=( + "db.operation.name", + "cloudflare.d1.query_type", + "db.operation", + "redis.command", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=1, + example="SELECT", + deprecation=DeprecationInfo( + replacement="db.operation.name", status=DeprecationStatus.NORMALIZE + ), + aliases=["db.operation.name", "cloudflare.d1.query_type", "redis.command"], changelog=[ ChangelogEntry( - version="0.11.0", - prs=[392], - description="Added cloudflare.workflow.attempt attribute", + version="0.19.0", + prs=[531], + description="Added redis.command as an alias", ), + ChangelogEntry(version="0.4.0", prs=[199]), + ChangelogEntry(version="0.1.0", prs=[61, 127]), + ChangelogEntry(version="0.0.0"), ], ), - "cloudflare.workflow.retries.backoff": AttributeMetadata( - brief="The backoff strategy for Cloudflare Workflow step retries", - type=AttributeType.STRING, - keys=("cloudflare.workflow.retries.backoff",), + "db.operation.batch.size": AttributeMetadata( + 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=AttributeType.INTEGER, + keys=("db.operation.batch.size",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="exponential", + example=3, changelog=[ ChangelogEntry( version="0.11.0", - prs=[392], - description="Added cloudflare.workflow.retries.backoff attribute", + prs=[407], + description="Added db.operation.batch.size attribute", ), ], ), - "cloudflare.workflow.retries.delay": AttributeMetadata( - brief="The delay between Cloudflare Workflow step retries", + "db.operation.name": AttributeMetadata( + brief="The name of the operation being executed.", type=AttributeType.STRING, - keys=("cloudflare.workflow.retries.delay",), + keys=( + "db.operation.name", + "cloudflare.d1.query_type", + "db.operation", + "redis.command", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="5 seconds", + example="SELECT", + aliases=["db.operation", "cloudflare.d1.query_type", "redis.command"], changelog=[ ChangelogEntry( - version="0.11.0", - prs=[392], - description="Added cloudflare.workflow.retries.delay attribute", + version="0.19.0", + prs=[531], + description="Added redis.command as an alias", ), + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), ], ), - "cloudflare.workflow.retries.limit": AttributeMetadata( - brief="The maximum number of retries for a Cloudflare Workflow step", - type=AttributeType.INTEGER, - keys=("cloudflare.workflow.retries.limit",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + "db.params": AttributeMetadata( + brief="The query bindings for a database request.", + type=AttributeType.STRING, + keys=("db.params",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), is_in_otel=False, visibility=Visibility.PUBLIC, - example=3, + example='[{"x": 100}]', + examples=['[{"x": 100}]'], + deprecation=DeprecationInfo( + replacement="db.query.parameter.", + reason="Instead of adding every binding in the db.params attribute, add them as individual entries with db.query.parameter..", + ), changelog=[ ChangelogEntry( - version="0.11.0", - prs=[392], - description="Added cloudflare.workflow.retries.limit attribute", + version="0.19.0", prs=[529], description="Added db.params attribute" ), ], ), - "cloudflare.workflow.timeout": AttributeMetadata( - brief="The timeout duration for a Cloudflare Workflow step", + "db.query.parameter.": AttributeMetadata( + brief="A query parameter used in db.query.text, with being the parameter name, and the attribute value being a string representation of the parameter value.", type=AttributeType.STRING, - keys=("cloudflare.workflow.timeout",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + keys=("db.query.parameter.",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + is_in_otel=True, visibility=Visibility.PUBLIC, - example="1 minute", + has_dynamic_suffix=True, + example="db.query.parameter.foo='123'", + changelog=[ + ChangelogEntry(version="0.1.0", prs=[103, 127]), + ], + ), + "db.query.summary": AttributeMetadata( + brief="A shortened representation of operation(s) in the full query. This attribute must be low-cardinality and should only contain the operation table names.", + type=AttributeType.STRING, + keys=("db.query.summary",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=True, + visibility=Visibility.PUBLIC, + example="SELECT users", + examples=["SELECT users", "INSERT products; UPDATE orders"], changelog=[ ChangelogEntry( - version="0.11.0", - prs=[392], - description="Added cloudflare.workflow.timeout attribute", + version="0.19.0", prs=[505], description="Added multiple examples" ), + ChangelogEntry(version="0.4.0", prs=[208]), + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), ], ), - "cls.source.": AttributeMetadata( - brief="The HTML elements or components responsible for the layout shift. is a numeric index from 1 to N", + "db.query.text": AttributeMetadata( + brief="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.` to add the parameter value.", type=AttributeType.STRING, keys=( - "browser.web_vital.cls.source.", - "cls.source.", + "db.query.text", + "db.statement", + "query", ), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + is_in_otel=True, + visibility=Visibility.PUBLIC, + example="SELECT * FROM users WHERE id = $1", + aliases=["db.statement", "query"], + changelog=[ + ChangelogEntry( + version="0.19.0", prs=[530], description="Added query as an alias" + ), + ChangelogEntry(version="0.4.0", prs=[208]), + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), + ], + ), + "db.redis.connection": AttributeMetadata( + brief="The redis connection name.", + type=AttributeType.STRING, + keys=("db.redis.connection",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - has_dynamic_suffix=True, - example="body > div#app", - deprecation=DeprecationInfo( - replacement="browser.web_vital.cls.source.", - reason="The CLS source is now recorded as a browser.web_vital.cls.source. attribute.", - status=DeprecationStatus.BACKFILL, - ), - aliases=["browser.web_vital.cls.source."], + example="my-redis-instance", changelog=[ - ChangelogEntry(version="0.5.0", prs=[234]), + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), ], ), - "cls": AttributeMetadata( - brief="The value of the recorded Cumulative Layout Shift (CLS) web vital", - type=AttributeType.DOUBLE, + "db.redis.key": AttributeMetadata( + brief="The key the Redis command is operating on.", + type=AttributeType.STRING, keys=( - "browser.web_vital.cls.value", - "cls", + "db.redis.key", + "redis.key", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=0.2361, - deprecation=DeprecationInfo( - replacement="browser.web_vital.cls.value", - reason="The CLS web vital is now recorded as a browser.web_vital.cls.value attribute.", - status=DeprecationStatus.BACKFILL, - ), - aliases=["browser.web_vital.cls.value"], + example="user:2047:city", + aliases=["redis.key"], changelog=[ ChangelogEntry( - version="0.5.0", - prs=[229], - description="Added and deprecated attribute to document JS SDK's current behaviour", + version="0.19.0", prs=[484], description="Added redis.key as an alias" + ), + ChangelogEntry( + version="0.6.0", prs=[326], description="Added db.redis.key attribute" ), ], ), - "code.file.path": AttributeMetadata( - brief="The source code file name that identifies the code unit as uniquely as possible (preferably an absolute file path).", + "db.redis.parameters": AttributeMetadata( + brief="The array of command parameters given to a redis command.", + type=AttributeType.STRING_ARRAY, + keys=("db.redis.parameters",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=["test", "*"], + changelog=[ + ChangelogEntry(version="0.0.0"), + ], + ), + "db.response.status_code": AttributeMetadata( + 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=AttributeType.STRING, - keys=( - "code.file.path", - "sveltekit.load.node_id", - "code.filepath", - ), + keys=("db.response.status_code",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="/app/myapplication/http/handler/server.py", - aliases=["code.filepath", "sveltekit.load.node_id"], + example="ORA-17002", changelog=[ ChangelogEntry( - version="0.22.0", - prs=[611], - description="Added sveltekit.load.node_id as an alias", + version="0.16.0", + prs=[462], + description="Added db.response.status_code attribute", ), - ChangelogEntry(version="0.0.0"), ], ), - "code.filepath": AttributeMetadata( - brief="The source code file name that identifies the code unit as uniquely as possible (preferably an absolute file path).", - type=AttributeType.STRING, - keys=( - "code.file.path", - "sveltekit.load.node_id", - "code.filepath", - ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + "db.sql.bindings": AttributeMetadata( + brief="The array of query bindings.", + type=AttributeType.STRING_ARRAY, + keys=("db.sql.bindings",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + is_in_otel=False, visibility=Visibility.PUBLIC, - example="/app/myapplication/http/handler/server.py", + example=["1", "foo"], deprecation=DeprecationInfo( - replacement="code.file.path", status=DeprecationStatus.BACKFILL + replacement="db.query.parameter.", + reason="Instead of adding every binding in the db.sql.bindings attribute, add them as individual entires with db.query.parameter..", ), - aliases=["code.file.path", "sveltekit.load.node_id"], changelog=[ - ChangelogEntry( - version="0.22.0", - prs=[611], - description="Added sveltekit.load.node_id as an alias", - ), ChangelogEntry(version="0.1.0", prs=[61]), ChangelogEntry(version="0.0.0"), ], ), - "code.function": AttributeMetadata( - brief="The method or function name, or equivalent (usually rightmost part of the code unit's name).", + "db.statement": AttributeMetadata( + brief="The database statement being executed.", type=AttributeType.STRING, keys=( - "code.function", - "code.function.name", - "django.function_name", + "db.query.text", + "db.statement", + "query", ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), is_in_otel=True, visibility=Visibility.PUBLIC, - example="server_request", - aliases=["code.function.name", "django.function_name"], + example="SELECT * FROM users WHERE id = $1", + deprecation=DeprecationInfo( + replacement="db.query.text", + reason="While this attribute never specifically required parameterization, the replacement, db.query.text, does.", + status=DeprecationStatus.NORMALIZE, + ), + aliases=["db.query.text", "query"], changelog=[ ChangelogEntry( version="0.19.0", - prs=[538], - description="Added django.function_name as an alias", + prs=[501], + description="Improved example, added deprecation reason, and added query as an alias", ), - ChangelogEntry(version="0.1.0", prs=[61, 74]), + ChangelogEntry(version="0.4.0", prs=[199]), + ChangelogEntry(version="0.1.0", prs=[61, 127]), ChangelogEntry(version="0.0.0"), ], ), - "code.function.name": AttributeMetadata( - brief="The method or function fully-qualified name without arguments.", + "db.stored_procedure.name": AttributeMetadata( + brief="The name of a stored procedure being called.", type=AttributeType.STRING, - keys=( - "code.function.name", - "code.function", - "django.function_name", - ), + keys=("db.stored_procedure.name",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="server_request", - aliases=["code.function", "django.function_name"], + example="GetUserById", changelog=[ - ChangelogEntry( - version="0.19.0", - prs=[538], - description="Added django.function_name as an alias", - ), - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.11.0", prs=[398]), ], ), - "code.line.number": AttributeMetadata( - brief="The line number in code.filepath best representing the operation. It SHOULD point within the code unit named in code.function", - type=AttributeType.INTEGER, + "db.system": AttributeMetadata( + brief="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.", + type=AttributeType.STRING, keys=( - "code.line.number", - "code.lineno", + "db.system.name", + "db.system", + "span.system", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example=42, - aliases=["code.lineno"], + example="postgresql", + deprecation=DeprecationInfo( + replacement="db.system.name", status=DeprecationStatus.BACKFILL + ), + aliases=["db.system.name"], changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.4.0", prs=[199, 224]), + ChangelogEntry(version="0.1.0", prs=[61, 127]), ChangelogEntry(version="0.0.0"), ], + search_alias=SearchAlias(name="db.system", deprecated_aliases=["span.system"]), ), - "code.lineno": AttributeMetadata( - brief="The line number in code.filepath best representing the operation. It SHOULD point within the code unit named in code.function", - type=AttributeType.INTEGER, + "db.system.name": AttributeMetadata( + brief="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.", + type=AttributeType.STRING, keys=( - "code.line.number", - "code.lineno", + "db.system.name", + "db.system", + "span.system", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example=42, - deprecation=DeprecationInfo( - replacement="code.line.number", status=DeprecationStatus.BACKFILL - ), - aliases=["code.line.number"], + example="postgresql", + aliases=["db.system"], changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[61, 108]), + ChangelogEntry(version="0.1.0", prs=[127]), ChangelogEntry(version="0.0.0"), ], ), - "code.namespace": AttributeMetadata( - 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.", + "db.user": AttributeMetadata( + brief="The database user.", type=AttributeType.STRING, - keys=("code.namespace",), + keys=("db.user",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="http.handler", + example="fancy_user", changelog=[ - ChangelogEntry(version="0.1.0", prs=[61, 74]), ChangelogEntry(version="0.0.0"), ], ), - "code": AttributeMetadata( - brief="Status code of the RPC returned by the RPC server or generated by the client.", - type=AttributeType.STRING, - keys=( - "rpc.response.status_code", - "code", - ), + "device.archs": AttributeMetadata( + brief="The CPU architectures of the device.", + type=AttributeType.STRING_ARRAY, + keys=("device.archs",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="DEADLINE_EXCEEDED", - examples=["DEADLINE_EXCEEDED"], - deprecation=DeprecationInfo( - replacement="rpc.response.status_code", status=DeprecationStatus.BACKFILL - ), - aliases=["rpc.grpc.status_code", "rpc.response.status_code"], + example=["arm64-v8a", "armeabi-v7a", "armeabi"], changelog=[ ChangelogEntry( - version="0.19.0", prs=[533], description="Added code attribute" + version="0.5.0", prs=[303], description="Added device.archs attribute" ), ], ), - "connection.rtt": AttributeMetadata( - brief="Specifies the estimated effective round-trip time of the current connection, in milliseconds.", - type=AttributeType.INTEGER, - keys=( - "network.connection.rtt", - "connection.rtt", - ), + "device.battery_level": AttributeMetadata( + brief="The battery level of the device as a percentage (0-100).", + type=AttributeType.DOUBLE, + keys=("device.battery_level",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, example=100, - deprecation=DeprecationInfo( - replacement="network.connection.rtt", - reason="Old attribute name (no official namespace), to be replaced with network.connection.rtt for span-first future", - status=DeprecationStatus.BACKFILL, - ), - aliases=["network.connection.rtt"], changelog=[ ChangelogEntry( version="0.5.0", - prs=[279], - description="Added and deprecated attribute to document JS SDK's current behaviour", + prs=[303], + description="Added device.battery_level attribute", ), ], ), - "connectionType": AttributeMetadata( - brief="Specifies the type of the current connection (e.g. wifi, ethernet, cellular , etc).", - type=AttributeType.STRING, - keys=( - "network.connection.type", - "connectionType", - "device.connection_type", - ), + "device.battery_temperature": AttributeMetadata( + brief="The battery temperature of the device in Celsius.", + type=AttributeType.DOUBLE, + keys=("device.battery_temperature",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="wifi", - deprecation=DeprecationInfo( - replacement="network.connection.type", - reason="Old namespace-less attribute, to be replaced with network.connection.type for span-first future", - status=DeprecationStatus.BACKFILL, - ), - aliases=["network.connection.type", "device.connection_type"], + example=25, changelog=[ ChangelogEntry( version="0.5.0", - prs=[279], - description="Added and deprecated attribute to document JS SDK's current behaviour", + prs=[303], + description="Added device.battery_temperature attribute", ), ], ), - "culture.calendar": AttributeMetadata( - brief="The calendar system used by the culture.", + "device.boot_time": AttributeMetadata( + brief="A formatted UTC timestamp when the system was booted.", type=AttributeType.STRING, - keys=("culture.calendar",), + keys=("device.boot_time",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="GregorianCalendar", + example="2018-02-08T12:52:12Z", changelog=[ - ChangelogEntry(version="0.4.0", prs=[243]), + ChangelogEntry( + version="0.5.0", + prs=[303], + description="Added device.boot_time attribute", + ), ], ), - "culture.display_name": AttributeMetadata( - brief="Human readable name of the culture.", + "device.brand": AttributeMetadata( + brief="The brand of the device.", type=AttributeType.STRING, - keys=("culture.display_name",), + keys=("device.brand",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="English (United States)", + example="Apple", changelog=[ - ChangelogEntry(version="0.4.0", prs=[243]), + ChangelogEntry(version="0.1.0", prs=[116, 127]), ], ), - "culture.is_24_hour_format": AttributeMetadata( - brief="Whether the culture uses 24-hour time format.", + "device.charging": AttributeMetadata( + brief="Whether the device was charging or not.", type=AttributeType.BOOLEAN, - keys=("culture.is_24_hour_format",), + keys=("device.charging",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=True, + example=False, changelog=[ - ChangelogEntry(version="0.4.0", prs=[243]), + ChangelogEntry( + version="0.5.0", + prs=[303], + description="Added device.charging attribute", + ), ], ), - "culture.locale": AttributeMetadata( - brief="The locale identifier following RFC 4646.", + "device.chipset": AttributeMetadata( + brief="The chipset of the device.", type=AttributeType.STRING, - keys=("culture.locale",), + keys=("device.chipset",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="en-US", + example="Qualcomm SM8550", changelog=[ - ChangelogEntry(version="0.4.0", prs=[243]), + ChangelogEntry( + version="0.5.0", prs=[303], description="Added device.chipset attribute" + ), ], ), - "culture.timezone": AttributeMetadata( - brief="The timezone of the culture, as a geographic timezone identifier.", + "device.class": AttributeMetadata( + 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=AttributeType.STRING, - keys=("culture.timezone",), + keys=("device.class",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="Europe/Vienna", + example="medium", changelog=[ - ChangelogEntry(version="0.4.0", prs=[243]), + ChangelogEntry( + version="0.5.0", prs=[300], description="Added device.class attribute" + ), ], ), - "db.collection.name": AttributeMetadata( - brief="The name of a collection (table, container) within the database.", + "device.connection_type": AttributeMetadata( + brief="The internet connection type currently being used by the device.", type=AttributeType.STRING, keys=( - "db.collection.name", - "db.mongodb.collection", + "network.connection.type", + "connectionType", + "device.connection_type", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="users", - aliases=["db.mongodb.collection"], + example="wifi", + deprecation=DeprecationInfo( + replacement="network.connection.type", + reason="This attribute is being deprecated in favor of network.connection.type", + status=DeprecationStatus.BACKFILL, + ), + aliases=["network.connection.type", "connectionType"], changelog=[ ChangelogEntry( - version="0.19.0", - prs=[483], - description="Added db.mongodb.collection as an alias", + version="0.5.0", + prs=[303], + description="Added and deprecated device.connection_type in favor of network.connection.type", ), - ChangelogEntry(version="0.1.0", prs=[106, 127]), - ChangelogEntry(version="0.0.0"), ], ), - "db.connection_string": AttributeMetadata( - brief="The connection string used to connect to the database.", + "device.cpu_description": AttributeMetadata( + brief="A description of the CPU of the device.", type=AttributeType.STRING, - keys=("db.connection_string",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), - is_in_otel=True, + keys=("device.cpu_description",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, visibility=Visibility.PUBLIC, - example="redis://localhost:6379", - examples=["redis://localhost:6379"], - deprecation=DeprecationInfo( - reason="This attribute is deprecated. The connection is described by server.address and server.port instead, so the value cannot be copied to a single replacement attribute." - ), + example="Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz", changelog=[ ChangelogEntry( - version="0.21.0", - prs=[581], - description="Added db.connection_string attribute", + version="0.5.0", + prs=[303], + description="Added device.cpu_description attribute", ), ], ), - "db.driver.name": AttributeMetadata( - brief="The name of the driver used for the database connection.", - type=AttributeType.STRING, - keys=("db.driver.name",), + "device.external_free_storage": AttributeMetadata( + brief="External storage free size in bytes.", + type=AttributeType.INTEGER, + keys=("device.external_free_storage",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="psycopg2", + example=67108864000, changelog=[ ChangelogEntry( - version="0.5.0", prs=[297], description="Added db.driver.name attribute" + version="0.5.0", + prs=[303], + description="Added device.external_free_storage attribute", ), ], ), - "db.mongodb.collection": AttributeMetadata( - brief="The MongoDB collection being accessed.", - type=AttributeType.STRING, - keys=( - "db.collection.name", - "db.mongodb.collection", - ), + "device.external_storage_size": AttributeMetadata( + brief="External storage total size in bytes.", + type=AttributeType.INTEGER, + keys=("device.external_storage_size",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="users", - deprecation=DeprecationInfo( - replacement="db.collection.name", - reason="This attribute is being deprecated in favor of db.collection.name, which is the OTel-aligned replacement.", - status=DeprecationStatus.BACKFILL, - ), - aliases=["db.collection.name"], + example=134217728000, changelog=[ ChangelogEntry( - version="0.19.0", - prs=[483], - description="Added db.mongodb.collection attribute, deprecated in favor of db.collection.name", + version="0.5.0", + prs=[303], + description="Added device.external_storage_size attribute", ), ], ), - "db.name": AttributeMetadata( - brief="The name of the database being accessed.", + "device.family": AttributeMetadata( + brief="The family of the device.", type=AttributeType.STRING, - keys=( - "db.namespace", - "db.name", - ), + keys=("device.family",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="customers", - deprecation=DeprecationInfo( - replacement="db.namespace", status=DeprecationStatus.BACKFILL - ), - aliases=["db.namespace"], + example="iPhone", changelog=[ - ChangelogEntry(version="0.1.0", prs=[61, 127]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.1.0", prs=[116, 127]), ], ), - "db.namespace": AttributeMetadata( - brief="The name of the database being accessed.", - type=AttributeType.STRING, - keys=( - "db.namespace", - "db.name", - ), + "device.free_memory": AttributeMetadata( + brief="Free system memory in bytes.", + type=AttributeType.INTEGER, + keys=("device.free_memory",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="customers", - aliases=["db.name"], + example=2147483648, changelog=[ - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry( + version="0.5.0", + prs=[300], + description="Added device.free_memory attribute", + ), ], ), - "db.operation": AttributeMetadata( - brief="The name of the operation being executed.", - type=AttributeType.STRING, - keys=( - "db.operation.name", - "cloudflare.d1.query_type", - "db.operation", - "redis.command", - ), + "device.free_storage": AttributeMetadata( + brief="Free device storage in bytes.", + type=AttributeType.INTEGER, + keys=("device.free_storage",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="SELECT", - deprecation=DeprecationInfo( - replacement="db.operation.name", status=DeprecationStatus.NORMALIZE - ), - aliases=["db.operation.name", "cloudflare.d1.query_type", "redis.command"], + example=107374182400, changelog=[ ChangelogEntry( - version="0.19.0", - prs=[531], - description="Added redis.command as an alias", + version="0.5.0", + prs=[303], + description="Added device.free_storage attribute", ), - ChangelogEntry(version="0.4.0", prs=[199]), - ChangelogEntry(version="0.1.0", prs=[61, 127]), - ChangelogEntry(version="0.0.0"), ], ), - "db.operation.batch.size": AttributeMetadata( - 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=AttributeType.INTEGER, - keys=("db.operation.batch.size",), + "device.id": AttributeMetadata( + brief="Unique device identifier.", + type=AttributeType.STRING, + keys=("device.id",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example=3, + example="a1b2c3d4-e5f6-7890-abcd-ef1234567890", changelog=[ ChangelogEntry( - version="0.11.0", - prs=[407], - description="Added db.operation.batch.size attribute", + version="0.5.0", prs=[303], description="Added device.id attribute" ), ], ), - "db.operation.name": AttributeMetadata( - brief="The name of the operation being executed.", + "device.locale": AttributeMetadata( + brief="The locale of the device.", type=AttributeType.STRING, - keys=( - "db.operation.name", - "cloudflare.d1.query_type", - "db.operation", - "redis.command", - ), + keys=("device.locale",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="SELECT", - aliases=["db.operation", "cloudflare.d1.query_type", "redis.command"], + example="en-US", changelog=[ ChangelogEntry( - version="0.19.0", - prs=[531], - description="Added redis.command as an alias", + version="0.5.0", prs=[303], description="Added device.locale attribute" ), - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), ], ), - "db.params": AttributeMetadata( - brief="The query bindings for a database request.", - type=AttributeType.STRING, - keys=("db.params",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + "device.low_memory": AttributeMetadata( + brief="Whether the device was low on memory.", + type=AttributeType.BOOLEAN, + keys=("device.low_memory",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example='[{"x": 100}]', - examples=['[{"x": 100}]'], - deprecation=DeprecationInfo( - replacement="db.query.parameter.", - reason="Instead of adding every binding in the db.params attribute, add them as individual entries with db.query.parameter..", - ), + example=False, changelog=[ ChangelogEntry( - version="0.19.0", prs=[529], description="Added db.params attribute" + version="0.5.0", + prs=[303], + description="Added device.low_memory attribute", ), ], ), - "db.query.parameter.": AttributeMetadata( - brief="A query parameter used in db.query.text, with being the parameter name, and the attribute value being a string representation of the parameter value.", - type=AttributeType.STRING, - keys=("db.query.parameter.",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), - is_in_otel=True, + "device.low_power_mode": AttributeMetadata( + brief="Whether the device is in Low Power Mode.", + type=AttributeType.BOOLEAN, + keys=("device.low_power_mode",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, visibility=Visibility.PUBLIC, - has_dynamic_suffix=True, - example="db.query.parameter.foo='123'", + example=True, changelog=[ - ChangelogEntry(version="0.1.0", prs=[103, 127]), + ChangelogEntry( + version="0.6.0", + prs=[314], + description="Added device.low_power_mode attribute", + ), ], ), - "db.query.summary": AttributeMetadata( - brief="A shortened representation of operation(s) in the full query. This attribute must be low-cardinality and should only contain the operation table names.", + "device.manufacturer": AttributeMetadata( + brief="The manufacturer of the device.", type=AttributeType.STRING, - keys=("db.query.summary",), + keys=("device.manufacturer",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="SELECT users", - examples=["SELECT users", "INSERT products; UPDATE orders"], + example="Google", changelog=[ ChangelogEntry( - version="0.19.0", prs=[505], description="Added multiple examples" + version="0.5.0", + prs=[303], + description="Added device.manufacturer attribute", ), - ChangelogEntry(version="0.4.0", prs=[208]), - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), ], ), - "db.query.text": AttributeMetadata( - brief="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.` to add the parameter value.", - type=AttributeType.STRING, + "device.memory.estimated_capacity": AttributeMetadata( + 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=AttributeType.INTEGER, keys=( - "db.query.text", - "db.statement", - "query", + "device.memory.estimated_capacity", + "deviceMemory", ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), - is_in_otel=True, + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, visibility=Visibility.PUBLIC, - example="SELECT * FROM users WHERE id = $1", - aliases=["db.statement", "query"], + example=8, + aliases=["deviceMemory"], changelog=[ ChangelogEntry( - version="0.19.0", prs=[530], description="Added query as an alias" + version="0.5.0", + prs=[281], + description="Added attribute device.memory.estimated_capacity to be used instead of deviceMemory", ), - ChangelogEntry(version="0.4.0", prs=[208]), - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), ], ), - "db.redis.connection": AttributeMetadata( - brief="The redis connection name.", + "device.memory_size": AttributeMetadata( + brief="Total system memory available in bytes.", + type=AttributeType.INTEGER, + keys=("device.memory_size",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=17179869184, + changelog=[ + ChangelogEntry( + version="0.5.0", + prs=[300], + description="Added device.memory_size attribute", + ), + ], + ), + "device.model": AttributeMetadata( + brief="The model of the device.", type=AttributeType.STRING, - keys=("db.redis.connection",), + keys=("device.model",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="my-redis-instance", + example="iPhone 15 Pro Max", changelog=[ - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.1.0", prs=[116, 127]), ], ), - "db.redis.key": AttributeMetadata( - brief="The key the Redis command is operating on.", + "device.model_id": AttributeMetadata( + brief="An internal hardware revision to identify the device exactly.", type=AttributeType.STRING, - keys=( - "db.redis.key", - "redis.key", - ), + keys=("device.model_id",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="user:2047:city", - aliases=["redis.key"], + example="N861AP", changelog=[ ChangelogEntry( - version="0.19.0", prs=[484], description="Added redis.key as an alias" - ), - ChangelogEntry( - version="0.6.0", prs=[326], description="Added db.redis.key attribute" + version="0.5.0", + prs=[300], + description="Added device.model_id attribute", ), ], ), - "db.redis.parameters": AttributeMetadata( - brief="The array of command parameters given to a redis command.", - type=AttributeType.STRING_ARRAY, - keys=("db.redis.parameters",), + "device.name": AttributeMetadata( + brief="The user-assigned name of the mobile device.", + type=AttributeType.STRING, + keys=("device.name",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), is_in_otel=False, visibility=Visibility.PUBLIC, - example=["test", "*"], + example="localhost", changelog=[ - ChangelogEntry(version="0.0.0"), + ChangelogEntry( + version="0.24.0", + prs=[647], + description="Limit brief to mobile attributes and remove server_name alias", + ), + ChangelogEntry( + version="0.21.0", prs=[602], description="Added server_name as an alias" + ), + ChangelogEntry( + version="0.5.0", prs=[303], description="Added device.name attribute" + ), ], ), - "db.response.status_code": AttributeMetadata( - 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=AttributeType.STRING, - keys=("db.response.status_code",), + "device.online": AttributeMetadata( + brief="Whether the device was online or not.", + type=AttributeType.BOOLEAN, + keys=("device.online",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="ORA-17002", + example=True, changelog=[ ChangelogEntry( - version="0.16.0", - prs=[462], - description="Added db.response.status_code attribute", + version="0.5.0", prs=[303], description="Added device.online attribute" ), ], ), - "db.sql.bindings": AttributeMetadata( - brief="The array of query bindings.", - type=AttributeType.STRING_ARRAY, - keys=("db.sql.bindings",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + "device.orientation": AttributeMetadata( + brief='The orientation of the device, either "portrait" or "landscape".', + type=AttributeType.STRING, + keys=("device.orientation",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=["1", "foo"], - deprecation=DeprecationInfo( - replacement="db.query.parameter.", - reason="Instead of adding every binding in the db.sql.bindings attribute, add them as individual entires with db.query.parameter..", - ), + example="portrait", changelog=[ - ChangelogEntry(version="0.1.0", prs=[61]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry( + version="0.5.0", + prs=[303], + description="Added device.orientation attribute", + ), ], ), - "db.statement": AttributeMetadata( - brief="The database statement being executed.", - type=AttributeType.STRING, - keys=( - "db.query.text", - "db.statement", - "query", - ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), - is_in_otel=True, - visibility=Visibility.PUBLIC, - example="SELECT * FROM users WHERE id = $1", - deprecation=DeprecationInfo( - replacement="db.query.text", - reason="While this attribute never specifically required parameterization, the replacement, db.query.text, does.", - status=DeprecationStatus.NORMALIZE, - ), - aliases=["db.query.text", "query"], - changelog=[ - ChangelogEntry( - version="0.19.0", - prs=[501], - description="Improved example, added deprecation reason, and added query as an alias", - ), - ChangelogEntry(version="0.4.0", prs=[199]), - ChangelogEntry(version="0.1.0", prs=[61, 127]), - ChangelogEntry(version="0.0.0"), - ], - ), - "db.stored_procedure.name": AttributeMetadata( - brief="The name of a stored procedure being called.", - type=AttributeType.STRING, - keys=("db.stored_procedure.name",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, - visibility=Visibility.PUBLIC, - example="GetUserById", - changelog=[ - ChangelogEntry(version="0.11.0", prs=[398]), - ], - ), - "db.system": AttributeMetadata( - brief="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.", - type=AttributeType.STRING, - keys=( - "db.system.name", - "db.system", - "span.system", - ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, - visibility=Visibility.PUBLIC, - example="postgresql", - deprecation=DeprecationInfo( - replacement="db.system.name", status=DeprecationStatus.BACKFILL - ), - aliases=["db.system.name"], - changelog=[ - ChangelogEntry(version="0.4.0", prs=[199, 224]), - ChangelogEntry(version="0.1.0", prs=[61, 127]), - ChangelogEntry(version="0.0.0"), - ], - search_alias=SearchAlias(name="db.system", deprecated_aliases=["span.system"]), - ), - "db.system.name": AttributeMetadata( - brief="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.", - type=AttributeType.STRING, + "device.processor_count": AttributeMetadata( + brief='Number of "logical processors".', + type=AttributeType.INTEGER, keys=( - "db.system.name", - "db.system", - "span.system", + "device.processor_count", + "hardwareConcurrency", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, - visibility=Visibility.PUBLIC, - example="postgresql", - aliases=["db.system"], - changelog=[ - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), - ], - ), - "db.user": AttributeMetadata( - brief="The database user.", - type=AttributeType.STRING, - keys=("db.user",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, - visibility=Visibility.PUBLIC, - example="fancy_user", - changelog=[ - ChangelogEntry(version="0.0.0"), - ], - ), - "device.archs": AttributeMetadata( - brief="The CPU architectures of the device.", - type=AttributeType.STRING_ARRAY, - keys=("device.archs",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=["arm64-v8a", "armeabi-v7a", "armeabi"], + example=8, + aliases=["hardwareConcurrency"], changelog=[ ChangelogEntry( - version="0.5.0", prs=[303], description="Added device.archs attribute" + version="0.5.0", + prs=[300], + description="Added and deprecated attribute device.processor_count in favor of device.cpu.logical_core_count", ), ], ), - "device.battery_level": AttributeMetadata( - brief="The battery level of the device as a percentage (0-100).", + "device.processor_frequency": AttributeMetadata( + brief="Processor frequency in MHz.", type=AttributeType.DOUBLE, - keys=("device.battery_level",), + keys=("device.processor_frequency",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=100, + example=2400, changelog=[ ChangelogEntry( version="0.5.0", prs=[303], - description="Added device.battery_level attribute", + description="Added device.processor_frequency attribute", ), ], ), - "device.battery_temperature": AttributeMetadata( - brief="The battery temperature of the device in Celsius.", + "device.screen_density": AttributeMetadata( + brief="The screen density of the device.", type=AttributeType.DOUBLE, - keys=("device.battery_temperature",), + keys=("device.screen_density",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=25, + example=2.625, changelog=[ ChangelogEntry( version="0.5.0", prs=[303], - description="Added device.battery_temperature attribute", + description="Added device.screen_density attribute", ), ], ), - "device.boot_time": AttributeMetadata( - brief="A formatted UTC timestamp when the system was booted.", - type=AttributeType.STRING, - keys=("device.boot_time",), + "device.screen_dpi": AttributeMetadata( + brief="The screen density in dots-per-inch (DPI) of the device.", + type=AttributeType.INTEGER, + keys=("device.screen_dpi",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="2018-02-08T12:52:12Z", + example=420, changelog=[ ChangelogEntry( version="0.5.0", prs=[303], - description="Added device.boot_time attribute", + description="Added device.screen_dpi attribute", ), ], ), - "device.brand": AttributeMetadata( - brief="The brand of the device.", - type=AttributeType.STRING, - keys=("device.brand",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, - visibility=Visibility.PUBLIC, - example="Apple", - changelog=[ - ChangelogEntry(version="0.1.0", prs=[116, 127]), - ], - ), - "device.charging": AttributeMetadata( - brief="Whether the device was charging or not.", - type=AttributeType.BOOLEAN, - keys=("device.charging",), + "device.screen_height_pixels": AttributeMetadata( + brief="The height of the device screen in pixels.", + type=AttributeType.INTEGER, + keys=("device.screen_height_pixels",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=False, + example=2400, changelog=[ ChangelogEntry( version="0.5.0", prs=[303], - description="Added device.charging attribute", + description="Added device.screen_height_pixels attribute", ), ], ), - "device.chipset": AttributeMetadata( - brief="The chipset of the device.", - type=AttributeType.STRING, - keys=("device.chipset",), + "device.screen_width_pixels": AttributeMetadata( + brief="The width of the device screen in pixels.", + type=AttributeType.INTEGER, + keys=("device.screen_width_pixels",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="Qualcomm SM8550", + example=1080, changelog=[ ChangelogEntry( - version="0.5.0", prs=[303], description="Added device.chipset attribute" + version="0.5.0", + prs=[303], + description="Added device.screen_width_pixels attribute", ), ], ), - "device.class": AttributeMetadata( - 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=AttributeType.STRING, - keys=("device.class",), + "device.simulator": AttributeMetadata( + brief="Whether the device is a simulator or an actual device.", + type=AttributeType.BOOLEAN, + keys=("device.simulator",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="medium", + example=False, changelog=[ ChangelogEntry( - version="0.5.0", prs=[300], description="Added device.class attribute" + version="0.5.0", + prs=[300], + description="Added device.simulator attribute", ), ], ), - "device.connection_type": AttributeMetadata( - brief="The internet connection type currently being used by the device.", - type=AttributeType.STRING, - keys=( - "network.connection.type", - "connectionType", - "device.connection_type", - ), + "device.storage_size": AttributeMetadata( + brief="Total device storage in bytes.", + type=AttributeType.INTEGER, + keys=("device.storage_size",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="wifi", - deprecation=DeprecationInfo( - replacement="network.connection.type", - reason="This attribute is being deprecated in favor of network.connection.type", - status=DeprecationStatus.BACKFILL, - ), - aliases=["network.connection.type", "connectionType"], + example=274877906944, changelog=[ ChangelogEntry( version="0.5.0", prs=[303], - description="Added and deprecated device.connection_type in favor of network.connection.type", + description="Added device.storage_size attribute", ), ], ), - "device.cpu_description": AttributeMetadata( - brief="A description of the CPU of the device.", + "device.thermal_state": AttributeMetadata( + brief="The thermal state of the device. Based on Apple's `ProcessInfo.ThermalState` enum.", type=AttributeType.STRING, - keys=("device.cpu_description",), + keys=("device.thermal_state",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz", + example="nominal", changelog=[ ChangelogEntry( version="0.5.0", prs=[303], - description="Added device.cpu_description attribute", + description="Added device.thermal_state attribute", ), ], ), - "device.external_free_storage": AttributeMetadata( - brief="External storage free size in bytes.", - type=AttributeType.INTEGER, - keys=("device.external_free_storage",), + "device.timezone": AttributeMetadata( + brief="The timezone of the device.", + type=AttributeType.STRING, + keys=("device.timezone",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=67108864000, + example="Europe/Vienna", changelog=[ ChangelogEntry( version="0.5.0", prs=[303], - description="Added device.external_free_storage attribute", + description="Added device.timezone attribute", ), ], ), - "device.external_storage_size": AttributeMetadata( - brief="External storage total size in bytes.", + "device.usable_memory": AttributeMetadata( + brief="Memory usable for the app in bytes.", type=AttributeType.INTEGER, - keys=("device.external_storage_size",), + keys=("device.usable_memory",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=134217728000, + example=2147483648, changelog=[ ChangelogEntry( version="0.5.0", prs=[303], - description="Added device.external_storage_size attribute", + description="Added device.usable_memory attribute", ), ], ), - "device.family": AttributeMetadata( - brief="The family of the device.", + "deviceMemory": AttributeMetadata( + brief="The estimated total memory capacity of the device, only a rough estimation in gigabytes.", type=AttributeType.STRING, - keys=("device.family",), + keys=( + "device.memory.estimated_capacity", + "deviceMemory", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="iPhone", - changelog=[ - ChangelogEntry(version="0.1.0", prs=[116, 127]), - ], - ), - "device.free_memory": AttributeMetadata( - brief="Free system memory in bytes.", - type=AttributeType.INTEGER, - keys=("device.free_memory",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, - visibility=Visibility.PUBLIC, - example=2147483648, + example="8 GB", + deprecation=DeprecationInfo( + replacement="device.memory.estimated_capacity", + reason="Old namespace-less attribute, to be replaced with device.memory.estimated_capacity for span-first future", + status=DeprecationStatus.BACKFILL, + ), + aliases=["device.memory.estimated_capacity"], changelog=[ ChangelogEntry( version="0.5.0", - prs=[300], - description="Added device.free_memory attribute", + prs=[281], + description="Added and deprecated attribute to document JS SDK's current behaviour", ), ], ), - "device.free_storage": AttributeMetadata( - brief="Free device storage in bytes.", - type=AttributeType.INTEGER, - keys=("device.free_storage",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + "dist": AttributeMetadata( + brief="The sentry dist.", + type=AttributeType.STRING, + keys=( + "sentry.dist", + "dist", + ), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.NEVER), is_in_otel=False, visibility=Visibility.PUBLIC, - example=107374182400, + example="1.0", + deprecation=DeprecationInfo( + replacement="sentry.dist", + reason="This attribute is being deprecated in favor of sentry.dist.", + status=DeprecationStatus.BACKFILL, + ), + aliases=["sentry.dist"], changelog=[ ChangelogEntry( - version="0.5.0", - prs=[303], - description="Added device.free_storage attribute", + version="0.16.0", prs=[489], description="Added dist attribute" ), ], ), - "device.id": AttributeMetadata( - brief="Unique device identifier.", + "django.function_name": AttributeMetadata( + brief="The fully qualified name of a function used in a Django context.", type=AttributeType.STRING, - keys=("device.id",), + keys=( + "code.function.name", + "code.function", + "django.function_name", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="a1b2c3d4-e5f6-7890-abcd-ef1234567890", + example="django.contrib.sessions.middleware.SessionMiddleware", + examples=["django.contrib.sessions.middleware.SessionMiddleware"], + deprecation=DeprecationInfo( + replacement="code.function.name", + reason="This attribute is being deprecated in favor of code.function.name, which is the framework-agnostic replacement.", + status=DeprecationStatus.BACKFILL, + ), + aliases=["code.function.name", "code.function"], changelog=[ ChangelogEntry( - version="0.5.0", prs=[303], description="Added device.id attribute" + version="0.19.0", + prs=[538], + description="Added django.function_name attribute", ), ], ), - "device.locale": AttributeMetadata( - brief="The locale of the device.", + "django.middleware_name": AttributeMetadata( + brief="The name of the Django middleware.", type=AttributeType.STRING, - keys=("device.locale",), + keys=( + "middleware.name", + "django.middleware_name", + "litestar.middleware_name", + "starlette.middleware_name", + "starlite.middleware_name", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="en-US", + example="AuthenticationMiddleware", + examples=["AuthenticationMiddleware"], + deprecation=DeprecationInfo( + replacement="middleware.name", + reason="This attribute is being deprecated in favor of middleware.name, which is the framework-agnostic replacement.", + status=DeprecationStatus.BACKFILL, + ), + aliases=["middleware.name"], changelog=[ ChangelogEntry( - version="0.5.0", prs=[303], description="Added device.locale attribute" + version="0.19.0", + prs=[520], + description="Added django.middleware_name attribute", ), ], ), - "device.low_memory": AttributeMetadata( - brief="Whether the device was low on memory.", - type=AttributeType.BOOLEAN, - keys=("device.low_memory",), + "effectiveConnectionType": AttributeMetadata( + brief="Specifies the estimated effective type of the current connection (e.g. slow-2g, 2g, 3g, 4g).", + type=AttributeType.STRING, + keys=( + "network.connection.effective_type", + "effectiveConnectionType", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=False, + example="4g", + deprecation=DeprecationInfo( + replacement="network.connection.effective_type", + reason="Old namespace-less attribute, to be replaced with network.connection.effective_type for span-first future", + status=DeprecationStatus.BACKFILL, + ), + aliases=["network.connection.effective_type"], changelog=[ ChangelogEntry( version="0.5.0", - prs=[303], - description="Added device.low_memory attribute", + prs=[279], + description="Added and deprecated attribute to document JS SDK's current behaviour", ), ], ), - "device.low_power_mode": AttributeMetadata( - brief="Whether the device is in Low Power Mode.", - type=AttributeType.BOOLEAN, - keys=("device.low_power_mode",), + "environment": AttributeMetadata( + brief="The sentry environment.", + type=AttributeType.STRING, + keys=( + "sentry.environment", + "environment", + "resource.deployment.environment", + "resource.deployment.environment.name", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=True, + example="production", + deprecation=DeprecationInfo( + replacement="sentry.environment", status=DeprecationStatus.NORMALIZE + ), + aliases=["sentry.environment"], changelog=[ ChangelogEntry( - version="0.6.0", - prs=[314], - description="Added device.low_power_mode attribute", + version="0.19.0", prs=[427], description="Configured normalization" ), + ChangelogEntry(version="0.1.0", prs=[61, 127]), + ChangelogEntry(version="0.0.0"), ], ), - "device.manufacturer": AttributeMetadata( - brief="The manufacturer of the device.", + "error.type": AttributeMetadata( + brief="Describes a class of error the operation ended with.", type=AttributeType.STRING, - keys=("device.manufacturer",), + keys=("error.type",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="Google", + example="timeout", changelog=[ - ChangelogEntry( - version="0.5.0", - prs=[303], - description="Added device.manufacturer attribute", - ), + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), ], ), - "device.memory.estimated_capacity": AttributeMetadata( - 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", + "event.id": AttributeMetadata( + brief="The unique identifier for this event (log record)", type=AttributeType.INTEGER, - keys=( - "device.memory.estimated_capacity", - "deviceMemory", - ), + keys=("event.id",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=8, - aliases=["deviceMemory"], + example=1234567890, changelog=[ - ChangelogEntry( - version="0.5.0", - prs=[281], - description="Added attribute device.memory.estimated_capacity to be used instead of deviceMemory", - ), + ChangelogEntry(version="0.1.0", prs=[101]), ], ), - "device.memory_size": AttributeMetadata( - brief="Total system memory available in bytes.", - type=AttributeType.INTEGER, - keys=("device.memory_size",), + "event.name": AttributeMetadata( + brief="The name that uniquely identifies this event (log record)", + type=AttributeType.STRING, + keys=("event.name",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=17179869184, + example="Process Payload", changelog=[ - ChangelogEntry( - version="0.5.0", - prs=[300], - description="Added device.memory_size attribute", - ), + ChangelogEntry(version="0.1.0", prs=[101, 127]), ], ), - "device.model": AttributeMetadata( - brief="The model of the device.", - type=AttributeType.STRING, - keys=("device.model",), + "exception.escaped": AttributeMetadata( + 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=AttributeType.BOOLEAN, + keys=("exception.escaped",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="iPhone 15 Pro Max", + example=True, changelog=[ - ChangelogEntry(version="0.1.0", prs=[116, 127]), + ChangelogEntry(version="0.0.0"), ], ), - "device.model_id": AttributeMetadata( - brief="An internal hardware revision to identify the device exactly.", + "exception.message": AttributeMetadata( + brief="The error message.", type=AttributeType.STRING, - keys=("device.model_id",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + keys=("exception.message",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + is_in_otel=True, visibility=Visibility.PUBLIC, - example="N861AP", + example="ENOENT: no such file or directory", changelog=[ - ChangelogEntry( - version="0.5.0", - prs=[300], - description="Added device.model_id attribute", - ), + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), ], ), - "device.name": AttributeMetadata( - brief="The user-assigned name of the mobile device.", + "exception.stacktrace": AttributeMetadata( + 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=AttributeType.STRING, - keys=("device.name",), + keys=("exception.stacktrace",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="localhost", + 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=[ - ChangelogEntry( - version="0.24.0", - prs=[647], - description="Limit brief to mobile attributes and remove server_name alias", - ), - ChangelogEntry( - version="0.21.0", prs=[602], description="Added server_name as an alias" - ), - ChangelogEntry( - version="0.5.0", prs=[303], description="Added device.name attribute" - ), + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), ], ), - "device.online": AttributeMetadata( - brief="Whether the device was online or not.", - type=AttributeType.BOOLEAN, - keys=("device.online",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, - visibility=Visibility.PUBLIC, - example=True, - changelog=[ - ChangelogEntry( - version="0.5.0", prs=[303], description="Added device.online attribute" - ), - ], - ), - "device.orientation": AttributeMetadata( - brief='The orientation of the device, either "portrait" or "landscape".', + "exception.type": AttributeMetadata( + 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=AttributeType.STRING, - keys=("device.orientation",), + keys=("exception.type",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="portrait", + example="OSError", changelog=[ - ChangelogEntry( - version="0.5.0", - prs=[303], - description="Added device.orientation attribute", - ), + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), ], ), - "device.processor_count": AttributeMetadata( - brief='Number of "logical processors".', - type=AttributeType.INTEGER, - keys=( - "device.processor_count", - "hardwareConcurrency", - ), + "faas.coldstart": AttributeMetadata( + brief="A boolean that is true if the serverless function is executed for the first time (aka cold-start).", + type=AttributeType.BOOLEAN, + keys=("faas.coldstart",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=8, - aliases=["hardwareConcurrency"], + example=True, changelog=[ - ChangelogEntry( - version="0.5.0", - prs=[300], - description="Added and deprecated attribute device.processor_count in favor of device.cpu.logical_core_count", - ), + ChangelogEntry(version="0.0.0"), ], ), - "device.processor_frequency": AttributeMetadata( - brief="Processor frequency in MHz.", - type=AttributeType.DOUBLE, - keys=("device.processor_frequency",), + "faas.cron": AttributeMetadata( + brief="A string containing the schedule period as Cron Expression.", + type=AttributeType.STRING, + keys=("faas.cron",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=2400, + example="0/5 * * * ? *", changelog=[ - ChangelogEntry( - version="0.5.0", - prs=[303], - description="Added device.processor_frequency attribute", - ), + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), ], ), - "device.screen_density": AttributeMetadata( - brief="The screen density of the device.", - type=AttributeType.DOUBLE, - keys=("device.screen_density",), + "faas.duration_in_ms": AttributeMetadata( + brief="The duration a function took to run, in milliseconds.", + type=AttributeType.INTEGER, + keys=("faas.duration_in_ms",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=2.625, + example=120, changelog=[ - ChangelogEntry( - version="0.5.0", - prs=[303], - description="Added device.screen_density attribute", - ), + ChangelogEntry(version="0.11.0", prs=[403]), ], ), - "device.screen_dpi": AttributeMetadata( - brief="The screen density in dots-per-inch (DPI) of the device.", - type=AttributeType.INTEGER, - keys=("device.screen_dpi",), + "faas.entry_point": AttributeMetadata( + brief="The code that's run when the cloud provider invokes your function.", + type=AttributeType.STRING, + keys=("faas.entry_point",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=420, + example="my_main_function", changelog=[ - ChangelogEntry( - version="0.5.0", - prs=[303], - description="Added device.screen_dpi attribute", - ), + ChangelogEntry(version="0.11.0", prs=[403, 415]), ], ), - "device.screen_height_pixels": AttributeMetadata( - brief="The height of the device screen in pixels.", - type=AttributeType.INTEGER, - keys=("device.screen_height_pixels",), + "faas.execution": AttributeMetadata( + brief="The execution ID of the current function execution.", + type=AttributeType.STRING, + keys=( + "faas.invocation_id", + "aws.lambda.aws_request_id", + "faas.execution", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=2400, + example="af9d5aa4-a685-4c5f-a22b-444f80b3cc28", + deprecation=DeprecationInfo( + replacement="faas.invocation_id", + reason="This attribute is being deprecated in favor of faas.invocation_id, which is the OTel-aligned replacement.", + status=DeprecationStatus.BACKFILL, + ), + aliases=["faas.invocation_id", "aws.lambda.aws_request_id"], changelog=[ ChangelogEntry( - version="0.5.0", - prs=[303], - description="Added device.screen_height_pixels attribute", + version="0.16.0", + prs=[473], + description="Added faas.execution attribute, deprecated in favor of faas.invocation_id", ), ], ), - "device.screen_width_pixels": AttributeMetadata( - brief="The width of the device screen in pixels.", - type=AttributeType.INTEGER, - keys=("device.screen_width_pixels",), + "faas.id": AttributeMetadata( + brief="The unique ID of the single function that this runtime instance executes.", + type=AttributeType.STRING, + keys=( + "cloud.resource_id", + "faas.id", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=1080, + example="arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function", + deprecation=DeprecationInfo( + 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=DeprecationStatus.BACKFILL, + ), + aliases=["cloud.resource_id"], changelog=[ ChangelogEntry( - version="0.5.0", - prs=[303], - description="Added device.screen_width_pixels attribute", + version="0.16.0", + prs=[475], + description="Added faas.id attribute, deprecated in favor of cloud.resource_id", ), ], ), - "device.simulator": AttributeMetadata( - brief="Whether the device is a simulator or an actual device.", - type=AttributeType.BOOLEAN, - keys=("device.simulator",), + "faas.identity": AttributeMetadata( + 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=AttributeType.STRING, + keys=("faas.identity",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=False, + example="name@project.iam.gserviceaccount.com (GCP), arn:aws:iam::123456789012:role/role-name (AWS), 00000000-0000-0000-0000-000000000000 (Azure)", changelog=[ - ChangelogEntry( - version="0.5.0", - prs=[300], - description="Added device.simulator attribute", - ), + ChangelogEntry(version="0.11.0", prs=[403]), ], ), - "device.storage_size": AttributeMetadata( - brief="Total device storage in bytes.", - type=AttributeType.INTEGER, - keys=("device.storage_size",), + "faas.invocation_id": AttributeMetadata( + brief="The invocation ID of the current function invocation.", + type=AttributeType.STRING, + keys=( + "faas.invocation_id", + "aws.lambda.aws_request_id", + "faas.execution", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=274877906944, + example="af9d5aa4-a685-4c5f-a22b-444f80b3cc28", + aliases=["aws.lambda.aws_request_id", "faas.execution"], changelog=[ ChangelogEntry( - version="0.5.0", - prs=[303], - description="Added device.storage_size attribute", + version="0.16.0", + prs=[473], + description="Added faas.execution as an alias", ), + ChangelogEntry(version="0.11.1", prs=[414, 424]), ], ), - "device.thermal_state": AttributeMetadata( - brief="The thermal state of the device. Based on Apple's `ProcessInfo.ThermalState` enum.", + "faas.invoked_name": AttributeMetadata( + brief="The name of the invoked function.", type=AttributeType.STRING, - keys=("device.thermal_state",), + keys=("faas.invoked_name",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="nominal", + example="my-function", changelog=[ ChangelogEntry( - version="0.5.0", - prs=[303], - description="Added device.thermal_state attribute", + version="0.16.0", + prs=[481], + description="Added faas.invoked_name attribute", ), ], ), - "device.timezone": AttributeMetadata( - brief="The timezone of the device.", + "faas.invoked_provider": AttributeMetadata( + brief="The cloud provider of the invoked function.", type=AttributeType.STRING, - keys=("device.timezone",), + keys=("faas.invoked_provider",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="Europe/Vienna", + example="aws", changelog=[ ChangelogEntry( - version="0.5.0", - prs=[303], - description="Added device.timezone attribute", + version="0.16.0", + prs=[481], + description="Added faas.invoked_provider attribute", ), ], ), - "device.usable_memory": AttributeMetadata( - brief="Memory usable for the app in bytes.", - type=AttributeType.INTEGER, - keys=("device.usable_memory",), + "faas.invoked_region": AttributeMetadata( + brief="The cloud region of the invoked function.", + type=AttributeType.STRING, + keys=("faas.invoked_region",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=2147483648, + example="eu-central-1", changelog=[ ChangelogEntry( - version="0.5.0", - prs=[303], - description="Added device.usable_memory attribute", + version="0.16.0", + prs=[481], + description="Added faas.invoked_region attribute", ), ], ), - "deviceMemory": AttributeMetadata( - brief="The estimated total memory capacity of the device, only a rough estimation in gigabytes.", + "faas.name": AttributeMetadata( + brief="The name of the serverless function", type=AttributeType.STRING, keys=( - "device.memory.estimated_capacity", - "deviceMemory", + "faas.name", + "aws.lambda.function_name", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="8 GB", - deprecation=DeprecationInfo( - replacement="device.memory.estimated_capacity", - reason="Old namespace-less attribute, to be replaced with device.memory.estimated_capacity for span-first future", - status=DeprecationStatus.BACKFILL, - ), - aliases=["device.memory.estimated_capacity"], + example="my_function", + aliases=["aws.lambda.function_name"], changelog=[ - ChangelogEntry( - version="0.5.0", - prs=[281], - description="Added and deprecated attribute to document JS SDK's current behaviour", - ), + ChangelogEntry(version="0.11.0", prs=[403, 415]), ], ), - "dist": AttributeMetadata( - brief="The sentry dist.", + "faas.time": AttributeMetadata( + brief="A string containing the function invocation time in the ISO 8601 format expressed in UTC.", + type=AttributeType.STRING, + keys=("faas.time",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=True, + visibility=Visibility.PUBLIC, + example="2020-01-23T13:47:06Z", + changelog=[ + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), + ], + ), + "faas.trigger": AttributeMetadata( + brief="Type of the trigger which caused this function invocation.", + type=AttributeType.STRING, + keys=("faas.trigger",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=True, + visibility=Visibility.PUBLIC, + example="timer", + changelog=[ + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), + ], + ), + "faas.version": AttributeMetadata( + brief="The version of the function that was invoked", type=AttributeType.STRING, keys=( - "sentry.dist", - "dist", + "faas.version", + "aws.lambda.function_version", ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.NEVER), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=True, + visibility=Visibility.PUBLIC, + example="$LATEST", + aliases=["aws.lambda.function_version"], + changelog=[ + ChangelogEntry(version="0.11.1", prs=[414, 424]), + ], + ), + "fcp": AttributeMetadata( + brief="The time it takes for the browser to render the first piece of meaningful content on the screen", + type=AttributeType.DOUBLE, + keys=( + "browser.web_vital.fcp.value", + "fcp", + ), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="1.0", + example=547.6951, deprecation=DeprecationInfo( - replacement="sentry.dist", - reason="This attribute is being deprecated in favor of sentry.dist.", + replacement="browser.web_vital.fcp.value", + reason="This attribute is being deprecated in favor of browser.web_vital.fcp.value", status=DeprecationStatus.BACKFILL, ), - aliases=["sentry.dist"], + aliases=["browser.web_vital.fcp.value"], + changelog=[ + ChangelogEntry(version="0.5.0", prs=[235]), + ], + ), + "file.path": AttributeMetadata( + brief="Path to the file.", + type=AttributeType.STRING, + keys=("file.path",), + apply_scrubbing=ApplyScrubbingInfo( + key=ApplyScrubbing.AUTO, + reason="File paths can contain end-user paths (e.g. from stack traces) that may be sensitive.", + ), + is_in_otel=True, + visibility=Visibility.PUBLIC, + example="/home/user/example.txt", changelog=[ ChangelogEntry( - version="0.16.0", prs=[489], description="Added dist attribute" + version="0.17.0", prs=[458], description="Added file.path attribute" ), ], ), - "django.function_name": AttributeMetadata( - brief="The fully qualified name of a function used in a Django context.", - type=AttributeType.STRING, + "file.size": AttributeMetadata( + brief="File size in bytes.", + type=AttributeType.INTEGER, + keys=("file.size",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=True, + visibility=Visibility.PUBLIC, + example=1024, + changelog=[ + ChangelogEntry( + version="0.17.0", prs=[458], description="Added file.size attribute" + ), + ], + ), + "flag.evaluation.": AttributeMetadata( + brief="An instance of a feature flag evaluation. The value of this attribute is the boolean representing the evaluation result. The suffix is the name of the feature flag.", + type=AttributeType.BOOLEAN, + keys=("flag.evaluation.",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + has_dynamic_suffix=True, + example="flag.evaluation.is_new_ui=true", + changelog=[ + ChangelogEntry(version="0.1.0", prs=[103]), + ], + ), + "fp": AttributeMetadata( + brief="The time it takes for the browser to render the first pixel on the screen", + type=AttributeType.DOUBLE, keys=( - "code.function.name", - "code.function", - "django.function_name", + "browser.web_vital.fp.value", + "fp", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="django.contrib.sessions.middleware.SessionMiddleware", - examples=["django.contrib.sessions.middleware.SessionMiddleware"], + example=477.1926, deprecation=DeprecationInfo( - replacement="code.function.name", - reason="This attribute is being deprecated in favor of code.function.name, which is the framework-agnostic replacement.", + replacement="browser.web_vital.fp.value", + reason="This attribute is being deprecated in favor of browser.web_vital.fp.value", status=DeprecationStatus.BACKFILL, ), - aliases=["code.function.name", "code.function"], + aliases=["browser.web_vital.fp.value"], changelog=[ - ChangelogEntry( - version="0.19.0", - prs=[538], - description="Added django.function_name attribute", - ), + ChangelogEntry(version="0.5.0", prs=[235]), ], ), - "django.middleware_name": AttributeMetadata( - brief="The name of the Django middleware.", - type=AttributeType.STRING, + "frames.delay": AttributeMetadata( + 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=AttributeType.INTEGER, keys=( - "middleware.name", - "django.middleware_name", - "litestar.middleware_name", - "starlette.middleware_name", - "starlite.middleware_name", + "app.vitals.frames.delay.value", + "frames.delay", + "mobile.frames_delay", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="AuthenticationMiddleware", - examples=["AuthenticationMiddleware"], + example=5, deprecation=DeprecationInfo( - replacement="middleware.name", - reason="This attribute is being deprecated in favor of middleware.name, which is the framework-agnostic replacement.", + 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=DeprecationStatus.BACKFILL, ), - aliases=["middleware.name"], + aliases=["app.vitals.frames.delay.value"], changelog=[ ChangelogEntry( - version="0.19.0", - prs=[520], - description="Added django.middleware_name attribute", + version="0.5.0", + prs=[313], + description="Deprecated in favor of app.vitals.frames.delay.value", ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.0.0"), ], + search_alias=SearchAlias(name="mobile.frames_delay", type="second"), ), - "effectiveConnectionType": AttributeMetadata( - brief="Specifies the estimated effective type of the current connection (e.g. slow-2g, 2g, 3g, 4g).", - type=AttributeType.STRING, + "frames.frozen": AttributeMetadata( + brief="The number of frozen frames rendered during the lifetime of the span.", + type=AttributeType.INTEGER, keys=( - "network.connection.effective_type", - "effectiveConnectionType", + "app.vitals.frames.frozen.count", + "frames.frozen", + "mobile.frozen_frames", + "sentry.frames.frozen", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="4g", + example=3, deprecation=DeprecationInfo( - replacement="network.connection.effective_type", - reason="Old namespace-less attribute, to be replaced with network.connection.effective_type for span-first future", + replacement="app.vitals.frames.frozen.count", + reason="Replaced by app.vitals.frames.frozen.count to align with the app.vitals.* namespace for mobile performance attributes", status=DeprecationStatus.BACKFILL, ), - aliases=["network.connection.effective_type"], + aliases=["app.vitals.frames.frozen.count", "sentry.frames.frozen"], changelog=[ + ChangelogEntry( + version="0.19.0", + prs=[500], + description="Added sentry.frames.frozen as an alias", + ), ChangelogEntry( version="0.5.0", - prs=[279], - description="Added and deprecated attribute to document JS SDK's current behaviour", + prs=[313], + description="Deprecated in favor of app.vitals.frames.frozen.count", ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.0.0"), ], + search_alias=SearchAlias(name="mobile.frozen_frames"), ), - "environment": AttributeMetadata( - brief="The sentry environment.", - type=AttributeType.STRING, + "frames.slow": AttributeMetadata( + brief="The number of slow frames rendered during the lifetime of the span.", + type=AttributeType.INTEGER, keys=( - "sentry.environment", - "environment", - "resource.deployment.environment", - "resource.deployment.environment.name", + "app.vitals.frames.slow.count", + "frames.slow", + "mobile.slow_frames", + "sentry.frames.slow", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="production", + example=1, deprecation=DeprecationInfo( - replacement="sentry.environment", status=DeprecationStatus.NORMALIZE + replacement="app.vitals.frames.slow.count", + reason="Replaced by app.vitals.frames.slow.count to align with the app.vitals.* namespace for mobile performance attributes", + status=DeprecationStatus.BACKFILL, ), - aliases=["sentry.environment"], + aliases=["app.vitals.frames.slow.count", "sentry.frames.slow"], changelog=[ ChangelogEntry( - version="0.19.0", prs=[427], description="Configured normalization" + version="0.19.0", + prs=[500], + description="Added sentry.frames.slow as an alias", ), - ChangelogEntry(version="0.1.0", prs=[61, 127]), + ChangelogEntry( + version="0.5.0", + prs=[313], + description="Deprecated in favor of app.vitals.frames.slow.count", + ), + ChangelogEntry(version="0.4.0", prs=[228]), ChangelogEntry(version="0.0.0"), ], + search_alias=SearchAlias(name="mobile.slow_frames"), ), - "error.type": AttributeMetadata( - brief="Describes a class of error the operation ended with.", - type=AttributeType.STRING, - keys=("error.type",), + "frames.total": AttributeMetadata( + brief="The number of total frames rendered during the lifetime of the span.", + type=AttributeType.INTEGER, + keys=( + "app.vitals.frames.total.count", + "frames.total", + "mobile.total_frames", + "sentry.frames.total", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="timeout", - changelog=[ - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), + example=60, + deprecation=DeprecationInfo( + replacement="app.vitals.frames.total.count", + reason="Replaced by app.vitals.frames.total.count to align with the app.vitals.* namespace for mobile performance attributes", + status=DeprecationStatus.BACKFILL, + ), + aliases=["app.vitals.frames.total.count", "sentry.frames.total"], + changelog=[ + ChangelogEntry( + version="0.19.0", + prs=[500], + description="Added sentry.frames.total as an alias", + ), + ChangelogEntry( + version="0.5.0", + prs=[313], + description="Deprecated in favor of app.vitals.frames.total.count", + ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.0.0"), ], + search_alias=SearchAlias(name="mobile.total_frames"), ), - "event.id": AttributeMetadata( - brief="The unique identifier for this event (log record)", - type=AttributeType.INTEGER, - keys=("event.id",), + "frames_frozen_rate": AttributeMetadata( + brief="The rate of frozen frames, or `app.vitals.frames.frozen.count` divided by `app.vitals.frames.total.count`. This is computed by Relay.", + type=AttributeType.DOUBLE, + keys=( + "app.vitals.frames.frozen.rate", + "frames_frozen_rate", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=1234567890, + deprecation=DeprecationInfo( + replacement="app.vitals.frames.frozen.rate", + reason="Replaced by app.vitals.frames.frozen.rate to align with the app.vitals.* namespace for mobile performance attributes", + status=DeprecationStatus.BACKFILL, + ), + aliases=["app.vitals.frames.frozen.rate"], changelog=[ - ChangelogEntry(version="0.1.0", prs=[101]), + ChangelogEntry( + version="0.19.0", + prs=[493], + description="Deprecated in favor of app.vitals.frames.frozen.rate", + ), + ChangelogEntry( + version="0.7.0", + prs=[362], + description="Added frames_frozen_rate attribute", + ), ], ), - "event.name": AttributeMetadata( - brief="The name that uniquely identifies this event (log record)", - type=AttributeType.STRING, - keys=("event.name",), + "frames_slow_rate": AttributeMetadata( + brief="The rate of slow frames, or `app.vitals.frames.slow.count` divided by `app.vitals.frames.total.count`. This is computed by Relay.", + type=AttributeType.DOUBLE, + keys=( + "app.vitals.frames.slow.rate", + "frames_slow_rate", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="Process Payload", + deprecation=DeprecationInfo( + replacement="app.vitals.frames.slow.rate", + reason="Replaced by app.vitals.frames.slow.rate to align with the app.vitals.* namespace for mobile performance attributes", + status=DeprecationStatus.BACKFILL, + ), + aliases=["app.vitals.frames.slow.rate"], changelog=[ - ChangelogEntry(version="0.1.0", prs=[101, 127]), + ChangelogEntry( + version="0.19.0", + prs=[493], + description="Deprecated in favor of app.vitals.frames.slow.rate", + ), + ChangelogEntry( + version="0.7.0", + prs=[362], + description="Added frames_slow_rate attribute", + ), ], ), - "exception.escaped": AttributeMetadata( - 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=AttributeType.BOOLEAN, - keys=("exception.escaped",), + "fs_error": AttributeMetadata( + brief="The error message of a file system error.", + type=AttributeType.STRING, + keys=("fs_error",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example=True, + example="ENOENT: no such file or directory", + deprecation=DeprecationInfo( + replacement="error.type", + reason="This attribute is not part of the OpenTelemetry specification and error.type fits much better. The value changes from the full error message to the syscall error code, so the old value cannot be copied over.", + ), changelog=[ + ChangelogEntry( + version="0.23.0", + prs=[638], + description="Remove unnecessary transformation and change deprecation status to null.", + ), + ChangelogEntry( + version="0.22.0", + prs=[589], + description="Transform fs_error into error.type", + ), + ChangelogEntry(version="0.1.0", prs=[61, 127]), ChangelogEntry(version="0.0.0"), ], ), - "exception.message": AttributeMetadata( - brief="The error message.", + "gcp.function.context.event_id": AttributeMetadata( + brief="The event ID from the legacy GCP Cloud Function context (1st gen)", type=AttributeType.STRING, - keys=("exception.message",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), - is_in_otel=True, + keys=("gcp.function.context.event_id",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, visibility=Visibility.PUBLIC, - example="ENOENT: no such file or directory", + example="1234567890", changelog=[ - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry( + version="0.7.0", + prs=[371], + description="Added gcp.function.context.event_id attribute", + ), ], ), - "exception.stacktrace": AttributeMetadata( - 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.", + "gcp.function.context.event_type": AttributeMetadata( + brief="The type of the GCP Cloud Function event", type=AttributeType.STRING, - keys=("exception.stacktrace",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), - is_in_otel=True, + keys=("gcp.function.context.event_type",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, visibility=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)', + example="google.pubsub.topic.publish", changelog=[ - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry( + version="0.7.0", + prs=[371], + description="Added gcp.function.context.event_type attribute", + ), ], ), - "exception.type": AttributeMetadata( - 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.", + "gcp.function.context.id": AttributeMetadata( + brief="The unique event ID from the GCP CloudEvents context (2nd gen Cloud Functions)", type=AttributeType.STRING, - keys=("exception.type",), + keys=("gcp.function.context.id",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="OSError", + example="1234567890", changelog=[ - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry( + version="0.7.0", + prs=[371], + description="Added gcp.function.context.id attribute", + ), ], ), - "faas.coldstart": AttributeMetadata( - brief="A boolean that is true if the serverless function is executed for the first time (aka cold-start).", - type=AttributeType.BOOLEAN, - keys=("faas.coldstart",), + "gcp.function.context.resource": AttributeMetadata( + brief="The resource that triggered the GCP Cloud Function event", + type=AttributeType.STRING, + keys=("gcp.function.context.resource",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example=True, + example="projects/my-project/topics/my-topic", changelog=[ - ChangelogEntry(version="0.0.0"), + ChangelogEntry( + version="0.7.0", + prs=[371], + description="Added gcp.function.context.resource attribute", + ), ], ), - "faas.cron": AttributeMetadata( - brief="A string containing the schedule period as Cron Expression.", + "gcp.function.context.source": AttributeMetadata( + brief="The source of the GCP Cloud Function event", type=AttributeType.STRING, - keys=("faas.cron",), + keys=("gcp.function.context.source",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="0/5 * * * ? *", + example="//pubsub.googleapis.com/projects/my-project/topics/my-topic", changelog=[ - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry( + version="0.7.0", + prs=[371], + description="Added gcp.function.context.source attribute", + ), ], ), - "faas.duration_in_ms": AttributeMetadata( - brief="The duration a function took to run, in milliseconds.", - type=AttributeType.INTEGER, - keys=("faas.duration_in_ms",), + "gcp.function.context.specversion": AttributeMetadata( + brief="The CloudEvents specification version of the GCP Cloud Function event", + type=AttributeType.STRING, + keys=("gcp.function.context.specversion",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=120, + example="1.0", changelog=[ - ChangelogEntry(version="0.11.0", prs=[403]), + ChangelogEntry( + version="0.7.0", + prs=[371], + description="Added gcp.function.context.specversion attribute", + ), ], ), - "faas.entry_point": AttributeMetadata( - brief="The code that's run when the cloud provider invokes your function.", + "gcp.function.context.time": AttributeMetadata( + brief="The timestamp of the GCP Cloud Function event", type=AttributeType.STRING, - keys=("faas.entry_point",), + keys=("gcp.function.context.time",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="my_main_function", + example="2024-01-01T00:00:00.000Z", changelog=[ - ChangelogEntry(version="0.11.0", prs=[403, 415]), + ChangelogEntry( + version="0.7.0", + prs=[371], + description="Added gcp.function.context.time attribute", + ), ], ), - "faas.execution": AttributeMetadata( - brief="The execution ID of the current function execution.", + "gcp.function.context.timestamp": AttributeMetadata( + brief="The legacy timestamp of the GCP Cloud Function event", type=AttributeType.STRING, - keys=( - "faas.invocation_id", - "aws.lambda.aws_request_id", - "faas.execution", - ), + keys=("gcp.function.context.timestamp",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="af9d5aa4-a685-4c5f-a22b-444f80b3cc28", - deprecation=DeprecationInfo( - replacement="faas.invocation_id", - reason="This attribute is being deprecated in favor of faas.invocation_id, which is the OTel-aligned replacement.", - status=DeprecationStatus.BACKFILL, - ), - aliases=["faas.invocation_id", "aws.lambda.aws_request_id"], + example="2024-01-01T00:00:00.000Z", changelog=[ ChangelogEntry( - version="0.16.0", - prs=[473], - description="Added faas.execution attribute, deprecated in favor of faas.invocation_id", + version="0.7.0", + prs=[371], + description="Added gcp.function.context.timestamp attribute", ), ], ), - "faas.id": AttributeMetadata( - brief="The unique ID of the single function that this runtime instance executes.", + "gcp.function.context.type": AttributeMetadata( + brief="The type of the GCP Cloud Function event context", type=AttributeType.STRING, - keys=( - "cloud.resource_id", - "faas.id", - ), + keys=("gcp.function.context.type",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="arn:aws:lambda:REGION:ACCOUNT_ID:function:my-function", - deprecation=DeprecationInfo( - 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=DeprecationStatus.BACKFILL, - ), - aliases=["cloud.resource_id"], + example="cloud_functions.context", changelog=[ ChangelogEntry( - version="0.16.0", - prs=[475], - description="Added faas.id attribute, deprecated in favor of cloud.resource_id", + version="0.7.0", + prs=[371], + description="Added gcp.function.context.type attribute", ), ], ), - "faas.identity": AttributeMetadata( - brief="The Service Account (GCP), IAM Execution Role (AWS), or Managed Identity (Azure) used by the serverless function when interacting with other cloud services", + "gcp.project.id": AttributeMetadata( + brief="The ID of the project in GCP that this resource is associated with", type=AttributeType.STRING, - keys=("faas.identity",), + keys=("gcp.project.id",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="name@project.iam.gserviceaccount.com (GCP), arn:aws:iam::123456789012:role/role-name (AWS), 00000000-0000-0000-0000-000000000000 (Azure)", + example="my-project-123", changelog=[ ChangelogEntry(version="0.11.0", prs=[403]), ], ), - "faas.invocation_id": AttributeMetadata( - brief="The invocation ID of the current function invocation.", + "gcp_region": AttributeMetadata( + brief="The geographical region the GCP resource is running", type=AttributeType.STRING, keys=( - "faas.invocation_id", - "aws.lambda.aws_request_id", - "faas.execution", + "cloud.region", + "aws_region", + "gcp_region", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="af9d5aa4-a685-4c5f-a22b-444f80b3cc28", - aliases=["aws.lambda.aws_request_id", "faas.execution"], + example="us-east-1", + examples=["us-east-1"], + deprecation=DeprecationInfo( + replacement="cloud.region", status=DeprecationStatus.BACKFILL + ), + aliases=["cloud.region", "aws_region"], changelog=[ ChangelogEntry( - version="0.16.0", - prs=[473], - description="Added faas.execution as an alias", + version="0.19.0", prs=[535], description="Added gcp_region attribute" ), - ChangelogEntry(version="0.11.1", prs=[414, 424]), ], ), - "faas.invoked_name": AttributeMetadata( - brief="The name of the invoked function.", + "gen_ai.agent.name": AttributeMetadata( + brief="The name of the agent being used.", type=AttributeType.STRING, - keys=("faas.invoked_name",), + keys=("gen_ai.agent.name",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="my-function", + example="ResearchAssistant", changelog=[ - ChangelogEntry( - version="0.16.0", - prs=[481], - description="Added faas.invoked_name attribute", - ), + ChangelogEntry(version="0.1.0", prs=[62, 127]), ], ), - "faas.invoked_provider": AttributeMetadata( - brief="The cloud provider of the invoked function.", - type=AttributeType.STRING, - keys=("faas.invoked_provider",), + "gen_ai.context.utilization": AttributeMetadata( + brief="The fraction of the model context window utilized by this generation.", + type=AttributeType.DOUBLE, + keys=("gen_ai.context.utilization",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="aws", + example=0.75, changelog=[ ChangelogEntry( - version="0.16.0", - prs=[481], - description="Added faas.invoked_provider attribute", + version="0.5.0", + prs=[315], + description="Added gen_ai.context.utilization attribute", ), ], ), - "faas.invoked_region": AttributeMetadata( - brief="The cloud region of the invoked function.", - type=AttributeType.STRING, - keys=("faas.invoked_region",), + "gen_ai.context.window_size": AttributeMetadata( + brief="The maximum context window size supported by the model for this generation.", + type=AttributeType.INTEGER, + keys=("gen_ai.context.window_size",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="eu-central-1", + example=128000, changelog=[ ChangelogEntry( - version="0.16.0", - prs=[481], - description="Added faas.invoked_region attribute", + version="0.5.0", + prs=[315], + description="Added gen_ai.context.window_size attribute", ), ], ), - "faas.name": AttributeMetadata( - brief="The name of the serverless function", - type=AttributeType.STRING, - keys=( - "faas.name", - "aws.lambda.function_name", - ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, - visibility=Visibility.PUBLIC, - example="my_function", - aliases=["aws.lambda.function_name"], - changelog=[ - ChangelogEntry(version="0.11.0", prs=[403, 415]), - ], - ), - "faas.time": AttributeMetadata( - brief="A string containing the function invocation time in the ISO 8601 format expressed in UTC.", + "gen_ai.conversation.id": AttributeMetadata( + brief="The unique identifier for a conversation (session, thread), used to store and correlate messages within this conversation.", type=AttributeType.STRING, - keys=("faas.time",), + keys=("gen_ai.conversation.id",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="2020-01-23T13:47:06Z", + example="conv_5j66UpCpwteGg4YSxUnt7lPY", changelog=[ - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.4.0", prs=[250]), ], ), - "faas.trigger": AttributeMetadata( - brief="Type of the trigger which caused this function invocation.", - type=AttributeType.STRING, - keys=("faas.trigger",), + "gen_ai.cost.cache_creation.input_tokens": AttributeMetadata( + brief="The cost of input tokens written to cache in USD.", + type=AttributeType.DOUBLE, + keys=("gen_ai.cost.cache_creation.input_tokens",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="timer", + example=12.34, changelog=[ - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry( + version="0.16.0", + description="Added gen_ai.cost.cache_creation.input_tokens attribute", + ), ], - ), - "faas.version": AttributeMetadata( - brief="The version of the function that was invoked", - type=AttributeType.STRING, - keys=( - "faas.version", - "aws.lambda.function_version", - ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, - visibility=Visibility.PUBLIC, - example="$LATEST", - aliases=["aws.lambda.function_version"], - changelog=[ - ChangelogEntry(version="0.11.1", prs=[414, 424]), + 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.", ], ), - "fcp": AttributeMetadata( - brief="The time it takes for the browser to render the first piece of meaningful content on the screen", + "gen_ai.cost.cache_read.input_tokens": AttributeMetadata( + brief="The cost of cached input tokens in USD.", type=AttributeType.DOUBLE, - keys=( - "browser.web_vital.fcp.value", - "fcp", - ), + keys=("gen_ai.cost.cache_read.input_tokens",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=547.6951, - deprecation=DeprecationInfo( - replacement="browser.web_vital.fcp.value", - reason="This attribute is being deprecated in favor of browser.web_vital.fcp.value", - status=DeprecationStatus.BACKFILL, - ), - aliases=["browser.web_vital.fcp.value"], - changelog=[ - ChangelogEntry(version="0.5.0", prs=[235]), - ], - ), - "file.path": AttributeMetadata( - brief="Path to the file.", - type=AttributeType.STRING, - keys=("file.path",), - apply_scrubbing=ApplyScrubbingInfo( - key=ApplyScrubbing.AUTO, - reason="File paths can contain end-user paths (e.g. from stack traces) that may be sensitive.", - ), - is_in_otel=True, - visibility=Visibility.PUBLIC, - example="/home/user/example.txt", + example=12.34, changelog=[ ChangelogEntry( - version="0.17.0", prs=[458], description="Added file.path attribute" + version="0.16.0", + description="Added gen_ai.cost.cache_read.input_tokens attribute", ), ], + 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.", + ], ), - "file.size": AttributeMetadata( - brief="File size in bytes.", - type=AttributeType.INTEGER, - keys=("file.size",), + "gen_ai.cost.input_tokens": AttributeMetadata( + brief="The total cost of all input tokens in USD (includes cached and cache creation tokens).", + type=AttributeType.DOUBLE, + keys=("gen_ai.cost.input_tokens",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example=1024, + example=123.45, changelog=[ ChangelogEntry( - version="0.17.0", prs=[458], description="Added file.size attribute" + version="0.9.0", prs=[397], description="Add additional_context" ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[112]), + ], + 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.", ], ), - "flag.evaluation.": AttributeMetadata( - brief="An instance of a feature flag evaluation. The value of this attribute is the boolean representing the evaluation result. The suffix is the name of the feature flag.", - type=AttributeType.BOOLEAN, - keys=("flag.evaluation.",), + "gen_ai.cost.output_tokens": AttributeMetadata( + brief="The total cost of all output tokens in USD (includes reasoning tokens).", + type=AttributeType.DOUBLE, + keys=("gen_ai.cost.output_tokens",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - has_dynamic_suffix=True, - example="flag.evaluation.is_new_ui=true", + example=123.45, changelog=[ - ChangelogEntry(version="0.1.0", prs=[103]), + ChangelogEntry( + version="0.9.0", prs=[397], description="Add additional_context" + ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[112]), + ], + 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.", ], ), - "fp": AttributeMetadata( - brief="The time it takes for the browser to render the first pixel on the screen", + "gen_ai.cost.reasoning.output_tokens": AttributeMetadata( + brief="The cost of reasoning output tokens in USD.", type=AttributeType.DOUBLE, - keys=( - "browser.web_vital.fp.value", - "fp", - ), + keys=("gen_ai.cost.reasoning.output_tokens",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=477.1926, - deprecation=DeprecationInfo( - replacement="browser.web_vital.fp.value", - reason="This attribute is being deprecated in favor of browser.web_vital.fp.value", - status=DeprecationStatus.BACKFILL, - ), - aliases=["browser.web_vital.fp.value"], + example=12.34, changelog=[ - ChangelogEntry(version="0.5.0", prs=[235]), + ChangelogEntry( + version="0.16.0", + description="Added gen_ai.cost.reasoning.output_tokens attribute", + ), + ], + 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.", ], ), - "frames.delay": AttributeMetadata( - 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=AttributeType.INTEGER, + "gen_ai.cost.total_tokens": AttributeMetadata( + brief="The total cost for the tokens used.", + type=AttributeType.DOUBLE, keys=( - "app.vitals.frames.delay.value", - "frames.delay", - "mobile.frames_delay", + "gen_ai.cost.total_tokens", + "ai.total_cost", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=5, - deprecation=DeprecationInfo( - 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=DeprecationStatus.BACKFILL, - ), - aliases=["app.vitals.frames.delay.value"], + example=12.34, + aliases=["ai.total_cost"], changelog=[ ChangelogEntry( - version="0.5.0", - prs=[313], - description="Deprecated in favor of app.vitals.frames.delay.value", + version="0.9.0", prs=[397], description="Add additional_context" ), + ChangelogEntry(version="0.5.0", prs=[264]), ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.1.0", prs=[126]), + ], + 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.total_tokens', this value is cost in USD, not a token count. For token counts, use gen_ai.usage.total_tokens.", ], - search_alias=SearchAlias(name="mobile.frames_delay", type="second"), ), - "frames.frozen": AttributeMetadata( - brief="The number of frozen frames rendered during the lifetime of the span.", - type=AttributeType.INTEGER, - keys=( - "app.vitals.frames.frozen.count", - "frames.frozen", - "mobile.frozen_frames", - "sentry.frames.frozen", - ), + "gen_ai.embeddings.input": AttributeMetadata( + brief="The input to the embeddings model.", + type=AttributeType.STRING, + keys=("gen_ai.embeddings.input",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=3, - deprecation=DeprecationInfo( - replacement="app.vitals.frames.frozen.count", - reason="Replaced by app.vitals.frames.frozen.count to align with the app.vitals.* namespace for mobile performance attributes", - status=DeprecationStatus.BACKFILL, - ), - aliases=["app.vitals.frames.frozen.count", "sentry.frames.frozen"], + example="What's the weather in Paris?", changelog=[ - ChangelogEntry( - version="0.19.0", - prs=[500], - description="Added sentry.frames.frozen as an alias", - ), - ChangelogEntry( - version="0.5.0", - prs=[313], - description="Deprecated in favor of app.vitals.frames.frozen.count", - ), - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.3.1", prs=[195]), ], - search_alias=SearchAlias(name="mobile.frozen_frames"), ), - "frames.slow": AttributeMetadata( - brief="The number of slow frames rendered during the lifetime of the span.", - type=AttributeType.INTEGER, - keys=( - "app.vitals.frames.slow.count", - "frames.slow", - "mobile.slow_frames", - "sentry.frames.slow", - ), + "gen_ai.function_id": AttributeMetadata( + brief="Framework-specific tracing label for the execution of a function or other unit of execution in a generative AI system.", + type=AttributeType.STRING, + keys=("gen_ai.function_id",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=1, - deprecation=DeprecationInfo( - replacement="app.vitals.frames.slow.count", - reason="Replaced by app.vitals.frames.slow.count to align with the app.vitals.* namespace for mobile performance attributes", - status=DeprecationStatus.BACKFILL, - ), - aliases=["app.vitals.frames.slow.count", "sentry.frames.slow"], + example="my-awesome-function", changelog=[ - ChangelogEntry( - version="0.19.0", - prs=[500], - description="Added sentry.frames.slow as an alias", - ), ChangelogEntry( version="0.5.0", - prs=[313], - description="Deprecated in favor of app.vitals.frames.slow.count", + prs=[308], + description="Added gen_ai.function_id attribute", ), - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.0.0"), ], - search_alias=SearchAlias(name="mobile.slow_frames"), ), - "frames.total": AttributeMetadata( - brief="The number of total frames rendered during the lifetime of the span.", - type=AttributeType.INTEGER, + "gen_ai.input.messages": AttributeMetadata( + 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:"..."}`. For `gen_ai.evaluate` operations, the array holds one object `{type: "evaluation", state: ..., questions: {...}}` with the evaluated state and the questions keyed by name, as the caller passed them.', + type=AttributeType.STRING, keys=( - "app.vitals.frames.total.count", - "frames.total", - "mobile.total_frames", - "sentry.frames.total", + "gen_ai.input.messages", + "ai.input_messages", + "ai.prompt", + "ai.prompt.messages", + "ai.texts", + "gen_ai.prompt", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=60, - deprecation=DeprecationInfo( - replacement="app.vitals.frames.total.count", - reason="Replaced by app.vitals.frames.total.count to align with the app.vitals.* namespace for mobile performance attributes", - status=DeprecationStatus.BACKFILL, - ), - aliases=["app.vitals.frames.total.count", "sentry.frames.total"], + 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"}]}]', + aliases=["ai.texts", "ai.prompt.messages", "gen_ai.prompt", "ai.prompt"], changelog=[ ChangelogEntry( - version="0.19.0", - prs=[500], - description="Added sentry.frames.total as an alias", + version="0.26.0", + prs=[650], + description="Describe the evaluation message shape for gen_ai.evaluate", ), ChangelogEntry( - version="0.5.0", - prs=[313], - description="Deprecated in favor of app.vitals.frames.total.count", + version="0.21.0", prs=[583], description="Added ai.prompt as an alias" ), - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.5.0", prs=[264]), + ChangelogEntry(version="0.4.0", prs=[221]), ], - search_alias=SearchAlias(name="mobile.total_frames"), ), - "frames_frozen_rate": AttributeMetadata( - brief="The rate of frozen frames, or `app.vitals.frames.frozen.count` divided by `app.vitals.frames.total.count`. This is computed by Relay.", - type=AttributeType.DOUBLE, - keys=( - "app.vitals.frames.frozen.rate", - "frames_frozen_rate", - ), + "gen_ai.memory.query.text": AttributeMetadata( + brief="The search query used to retrieve memories. Only applicable to 'search_memory'. Opt-in: instrumentations SHOULD NOT capture this by default and SHOULD gate it behind explicit user opt-in, as it may contain sensitive information.", + type=AttributeType.STRING, + keys=("gen_ai.memory.query.text",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - deprecation=DeprecationInfo( - replacement="app.vitals.frames.frozen.rate", - reason="Replaced by app.vitals.frames.frozen.rate to align with the app.vitals.* namespace for mobile performance attributes", - status=DeprecationStatus.BACKFILL, - ), - aliases=["app.vitals.frames.frozen.rate"], + example="user dietary preferences", + examples=["user dietary preferences", "past flight bookings"], changelog=[ ChangelogEntry( - version="0.19.0", - prs=[493], - description="Deprecated in favor of app.vitals.frames.frozen.rate", - ), - ChangelogEntry( - version="0.7.0", - prs=[362], - description="Added frames_frozen_rate attribute", + version="next", + prs=[653], + description="Added gen_ai.memory.query.text attribute", ), ], ), - "frames_slow_rate": AttributeMetadata( - brief="The rate of slow frames, or `app.vitals.frames.slow.count` divided by `app.vitals.frames.total.count`. This is computed by Relay.", - type=AttributeType.DOUBLE, - keys=( - "app.vitals.frames.slow.rate", - "frames_slow_rate", - ), + "gen_ai.memory.record.count": AttributeMetadata( + brief="The number of memory records relevant to the operation. For 'search_memory' this is the number returned; for 'create_memory', 'update_memory', 'upsert_memory' and 'delete_memory' it is the number the operation attempted to create, modify, create-or-update, or delete respectively.", + type=AttributeType.INTEGER, + keys=("gen_ai.memory.record.count",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - deprecation=DeprecationInfo( - replacement="app.vitals.frames.slow.rate", - reason="Replaced by app.vitals.frames.slow.rate to align with the app.vitals.* namespace for mobile performance attributes", - status=DeprecationStatus.BACKFILL, - ), - aliases=["app.vitals.frames.slow.rate"], + example=3, + examples=[3], changelog=[ ChangelogEntry( - version="0.19.0", - prs=[493], - description="Deprecated in favor of app.vitals.frames.slow.rate", - ), - ChangelogEntry( - version="0.7.0", - prs=[362], - description="Added frames_slow_rate attribute", + version="next", + prs=[653], + description="Added gen_ai.memory.record.count attribute", ), ], ), - "fs_error": AttributeMetadata( - brief="The error message of a file system error.", + "gen_ai.memory.record.id": AttributeMetadata( + brief="The unique identifier of the memory record. Set when the operation applies to a specific memory record. For 'delete_memory', its absence may indicate the operation intends to delete all memory records in the store.", type=AttributeType.STRING, - keys=("fs_error",), + keys=("gen_ai.memory.record.id",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="ENOENT: no such file or directory", - deprecation=DeprecationInfo( - replacement="error.type", - reason="This attribute is not part of the OpenTelemetry specification and error.type fits much better. The value changes from the full error message to the syscall error code, so the old value cannot be copied over.", - ), + example="mem_5j66UpCpwteGg4YSxUnt7lPY", + examples=["mem_5j66UpCpwteGg4YSxUnt7lPY"], changelog=[ ChangelogEntry( - version="0.23.0", - prs=[638], - description="Remove unnecessary transformation and change deprecation status to null.", - ), - ChangelogEntry( - version="0.22.0", - prs=[589], - description="Transform fs_error into error.type", + version="next", + prs=[653], + description="Added gen_ai.memory.record.id attribute", ), - ChangelogEntry(version="0.1.0", prs=[61, 127]), - ChangelogEntry(version="0.0.0"), ], ), - "gcp.function.context.event_id": AttributeMetadata( - brief="The event ID from the legacy GCP Cloud Function context (1st gen)", + "gen_ai.memory.records": AttributeMetadata( + brief="The memory records stored or retrieved in a memory operation. Stringified JSON array; each element follows the OTel MemoryRecord schema: {content (required), id, metadata, score}. Opt-in: instrumentations SHOULD NOT capture this by default and SHOULD gate it behind explicit user opt-in, as it may contain sensitive information including user/PII data.", type=AttributeType.STRING, - keys=("gcp.function.context.event_id",), + keys=("gen_ai.memory.records",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="1234567890", + example='[{"content": "User prefers dark mode", "id": "mem_123", "score": 0.95}, {"content": {"preference": "vegetarian meals", "confidence": 0.9}, "metadata": {"source": "profile"}}]', + examples=[ + '[{"content": "User prefers dark mode", "id": "mem_123", "score": 0.95}, {"content": {"preference": "vegetarian meals", "confidence": 0.9}, "metadata": {"source": "profile"}}]' + ], changelog=[ ChangelogEntry( - version="0.7.0", - prs=[371], - description="Added gcp.function.context.event_id attribute", + version="next", + prs=[653], + description="Added gen_ai.memory.records attribute", ), ], ), - "gcp.function.context.event_type": AttributeMetadata( - brief="The type of the GCP Cloud Function event", + "gen_ai.memory.store.id": AttributeMetadata( + brief="The unique identifier of the memory store the operation targets. What this maps to is implementation-specific (e.g. a collection, namespace, or vector index) and SHOULD be documented per integration.", type=AttributeType.STRING, - keys=("gcp.function.context.event_type",), + keys=("gen_ai.memory.store.id",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="google.pubsub.topic.publish", + example="ms_abc123", + examples=["ms_abc123", "user-preferences-store", "seer-knowledge"], changelog=[ ChangelogEntry( - version="0.7.0", - prs=[371], - description="Added gcp.function.context.event_type attribute", + version="next", + prs=[653], + description="Added gen_ai.memory.store.id attribute", ), ], ), - "gcp.function.context.id": AttributeMetadata( - brief="The unique event ID from the GCP CloudEvents context (2nd gen Cloud Functions)", + "gen_ai.operation.name": AttributeMetadata( + brief="The name of the operation being performed.", type=AttributeType.STRING, - keys=("gcp.function.context.id",), + keys=("gen_ai.operation.name",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="1234567890", + example="chat", changelog=[ ChangelogEntry( - version="0.7.0", - prs=[371], - description="Added gcp.function.context.id attribute", + version="next", + prs=[653, 680], + description="Added memory operation values and 'evaluate' to the well-known values", ), + ChangelogEntry(version="0.4.0", prs=[225]), + ChangelogEntry(version="0.1.0", prs=[62, 127]), ], ), - "gcp.function.context.resource": AttributeMetadata( - brief="The resource that triggered the GCP Cloud Function event", + "gen_ai.operation.type": AttributeMetadata( + brief="The type of AI operation. Added during ingestion based on span.op and gen_ai.operation.type. Used to filter and aggregate data in the UI", type=AttributeType.STRING, - keys=("gcp.function.context.resource",), + keys=("gen_ai.operation.type",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="projects/my-project/topics/my-topic", + example="tool", changelog=[ ChangelogEntry( - version="0.7.0", - prs=[371], - description="Added gcp.function.context.resource attribute", + version="next", prs=[653], description="Added 'memory' value" ), + ChangelogEntry(version="0.4.0", prs=[257]), + ChangelogEntry(version="0.1.0", prs=[113, 127]), ], ), - "gcp.function.context.source": AttributeMetadata( - brief="The source of the GCP Cloud Function event", + "gen_ai.output.messages": AttributeMetadata( + 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. For `gen_ai.evaluate` operations, the array holds one object `{type: "evaluation", answers: {...}}` with the answers keyed by question name, as the provider returned them.', type=AttributeType.STRING, - keys=("gcp.function.context.source",), + keys=( + "gen_ai.output.messages", + "ai.response.text", + "ai.response.toolCalls", + "ai.responses", + "ai.tool_calls", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="//pubsub.googleapis.com/projects/my-project/topics/my-topic", + example='[{"role": "assistant", "parts": [{"type": "text", "content": "The weather in Paris is currently rainy with a temperature of 57°F."}], "finish_reason": "stop"}]', + aliases=["ai.response.toolCalls", "ai.response.text"], changelog=[ ChangelogEntry( - version="0.7.0", - prs=[371], - description="Added gcp.function.context.source attribute", + version="0.26.0", + prs=[650], + description="Describe the evaluation message shape for gen_ai.evaluate", ), + ChangelogEntry(version="0.4.0", prs=[221]), ], ), - "gcp.function.context.specversion": AttributeMetadata( - brief="The CloudEvents specification version of the GCP Cloud Function event", + "gen_ai.pipeline.name": AttributeMetadata( + brief="Name of the AI pipeline or chain being executed.", type=AttributeType.STRING, - keys=("gcp.function.context.specversion",), + keys=( + "gen_ai.pipeline.name", + "ai.pipeline.name", + "langchain.chain.name", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="1.0", + example="Autofix Pipeline", + aliases=["ai.pipeline.name", "langchain.chain.name"], changelog=[ ChangelogEntry( - version="0.7.0", - prs=[371], - description="Added gcp.function.context.specversion attribute", + version="0.22.0", + prs=[599], + description="Added langchain.chain.name as an alias", ), + ChangelogEntry(version="0.1.0", prs=[76, 127]), ], ), - "gcp.function.context.time": AttributeMetadata( - brief="The timestamp of the GCP Cloud Function event", + "gen_ai.prompt": AttributeMetadata( + brief="The input messages sent to the model", type=AttributeType.STRING, - keys=("gcp.function.context.time",), + keys=( + "gen_ai.input.messages", + "ai.input_messages", + "ai.prompt", + "ai.prompt.messages", + "ai.texts", + "gen_ai.prompt", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="2024-01-01T00:00:00.000Z", + example='[{"role": "user", "message": "hello"}]', + deprecation=DeprecationInfo( + replacement="gen_ai.input.messages", + reason="Deprecated from OTEL, use gen_ai.input.messages with the new format instead.", + status=DeprecationStatus.BACKFILL, + ), + aliases=[ + "gen_ai.input.messages", + "ai.texts", + "ai.prompt.messages", + "ai.prompt", + ], changelog=[ ChangelogEntry( - version="0.7.0", - prs=[371], - description="Added gcp.function.context.time attribute", + version="0.21.0", prs=[583], description="Added ai.prompt as an alias" ), + ChangelogEntry(version="0.1.0", prs=[74, 108, 119]), + ChangelogEntry(version="0.0.0"), ], ), - "gcp.function.context.timestamp": AttributeMetadata( - brief="The legacy timestamp of the GCP Cloud Function event", + "gen_ai.prompt.name": AttributeMetadata( + brief="The name of the prompt that uniquely identifies it.", type=AttributeType.STRING, - keys=("gcp.function.context.timestamp",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + keys=( + "gen_ai.prompt.name", + "mcp.prompt.name", + ), + apply_scrubbing=ApplyScrubbingInfo( + key=ApplyScrubbing.MANUAL, + reason="Prompt names may reveal user behavior patterns or sensitive operations", + ), + is_in_otel=True, visibility=Visibility.PUBLIC, - example="2024-01-01T00:00:00.000Z", + example="summarize_text", + aliases=["mcp.prompt.name"], changelog=[ ChangelogEntry( - version="0.7.0", - prs=[371], - description="Added gcp.function.context.timestamp attribute", + version="0.12.0", + prs=[420], + description="Added gen_ai.prompt.name attribute", ), ], ), - "gcp.function.context.type": AttributeMetadata( - brief="The type of the GCP Cloud Function event context", + "gen_ai.prompt.variable.": AttributeMetadata( + brief="Variables supplied to the prompt template. The is the variable name, and the value is the variable value serialized as a string.", type=AttributeType.STRING, - keys=("gcp.function.context.type",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + keys=("gen_ai.prompt.variable.",), + apply_scrubbing=ApplyScrubbingInfo( + key=ApplyScrubbing.AUTO, + reason="Prompt variables contain user input and may include sensitive information", + ), + is_in_otel=True, visibility=Visibility.PUBLIC, - example="cloud_functions.context", + has_dynamic_suffix=True, + example="gen_ai.prompt.variable.language='French'", + examples=[ + "gen_ai.prompt.variable.language='French'", + "gen_ai.prompt.variable.topic='weather'", + ], changelog=[ ChangelogEntry( - version="0.7.0", - prs=[371], - description="Added gcp.function.context.type attribute", + version="next", + prs=[671], + description="Added the OpenTelemetry convention for prompt variables", ), ], + additional_context=[ + "Capture only when the user explicitly opts in to recording prompt inputs. In MCP, these values are the arguments supplied in prompts/get requests." + ], ), - "gcp.project.id": AttributeMetadata( - brief="The ID of the project in GCP that this resource is associated with", + "gen_ai.provider.name": AttributeMetadata( + brief="The Generative AI provider as identified by the client or server instrumentation.", type=AttributeType.STRING, - keys=("gcp.project.id",), + keys=( + "gen_ai.provider.name", + "ai.model.provider", + "gen_ai.system", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="my-project-123", + example="openai", + aliases=["ai.model.provider", "gen_ai.system"], changelog=[ - ChangelogEntry(version="0.11.0", prs=[403]), + ChangelogEntry(version="0.4.0", prs=[253]), ], ), - "gcp_region": AttributeMetadata( - brief="The geographical region the GCP resource is running", + "gen_ai.request.available_tools": AttributeMetadata( + brief="The available tools for the model. It has to be a stringified version of an array of objects.", type=AttributeType.STRING, keys=( - "cloud.region", - "aws_region", - "gcp_region", + "gen_ai.tool.definitions", + "ai.prompt.tools", + "ai.tools", + "gen_ai.request.available_tools", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="us-east-1", - examples=["us-east-1"], + example='[{"name": "get_weather", "description": "Get the weather for a given location"}, {"name": "get_news", "description": "Get the news for a given topic"}]', deprecation=DeprecationInfo( - replacement="cloud.region", status=DeprecationStatus.BACKFILL + replacement="gen_ai.tool.definitions", status=DeprecationStatus.NORMALIZE ), - aliases=["cloud.region", "aws_region"], + aliases=["gen_ai.tool.definitions"], changelog=[ ChangelogEntry( - version="0.19.0", prs=[535], description="Added gcp_region attribute" + version="0.22.0", + prs=[595], + description="Added gen_ai.tool.definitions as an alias", ), + ChangelogEntry(version="0.4.0", prs=[221]), + ChangelogEntry(version="0.1.0", prs=[63, 127]), ], ), - "gen_ai.agent.name": AttributeMetadata( - brief="The name of the agent being used.", - type=AttributeType.STRING, - keys=("gen_ai.agent.name",), + "gen_ai.request.frequency_penalty": AttributeMetadata( + 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=AttributeType.DOUBLE, + keys=( + "gen_ai.request.frequency_penalty", + "ai.frequency_penalty", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="ResearchAssistant", + example=0.5, + aliases=["ai.frequency_penalty"], changelog=[ - ChangelogEntry(version="0.1.0", prs=[62, 127]), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[57]), ], ), - "gen_ai.context.utilization": AttributeMetadata( - brief="The fraction of the model context window utilized by this generation.", - type=AttributeType.DOUBLE, - keys=("gen_ai.context.utilization",), + "gen_ai.request.max_tokens": AttributeMetadata( + brief="The maximum number of tokens to generate in the response.", + type=AttributeType.INTEGER, + keys=("gen_ai.request.max_tokens",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=0.75, + example=2048, changelog=[ - ChangelogEntry( - version="0.5.0", - prs=[315], - description="Added gen_ai.context.utilization attribute", - ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[62]), ], ), - "gen_ai.context.window_size": AttributeMetadata( - brief="The maximum context window size supported by the model for this generation.", - type=AttributeType.INTEGER, - keys=("gen_ai.context.window_size",), + "gen_ai.request.messages": AttributeMetadata( + 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=AttributeType.STRING, + keys=("gen_ai.request.messages",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=128000, + 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=DeprecationInfo( + replacement="gen_ai.input.messages", + status=DeprecationStatus.TRANSFORM, + transformation="gen_ai_request_messages_to_input_messages", + ), + aliases=["ai.input_messages"], changelog=[ - ChangelogEntry( - version="0.5.0", - prs=[315], - description="Added gen_ai.context.window_size attribute", - ), + ChangelogEntry(version="0.4.0", prs=[221]), + ChangelogEntry(version="0.1.0", prs=[63, 74, 108, 119, 122]), ], ), - "gen_ai.conversation.id": AttributeMetadata( - brief="The unique identifier for a conversation (session, thread), used to store and correlate messages within this conversation.", + "gen_ai.request.model": AttributeMetadata( + brief="The model identifier being used for the request.", type=AttributeType.STRING, - keys=("gen_ai.conversation.id",), + keys=( + "gen_ai.request.model", + "ai.model.id", + "ai.model_id", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="conv_5j66UpCpwteGg4YSxUnt7lPY", + example="gpt-4-turbo-preview", + aliases=["ai.model_id", "ai.model.id"], changelog=[ - ChangelogEntry(version="0.4.0", prs=[250]), + ChangelogEntry( + version="0.21.0", prs=[583], description="Added ai.model.id as an alias" + ), + ChangelogEntry(version="0.1.0", prs=[62, 127]), ], ), - "gen_ai.cost.cache_creation.input_tokens": AttributeMetadata( - brief="The cost of input tokens written to cache in USD.", + "gen_ai.request.presence_penalty": AttributeMetadata( + brief="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.", type=AttributeType.DOUBLE, - keys=("gen_ai.cost.cache_creation.input_tokens",), + keys=( + "gen_ai.request.presence_penalty", + "ai.presence_penalty", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=12.34, + example=0.5, + aliases=["ai.presence_penalty"], changelog=[ - ChangelogEntry( - version="0.16.0", - description="Added gen_ai.cost.cache_creation.input_tokens attribute", - ), - ], - 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.", + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[57]), ], ), - "gen_ai.cost.cache_read.input_tokens": AttributeMetadata( - brief="The cost of cached input tokens in USD.", - type=AttributeType.DOUBLE, - keys=("gen_ai.cost.cache_read.input_tokens",), + "gen_ai.request.reasoning.level": AttributeMetadata( + brief="The reasoning or thinking effort level requested for a GenAI model.", + type=AttributeType.STRING, + keys=("gen_ai.request.reasoning.level",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=12.34, + example="high", changelog=[ ChangelogEntry( - version="0.16.0", - description="Added gen_ai.cost.cache_read.input_tokens attribute", + version="0.17.0", + prs=[502], + description="Added gen_ai.request.reasoning.level attribute", ), ], - 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.", - ], ), - "gen_ai.cost.input_tokens": AttributeMetadata( - brief="The total cost of all input tokens in USD (includes cached and cache creation tokens).", - type=AttributeType.DOUBLE, - keys=("gen_ai.cost.input_tokens",), + "gen_ai.request.schema": AttributeMetadata( + brief="The stringified JSON schema the model output must conform to.", + type=AttributeType.STRING, + keys=("gen_ai.request.schema",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=123.45, + example='{"type":"object","properties":{"city":{"type":"string"}}}', + examples=['{"type":"object","properties":{"city":{"type":"string"}}}'], + deprecation=DeprecationInfo( + reason="This attribute is deprecated. The Sentry conventions have no replacement for the requested output schema." + ), changelog=[ ChangelogEntry( - version="0.9.0", prs=[397], description="Add additional_context" + version="0.21.0", + prs=[583], + description="Added gen_ai.request.schema attribute", ), - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[112]), - ], - 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.", ], ), - "gen_ai.cost.output_tokens": AttributeMetadata( - brief="The total cost of all output tokens in USD (includes reasoning tokens).", - type=AttributeType.DOUBLE, - keys=("gen_ai.cost.output_tokens",), + "gen_ai.request.seed": AttributeMetadata( + brief="The seed, ideally models given the same seed and same other parameters will produce the exact same output.", + type=AttributeType.STRING, + keys=( + "gen_ai.request.seed", + "ai.seed", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=123.45, + example="1234567890", + aliases=["ai.seed"], changelog=[ - ChangelogEntry( - version="0.9.0", prs=[397], description="Add additional_context" - ), - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[112]), - ], - 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.", + ChangelogEntry(version="0.1.0", prs=[57, 127]), ], ), - "gen_ai.cost.reasoning.output_tokens": AttributeMetadata( - brief="The cost of reasoning output tokens in USD.", - type=AttributeType.DOUBLE, - keys=("gen_ai.cost.reasoning.output_tokens",), + "gen_ai.request.stop_sequences": AttributeMetadata( + brief="List of sequences that the model will use to stop generating further tokens.", + type=AttributeType.STRING_ARRAY, + keys=("gen_ai.request.stop_sequences",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=12.34, + example=["forest", "lived"], changelog=[ ChangelogEntry( version="0.16.0", - description="Added gen_ai.cost.reasoning.output_tokens attribute", + prs=[482], + description="Added gen_ai.request.stop_sequences attribute", ), ], - 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.", - ], ), - "gen_ai.cost.total_tokens": AttributeMetadata( - brief="The total cost for the tokens used.", + "gen_ai.request.temperature": AttributeMetadata( + brief="For an AI model call, the temperature parameter. Temperature essentially means how random the output will be.", type=AttributeType.DOUBLE, keys=( - "gen_ai.cost.total_tokens", - "ai.total_cost", + "gen_ai.request.temperature", + "ai.temperature", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=12.34, - aliases=["ai.total_cost"], + example=0.1, + aliases=["ai.temperature"], changelog=[ - ChangelogEntry( - version="0.9.0", prs=[397], description="Add additional_context" - ), - ChangelogEntry(version="0.5.0", prs=[264]), ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[126]), - ], - 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.total_tokens', this value is cost in USD, not a token count. For token counts, use gen_ai.usage.total_tokens.", + ChangelogEntry(version="0.1.0", prs=[57]), ], ), - "gen_ai.embeddings.input": AttributeMetadata( - brief="The input to the embeddings model.", - type=AttributeType.STRING, - keys=("gen_ai.embeddings.input",), + "gen_ai.request.top_k": AttributeMetadata( + 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=AttributeType.INTEGER, + keys=( + "gen_ai.request.top_k", + "ai.top_k", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="What's the weather in Paris?", + example=35, + aliases=["ai.top_k"], changelog=[ - ChangelogEntry(version="0.3.1", prs=[195]), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[57]), ], ), - "gen_ai.function_id": AttributeMetadata( - brief="Framework-specific tracing label for the execution of a function or other unit of execution in a generative AI system.", - type=AttributeType.STRING, - keys=("gen_ai.function_id",), + "gen_ai.request.top_p": AttributeMetadata( + 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=AttributeType.DOUBLE, + keys=( + "gen_ai.request.top_p", + "ai.top_p", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="my-awesome-function", + example=0.7, + aliases=["ai.top_p"], changelog=[ - ChangelogEntry( - version="0.5.0", - prs=[308], - description="Added gen_ai.function_id attribute", - ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[57]), ], ), - "gen_ai.input.messages": AttributeMetadata( - 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:"..."}`. For `gen_ai.evaluate` operations, the array holds one object `{type: "evaluation", state: ..., questions: {...}}` with the evaluated state and the questions keyed by name, as the caller passed them.', + "gen_ai.response.finish_reason": AttributeMetadata( + brief="The reason why the model stopped generating (singular form).", type=AttributeType.STRING, keys=( - "gen_ai.input.messages", - "ai.input_messages", - "ai.prompt", - "ai.prompt.messages", - "ai.texts", - "gen_ai.prompt", + "gen_ai.response.finish_reasons", + "ai.finish_reason", + "gen_ai.response.finish_reason", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=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"}]}]', - aliases=["ai.texts", "ai.prompt.messages", "gen_ai.prompt", "ai.prompt"], + example="COMPLETE", + deprecation=DeprecationInfo( + replacement="gen_ai.response.finish_reasons", + status=DeprecationStatus.NORMALIZE, + ), + aliases=["gen_ai.response.finish_reasons"], changelog=[ ChangelogEntry( - version="0.26.0", - prs=[650], - description="Describe the evaluation message shape for gen_ai.evaluate", - ), - ChangelogEntry( - version="0.21.0", prs=[583], description="Added ai.prompt as an alias" + version="0.19.0", + prs=[498], + description="Added gen_ai.response.finish_reason attribute", ), - ChangelogEntry(version="0.5.0", prs=[264]), - ChangelogEntry(version="0.4.0", prs=[221]), ], ), - "gen_ai.memory.query.text": AttributeMetadata( - brief="The search query used to retrieve memories. Only applicable to 'search_memory'. Opt-in: instrumentations SHOULD NOT capture this by default and SHOULD gate it behind explicit user opt-in, as it may contain sensitive information.", + "gen_ai.response.finish_reasons": AttributeMetadata( + brief="The reason why the model stopped generating.", type=AttributeType.STRING, - keys=("gen_ai.memory.query.text",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, - visibility=Visibility.PUBLIC, - example="user dietary preferences", - examples=["user dietary preferences", "past flight bookings"], - changelog=[ - ChangelogEntry( - version="next", - prs=[653], - description="Added gen_ai.memory.query.text attribute", - ), - ], - ), - "gen_ai.memory.record.count": AttributeMetadata( - brief="The number of memory records relevant to the operation. For 'search_memory' this is the number returned; for 'create_memory', 'update_memory', 'upsert_memory' and 'delete_memory' it is the number the operation attempted to create, modify, create-or-update, or delete respectively.", - type=AttributeType.INTEGER, - keys=("gen_ai.memory.record.count",), + keys=( + "gen_ai.response.finish_reasons", + "ai.finish_reason", + "gen_ai.response.finish_reason", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example=3, - examples=[3], + example="COMPLETE", + aliases=["ai.finish_reason", "gen_ai.response.finish_reason"], changelog=[ - ChangelogEntry( - version="next", - prs=[653], - description="Added gen_ai.memory.record.count attribute", - ), + ChangelogEntry(version="0.1.0", prs=[57, 127]), ], ), - "gen_ai.memory.record.id": AttributeMetadata( - brief="The unique identifier of the memory record. Set when the operation applies to a specific memory record. For 'delete_memory', its absence may indicate the operation intends to delete all memory records in the store.", + "gen_ai.response.id": AttributeMetadata( + brief="Unique identifier for the completion.", type=AttributeType.STRING, - keys=("gen_ai.memory.record.id",), + keys=( + "gen_ai.response.id", + "ai.generation_id", + "ai.response.id", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="mem_5j66UpCpwteGg4YSxUnt7lPY", - examples=["mem_5j66UpCpwteGg4YSxUnt7lPY"], + example="gen_123abc", + aliases=["ai.generation_id", "ai.response.id"], changelog=[ ChangelogEntry( - version="next", - prs=[653], - description="Added gen_ai.memory.record.id attribute", + version="0.21.0", + prs=[583], + description="Added ai.response.id as an alias", ), + ChangelogEntry(version="0.1.0", prs=[57, 127]), ], ), - "gen_ai.memory.records": AttributeMetadata( - brief="The memory records stored or retrieved in a memory operation. Stringified JSON array; each element follows the OTel MemoryRecord schema: {content (required), id, metadata, score}. Opt-in: instrumentations SHOULD NOT capture this by default and SHOULD gate it behind explicit user opt-in, as it may contain sensitive information including user/PII data.", + "gen_ai.response.model": AttributeMetadata( + brief="The vendor-specific ID of the model used.", type=AttributeType.STRING, - keys=("gen_ai.memory.records",), + keys=( + "gen_ai.response.model", + "ai.response.model", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example='[{"content": "User prefers dark mode", "id": "mem_123", "score": 0.95}, {"content": {"preference": "vegetarian meals", "confidence": 0.9}, "metadata": {"source": "profile"}}]', - examples=[ - '[{"content": "User prefers dark mode", "id": "mem_123", "score": 0.95}, {"content": {"preference": "vegetarian meals", "confidence": 0.9}, "metadata": {"source": "profile"}}]' - ], + example="gpt-4", + aliases=["ai.response.model"], changelog=[ ChangelogEntry( - version="next", - prs=[653], - description="Added gen_ai.memory.records attribute", + version="0.21.0", + prs=[583], + description="Added ai.response.model as an alias", ), + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), ], ), - "gen_ai.memory.store.id": AttributeMetadata( - brief="The unique identifier of the memory store the operation targets. What this maps to is implementation-specific (e.g. a collection, namespace, or vector index) and SHOULD be documented per integration.", + "gen_ai.response.object": AttributeMetadata( + brief="The type of the object returned by the model.", type=AttributeType.STRING, - keys=("gen_ai.memory.store.id",), + keys=("gen_ai.response.object",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="ms_abc123", - examples=["ms_abc123", "user-preferences-store", "seer-knowledge"], + example="chat.completion", + examples=["chat.completion"], + deprecation=DeprecationInfo( + reason="This attribute is deprecated. The Sentry conventions have no replacement for the raw response object type." + ), changelog=[ ChangelogEntry( - version="next", - prs=[653], - description="Added gen_ai.memory.store.id attribute", + version="0.21.0", + prs=[583], + description="Added gen_ai.response.object attribute", ), ], ), - "gen_ai.operation.name": AttributeMetadata( - brief="The name of the operation being performed.", - type=AttributeType.STRING, - keys=("gen_ai.operation.name",), + "gen_ai.response.streaming": AttributeMetadata( + brief="Whether or not the AI model call's response was streamed back asynchronously", + type=AttributeType.BOOLEAN, + keys=( + "gen_ai.response.streaming", + "ai.streaming", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="chat", + example=True, + aliases=["ai.streaming"], changelog=[ - ChangelogEntry( - version="next", - prs=[653, 680], - description="Added memory operation values and 'evaluate' to the well-known values", - ), - ChangelogEntry(version="0.4.0", prs=[225]), - ChangelogEntry(version="0.1.0", prs=[62, 127]), + ChangelogEntry(version="0.1.0", prs=[76]), ], ), - "gen_ai.operation.type": AttributeMetadata( - brief="The type of AI operation. Added during ingestion based on span.op and gen_ai.operation.type. Used to filter and aggregate data in the UI", + "gen_ai.response.text": AttributeMetadata( + brief="The model's response text messages. It has to be a stringified version of an array of response text messages.", type=AttributeType.STRING, - keys=("gen_ai.operation.type",), + keys=("gen_ai.response.text",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="tool", + 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=DeprecationInfo( + replacement="gen_ai.output.messages", + status=DeprecationStatus.TRANSFORM, + transformation="gen_ai_response_to_output_messages", + ), changelog=[ - ChangelogEntry( - version="next", prs=[653], description="Added 'memory' value" - ), - ChangelogEntry(version="0.4.0", prs=[257]), - ChangelogEntry(version="0.1.0", prs=[113, 127]), + ChangelogEntry(version="0.4.0", prs=[221]), + ChangelogEntry(version="0.1.0", prs=[63, 74]), ], ), - "gen_ai.output.messages": AttributeMetadata( - 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. For `gen_ai.evaluate` operations, the array holds one object `{type: "evaluation", answers: {...}}` with the answers keyed by question name, as the provider returned them.', - type=AttributeType.STRING, + "gen_ai.response.time_to_first_chunk": AttributeMetadata( + brief="Time in seconds when the first response content chunk arrived in streaming responses.", + type=AttributeType.DOUBLE, keys=( - "gen_ai.output.messages", - "ai.response.text", - "ai.response.toolCalls", - "ai.responses", - "ai.tool_calls", + "gen_ai.response.time_to_first_chunk", + "gen_ai.response.time_to_first_token", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=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"}]', - aliases=["ai.response.toolCalls", "ai.response.text"], + example=0.6853435, + aliases=["gen_ai.response.time_to_first_token"], changelog=[ ChangelogEntry( - version="0.26.0", - prs=[650], - description="Describe the evaluation message shape for gen_ai.evaluate", + version="0.11.0", + prs=[418], + description="Added gen_ai.response.time_to_first_chunk attribute", ), - ChangelogEntry(version="0.4.0", prs=[221]), ], ), - "gen_ai.pipeline.name": AttributeMetadata( - brief="Name of the AI pipeline or chain being executed.", - type=AttributeType.STRING, + "gen_ai.response.time_to_first_token": AttributeMetadata( + brief="Time in seconds when the first response content chunk arrived in streaming responses.", + type=AttributeType.DOUBLE, keys=( - "gen_ai.pipeline.name", - "ai.pipeline.name", - "langchain.chain.name", + "gen_ai.response.time_to_first_chunk", + "gen_ai.response.time_to_first_token", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="Autofix Pipeline", - aliases=["ai.pipeline.name", "langchain.chain.name"], + example=0.6853435, + deprecation=DeprecationInfo( + replacement="gen_ai.response.time_to_first_chunk", + status=DeprecationStatus.BACKFILL, + ), + aliases=["gen_ai.response.time_to_first_chunk"], changelog=[ ChangelogEntry( - version="0.22.0", - prs=[599], - description="Added langchain.chain.name as an alias", + version="0.11.0", + prs=[418], + description="Deprecate in favor of gen_ai.response.time_to_first_chunk", ), - ChangelogEntry(version="0.1.0", prs=[76, 127]), + ChangelogEntry(version="0.4.0", prs=[227]), ], ), - "gen_ai.prompt": AttributeMetadata( - brief="The input messages sent to the model", - type=AttributeType.STRING, - keys=( - "gen_ai.input.messages", - "ai.input_messages", - "ai.prompt", - "ai.prompt.messages", - "ai.texts", - "gen_ai.prompt", - ), + "gen_ai.response.tokens_per_second": AttributeMetadata( + brief="The total output tokens per seconds throughput", + type=AttributeType.DOUBLE, + keys=("gen_ai.response.tokens_per_second",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example='[{"role": "user", "message": "hello"}]', - deprecation=DeprecationInfo( - replacement="gen_ai.input.messages", - reason="Deprecated from OTEL, use gen_ai.input.messages with the new format instead.", - status=DeprecationStatus.BACKFILL, - ), - aliases=[ - "gen_ai.input.messages", - "ai.texts", - "ai.prompt.messages", - "ai.prompt", - ], + example=12345.67, changelog=[ - ChangelogEntry( - version="0.21.0", prs=[583], description="Added ai.prompt as an alias" - ), - ChangelogEntry(version="0.1.0", prs=[74, 108, 119]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[66]), ], ), - "gen_ai.prompt.name": AttributeMetadata( - brief="The name of the prompt that uniquely identifies it.", + "gen_ai.response.tool_calls": AttributeMetadata( + brief="The tool calls in the model's response. It has to be a stringified version of an array of objects.", type=AttributeType.STRING, - keys=( - "gen_ai.prompt.name", - "mcp.prompt.name", - ), - apply_scrubbing=ApplyScrubbingInfo( - key=ApplyScrubbing.MANUAL, - reason="Prompt names may reveal user behavior patterns or sensitive operations", - ), - is_in_otel=True, + keys=("gen_ai.response.tool_calls",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, visibility=Visibility.PUBLIC, - example="summarize_text", - aliases=["mcp.prompt.name"], - changelog=[ - ChangelogEntry( - version="0.12.0", - prs=[420], - description="Added gen_ai.prompt.name attribute", - ), - ], - ), - "gen_ai.prompt.variable.": AttributeMetadata( - brief="Variables supplied to the prompt template. The is the variable name, and the value is the variable value serialized as a string.", - type=AttributeType.STRING, - keys=("gen_ai.prompt.variable.",), - apply_scrubbing=ApplyScrubbingInfo( - key=ApplyScrubbing.AUTO, - reason="Prompt variables contain user input and may include sensitive information", + example='[{"name": "get_weather", "arguments": {"location": "Paris"}}]', + deprecation=DeprecationInfo( + replacement="gen_ai.output.messages", + status=DeprecationStatus.TRANSFORM, + transformation="gen_ai_response_to_output_messages", ), - is_in_otel=True, - visibility=Visibility.PUBLIC, - has_dynamic_suffix=True, - example="gen_ai.prompt.variable.language='French'", - examples=[ - "gen_ai.prompt.variable.language='French'", - "gen_ai.prompt.variable.topic='weather'", - ], changelog=[ - ChangelogEntry( - version="next", - prs=[671], - description="Added the OpenTelemetry convention for prompt variables", - ), - ], - additional_context=[ - "Capture only when the user explicitly opts in to recording prompt inputs. In MCP, these values are the arguments supplied in prompts/get requests." + ChangelogEntry(version="0.4.0", prs=[221]), + ChangelogEntry(version="0.1.0", prs=[63, 74]), ], ), - "gen_ai.provider.name": AttributeMetadata( - brief="The Generative AI provider as identified by the client or server instrumentation.", + "gen_ai.system": AttributeMetadata( + brief="The provider of the model.", type=AttributeType.STRING, keys=( "gen_ai.provider.name", @@ -19491,1489 +19421,1558 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): is_in_otel=True, visibility=Visibility.PUBLIC, example="openai", - aliases=["ai.model.provider", "gen_ai.system"], + deprecation=DeprecationInfo( + replacement="gen_ai.provider.name", status=DeprecationStatus.NORMALIZE + ), + aliases=["ai.model.provider", "gen_ai.provider.name"], changelog=[ ChangelogEntry(version="0.4.0", prs=[253]), + ChangelogEntry(version="0.1.0", prs=[57, 127]), ], ), - "gen_ai.request.available_tools": AttributeMetadata( - brief="The available tools for the model. It has to be a stringified version of an array of objects.", + "gen_ai.system.message": AttributeMetadata( + brief="The system instructions passed to the model.", type=AttributeType.STRING, keys=( - "gen_ai.tool.definitions", - "ai.prompt.tools", - "ai.tools", - "gen_ai.request.available_tools", + "gen_ai.system_instructions", + "ai.preamble", + "gen_ai.system.message", ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), is_in_otel=False, visibility=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"}]', + example="You are a helpful assistant", deprecation=DeprecationInfo( - replacement="gen_ai.tool.definitions", status=DeprecationStatus.NORMALIZE + replacement="gen_ai.system_instructions", status=DeprecationStatus.BACKFILL ), - aliases=["gen_ai.tool.definitions"], changelog=[ - ChangelogEntry( - version="0.22.0", - prs=[595], - description="Added gen_ai.tool.definitions as an alias", - ), ChangelogEntry(version="0.4.0", prs=[221]), - ChangelogEntry(version="0.1.0", prs=[63, 127]), + ChangelogEntry(version="0.1.0", prs=[62]), ], ), - "gen_ai.request.frequency_penalty": AttributeMetadata( - 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=AttributeType.DOUBLE, + "gen_ai.system_instructions": AttributeMetadata( + brief="The system instructions passed to the model.", + type=AttributeType.STRING, keys=( - "gen_ai.request.frequency_penalty", - "ai.frequency_penalty", + "gen_ai.system_instructions", + "ai.preamble", + "gen_ai.system.message", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example=0.5, - aliases=["ai.frequency_penalty"], - changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[57]), - ], - ), - "gen_ai.request.max_tokens": AttributeMetadata( - brief="The maximum number of tokens to generate in the response.", - type=AttributeType.INTEGER, - keys=("gen_ai.request.max_tokens",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, - visibility=Visibility.PUBLIC, - example=2048, + example="You are a helpful assistant", + aliases=["ai.preamble"], changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[62]), + ChangelogEntry(version="0.5.0", prs=[264]), + ChangelogEntry(version="0.4.0", prs=[221]), ], ), - "gen_ai.request.messages": AttributeMetadata( - 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:"..."}`.', + "gen_ai.tool.call.arguments": AttributeMetadata( + brief="The arguments of the tool call. It has to be a stringified version of the arguments to the tool.", type=AttributeType.STRING, - keys=("gen_ai.request.messages",), + keys=( + "gen_ai.tool.call.arguments", + "ai.toolCall.args", + "gen_ai.tool.input", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=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=DeprecationInfo( - replacement="gen_ai.input.messages", - status=DeprecationStatus.TRANSFORM, - transformation="gen_ai_request_messages_to_input_messages", - ), - aliases=["ai.input_messages"], + example='{"location": "Paris"}', + aliases=["gen_ai.tool.input", "ai.toolCall.args"], changelog=[ + ChangelogEntry(version="0.5.0", prs=[265]), ChangelogEntry(version="0.4.0", prs=[221]), - ChangelogEntry(version="0.1.0", prs=[63, 74, 108, 119, 122]), ], ), - "gen_ai.request.model": AttributeMetadata( - brief="The model identifier being used for the request.", + "gen_ai.tool.call.result": AttributeMetadata( + brief="The result of the tool call. It has to be a stringified version of the result of the tool.", type=AttributeType.STRING, keys=( - "gen_ai.request.model", - "ai.model.id", - "ai.model_id", + "gen_ai.tool.call.result", + "ai.toolCall.result", + "anthropic.tool_result.content", + "gen_ai.tool.message", + "gen_ai.tool.output", + "mcp.tool.result.content", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="gpt-4-turbo-preview", - aliases=["ai.model_id", "ai.model.id"], + example="rainy, 57°F", + aliases=[ + "gen_ai.tool.output", + "gen_ai.tool.message", + "mcp.tool.result.content", + "ai.toolCall.result", + "anthropic.tool_result.content", + ], changelog=[ - ChangelogEntry( - version="0.21.0", prs=[583], description="Added ai.model.id as an alias" - ), - ChangelogEntry(version="0.1.0", prs=[62, 127]), + ChangelogEntry(version="0.5.0", prs=[265]), + ChangelogEntry(version="0.4.0", prs=[221]), ], ), - "gen_ai.request.presence_penalty": AttributeMetadata( - brief="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.", - type=AttributeType.DOUBLE, + "gen_ai.tool.definitions": AttributeMetadata( + brief="The list of source system tool definitions available to the GenAI agent or model.", + type=AttributeType.STRING, keys=( - "gen_ai.request.presence_penalty", - "ai.presence_penalty", + "gen_ai.tool.definitions", + "ai.prompt.tools", + "ai.tools", + "gen_ai.request.available_tools", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example=0.5, - aliases=["ai.presence_penalty"], + 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"]}}]', + aliases=["gen_ai.request.available_tools"], changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[57]), + ChangelogEntry( + version="0.22.0", + prs=[595], + description="Added gen_ai.request.available_tools as an alias", + ), + ChangelogEntry(version="0.4.0", prs=[221]), ], ), - "gen_ai.request.reasoning.level": AttributeMetadata( - brief="The reasoning or thinking effort level requested for a GenAI model.", + "gen_ai.tool.description": AttributeMetadata( + brief="The description of the tool being used.", type=AttributeType.STRING, - keys=("gen_ai.request.reasoning.level",), + keys=("gen_ai.tool.description",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="high", + example="Searches the web for current information about a topic", changelog=[ - ChangelogEntry( - version="0.17.0", - prs=[502], - description="Added gen_ai.request.reasoning.level attribute", - ), + ChangelogEntry(version="0.1.0", prs=[62, 127]), ], ), - "gen_ai.request.schema": AttributeMetadata( - brief="The stringified JSON schema the model output must conform to.", + "gen_ai.tool.input": AttributeMetadata( + brief="The input of the tool being used. It has to be a stringified version of the input to the tool.", type=AttributeType.STRING, - keys=("gen_ai.request.schema",), + keys=( + "gen_ai.tool.call.arguments", + "ai.toolCall.args", + "gen_ai.tool.input", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example='{"type":"object","properties":{"city":{"type":"string"}}}', - examples=['{"type":"object","properties":{"city":{"type":"string"}}}'], + example='{"location": "Paris"}', deprecation=DeprecationInfo( - reason="This attribute is deprecated. The Sentry conventions have no replacement for the requested output schema." + replacement="gen_ai.tool.call.arguments", status=DeprecationStatus.NORMALIZE ), + aliases=["gen_ai.tool.call.arguments", "ai.toolCall.args"], changelog=[ - ChangelogEntry( - version="0.21.0", - prs=[583], - description="Added gen_ai.request.schema attribute", - ), + ChangelogEntry(version="0.5.0", prs=[265]), + ChangelogEntry(version="0.1.0", prs=[63, 74]), ], ), - "gen_ai.request.seed": AttributeMetadata( - brief="The seed, ideally models given the same seed and same other parameters will produce the exact same output.", + "gen_ai.tool.message": AttributeMetadata( + brief="The response from a tool or function call passed to the model.", type=AttributeType.STRING, keys=( - "gen_ai.request.seed", - "ai.seed", + "gen_ai.tool.call.result", + "ai.toolCall.result", + "anthropic.tool_result.content", + "gen_ai.tool.message", + "gen_ai.tool.output", + "mcp.tool.result.content", ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + is_in_otel=False, visibility=Visibility.PUBLIC, - example="1234567890", - aliases=["ai.seed"], - changelog=[ - ChangelogEntry(version="0.1.0", prs=[57, 127]), - ], + example="rainy, 57°F", + deprecation=DeprecationInfo( + replacement="gen_ai.tool.call.result", status=DeprecationStatus.NORMALIZE + ), + aliases=[ + "gen_ai.tool.call.result", + "gen_ai.tool.output", + "mcp.tool.result.content", + "ai.toolCall.result", + "anthropic.tool_result.content", + ], + changelog=[ + ChangelogEntry(version="0.5.0", prs=[265]), + ChangelogEntry(version="0.1.0", prs=[62]), + ], ), - "gen_ai.request.stop_sequences": AttributeMetadata( - brief="List of sequences that the model will use to stop generating further tokens.", - type=AttributeType.STRING_ARRAY, - keys=("gen_ai.request.stop_sequences",), + "gen_ai.tool.name": AttributeMetadata( + brief="Name of the tool utilized by the agent.", + type=AttributeType.STRING, + keys=( + "gen_ai.tool.name", + "ai.function_call", + "mcp.tool.name", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example=["forest", "lived"], + example="Flights", + aliases=["ai.function_call", "mcp.tool.name"], changelog=[ - ChangelogEntry( - version="0.16.0", - prs=[482], - description="Added gen_ai.request.stop_sequences attribute", - ), + ChangelogEntry(version="0.1.0", prs=[57, 127]), ], ), - "gen_ai.request.temperature": AttributeMetadata( - brief="For an AI model call, the temperature parameter. Temperature essentially means how random the output will be.", - type=AttributeType.DOUBLE, + "gen_ai.tool.output": AttributeMetadata( + brief="The output of the tool being used. It has to be a stringified version of the output of the tool.", + type=AttributeType.STRING, keys=( - "gen_ai.request.temperature", - "ai.temperature", + "gen_ai.tool.call.result", + "ai.toolCall.result", + "anthropic.tool_result.content", + "gen_ai.tool.message", + "gen_ai.tool.output", + "mcp.tool.result.content", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example=0.1, - aliases=["ai.temperature"], + example="rainy, 57°F", + deprecation=DeprecationInfo( + replacement="gen_ai.tool.call.result", status=DeprecationStatus.NORMALIZE + ), + aliases=[ + "gen_ai.tool.call.result", + "gen_ai.tool.message", + "mcp.tool.result.content", + "ai.toolCall.result", + "anthropic.tool_result.content", + ], changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[57]), + ChangelogEntry(version="0.5.0", prs=[265]), + ChangelogEntry(version="0.1.0", prs=[63, 74]), ], ), - "gen_ai.request.top_k": AttributeMetadata( - 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=AttributeType.INTEGER, - keys=( - "gen_ai.request.top_k", - "ai.top_k", - ), + "gen_ai.tool.type": AttributeMetadata( + brief="The type of tool being used.", + type=AttributeType.STRING, + keys=("gen_ai.tool.type",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example=35, - aliases=["ai.top_k"], + example="function", + deprecation=DeprecationInfo( + reason="The gen_ai.tool.type attribute is deprecated and should no longer be set." + ), changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[57]), + ChangelogEntry(version="0.1.0", prs=[62, 127]), ], ), - "gen_ai.request.top_p": AttributeMetadata( - 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=AttributeType.DOUBLE, + "gen_ai.usage.cache_creation.input_tokens": AttributeMetadata( + brief="The number of tokens written to the cache when processing the AI input (prompt).", + type=AttributeType.INTEGER, keys=( - "gen_ai.request.top_p", - "ai.top_p", + "gen_ai.usage.cache_creation.input_tokens", + "gen_ai.usage.cache_creation_input_tokens", + "gen_ai.usage.input_tokens.cache_write", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example=0.7, - aliases=["ai.top_p"], + example=100, + aliases=[ + "gen_ai.usage.input_tokens.cache_write", + "gen_ai.usage.cache_creation_input_tokens", + ], changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[57]), + ChangelogEntry( + version="0.24.0", + prs=[582], + description="Added gen_ai.usage.cache_creation_input_tokens as an alias", + ), + ChangelogEntry( + version="0.11.0", + prs=[418], + description="Added gen_ai.usage.cache_creation.input_tokens attribute", + ), + ], + 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." ], ), - "gen_ai.response.finish_reason": AttributeMetadata( - brief="The reason why the model stopped generating (singular form).", - type=AttributeType.STRING, + "gen_ai.usage.cache_creation_input_tokens": AttributeMetadata( + brief="The number of tokens written to the cache when processing the AI input (prompt).", + type=AttributeType.INTEGER, keys=( - "gen_ai.response.finish_reasons", - "ai.finish_reason", - "gen_ai.response.finish_reason", + "gen_ai.usage.cache_creation.input_tokens", + "gen_ai.usage.cache_creation_input_tokens", + "gen_ai.usage.input_tokens.cache_write", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="COMPLETE", + example=100, + examples=[100], deprecation=DeprecationInfo( - replacement="gen_ai.response.finish_reasons", - status=DeprecationStatus.NORMALIZE, + replacement="gen_ai.usage.cache_creation.input_tokens", + reason="This attribute is being deprecated in favor of gen_ai.usage.cache_creation.input_tokens.", + status=DeprecationStatus.BACKFILL, ), - aliases=["gen_ai.response.finish_reasons"], + aliases=[ + "gen_ai.usage.cache_creation.input_tokens", + "gen_ai.usage.input_tokens.cache_write", + ], changelog=[ ChangelogEntry( - version="0.19.0", - prs=[498], - description="Added gen_ai.response.finish_reason attribute", + version="0.24.0", + prs=[582], + description="Added gen_ai.usage.cache_creation_input_tokens attribute", ), ], ), - "gen_ai.response.finish_reasons": AttributeMetadata( - brief="The reason why the model stopped generating.", - type=AttributeType.STRING, + "gen_ai.usage.cache_read.input_tokens": AttributeMetadata( + brief="The number of cached tokens used to process the AI input (prompt).", + type=AttributeType.INTEGER, keys=( - "gen_ai.response.finish_reasons", - "ai.finish_reason", - "gen_ai.response.finish_reason", + "gen_ai.usage.cache_read.input_tokens", + "gen_ai.usage.cache_read_input_tokens", + "gen_ai.usage.input_tokens.cached", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="COMPLETE", - aliases=["ai.finish_reason", "gen_ai.response.finish_reason"], + example=50, + aliases=[ + "gen_ai.usage.input_tokens.cached", + "gen_ai.usage.cache_read_input_tokens", + ], changelog=[ - ChangelogEntry(version="0.1.0", prs=[57, 127]), + ChangelogEntry( + version="0.24.0", + prs=[582], + description="Added gen_ai.usage.cache_read_input_tokens as an alias", + ), + ChangelogEntry( + version="0.11.0", + prs=[418], + description="Added gen_ai.usage.cache_read.input_tokens attribute", + ), + ], + 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.", ], ), - "gen_ai.response.id": AttributeMetadata( - brief="Unique identifier for the completion.", - type=AttributeType.STRING, + "gen_ai.usage.cache_read_input_tokens": AttributeMetadata( + brief="The number of cached tokens used to process the AI input (prompt).", + type=AttributeType.INTEGER, keys=( - "gen_ai.response.id", - "ai.generation_id", - "ai.response.id", + "gen_ai.usage.cache_read.input_tokens", + "gen_ai.usage.cache_read_input_tokens", + "gen_ai.usage.input_tokens.cached", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="gen_123abc", - aliases=["ai.generation_id", "ai.response.id"], + example=50, + examples=[50], + deprecation=DeprecationInfo( + replacement="gen_ai.usage.cache_read.input_tokens", + reason="This attribute is being deprecated in favor of gen_ai.usage.cache_read.input_tokens.", + status=DeprecationStatus.BACKFILL, + ), + aliases=[ + "gen_ai.usage.cache_read.input_tokens", + "gen_ai.usage.input_tokens.cached", + ], changelog=[ ChangelogEntry( - version="0.21.0", - prs=[583], - description="Added ai.response.id as an alias", + version="0.24.0", + prs=[582], + description="Added gen_ai.usage.cache_read_input_tokens attribute", ), - ChangelogEntry(version="0.1.0", prs=[57, 127]), ], ), - "gen_ai.response.model": AttributeMetadata( - brief="The vendor-specific ID of the model used.", - type=AttributeType.STRING, + "gen_ai.usage.completion_tokens": AttributeMetadata( + brief="The number of tokens used in the GenAI response (completion).", + type=AttributeType.INTEGER, keys=( - "gen_ai.response.model", - "ai.response.model", + "gen_ai.usage.output_tokens", + "ai.completion_tokens.used", + "gen_ai.usage.completion_tokens", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="gpt-4", - aliases=["ai.response.model"], + example=10, + deprecation=DeprecationInfo( + replacement="gen_ai.usage.output_tokens", status=DeprecationStatus.BACKFILL + ), + aliases=["ai.completion_tokens.used", "gen_ai.usage.output_tokens"], changelog=[ ChangelogEntry( - version="0.21.0", - prs=[583], - description="Added ai.response.model as an alias", + version="0.9.0", prs=[397], description="Add additional_context" ), - ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[61]), ChangelogEntry(version="0.0.0"), ], + 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." + ], ), - "gen_ai.response.object": AttributeMetadata( - brief="The type of the object returned by the model.", - type=AttributeType.STRING, - keys=("gen_ai.response.object",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, - visibility=Visibility.PUBLIC, - example="chat.completion", - examples=["chat.completion"], - deprecation=DeprecationInfo( - reason="This attribute is deprecated. The Sentry conventions have no replacement for the raw response object type." + "gen_ai.usage.input_tokens": AttributeMetadata( + brief="The number of tokens used to process the AI input (prompt) including cached input tokens.", + type=AttributeType.INTEGER, + keys=( + "gen_ai.usage.input_tokens", + "ai.prompt_tokens.used", + "gen_ai.usage.prompt_tokens", ), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=True, + visibility=Visibility.PUBLIC, + example=10, + aliases=["ai.prompt_tokens.used", "gen_ai.usage.prompt_tokens"], changelog=[ ChangelogEntry( - version="0.21.0", - prs=[583], - description="Added gen_ai.response.object attribute", + version="0.11.0", + prs=[418], + description="Update additional_context to reference gen_ai.usage.cache_read.input_tokens", + ), + ChangelogEntry( + version="0.9.0", prs=[397], description="Add additional_context" ), + ChangelogEntry(version="0.5.0", prs=[261]), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[112]), + ChangelogEntry(version="0.0.0"), + ], + 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.cache_read.input_tokens is a subset of this value, not an independent count — do not sum them together.", ], ), - "gen_ai.response.streaming": AttributeMetadata( - brief="Whether or not the AI model call's response was streamed back asynchronously", - type=AttributeType.BOOLEAN, + "gen_ai.usage.input_tokens.cache_write": AttributeMetadata( + brief="The number of tokens written to the cache when processing the AI input (prompt).", + type=AttributeType.INTEGER, keys=( - "gen_ai.response.streaming", - "ai.streaming", + "gen_ai.usage.cache_creation.input_tokens", + "gen_ai.usage.cache_creation_input_tokens", + "gen_ai.usage.input_tokens.cache_write", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=True, - aliases=["ai.streaming"], + example=100, + deprecation=DeprecationInfo( + replacement="gen_ai.usage.cache_creation.input_tokens", + status=DeprecationStatus.BACKFILL, + ), + aliases=[ + "gen_ai.usage.cache_creation.input_tokens", + "gen_ai.usage.cache_creation_input_tokens", + ], changelog=[ - ChangelogEntry(version="0.1.0", prs=[76]), + ChangelogEntry( + version="0.24.0", + prs=[582], + description="Added gen_ai.usage.cache_creation_input_tokens as an alias", + ), + ChangelogEntry( + version="0.11.0", + prs=[418], + description="Deprecate in favor of gen_ai.usage.cache_creation.input_tokens", + ), + ChangelogEntry( + version="0.9.0", prs=[397], description="Add additional_context" + ), + ChangelogEntry(version="0.4.0", prs=[217, 228]), + ], + 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." ], ), - "gen_ai.response.text": AttributeMetadata( - brief="The model's response text messages. It has to be a stringified version of an array of response text messages.", - type=AttributeType.STRING, - keys=("gen_ai.response.text",), + "gen_ai.usage.input_tokens.cached": AttributeMetadata( + brief="The number of cached tokens used to process the AI input (prompt).", + type=AttributeType.INTEGER, + keys=( + "gen_ai.usage.cache_read.input_tokens", + "gen_ai.usage.cache_read_input_tokens", + "gen_ai.usage.input_tokens.cached", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=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"]', + example=50, deprecation=DeprecationInfo( - replacement="gen_ai.output.messages", - status=DeprecationStatus.TRANSFORM, - transformation="gen_ai_response_to_output_messages", + replacement="gen_ai.usage.cache_read.input_tokens", + status=DeprecationStatus.BACKFILL, ), + aliases=[ + "gen_ai.usage.cache_read.input_tokens", + "gen_ai.usage.cache_read_input_tokens", + ], changelog=[ - ChangelogEntry(version="0.4.0", prs=[221]), - ChangelogEntry(version="0.1.0", prs=[63, 74]), + ChangelogEntry( + version="0.24.0", + prs=[582], + description="Added gen_ai.usage.cache_read_input_tokens as an alias", + ), + ChangelogEntry( + version="0.11.0", + prs=[418], + description="Deprecate in favor of gen_ai.usage.cache_read.input_tokens", + ), + ChangelogEntry( + version="0.9.0", prs=[397], description="Add additional_context" + ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[62, 112]), + ], + 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.", ], ), - "gen_ai.response.time_to_first_chunk": AttributeMetadata( - brief="Time in seconds when the first response content chunk arrived in streaming responses.", - type=AttributeType.DOUBLE, + "gen_ai.usage.output_tokens": AttributeMetadata( + brief="The number of tokens used for creating the AI output (including reasoning tokens).", + type=AttributeType.INTEGER, keys=( - "gen_ai.response.time_to_first_chunk", - "gen_ai.response.time_to_first_token", + "gen_ai.usage.output_tokens", + "ai.completion_tokens.used", + "gen_ai.usage.completion_tokens", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example=0.6853435, - aliases=["gen_ai.response.time_to_first_token"], + example=10, + aliases=["ai.completion_tokens.used", "gen_ai.usage.completion_tokens"], changelog=[ ChangelogEntry( version="0.11.0", prs=[418], - description="Added gen_ai.response.time_to_first_chunk attribute", + description="Update additional_context to reference gen_ai.usage.reasoning.output_tokens", + ), + ChangelogEntry( + version="0.9.0", prs=[397], description="Add additional_context" ), + ChangelogEntry(version="0.5.0", prs=[261]), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[112]), + ChangelogEntry(version="0.0.0"), + ], + 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 reasoning tokens. gen_ai.usage.reasoning.output_tokens is a subset of this value, not an independent count — do not sum them together.", ], ), - "gen_ai.response.time_to_first_token": AttributeMetadata( - brief="Time in seconds when the first response content chunk arrived in streaming responses.", - type=AttributeType.DOUBLE, + "gen_ai.usage.output_tokens.reasoning": AttributeMetadata( + brief="The number of tokens used for reasoning to create the AI output.", + type=AttributeType.INTEGER, keys=( - "gen_ai.response.time_to_first_chunk", - "gen_ai.response.time_to_first_token", + "gen_ai.usage.reasoning.output_tokens", + "gen_ai.usage.output_tokens.reasoning", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=0.6853435, + example=75, deprecation=DeprecationInfo( - replacement="gen_ai.response.time_to_first_chunk", + replacement="gen_ai.usage.reasoning.output_tokens", status=DeprecationStatus.BACKFILL, ), - aliases=["gen_ai.response.time_to_first_chunk"], + aliases=["gen_ai.usage.reasoning.output_tokens"], changelog=[ ChangelogEntry( version="0.11.0", prs=[418], - description="Deprecate in favor of gen_ai.response.time_to_first_chunk", + description="Deprecate in favor of gen_ai.usage.reasoning.output_tokens", + ), + ChangelogEntry( + version="0.9.0", prs=[397], description="Add additional_context" ), - ChangelogEntry(version="0.4.0", prs=[227]), - ], - ), - "gen_ai.response.tokens_per_second": AttributeMetadata( - brief="The total output tokens per seconds throughput", - type=AttributeType.DOUBLE, - keys=("gen_ai.response.tokens_per_second",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, - visibility=Visibility.PUBLIC, - example=12345.67, - changelog=[ ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[66]), + ChangelogEntry(version="0.1.0", prs=[62, 112]), + ], + 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.", ], ), - "gen_ai.response.tool_calls": AttributeMetadata( - brief="The tool calls in the model's response. It has to be a stringified version of an array of objects.", - type=AttributeType.STRING, - keys=("gen_ai.response.tool_calls",), + "gen_ai.usage.prompt_tokens": AttributeMetadata( + brief="The number of tokens used in the GenAI input (prompt).", + type=AttributeType.INTEGER, + keys=( + "gen_ai.usage.input_tokens", + "ai.prompt_tokens.used", + "gen_ai.usage.prompt_tokens", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example='[{"name": "get_weather", "arguments": {"location": "Paris"}}]', + example=20, deprecation=DeprecationInfo( - replacement="gen_ai.output.messages", - status=DeprecationStatus.TRANSFORM, - transformation="gen_ai_response_to_output_messages", + replacement="gen_ai.usage.input_tokens", status=DeprecationStatus.BACKFILL ), + aliases=["ai.prompt_tokens.used", "gen_ai.usage.input_tokens"], changelog=[ - ChangelogEntry(version="0.4.0", prs=[221]), - ChangelogEntry(version="0.1.0", prs=[63, 74]), + ChangelogEntry( + version="0.9.0", prs=[397], description="Add additional_context" + ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[61]), + ChangelogEntry(version="0.0.0"), + ], + 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." ], ), - "gen_ai.system": AttributeMetadata( - brief="The provider of the model.", - type=AttributeType.STRING, + "gen_ai.usage.reasoning.output_tokens": AttributeMetadata( + brief="The number of tokens used for reasoning to create the AI output.", + type=AttributeType.INTEGER, keys=( - "gen_ai.provider.name", - "ai.model.provider", - "gen_ai.system", + "gen_ai.usage.reasoning.output_tokens", + "gen_ai.usage.output_tokens.reasoning", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="openai", - deprecation=DeprecationInfo( - replacement="gen_ai.provider.name", status=DeprecationStatus.NORMALIZE - ), - aliases=["ai.model.provider", "gen_ai.provider.name"], + example=75, + aliases=["gen_ai.usage.output_tokens.reasoning"], changelog=[ - ChangelogEntry(version="0.4.0", prs=[253]), - ChangelogEntry(version="0.1.0", prs=[57, 127]), + ChangelogEntry( + version="0.11.0", + prs=[418], + description="Added gen_ai.usage.reasoning.output_tokens attribute", + ), + ], + 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.", ], ), - "gen_ai.system.message": AttributeMetadata( - brief="The system instructions passed to the model.", - type=AttributeType.STRING, + "gen_ai.usage.total_tokens": AttributeMetadata( + brief="The total number of tokens used to process the prompt. (input tokens plus output todkens)", + type=AttributeType.INTEGER, keys=( - "gen_ai.system_instructions", - "ai.preamble", - "gen_ai.system.message", - ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + "gen_ai.usage.total_tokens", + "ai.total_tokens.used", + "ai.usage.tokens", + ), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="You are a helpful assistant", - deprecation=DeprecationInfo( - replacement="gen_ai.system_instructions", status=DeprecationStatus.BACKFILL - ), + example=20, + aliases=["ai.total_tokens.used", "ai.usage.tokens"], changelog=[ - ChangelogEntry(version="0.4.0", prs=[221]), - ChangelogEntry(version="0.1.0", prs=[62]), + ChangelogEntry( + version="0.21.0", + prs=[583], + description="Added ai.usage.tokens as an alias", + ), + ChangelogEntry( + version="0.9.0", prs=[397], description="Add additional_context" + ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[57]), + ], + 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.", ], ), - "gen_ai.system_instructions": AttributeMetadata( - brief="The system instructions passed to the model.", + "graphql.document": AttributeMetadata( + brief="The GraphQL document being executed.", type=AttributeType.STRING, keys=( - "gen_ai.system_instructions", - "ai.preamble", - "gen_ai.system.message", + "graphql.document", + "graphql.source", + ), + apply_scrubbing=ApplyScrubbingInfo( + key=ApplyScrubbing.AUTO, + reason="The document may contain sensitive information in arguments or variables. Instrumentation should redact sensitive information when possible.", ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="You are a helpful assistant", - aliases=["ai.preamble"], + example="query findBookById { bookById(id: ?) { name } }", + aliases=["graphql.source"], changelog=[ - ChangelogEntry(version="0.5.0", prs=[264]), - ChangelogEntry(version="0.4.0", prs=[221]), + ChangelogEntry( + version="0.21.0", + prs=[584], + description="Added graphql.source as an alias", + ), + ChangelogEntry( + version="0.7.0", + description="Adds the `graphql.document` attribute to track the GraphQL document being executed.", + ), ], ), - "gen_ai.tool.call.arguments": AttributeMetadata( - brief="The arguments of the tool call. It has to be a stringified version of the arguments to the tool.", + "graphql.operation.name": AttributeMetadata( + brief="The name of the operation being executed.", type=AttributeType.STRING, - keys=( - "gen_ai.tool.call.arguments", - "ai.toolCall.args", - "gen_ai.tool.input", - ), + keys=("graphql.operation.name",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example='{"location": "Paris"}', - aliases=["gen_ai.tool.input", "ai.toolCall.args"], + example="findBookById", changelog=[ - ChangelogEntry(version="0.5.0", prs=[265]), - ChangelogEntry(version="0.4.0", prs=[221]), + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), ], ), - "gen_ai.tool.call.result": AttributeMetadata( - brief="The result of the tool call. It has to be a stringified version of the result of the tool.", + "graphql.operation.type": AttributeMetadata( + brief="The type of the operation being executed.", type=AttributeType.STRING, - keys=( - "gen_ai.tool.call.result", - "ai.toolCall.result", - "anthropic.tool_result.content", - "gen_ai.tool.message", - "gen_ai.tool.output", - "mcp.tool.result.content", - ), + keys=("graphql.operation.type",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="rainy, 57°F", - aliases=[ - "gen_ai.tool.output", - "gen_ai.tool.message", - "mcp.tool.result.content", - "ai.toolCall.result", - "anthropic.tool_result.content", + example="query", + changelog=[ + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), ], + ), + "graphql.processing.type": AttributeMetadata( + brief="The type of processing represented by this span.", + type=AttributeType.STRING, + keys=("graphql.processing.type",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example="parse", + examples=["parse", "validate", "execute", "resolve"], changelog=[ - ChangelogEntry(version="0.5.0", prs=[265]), - ChangelogEntry(version="0.4.0", prs=[221]), + ChangelogEntry( + version="0.21.0", + prs=[572], + description="Added graphql.processing.type attribute", + ), + ], + additional_context=[ + "Well-known values are request, parse, validate, variable_coercion, plan, execute, subscription_event, step_execute, resolve, dataloader_dispatch, dataloader_batch and _OTHER. Use one of these if it applies, otherwise a custom value.", + "Not to be confused with graphql.operation.type, which holds the GraphQL operation type (query, mutation, subscription) and only applies to spans that run an operation.", ], ), - "gen_ai.tool.definitions": AttributeMetadata( - brief="The list of source system tool definitions available to the GenAI agent or model.", + "graphql.source": AttributeMetadata( + brief="The GraphQL document being executed.", type=AttributeType.STRING, keys=( - "gen_ai.tool.definitions", - "ai.prompt.tools", - "ai.tools", - "gen_ai.request.available_tools", + "graphql.document", + "graphql.source", ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + is_in_otel=False, visibility=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"]}}]', - aliases=["gen_ai.request.available_tools"], + example="query findBookById { bookById(id: ?) { name } }", + examples=["query findBookById { bookById(id: ?) { name } }"], + deprecation=DeprecationInfo( + replacement="graphql.document", + reason="This attribute is being deprecated in favor of graphql.document, which is the OpenTelemetry name for the same value.", + status=DeprecationStatus.BACKFILL, + ), + aliases=["graphql.document"], changelog=[ ChangelogEntry( - version="0.22.0", - prs=[595], - description="Added gen_ai.request.available_tools as an alias", + version="0.21.0", + prs=[584], + description="Added graphql.source attribute", ), - ChangelogEntry(version="0.4.0", prs=[221]), ], ), - "gen_ai.tool.description": AttributeMetadata( - brief="The description of the tool being used.", - type=AttributeType.STRING, - keys=("gen_ai.tool.description",), + "grpc.error.bad_request.field_violations": AttributeMetadata( + brief="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.", + type=AttributeType.STRING_ARRAY, + keys=("grpc.error.bad_request.field_violations",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="Searches the web for current information about a topic", + 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"}}' + ], changelog=[ - ChangelogEntry(version="0.1.0", prs=[62, 127]), + ChangelogEntry( + version="0.17.0", + prs=[460], + description="Added grpc.error.bad_request.field_violations attribute", + ), ], ), - "gen_ai.tool.input": AttributeMetadata( - brief="The input of the tool being used. It has to be a stringified version of the input to the tool.", + "grpc.error.debug_info.detail": AttributeMetadata( + brief="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.", type=AttributeType.STRING, - keys=( - "gen_ai.tool.call.arguments", - "ai.toolCall.args", - "gen_ai.tool.input", - ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + keys=("grpc.error.debug_info.detail",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), is_in_otel=False, visibility=Visibility.PUBLIC, - example='{"location": "Paris"}', - deprecation=DeprecationInfo( - replacement="gen_ai.tool.call.arguments", status=DeprecationStatus.NORMALIZE - ), - aliases=["gen_ai.tool.call.arguments", "ai.toolCall.args"], + example="at com.example.Service.method(Service.java:42)", changelog=[ - ChangelogEntry(version="0.5.0", prs=[265]), - ChangelogEntry(version="0.1.0", prs=[63, 74]), + ChangelogEntry( + version="0.17.0", + prs=[460], + description="Added grpc.error.debug_info.detail attribute", + ), ], ), - "gen_ai.tool.message": AttributeMetadata( - brief="The response from a tool or function call passed to the model.", - type=AttributeType.STRING, - keys=( - "gen_ai.tool.call.result", - "ai.toolCall.result", - "anthropic.tool_result.content", - "gen_ai.tool.message", - "gen_ai.tool.output", - "mcp.tool.result.content", - ), + "grpc.error.debug_info.stack_entries": AttributeMetadata( + brief="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.", + type=AttributeType.STRING_ARRAY, + keys=("grpc.error.debug_info.stack_entries",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), is_in_otel=False, visibility=Visibility.PUBLIC, - example="rainy, 57°F", - deprecation=DeprecationInfo( - replacement="gen_ai.tool.call.result", status=DeprecationStatus.NORMALIZE - ), - aliases=[ - "gen_ai.tool.call.result", - "gen_ai.tool.output", - "mcp.tool.result.content", - "ai.toolCall.result", - "anthropic.tool_result.content", + example=[ + "com.example.Service.method(Service.java:42)", + "com.example.Server.handle(Server.java:100)", ], changelog=[ - ChangelogEntry(version="0.5.0", prs=[265]), - ChangelogEntry(version="0.1.0", prs=[62]), + ChangelogEntry( + version="0.17.0", + prs=[460], + description="Added grpc.error.debug_info.stack_entries attribute", + ), ], ), - "gen_ai.tool.name": AttributeMetadata( - brief="Name of the tool utilized by the agent.", + "grpc.error.error_info.domain": AttributeMetadata( + brief="The logical grouping to which the gRPC error reason belongs, from the google.rpc.ErrorInfo error detail.", type=AttributeType.STRING, - keys=( - "gen_ai.tool.name", - "ai.function_call", - "mcp.tool.name", - ), + keys=("grpc.error.error_info.domain",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="Flights", - aliases=["ai.function_call", "mcp.tool.name"], + example="example.sentry.io", changelog=[ - ChangelogEntry(version="0.1.0", prs=[57, 127]), + ChangelogEntry( + version="0.17.0", + prs=[460], + description="Added grpc.error.error_info.domain attribute", + ), ], ), - "gen_ai.tool.output": AttributeMetadata( - brief="The output of the tool being used. It has to be a stringified version of the output of the tool.", + "grpc.error.error_info.metadata.": AttributeMetadata( + brief="Additional structured metadata attached to a google.rpc.ErrorInfo error detail, with being the metadata key name. SDKs should only send this attribute when sendDefaultPii is enabled or dataCollection is configured accordingly.", type=AttributeType.STRING, - keys=( - "gen_ai.tool.call.result", - "ai.toolCall.result", - "anthropic.tool_result.content", - "gen_ai.tool.message", - "gen_ai.tool.output", - "mcp.tool.result.content", - ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + keys=("grpc.error.error_info.metadata.",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), is_in_otel=False, visibility=Visibility.PUBLIC, - example="rainy, 57°F", - deprecation=DeprecationInfo( - replacement="gen_ai.tool.call.result", status=DeprecationStatus.NORMALIZE - ), - aliases=[ - "gen_ai.tool.call.result", - "gen_ai.tool.message", - "mcp.tool.result.content", - "ai.toolCall.result", - "anthropic.tool_result.content", - ], + has_dynamic_suffix=True, + example="grpc.error.error_info.metadata.user_id='123'", changelog=[ - ChangelogEntry(version="0.5.0", prs=[265]), - ChangelogEntry(version="0.1.0", prs=[63, 74]), + ChangelogEntry( + version="0.17.0", + prs=[460], + description="Added grpc.error.error_info.metadata. attribute", + ), ], ), - "gen_ai.tool.type": AttributeMetadata( - brief="The type of tool being used.", + "grpc.error.error_info.reason": AttributeMetadata( + brief="The reason for the gRPC error, as defined by the service that generated it, from the google.rpc.ErrorInfo error detail.", type=AttributeType.STRING, - keys=("gen_ai.tool.type",), + keys=("grpc.error.error_info.reason",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="function", - deprecation=DeprecationInfo( - reason="The gen_ai.tool.type attribute is deprecated and should no longer be set." - ), + example="FIELD_INVALID", changelog=[ - ChangelogEntry(version="0.1.0", prs=[62, 127]), + ChangelogEntry( + version="0.17.0", + prs=[460], + description="Added grpc.error.error_info.reason attribute", + ), ], ), - "gen_ai.usage.cache_creation.input_tokens": AttributeMetadata( - brief="The number of tokens written to the cache when processing the AI input (prompt).", - type=AttributeType.INTEGER, - keys=( - "gen_ai.usage.cache_creation.input_tokens", - "gen_ai.usage.cache_creation_input_tokens", - "gen_ai.usage.input_tokens.cache_write", - ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + "grpc.error.precondition_failure.violations": AttributeMetadata( + 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=AttributeType.STRING_ARRAY, + keys=("grpc.error.precondition_failure.violations",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + is_in_otel=False, visibility=Visibility.PUBLIC, - example=100, - aliases=[ - "gen_ai.usage.input_tokens.cache_write", - "gen_ai.usage.cache_creation_input_tokens", + example=[ + '{"type":"TOS","subject":"example.com/user/123","description":"User must accept the terms of service"}' ], changelog=[ ChangelogEntry( - version="0.24.0", - prs=[582], - description="Added gen_ai.usage.cache_creation_input_tokens as an alias", - ), - ChangelogEntry( - version="0.11.0", - prs=[418], - description="Added gen_ai.usage.cache_creation.input_tokens attribute", + version="0.17.0", + prs=[460], + description="Added grpc.error.precondition_failure.violations attribute", ), ], - 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." - ], ), - "gen_ai.usage.cache_creation_input_tokens": AttributeMetadata( - brief="The number of tokens written to the cache when processing the AI input (prompt).", - type=AttributeType.INTEGER, - keys=( - "gen_ai.usage.cache_creation.input_tokens", - "gen_ai.usage.cache_creation_input_tokens", - "gen_ai.usage.input_tokens.cache_write", - ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + "grpc.error.quota_failure.violations": AttributeMetadata( + 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=AttributeType.STRING_ARRAY, + keys=("grpc.error.quota_failure.violations",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), is_in_otel=False, visibility=Visibility.PUBLIC, - example=100, - examples=[100], - deprecation=DeprecationInfo( - replacement="gen_ai.usage.cache_creation.input_tokens", - reason="This attribute is being deprecated in favor of gen_ai.usage.cache_creation.input_tokens.", - status=DeprecationStatus.BACKFILL, - ), - aliases=[ - "gen_ai.usage.cache_creation.input_tokens", - "gen_ai.usage.input_tokens.cache_write", + 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=[ ChangelogEntry( - version="0.24.0", - prs=[582], - description="Added gen_ai.usage.cache_creation_input_tokens attribute", + version="0.17.0", + prs=[460], + description="Added grpc.error.quota_failure.violations attribute", ), ], ), - "gen_ai.usage.cache_read.input_tokens": AttributeMetadata( - brief="The number of cached tokens used to process the AI input (prompt).", - type=AttributeType.INTEGER, - keys=( - "gen_ai.usage.cache_read.input_tokens", - "gen_ai.usage.cache_read_input_tokens", - "gen_ai.usage.input_tokens.cached", - ), + "grpc.error.resource_info.description": AttributeMetadata( + brief="A description of the error that occurred while accessing the resource, from a google.rpc.ResourceInfo error detail.", + type=AttributeType.STRING, + keys=("grpc.error.resource_info.description",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example=50, - aliases=[ - "gen_ai.usage.input_tokens.cached", - "gen_ai.usage.cache_read_input_tokens", - ], + example="Instance is not ready for the request.", changelog=[ ChangelogEntry( - version="0.24.0", - prs=[582], - description="Added gen_ai.usage.cache_read_input_tokens as an alias", + version="0.17.0", + prs=[460], + description="Added grpc.error.resource_info.description attribute", ), + ], + ), + "grpc.error.resource_info.owner": AttributeMetadata( + 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=AttributeType.STRING, + keys=("grpc.error.resource_info.owner",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example="user@example.com", + changelog=[ ChangelogEntry( - version="0.11.0", - prs=[418], - description="Added gen_ai.usage.cache_read.input_tokens attribute", + version="0.17.0", + prs=[460], + description="Added grpc.error.resource_info.owner attribute", ), ], - 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.", - ], ), - "gen_ai.usage.cache_read_input_tokens": AttributeMetadata( - brief="The number of cached tokens used to process the AI input (prompt).", - type=AttributeType.INTEGER, - keys=( - "gen_ai.usage.cache_read.input_tokens", - "gen_ai.usage.cache_read_input_tokens", - "gen_ai.usage.input_tokens.cached", - ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + "grpc.error.resource_info.resource_name": AttributeMetadata( + 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=AttributeType.STRING, + keys=("grpc.error.resource_info.resource_name",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), is_in_otel=False, visibility=Visibility.PUBLIC, - example=50, - examples=[50], - deprecation=DeprecationInfo( - replacement="gen_ai.usage.cache_read.input_tokens", - reason="This attribute is being deprecated in favor of gen_ai.usage.cache_read.input_tokens.", - status=DeprecationStatus.BACKFILL, - ), - aliases=[ - "gen_ai.usage.cache_read.input_tokens", - "gen_ai.usage.input_tokens.cached", - ], + example="projects/example/instances/example-instance", changelog=[ ChangelogEntry( - version="0.24.0", - prs=[582], - description="Added gen_ai.usage.cache_read_input_tokens attribute", + version="0.17.0", + prs=[460], + description="Added grpc.error.resource_info.resource_name attribute", ), ], ), - "gen_ai.usage.completion_tokens": AttributeMetadata( - brief="The number of tokens used in the GenAI response (completion).", - type=AttributeType.INTEGER, - keys=( - "gen_ai.usage.output_tokens", - "ai.completion_tokens.used", - "gen_ai.usage.completion_tokens", - ), + "grpc.error.resource_info.resource_type": AttributeMetadata( + brief="The type of resource being accessed, from a google.rpc.ResourceInfo error detail.", + type=AttributeType.STRING, + keys=("grpc.error.resource_info.resource_type",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example=10, - deprecation=DeprecationInfo( - replacement="gen_ai.usage.output_tokens", status=DeprecationStatus.BACKFILL - ), - aliases=["ai.completion_tokens.used", "gen_ai.usage.output_tokens"], + example="database", changelog=[ ChangelogEntry( - version="0.9.0", prs=[397], description="Add additional_context" + version="0.17.0", + prs=[460], + description="Added grpc.error.resource_info.resource_type attribute", ), - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[61]), - ChangelogEntry(version="0.0.0"), - ], - 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." ], ), - "gen_ai.usage.input_tokens": AttributeMetadata( - brief="The number of tokens used to process the AI input (prompt) including cached input tokens.", + "grpc.error.retry_info.retry_delay_ms": AttributeMetadata( + brief="How long the client should wait before retrying the gRPC call, in milliseconds, from the google.rpc.RetryInfo error detail.", type=AttributeType.INTEGER, - keys=( - "gen_ai.usage.input_tokens", - "ai.prompt_tokens.used", - "gen_ai.usage.prompt_tokens", - ), + keys=("grpc.error.retry_info.retry_delay_ms",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example=10, - aliases=["ai.prompt_tokens.used", "gen_ai.usage.prompt_tokens"], + example=5000, changelog=[ ChangelogEntry( - version="0.11.0", - prs=[418], - description="Update additional_context to reference gen_ai.usage.cache_read.input_tokens", - ), - ChangelogEntry( - version="0.9.0", prs=[397], description="Add additional_context" + version="0.17.0", + prs=[460], + description="Added grpc.error.retry_info.retry_delay_ms attribute", ), - ChangelogEntry(version="0.5.0", prs=[261]), - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[112]), - ChangelogEntry(version="0.0.0"), - ], - 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.cache_read.input_tokens is a subset of this value, not an independent count — do not sum them together.", ], ), - "gen_ai.usage.input_tokens.cache_write": AttributeMetadata( - brief="The number of tokens written to the cache when processing the AI input (prompt).", - type=AttributeType.INTEGER, + "hardwareConcurrency": AttributeMetadata( + brief="The number of logical CPU cores available.", + type=AttributeType.STRING, keys=( - "gen_ai.usage.cache_creation.input_tokens", - "gen_ai.usage.cache_creation_input_tokens", - "gen_ai.usage.input_tokens.cache_write", + "device.processor_count", + "hardwareConcurrency", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=100, + example="14", deprecation=DeprecationInfo( - replacement="gen_ai.usage.cache_creation.input_tokens", + replacement="device.processor_count", + reason="Old namespace-less attribute, to be replaced with device.processor_count for span-first future", status=DeprecationStatus.BACKFILL, ), - aliases=[ - "gen_ai.usage.cache_creation.input_tokens", - "gen_ai.usage.cache_creation_input_tokens", - ], + aliases=["device.processor_count"], changelog=[ ChangelogEntry( - version="0.24.0", - prs=[582], - description="Added gen_ai.usage.cache_creation_input_tokens as an alias", - ), - ChangelogEntry( - version="0.11.0", - prs=[418], - description="Deprecate in favor of gen_ai.usage.cache_creation.input_tokens", - ), - ChangelogEntry( - version="0.9.0", prs=[397], description="Add additional_context" + version="0.5.0", + prs=[281, 300], + description="Added and deprecated attribute to document JS SDK's current behaviour", ), - ChangelogEntry(version="0.4.0", prs=[217, 228]), ], - 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." + ), + "http.client_ip": AttributeMetadata( + brief="Client address - domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name.", + type=AttributeType.STRING, + keys=( + "client.address", + "http.client_ip", + ), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + is_in_otel=True, + visibility=Visibility.PUBLIC, + example="example.com", + deprecation=DeprecationInfo( + replacement="client.address", status=DeprecationStatus.BACKFILL + ), + aliases=["client.address"], + changelog=[ + ChangelogEntry(version="0.1.0", prs=[61, 106, 127]), + ChangelogEntry(version="0.0.0"), ], ), - "gen_ai.usage.input_tokens.cached": AttributeMetadata( - brief="The number of cached tokens used to process the AI input (prompt).", + "http.decoded_response_content_length": AttributeMetadata( + brief="The decoded body size of the response (in bytes).", type=AttributeType.INTEGER, keys=( - "gen_ai.usage.cache_read.input_tokens", - "gen_ai.usage.cache_read_input_tokens", - "gen_ai.usage.input_tokens.cached", + "http.response.body.decoded_size", + "http.decoded_response_content_length", + "http.response_content_length_uncompressed", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=50, + example=456, deprecation=DeprecationInfo( - replacement="gen_ai.usage.cache_read.input_tokens", + replacement="http.response.body.decoded_size", status=DeprecationStatus.BACKFILL, ), aliases=[ - "gen_ai.usage.cache_read.input_tokens", - "gen_ai.usage.cache_read_input_tokens", + "http.response.body.decoded_size", + "http.response_content_length_uncompressed", ], changelog=[ ChangelogEntry( - version="0.24.0", - prs=[582], - description="Added gen_ai.usage.cache_read_input_tokens as an alias", - ), - ChangelogEntry( - version="0.11.0", - prs=[418], - description="Deprecate in favor of gen_ai.usage.cache_read.input_tokens", - ), - ChangelogEntry( - version="0.9.0", prs=[397], description="Add additional_context" + version="0.21.0", + prs=[574], + description="Deprecated in favor of http.response.body.decoded_size", ), ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[62, 112]), - ], - 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.", + ChangelogEntry(version="0.0.0"), ], + search_alias=SearchAlias( + name="http.decoded_response_content_length", type="byte" + ), ), - "gen_ai.usage.output_tokens": AttributeMetadata( - brief="The number of tokens used for creating the AI output (including reasoning tokens).", - type=AttributeType.INTEGER, + "http.flavor": AttributeMetadata( + brief="The actual version of the protocol used for network communication.", + type=AttributeType.STRING, keys=( - "gen_ai.usage.output_tokens", - "ai.completion_tokens.used", - "gen_ai.usage.completion_tokens", + "network.protocol.version", + "http.flavor", + "messaging.protocol_version", + "net.protocol.version", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example=10, - aliases=["ai.completion_tokens.used", "gen_ai.usage.completion_tokens"], + example="1.1", + deprecation=DeprecationInfo( + replacement="network.protocol.version", status=DeprecationStatus.BACKFILL + ), + aliases=[ + "network.protocol.version", + "net.protocol.version", + "messaging.protocol_version", + ], changelog=[ ChangelogEntry( - version="0.11.0", - prs=[418], - description="Update additional_context to reference gen_ai.usage.reasoning.output_tokens", - ), - ChangelogEntry( - version="0.9.0", prs=[397], description="Add additional_context" + version="0.21.0", + prs=[581], + description="Added messaging.protocol_version as an alias", ), - ChangelogEntry(version="0.5.0", prs=[261]), - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[112]), + ChangelogEntry(version="0.1.0", prs=[61, 108, 127]), ChangelogEntry(version="0.0.0"), ], - 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 reasoning tokens. gen_ai.usage.reasoning.output_tokens is a subset of this value, not an independent count — do not sum them together.", + ), + "http.fragment": AttributeMetadata( + brief="The fragments present in the URI. Note that this contains the leading # character, while the `url.fragment` attribute does not.", + type=AttributeType.STRING, + keys=("http.fragment",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example="#details", + changelog=[ + ChangelogEntry(version="0.0.0"), ], ), - "gen_ai.usage.output_tokens.reasoning": AttributeMetadata( - brief="The number of tokens used for reasoning to create the AI output.", - type=AttributeType.INTEGER, - keys=( - "gen_ai.usage.reasoning.output_tokens", - "gen_ai.usage.output_tokens.reasoning", - ), + "http.host": AttributeMetadata( + brief="The domain name.", + type=AttributeType.STRING, + keys=("http.host",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=75, + example="example.com", deprecation=DeprecationInfo( - replacement="gen_ai.usage.reasoning.output_tokens", - status=DeprecationStatus.BACKFILL, + replacement="server.address", + reason="Deprecated, use one of `server.address` or `client.address`, depending on the usage", ), - aliases=["gen_ai.usage.reasoning.output_tokens"], + aliases=[ + "address", + "server.address", + "client.address", + "http.server_name", + "net.host.name", + "server_name", + "net.peer.name", + ], changelog=[ ChangelogEntry( - version="0.11.0", - prs=[418], - description="Deprecate in favor of gen_ai.usage.reasoning.output_tokens", + version="0.24.0", prs=[647], description="Added server_name as an alias" ), ChangelogEntry( - version="0.9.0", prs=[397], description="Add additional_context" + version="0.21.0", + prs=[588, 602], + description="Added net.peer.name as an alias", ), - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[62, 112]), - ], - 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.", + ChangelogEntry( + version="0.19.0", prs=[534], description="Added address as an alias" + ), + ChangelogEntry(version="0.1.0", prs=[61, 108, 127]), + ChangelogEntry(version="0.0.0"), ], ), - "gen_ai.usage.prompt_tokens": AttributeMetadata( - brief="The number of tokens used in the GenAI input (prompt).", - type=AttributeType.INTEGER, + "http.method": AttributeMetadata( + brief="The HTTP method used.", + type=AttributeType.STRING, keys=( - "gen_ai.usage.input_tokens", - "ai.prompt_tokens.used", - "gen_ai.usage.prompt_tokens", + "http.request.method", + "http.method", + "http.request_method", + "method", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example=20, + example="GET", deprecation=DeprecationInfo( - replacement="gen_ai.usage.input_tokens", status=DeprecationStatus.BACKFILL + replacement="http.request.method", status=DeprecationStatus.BACKFILL ), - aliases=["ai.prompt_tokens.used", "gen_ai.usage.input_tokens"], + aliases=["http.request.method", "http.request_method", "method"], + changelog=[ + ChangelogEntry(version="0.1.0", prs=[61, 127]), + ChangelogEntry(version="0.0.0"), + ], + ), + "http.query": AttributeMetadata( + brief="The query string present in the URL. Note that this contains the leading ? character, while the `url.query` attribute does not.", + type=AttributeType.STRING, + keys=("http.query",), + apply_scrubbing=ApplyScrubbingInfo( + key=ApplyScrubbing.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=Visibility.PUBLIC, + example="?foo=bar&bar=baz", changelog=[ - ChangelogEntry( - version="0.9.0", prs=[397], description="Add additional_context" - ), - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[61]), ChangelogEntry(version="0.0.0"), ], - 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." - ], ), - "gen_ai.usage.reasoning.output_tokens": AttributeMetadata( - brief="The number of tokens used for reasoning to create the AI output.", - type=AttributeType.INTEGER, - keys=( - "gen_ai.usage.reasoning.output_tokens", - "gen_ai.usage.output_tokens.reasoning", - ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + "http.request.body.data": AttributeMetadata( + brief="HTTP request body data. Can be given as string or structural data of any format.", + type=AttributeType.STRING, + keys=("http.request.body.data",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + is_in_otel=False, visibility=Visibility.PUBLIC, - example=75, - aliases=["gen_ai.usage.output_tokens.reasoning"], + example='[{"role": "user", "message": "hello"}]', changelog=[ ChangelogEntry( - version="0.11.0", - prs=[418], - description="Added gen_ai.usage.reasoning.output_tokens attribute", + version="0.6.0", + prs=[336], + description="Added http.request.body.data attribute", ), ], - 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.", - ], ), - "gen_ai.usage.total_tokens": AttributeMetadata( - brief="The total number of tokens used to process the prompt. (input tokens plus output todkens)", + "http.request.body.decoded_size": AttributeMetadata( + brief="The decoded body size of the request (in bytes).", type=AttributeType.INTEGER, keys=( - "gen_ai.usage.total_tokens", - "ai.total_tokens.used", - "ai.usage.tokens", + "http.request.body.decoded_size", + "http.request_content_length_uncompressed", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=20, - aliases=["ai.total_tokens.used", "ai.usage.tokens"], + example=456, + aliases=["http.request_content_length_uncompressed"], changelog=[ ChangelogEntry( version="0.21.0", - prs=[583], - description="Added ai.usage.tokens as an alias", - ), - ChangelogEntry( - version="0.9.0", prs=[397], description="Add additional_context" + prs=[574], + description="Added http.request.body.decoded_size attribute", ), - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[57]), ], 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.", + "This is the size after content decoding. Set it only when the decoded size is actually known, for example by measuring a decompressed request stream.", + "Do not derive this from the `content-length` header, which always carries the encoded size. Use `http.request.body.size` for that.", ], ), - "graphql.document": AttributeMetadata( - brief="The GraphQL document being executed.", - type=AttributeType.STRING, + "http.request.body.size": AttributeMetadata( + brief="The encoded body size of the request (in bytes).", + type=AttributeType.INTEGER, keys=( - "graphql.document", - "graphql.source", - ), - apply_scrubbing=ApplyScrubbingInfo( - key=ApplyScrubbing.AUTO, - reason="The document may contain sensitive information in arguments or variables. Instrumentation should redact sensitive information when possible.", + "http.request.body.size", + "http.request_content_length", ), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="query findBookById { bookById(id: ?) { name } }", - aliases=["graphql.source"], + example=123, + aliases=["http.request_content_length"], changelog=[ ChangelogEntry( version="0.21.0", - prs=[584], - description="Added graphql.source as an alias", - ), - ChangelogEntry( - version="0.7.0", - description="Adds the `graphql.document` attribute to track the GraphQL document being executed.", + prs=[574], + description="Added http.request.body.size attribute", ), ], + additional_context=[ + "This is the on-the-wire (encoded) size. The `content-length` header always carries the encoded size, so set this attribute whenever `content-length` is known, regardless of whether `content-encoding` is present." + ], ), - "graphql.operation.name": AttributeMetadata( - brief="The name of the operation being executed.", - type=AttributeType.STRING, - keys=("graphql.operation.name",), + "http.request.connect_start": AttributeMetadata( + brief="The UNIX timestamp representing the time immediately before the user agent starts establishing the connection to the server to retrieve the resource.", + type=AttributeType.DOUBLE, + keys=("http.request.connect_start",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="findBookById", + example=1732829555.111, changelog=[ - ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[134]), ChangelogEntry(version="0.0.0"), ], ), - "graphql.operation.type": AttributeMetadata( - brief="The type of the operation being executed.", - type=AttributeType.STRING, - keys=("graphql.operation.type",), + "http.request.connection_end": AttributeMetadata( + 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=AttributeType.DOUBLE, + keys=("http.request.connection_end",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="query", + example=1732829555.15, changelog=[ - ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[134]), ChangelogEntry(version="0.0.0"), ], ), - "graphql.processing.type": AttributeMetadata( - brief="The type of processing represented by this span.", - type=AttributeType.STRING, - keys=("graphql.processing.type",), + "http.request.domain_lookup_end": AttributeMetadata( + brief="The UNIX timestamp representing the time immediately after the browser finishes the domain-name lookup for the resource.", + type=AttributeType.DOUBLE, + keys=("http.request.domain_lookup_end",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="parse", - examples=["parse", "validate", "execute", "resolve"], + example=1732829555.201, changelog=[ - ChangelogEntry( - version="0.21.0", - prs=[572], - description="Added graphql.processing.type attribute", - ), - ], - additional_context=[ - "Well-known values are request, parse, validate, variable_coercion, plan, execute, subscription_event, step_execute, resolve, dataloader_dispatch, dataloader_batch and _OTHER. Use one of these if it applies, otherwise a custom value.", - "Not to be confused with graphql.operation.type, which holds the GraphQL operation type (query, mutation, subscription) and only applies to spans that run an operation.", + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[134]), + ChangelogEntry(version="0.0.0"), ], ), - "graphql.source": AttributeMetadata( - brief="The GraphQL document being executed.", - type=AttributeType.STRING, - keys=( - "graphql.document", - "graphql.source", - ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + "http.request.domain_lookup_start": AttributeMetadata( + brief="The UNIX timestamp representing the time immediately before the browser starts the domain name lookup for the resource.", + type=AttributeType.DOUBLE, + keys=("http.request.domain_lookup_start",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="query findBookById { bookById(id: ?) { name } }", - examples=["query findBookById { bookById(id: ?) { name } }"], - deprecation=DeprecationInfo( - replacement="graphql.document", - reason="This attribute is being deprecated in favor of graphql.document, which is the OpenTelemetry name for the same value.", - status=DeprecationStatus.BACKFILL, - ), - aliases=["graphql.document"], + example=1732829555.322, changelog=[ - ChangelogEntry( - version="0.21.0", - prs=[584], - description="Added graphql.source attribute", - ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[134]), + ChangelogEntry(version="0.0.0"), ], ), - "grpc.error.bad_request.field_violations": AttributeMetadata( - brief="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.", - type=AttributeType.STRING_ARRAY, - keys=("grpc.error.bad_request.field_violations",), + "http.request.fetch_start": AttributeMetadata( + brief="The UNIX timestamp representing the time immediately before the browser starts to fetch the resource.", + type=AttributeType.DOUBLE, + keys=("http.request.fetch_start",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - 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"}}' - ], + example=1732829555.389, changelog=[ - ChangelogEntry( - version="0.17.0", - prs=[460], - description="Added grpc.error.bad_request.field_violations attribute", - ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[134]), + ChangelogEntry(version="0.0.0"), ], ), - "grpc.error.debug_info.detail": AttributeMetadata( - brief="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.", - type=AttributeType.STRING, - keys=("grpc.error.debug_info.detail",), + "http.request.header.": AttributeMetadata( + brief="HTTP request headers, being the lower-cased, but otherwise unchanged HTTP Header name, the value being the header values.", + type=AttributeType.STRING_ARRAY, + keys=("http.request.header.",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="at com.example.Service.method(Service.java:42)", + has_dynamic_suffix=True, + example="http.request.header.custom-header=['foo', 'bar']", + examples=[ + "http.request.header.custom-header=['foo', 'bar']", + "http.request.header.content-length=['123']", + ], changelog=[ - ChangelogEntry( - version="0.17.0", - prs=[460], - description="Added grpc.error.debug_info.detail attribute", - ), + ChangelogEntry(version="0.4.0", prs=[201, 204]), + ChangelogEntry(version="0.1.0", prs=[103]), ], ), - "grpc.error.debug_info.stack_entries": AttributeMetadata( - brief="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.", - type=AttributeType.STRING_ARRAY, - keys=("grpc.error.debug_info.stack_entries",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), - is_in_otel=False, + "http.request.method": AttributeMetadata( + brief="The HTTP method used.", + type=AttributeType.STRING, + keys=( + "http.request.method", + "http.method", + "http.request_method", + "method", + ), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=True, visibility=Visibility.PUBLIC, - example=[ - "com.example.Service.method(Service.java:42)", - "com.example.Server.handle(Server.java:100)", - ], + example="GET", + aliases=["method", "http.method", "http.request_method"], changelog=[ - ChangelogEntry( - version="0.17.0", - prs=[460], - description="Added grpc.error.debug_info.stack_entries attribute", - ), + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), + ], + ), + "http.request.redirect_end": AttributeMetadata( + brief="The UNIX timestamp representing the timestamp immediately after receiving the last byte of the response of the last redirect", + type=AttributeType.DOUBLE, + keys=("http.request.redirect_end",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=1732829558.502, + changelog=[ + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[130, 134]), ], ), - "grpc.error.error_info.domain": AttributeMetadata( - brief="The logical grouping to which the gRPC error reason belongs, from the google.rpc.ErrorInfo error detail.", - type=AttributeType.STRING, - keys=("grpc.error.error_info.domain",), + "http.request.redirect_start": AttributeMetadata( + brief="The UNIX timestamp representing the start time of the fetch which that initiates the redirect.", + type=AttributeType.DOUBLE, + keys=("http.request.redirect_start",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="example.sentry.io", + example=1732829555.495, changelog=[ - ChangelogEntry( - version="0.17.0", - prs=[460], - description="Added grpc.error.error_info.domain attribute", - ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[134]), + ChangelogEntry(version="0.0.0"), ], ), - "grpc.error.error_info.metadata.": AttributeMetadata( - brief="Additional structured metadata attached to a google.rpc.ErrorInfo error detail, with being the metadata key name. SDKs should only send this attribute when sendDefaultPii is enabled or dataCollection is configured accordingly.", - type=AttributeType.STRING, - keys=("grpc.error.error_info.metadata.",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + "http.request.request_start": AttributeMetadata( + 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=AttributeType.DOUBLE, + keys=("http.request.request_start",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - has_dynamic_suffix=True, - example="grpc.error.error_info.metadata.user_id='123'", + example=1732829555.51, changelog=[ - ChangelogEntry( - version="0.17.0", - prs=[460], - description="Added grpc.error.error_info.metadata. attribute", - ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[134]), + ChangelogEntry(version="0.0.0"), ], ), - "grpc.error.error_info.reason": AttributeMetadata( - brief="The reason for the gRPC error, as defined by the service that generated it, from the google.rpc.ErrorInfo error detail.", - type=AttributeType.STRING, - keys=("grpc.error.error_info.reason",), + "http.request.resend_count": AttributeMetadata( + brief="The ordinal number of request resending attempt (for any reason, including redirects).", + type=AttributeType.INTEGER, + keys=("http.request.resend_count",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="FIELD_INVALID", + example=2, changelog=[ - ChangelogEntry( - version="0.17.0", - prs=[460], - description="Added grpc.error.error_info.reason attribute", - ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.0.0"), ], ), - "grpc.error.precondition_failure.violations": AttributeMetadata( - 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=AttributeType.STRING_ARRAY, - keys=("grpc.error.precondition_failure.violations",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + "http.request.response_end": AttributeMetadata( + 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=AttributeType.DOUBLE, + keys=("http.request.response_end",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=[ - '{"type":"TOS","subject":"example.com/user/123","description":"User must accept the terms of service"}' - ], + example=1732829555.89, changelog=[ - ChangelogEntry( - version="0.17.0", - prs=[460], - description="Added grpc.error.precondition_failure.violations attribute", - ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[134]), + ChangelogEntry(version="0.0.0"), ], ), - "grpc.error.quota_failure.violations": AttributeMetadata( - 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=AttributeType.STRING_ARRAY, - keys=("grpc.error.quota_failure.violations",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + "http.request.response_start": AttributeMetadata( + 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=AttributeType.DOUBLE, + keys=("http.request.response_start",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=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}' - ], + example=1732829555.7, changelog=[ - ChangelogEntry( - version="0.17.0", - prs=[460], - description="Added grpc.error.quota_failure.violations attribute", - ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[134]), + ChangelogEntry(version="0.0.0"), ], ), - "grpc.error.resource_info.description": AttributeMetadata( - brief="A description of the error that occurred while accessing the resource, from a google.rpc.ResourceInfo error detail.", - type=AttributeType.STRING, - keys=("grpc.error.resource_info.description",), + "http.request.same_origin": AttributeMetadata( + brief="Indicates that a URL has the same origin as the current page's origin in the browser.", + type=AttributeType.BOOLEAN, + keys=( + "http.request.same_origin", + "url.same_origin", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="Instance is not ready for the request.", + example=True, + aliases=["url.same_origin"], changelog=[ ChangelogEntry( - version="0.17.0", - prs=[460], - description="Added grpc.error.resource_info.description attribute", + version="0.16.0", + prs=[456], + description="Added http.request.same_origin attribute", ), ], ), - "grpc.error.resource_info.owner": AttributeMetadata( - 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=AttributeType.STRING, - keys=("grpc.error.resource_info.owner",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + "http.request.secure_connection_start": AttributeMetadata( + 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=AttributeType.DOUBLE, + keys=("http.request.secure_connection_start",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="user@example.com", + example=1732829555.73, changelog=[ - ChangelogEntry( - version="0.17.0", - prs=[460], - description="Added grpc.error.resource_info.owner attribute", - ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[134]), + ChangelogEntry(version="0.0.0"), ], ), - "grpc.error.resource_info.resource_name": AttributeMetadata( - 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=AttributeType.STRING, - keys=("grpc.error.resource_info.resource_name",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + "http.request.time_to_first_byte": AttributeMetadata( + 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=AttributeType.DOUBLE, + keys=("http.request.time_to_first_byte",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="projects/example/instances/example-instance", + example=1.032, changelog=[ - ChangelogEntry( - version="0.17.0", - prs=[460], - description="Added grpc.error.resource_info.resource_name attribute", - ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[131]), ], ), - "grpc.error.resource_info.resource_type": AttributeMetadata( - brief="The type of resource being accessed, from a google.rpc.ResourceInfo error detail.", - type=AttributeType.STRING, - keys=("grpc.error.resource_info.resource_type",), + "http.request.worker_start": AttributeMetadata( + 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=AttributeType.DOUBLE, + keys=("http.request.worker_start",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="database", + example=1732829553.68, changelog=[ - ChangelogEntry( - version="0.17.0", - prs=[460], - description="Added grpc.error.resource_info.resource_type attribute", - ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[130, 134]), ], ), - "grpc.error.retry_info.retry_delay_ms": AttributeMetadata( - brief="How long the client should wait before retrying the gRPC call, in milliseconds, from the google.rpc.RetryInfo error detail.", + "http.request_content_length": AttributeMetadata( + brief="The encoded body size of the request (in bytes).", type=AttributeType.INTEGER, - keys=("grpc.error.retry_info.retry_delay_ms",), + keys=( + "http.request.body.size", + "http.request_content_length", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=5000, + example=123, + deprecation=DeprecationInfo( + replacement="http.request.body.size", status=DeprecationStatus.BACKFILL + ), + aliases=["http.request.body.size"], changelog=[ ChangelogEntry( - version="0.17.0", - prs=[460], - description="Added grpc.error.retry_info.retry_delay_ms attribute", + version="0.21.0", + prs=[574], + description="Added http.request_content_length attribute, deprecated in favor of http.request.body.size", ), ], ), - "hardwareConcurrency": AttributeMetadata( - brief="The number of logical CPU cores available.", - type=AttributeType.STRING, + "http.request_content_length_uncompressed": AttributeMetadata( + brief="The decoded body size of the request (in bytes).", + type=AttributeType.INTEGER, keys=( - "device.processor_count", - "hardwareConcurrency", + "http.request.body.decoded_size", + "http.request_content_length_uncompressed", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="14", + example=456, deprecation=DeprecationInfo( - replacement="device.processor_count", - reason="Old namespace-less attribute, to be replaced with device.processor_count for span-first future", + replacement="http.request.body.decoded_size", status=DeprecationStatus.BACKFILL, ), - aliases=["device.processor_count"], + aliases=["http.request.body.decoded_size"], changelog=[ ChangelogEntry( - version="0.5.0", - prs=[281, 300], - description="Added and deprecated attribute to document JS SDK's current behaviour", + version="0.21.0", + prs=[574], + description="Added http.request_content_length_uncompressed attribute, deprecated in favor of http.request.body.decoded_size", ), ], ), - "http.client_ip": AttributeMetadata( - brief="Client address - domain name if available without reverse DNS lookup; otherwise, IP address or Unix domain socket name.", + "http.request_method": AttributeMetadata( + brief="The HTTP method used.", type=AttributeType.STRING, keys=( - "client.address", - "http.client_ip", + "http.request.method", + "http.method", + "http.request_method", + "method", ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), - is_in_otel=True, + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, visibility=Visibility.PUBLIC, - example="example.com", + example="GET", deprecation=DeprecationInfo( - replacement="client.address", status=DeprecationStatus.BACKFILL + replacement="http.request.method", status=DeprecationStatus.BACKFILL ), - aliases=["client.address"], + aliases=["method", "http.method", "http.request.method"], changelog=[ - ChangelogEntry(version="0.1.0", prs=[61, 106, 127]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry( + version="0.6.0", + prs=[343], + description="Added http.request_method attribute", + ), ], ), - "http.decoded_response_content_length": AttributeMetadata( + "http.response.body.decoded_size": AttributeMetadata( brief="The decoded body size of the response (in bytes).", type=AttributeType.INTEGER, keys=( @@ -20985,1424 +20984,1349 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): is_in_otel=False, visibility=Visibility.PUBLIC, example=456, - deprecation=DeprecationInfo( - replacement="http.response.body.decoded_size", - status=DeprecationStatus.BACKFILL, - ), aliases=[ - "http.response.body.decoded_size", + "http.decoded_response_content_length", "http.response_content_length_uncompressed", ], changelog=[ ChangelogEntry( version="0.21.0", prs=[574], - description="Deprecated in favor of http.response.body.decoded_size", + description="Added http.response.body.decoded_size attribute", ), - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.0.0"), ], - search_alias=SearchAlias( - name="http.decoded_response_content_length", type="byte" - ), + additional_context=[ + "This is the size after content decoding. Set it only when the decoded size is actually known, for example from the browser Resource Timing `decodedBodySize` or by measuring a decompressed response stream.", + "Do not derive this from the `content-length` header, which always carries the encoded size. Use `http.response.body.size` for that.", + ], ), - "http.flavor": AttributeMetadata( - brief="The actual version of the protocol used for network communication.", - type=AttributeType.STRING, + "http.response.body.size": AttributeMetadata( + brief="The encoded body size of the response (in bytes).", + type=AttributeType.INTEGER, keys=( - "network.protocol.version", - "http.flavor", - "messaging.protocol_version", - "net.protocol.version", + "http.response.body.size", + "http.response.header.content-length", + "http.response_content_length", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="1.1", - deprecation=DeprecationInfo( - replacement="network.protocol.version", status=DeprecationStatus.BACKFILL - ), - aliases=[ - "network.protocol.version", - "net.protocol.version", - "messaging.protocol_version", - ], + example=123, + aliases=["http.response_content_length", "http.response.header.content-length"], changelog=[ - ChangelogEntry( - version="0.21.0", - prs=[581], - description="Added messaging.protocol_version as an alias", - ), - ChangelogEntry(version="0.1.0", prs=[61, 108, 127]), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[106]), ChangelogEntry(version="0.0.0"), ], ), - "http.fragment": AttributeMetadata( - brief="The fragments present in the URI. Note that this contains the leading # character, while the `url.fragment` attribute does not.", - type=AttributeType.STRING, - keys=("http.fragment",), + "http.response.header.": AttributeMetadata( + brief="HTTP response headers, being the lower-cased, but otherwise unchanged HTTP Header name, the value being the header values.", + type=AttributeType.STRING_ARRAY, + keys=("http.response.header.",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="#details", + has_dynamic_suffix=True, + example="http.response.header.custom-header=['foo', 'bar']", + examples=[ + "http.response.header.custom-header=['foo', 'bar']", + "http.response.header.content-length=['123']", + ], changelog=[ - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.4.0", prs=[201, 204]), + ChangelogEntry(version="0.1.0", prs=[103]), ], ), - "http.host": AttributeMetadata( - brief="The domain name.", + "http.response.header.content-length": AttributeMetadata( + brief="The size of the message body sent to the recipient (in bytes)", type=AttributeType.STRING, - keys=("http.host",), + keys=( + "http.response.header.content-length", + "http.response.body.size", + "http.response_content_length", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="example.com", - deprecation=DeprecationInfo( - replacement="server.address", - reason="Deprecated, use one of `server.address` or `client.address`, depending on the usage", - ), - aliases=[ - "address", - "server.address", - "client.address", - "http.server_name", - "net.host.name", - "server_name", - "net.peer.name", - ], + example="http.response.header.custom-header=['foo', 'bar']", + aliases=["http.response_content_length", "http.response.body.size"], changelog=[ - ChangelogEntry( - version="0.24.0", prs=[647], description="Added server_name as an alias" - ), - ChangelogEntry( - version="0.21.0", - prs=[588, 602], - description="Added net.peer.name as an alias", - ), - ChangelogEntry( - version="0.19.0", prs=[534], description="Added address as an alias" - ), - ChangelogEntry(version="0.1.0", prs=[61, 108, 127]), + ChangelogEntry(version="0.1.0", prs=[127]), ChangelogEntry(version="0.0.0"), ], ), - "http.method": AttributeMetadata( - brief="The HTTP method used.", - type=AttributeType.STRING, + "http.response.size": AttributeMetadata( + brief="The transfer size of the response (in bytes).", + type=AttributeType.INTEGER, keys=( - "http.request.method", - "http.method", - "http.request_method", - "method", + "http.response.size", + "http.response_transfer_size", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="GET", - deprecation=DeprecationInfo( - replacement="http.request.method", status=DeprecationStatus.BACKFILL - ), - aliases=["http.request.method", "http.request_method", "method"], + example=456, + aliases=["http.response_transfer_size"], changelog=[ - ChangelogEntry(version="0.1.0", prs=[61, 127]), + ChangelogEntry(version="0.4.0", prs=[228]), ChangelogEntry(version="0.0.0"), ], ), - "http.query": AttributeMetadata( - brief="The query string present in the URL. Note that this contains the leading ? character, while the `url.query` attribute does not.", - type=AttributeType.STRING, - keys=("http.query",), - apply_scrubbing=ApplyScrubbingInfo( - key=ApplyScrubbing.AUTO, - reason="Query string values can contain sensitive information. Clients should attempt to scrub parameters that might contain sensitive information.", + "http.response.status_code": AttributeMetadata( + brief="The status code of the HTTP response.", + type=AttributeType.INTEGER, + keys=( + "http.response.status_code", + "http.response_status_code", + "http.status_code", ), - is_in_otel=False, + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=True, visibility=Visibility.PUBLIC, - example="?foo=bar&bar=baz", + example=404, + aliases=["http.status_code"], changelog=[ + ChangelogEntry(version="0.4.0", prs=[228]), ChangelogEntry(version="0.0.0"), ], + search_alias=SearchAlias(name="http.response_status_code"), ), - "http.request.body.data": AttributeMetadata( - brief="HTTP request body data. Can be given as string or structural data of any format.", + "http.response.status_text": AttributeMetadata( + brief="The reason phrase of the HTTP response.", type=AttributeType.STRING, - keys=("http.request.body.data",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), - is_in_otel=False, - visibility=Visibility.PUBLIC, - example='[{"role": "user", "message": "hello"}]', - changelog=[ - ChangelogEntry( - version="0.6.0", - prs=[336], - description="Added http.request.body.data attribute", - ), - ], - ), - "http.request.body.decoded_size": AttributeMetadata( - brief="The decoded body size of the request (in bytes).", - type=AttributeType.INTEGER, keys=( - "http.request.body.decoded_size", - "http.request_content_length_uncompressed", + "http.response.status_text", + "http.status_text", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=456, - aliases=["http.request_content_length_uncompressed"], + example="NOT FOUND", + aliases=["http.status_text"], changelog=[ ChangelogEntry( version="0.21.0", prs=[574], - description="Added http.request.body.decoded_size attribute", + description="Added http.response.status_text attribute", ), ], additional_context=[ - "This is the size after content decoding. Set it only when the decoded size is actually known, for example by measuring a decompressed request stream.", - "Do not derive this from the `content-length` header, which always carries the encoded size. Use `http.request.body.size` for that.", + "HTTP/2 and HTTP/3 do not carry a reason phrase. Do not set this attribute when the protocol provides none; use `http.response.status_code` instead." ], ), - "http.request.body.size": AttributeMetadata( - brief="The encoded body size of the request (in bytes).", + "http.response_content_length": AttributeMetadata( + brief="The encoded body size of the response (in bytes).", type=AttributeType.INTEGER, keys=( - "http.request.body.size", - "http.request_content_length", + "http.response.body.size", + "http.response.header.content-length", + "http.response_content_length", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, example=123, - aliases=["http.request_content_length"], + deprecation=DeprecationInfo( + replacement="http.response.body.size", status=DeprecationStatus.BACKFILL + ), + aliases=["http.response.body.size", "http.response.header.content-length"], changelog=[ - ChangelogEntry( - version="0.21.0", - prs=[574], - description="Added http.request.body.size attribute", - ), - ], - additional_context=[ - "This is the on-the-wire (encoded) size. The `content-length` header always carries the encoded size, so set this attribute whenever `content-length` is known, regardless of whether `content-encoding` is present." + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[61, 106]), + ChangelogEntry(version="0.0.0"), ], + search_alias=SearchAlias(name="http.response_content_length", type="byte"), ), - "http.request.connect_start": AttributeMetadata( - brief="The UNIX timestamp representing the time immediately before the user agent starts establishing the connection to the server to retrieve the resource.", - type=AttributeType.DOUBLE, - keys=("http.request.connect_start",), + "http.response_content_length_uncompressed": AttributeMetadata( + brief="The decoded body size of the response (in bytes).", + type=AttributeType.INTEGER, + keys=( + "http.response.body.decoded_size", + "http.decoded_response_content_length", + "http.response_content_length_uncompressed", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=1732829555.111, + example=456, + deprecation=DeprecationInfo( + replacement="http.response.body.decoded_size", + status=DeprecationStatus.BACKFILL, + ), + aliases=[ + "http.response.body.decoded_size", + "http.decoded_response_content_length", + ], changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[134]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry( + version="0.21.0", + prs=[574], + description="Added http.response_content_length_uncompressed attribute, deprecated in favor of http.response.body.decoded_size", + ), ], ), - "http.request.connection_end": AttributeMetadata( - 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=AttributeType.DOUBLE, - keys=("http.request.connection_end",), + "http.response_transfer_size": AttributeMetadata( + brief="The transfer size of the response (in bytes).", + type=AttributeType.INTEGER, + keys=( + "http.response.size", + "http.response_transfer_size", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=1732829555.15, + example=456, + deprecation=DeprecationInfo( + replacement="http.response.size", status=DeprecationStatus.BACKFILL + ), + aliases=["http.response.size"], changelog=[ ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[134]), + ChangelogEntry(version="0.1.0", prs=[61]), ChangelogEntry(version="0.0.0"), ], + search_alias=SearchAlias(name="http.response_transfer_size", type="byte"), ), - "http.request.domain_lookup_end": AttributeMetadata( - brief="The UNIX timestamp representing the time immediately after the browser finishes the domain-name lookup for the resource.", - type=AttributeType.DOUBLE, - keys=("http.request.domain_lookup_end",), + "http.route": AttributeMetadata( + brief="The matched route, that is, the path template in the format used by the respective server framework.", + type=AttributeType.STRING, + keys=("http.route",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=1732829555.201, + example="/users/:id", + examples=["/users/:id", "my-controller/my-action/{id}", "/posts"], + aliases=["route"], changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[134]), + ChangelogEntry( + version="0.19.0", + prs=[505, 521], + description="Added multiple examples, removed alias to `url.template`, added additional context", + ), + ChangelogEntry(version="0.1.0", prs=[127]), ChangelogEntry(version="0.0.0"), ], + additional_context=[ + "This attribute should primarily be set by server-side instrumentation that captures the framework route of an incoming request.", + "For `http.client` spans and client-side routing, use `url.template` instead.", + ], ), - "http.request.domain_lookup_start": AttributeMetadata( - brief="The UNIX timestamp representing the time immediately before the browser starts the domain name lookup for the resource.", - type=AttributeType.DOUBLE, - keys=("http.request.domain_lookup_start",), + "http.scheme": AttributeMetadata( + brief="The URI scheme component identifying the used protocol.", + type=AttributeType.STRING, + keys=( + "url.scheme", + "http.scheme", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=1732829555.322, + example="https", + deprecation=DeprecationInfo( + replacement="url.scheme", status=DeprecationStatus.BACKFILL + ), + aliases=["url.scheme"], changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[134]), + ChangelogEntry(version="0.1.0", prs=[61, 127]), ChangelogEntry(version="0.0.0"), ], ), - "http.request.fetch_start": AttributeMetadata( - brief="The UNIX timestamp representing the time immediately before the browser starts to fetch the resource.", + "http.server.request.time_in_queue": AttributeMetadata( + 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=AttributeType.DOUBLE, - keys=("http.request.fetch_start",), + keys=("http.server.request.time_in_queue",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=1732829555.389, + example=50, changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[134]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.5.0", prs=[267]), ], ), - "http.request.header.": AttributeMetadata( - brief="HTTP request headers, being the lower-cased, but otherwise unchanged HTTP Header name, the value being the header values.", - type=AttributeType.STRING_ARRAY, - keys=("http.request.header.",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + "http.server_name": AttributeMetadata( + brief="The server domain name", + type=AttributeType.STRING, + keys=( + "server.address", + "address", + "http.server_name", + "net.host.name", + "server_name", + ), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - has_dynamic_suffix=True, - example="http.request.header.custom-header=['foo', 'bar']", - examples=[ - "http.request.header.custom-header=['foo', 'bar']", - "http.request.header.content-length=['123']", + example="example.com", + deprecation=DeprecationInfo( + replacement="server.address", status=DeprecationStatus.BACKFILL + ), + aliases=[ + "address", + "server.address", + "net.host.name", + "http.host", + "server_name", + "net.peer.name", ], changelog=[ - ChangelogEntry(version="0.4.0", prs=[201, 204]), - ChangelogEntry(version="0.1.0", prs=[103]), + ChangelogEntry( + version="0.24.0", prs=[647], description="Added server_name as an alias" + ), + ChangelogEntry( + version="0.21.0", + prs=[588, 602], + description="Added net.peer.name as an alias", + ), + ChangelogEntry( + version="0.19.0", prs=[534], description="Added address as an alias" + ), + ChangelogEntry(version="0.1.0", prs=[61, 108, 127]), + ChangelogEntry(version="0.0.0"), ], ), - "http.request.method": AttributeMetadata( - brief="The HTTP method used.", - type=AttributeType.STRING, + "http.status_code": AttributeMetadata( + brief="The status code of the HTTP response.", + type=AttributeType.INTEGER, keys=( - "http.request.method", - "http.method", - "http.request_method", - "method", + "http.response.status_code", + "http.response_status_code", + "http.status_code", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="GET", - aliases=["method", "http.method", "http.request_method"], + example=404, + deprecation=DeprecationInfo( + replacement="http.response.status_code", status=DeprecationStatus.BACKFILL + ), + aliases=["http.response.status_code"], changelog=[ - ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.1.0", prs=[61]), ChangelogEntry(version="0.0.0"), ], ), - "http.request.redirect_end": AttributeMetadata( - brief="The UNIX timestamp representing the timestamp immediately after receiving the last byte of the response of the last redirect", - type=AttributeType.DOUBLE, - keys=("http.request.redirect_end",), + "http.status_text": AttributeMetadata( + brief="The reason phrase of the HTTP response", + type=AttributeType.STRING, + keys=( + "http.response.status_text", + "http.status_text", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=1732829558.502, + example="NOT FOUND", + examples=["NOT FOUND"], + deprecation=DeprecationInfo( + replacement="http.response.status_text", status=DeprecationStatus.BACKFILL + ), + aliases=["http.response.status_text"], changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[130, 134]), + ChangelogEntry( + version="0.21.0", + prs=[574], + description="Added http.status_text attribute, deprecated in favor of http.response.status_text", + ), ], ), - "http.request.redirect_start": AttributeMetadata( - brief="The UNIX timestamp representing the start time of the fetch which that initiates the redirect.", - type=AttributeType.DOUBLE, - keys=("http.request.redirect_start",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + "http.target": AttributeMetadata( + brief="The pathname and query string of the URL.", + type=AttributeType.STRING, + keys=("http.target",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + is_in_otel=True, visibility=Visibility.PUBLIC, - example=1732829555.495, + example="/test?foo=bar#buzz", + deprecation=DeprecationInfo( + reason="This attribute is being deprecated in favor of url.path, url.query and url.fragment. The value holds all three parts at once, so it has no single replacement." + ), changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[134]), + ChangelogEntry( + version="0.21.0", + prs=[587], + description="Documented url.path, url.query and url.fragment as the replacements for http.target", + ), + ChangelogEntry(version="0.1.0", prs=[61]), ChangelogEntry(version="0.0.0"), ], ), - "http.request.request_start": AttributeMetadata( - 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=AttributeType.DOUBLE, - keys=("http.request.request_start",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + "http.url": AttributeMetadata( + brief="The URL of the resource that was fetched.", + type=AttributeType.STRING, + keys=( + "url.full", + "aws.request.url", + "http.url", + "messaging.url", + "url", + ), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + is_in_otel=True, visibility=Visibility.PUBLIC, - example=1732829555.51, + example="https://example.com/test?foo=bar#buzz", + deprecation=DeprecationInfo( + replacement="url.full", status=DeprecationStatus.BACKFILL + ), + aliases=["url.full", "url", "aws.request.url", "messaging.url"], changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[134]), + ChangelogEntry( + version="0.21.0", + prs=[581], + description="Added messaging.url as an alias", + ), + ChangelogEntry(version="0.1.0", prs=[61, 108]), ChangelogEntry(version="0.0.0"), ], ), - "http.request.resend_count": AttributeMetadata( - brief="The ordinal number of request resending attempt (for any reason, including redirects).", - type=AttributeType.INTEGER, - keys=("http.request.resend_count",), + "http.user_agent": AttributeMetadata( + brief="Value of the HTTP User-Agent header sent by the client.", + type=AttributeType.STRING, + keys=( + "user_agent.original", + "http.user_agent", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=True, + visibility=Visibility.PUBLIC, + example="Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Mobile/15E148 Safari/604.1", + deprecation=DeprecationInfo( + replacement="user_agent.original", status=DeprecationStatus.BACKFILL + ), + aliases=["user_agent.original"], + changelog=[ + ChangelogEntry(version="0.1.0", prs=[61, 127]), + ChangelogEntry(version="0.0.0"), + ], + ), + "id": AttributeMetadata( + brief="A unique identifier for the span.", + type=AttributeType.STRING, + keys=("id",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.NEVER), is_in_otel=False, visibility=Visibility.PUBLIC, - example=2, + example="f47ac10b58cc4372a5670e02b2c3d479", changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), ChangelogEntry(version="0.0.0"), ], ), - "http.request.response_end": AttributeMetadata( - 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.", + "inp": AttributeMetadata( + brief="The value of the recorded Interaction to Next Paint (INP) web vital", type=AttributeType.DOUBLE, - keys=("http.request.response_end",), + keys=( + "browser.web_vital.inp.value", + "inp", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=1732829555.89, + example=200, + deprecation=DeprecationInfo( + replacement="browser.web_vital.inp.value", + reason="The INP web vital is now recorded as a browser.web_vital.inp.value attribute.", + status=DeprecationStatus.BACKFILL, + ), + aliases=["browser.web_vital.inp.value"], changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[134]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry( + version="0.5.0", + prs=[229], + description="Added and deprecated attribute to document JS SDK's current behaviour", + ), ], ), - "http.request.response_start": AttributeMetadata( - 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=AttributeType.DOUBLE, - keys=("http.request.response_start",), + "jsonrpc.protocol.version": AttributeMetadata( + brief="The version of the JSON-RPC protocol used.", + type=AttributeType.STRING, + keys=("jsonrpc.protocol.version",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=1732829555.7, + example="2.0", changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[134]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry( + version="0.12.0", + prs=[420], + description="Added jsonrpc.protocol.version attribute", + ), ], ), - "http.request.same_origin": AttributeMetadata( - brief="Indicates that a URL has the same origin as the current page's origin in the browser.", - type=AttributeType.BOOLEAN, + "jsonrpc.request.id": AttributeMetadata( + brief="The JSON-RPC request identifier, used to correlate a request with its response.", + type=AttributeType.STRING, keys=( - "http.request.same_origin", - "url.same_origin", + "jsonrpc.request.id", + "mcp.request.id", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=True, - aliases=["url.same_origin"], + example="1", + examples=["1"], + aliases=["mcp.request.id"], changelog=[ ChangelogEntry( - version="0.16.0", - prs=[456], - description="Added http.request.same_origin attribute", + version="next", + prs=[671], + description="Removed the session-scoped uniqueness requirement from the request identifier", + ), + ChangelogEntry( + version="0.12.0", + prs=[420], + description="Added jsonrpc.request.id attribute", ), ], ), - "http.request.secure_connection_start": AttributeMetadata( - 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=AttributeType.DOUBLE, - keys=("http.request.secure_connection_start",), + "jvm.gc.action": AttributeMetadata( + brief="Name of the garbage collector action.", + type=AttributeType.STRING, + keys=("jvm.gc.action",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=1732829555.73, + example="end of minor GC", changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[134]), + ChangelogEntry(version="0.1.0", prs=[127]), ChangelogEntry(version="0.0.0"), ], ), - "http.request.time_to_first_byte": AttributeMetadata( - 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=AttributeType.DOUBLE, - keys=("http.request.time_to_first_byte",), + "jvm.gc.name": AttributeMetadata( + brief="Name of the garbage collector.", + type=AttributeType.STRING, + keys=("jvm.gc.name",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=1.032, + example="G1 Young Generation", changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[131]), + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), ], ), - "http.request.worker_start": AttributeMetadata( - 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=AttributeType.DOUBLE, - keys=("http.request.worker_start",), + "jvm.memory.pool.name": AttributeMetadata( + brief="Name of the memory pool.", + type=AttributeType.STRING, + keys=("jvm.memory.pool.name",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=1732829553.68, + example="G1 Old Gen", changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[130, 134]), + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), ], ), - "http.request_content_length": AttributeMetadata( - brief="The encoded body size of the request (in bytes).", - type=AttributeType.INTEGER, - keys=( - "http.request.body.size", - "http.request_content_length", - ), + "jvm.memory.type": AttributeMetadata( + brief="Name of the memory pool.", + type=AttributeType.STRING, + keys=("jvm.memory.type",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example=123, - deprecation=DeprecationInfo( - replacement="http.request.body.size", status=DeprecationStatus.BACKFILL - ), - aliases=["http.request.body.size"], + example="G1 Old Gen", changelog=[ - ChangelogEntry( - version="0.21.0", - prs=[574], - description="Added http.request_content_length attribute, deprecated in favor of http.request.body.size", - ), + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), ], ), - "http.request_content_length_uncompressed": AttributeMetadata( - brief="The decoded body size of the request (in bytes).", - type=AttributeType.INTEGER, - keys=( - "http.request.body.decoded_size", - "http.request_content_length_uncompressed", - ), + "jvm.thread.daemon": AttributeMetadata( + brief="Whether the thread is daemon or not.", + type=AttributeType.BOOLEAN, + keys=("jvm.thread.daemon",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example=456, - deprecation=DeprecationInfo( - replacement="http.request.body.decoded_size", - status=DeprecationStatus.BACKFILL, - ), - aliases=["http.request.body.decoded_size"], + example=True, changelog=[ - ChangelogEntry( - version="0.21.0", - prs=[574], - description="Added http.request_content_length_uncompressed attribute, deprecated in favor of http.request.body.decoded_size", - ), + ChangelogEntry(version="0.0.0"), ], ), - "http.request_method": AttributeMetadata( - brief="The HTTP method used.", + "jvm.thread.state": AttributeMetadata( + brief="State of the thread.", type=AttributeType.STRING, - keys=( - "http.request.method", - "http.method", - "http.request_method", - "method", - ), + keys=("jvm.thread.state",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="GET", - deprecation=DeprecationInfo( - replacement="http.request.method", status=DeprecationStatus.BACKFILL - ), - aliases=["method", "http.method", "http.request.method"], + example="blocked", changelog=[ - ChangelogEntry( - version="0.6.0", - prs=[343], - description="Added http.request_method attribute", - ), + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), ], ), - "http.response.body.decoded_size": AttributeMetadata( - brief="The decoded body size of the response (in bytes).", - type=AttributeType.INTEGER, - keys=( - "http.response.body.decoded_size", - "http.decoded_response_content_length", - "http.response_content_length_uncompressed", - ), + "koa.name": AttributeMetadata( + brief="The name of the Koa middleware or matched route that handled the request.", + type=AttributeType.STRING, + keys=("koa.name",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=456, - aliases=[ - "http.decoded_response_content_length", - "http.response_content_length_uncompressed", - ], + example="/users/:id", + deprecation=DeprecationInfo( + reason="No single replacement. SDKs should use http.route for router layers and code.function.name for middleware layers instead." + ), changelog=[ ChangelogEntry( - version="0.21.0", - prs=[574], - description="Added http.response.body.decoded_size attribute", + version="0.16.0", + prs=[490], + description="Added koa.name attribute as deprecated", ), ], - additional_context=[ - "This is the size after content decoding. Set it only when the decoded size is actually known, for example from the browser Resource Timing `decodedBodySize` or by measuring a decompressed response stream.", - "Do not derive this from the `content-length` header, which always carries the encoded size. Use `http.response.body.size` for that.", - ], - ), - "http.response.body.size": AttributeMetadata( - brief="The encoded body size of the response (in bytes).", - type=AttributeType.INTEGER, - keys=( - "http.response.body.size", - "http.response.header.content-length", - "http.response_content_length", - ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, - visibility=Visibility.PUBLIC, - example=123, - aliases=["http.response_content_length", "http.response.header.content-length"], - changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[106]), - ChangelogEntry(version="0.0.0"), - ], ), - "http.response.header.": AttributeMetadata( - brief="HTTP response headers, being the lower-cased, but otherwise unchanged HTTP Header name, the value being the header values.", - type=AttributeType.STRING_ARRAY, - keys=("http.response.header.",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), - is_in_otel=True, - visibility=Visibility.PUBLIC, - has_dynamic_suffix=True, - example="http.response.header.custom-header=['foo', 'bar']", - examples=[ - "http.response.header.custom-header=['foo', 'bar']", - "http.response.header.content-length=['123']", + "koa.type": AttributeMetadata( + brief="The type of the Koa layer that handled the request.", + type=AttributeType.STRING, + keys=("koa.type",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example="router", + changelog=[ + ChangelogEntry( + version="0.16.0", prs=[471], description="Added koa.type attribute" + ), ], + ), + "langchain.chain.name": AttributeMetadata( + brief="The name of the LangChain chain being executed.", + type=AttributeType.STRING, + keys=( + "gen_ai.pipeline.name", + "ai.pipeline.name", + "langchain.chain.name", + ), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example="format_prompt", + examples=["format_prompt", "RunnableSequence"], + deprecation=DeprecationInfo( + replacement="gen_ai.pipeline.name", + reason="This attribute is being deprecated in favor of gen_ai.pipeline.name, which is the SDK-agnostic replacement for the name of the AI pipeline or chain being executed.", + status=DeprecationStatus.BACKFILL, + ), + aliases=["gen_ai.pipeline.name", "ai.pipeline.name"], changelog=[ - ChangelogEntry(version="0.4.0", prs=[201, 204]), - ChangelogEntry(version="0.1.0", prs=[103]), + ChangelogEntry( + version="0.22.0", + prs=[599], + description="Added langchain.chain.name attribute", + ), ], ), - "http.response.header.content-length": AttributeMetadata( - brief="The size of the message body sent to the recipient (in bytes)", + "lcp.element": AttributeMetadata( + brief="The dom element responsible for the largest contentful paint.", type=AttributeType.STRING, keys=( - "http.response.header.content-length", - "http.response.body.size", - "http.response_content_length", + "browser.web_vital.lcp.element", + "lcp.element", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="http.response.header.custom-header=['foo', 'bar']", - aliases=["http.response_content_length", "http.response.body.size"], + example="img", + deprecation=DeprecationInfo( + replacement="browser.web_vital.lcp.element", + reason="The LCP element is now recorded as a browser.web_vital.lcp.element attribute.", + status=DeprecationStatus.BACKFILL, + ), + aliases=["browser.web_vital.lcp.element"], changelog=[ + ChangelogEntry(version="0.5.0", prs=[233]), ChangelogEntry(version="0.1.0", prs=[127]), ChangelogEntry(version="0.0.0"), ], ), - "http.response.size": AttributeMetadata( - brief="The transfer size of the response (in bytes).", - type=AttributeType.INTEGER, + "lcp.id": AttributeMetadata( + brief="The id of the dom element responsible for the largest contentful paint.", + type=AttributeType.STRING, keys=( - "http.response.size", - "http.response_transfer_size", + "browser.web_vital.lcp.id", + "lcp.id", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example=456, - aliases=["http.response_transfer_size"], + example="#hero", + deprecation=DeprecationInfo( + replacement="browser.web_vital.lcp.id", + reason="The LCP id is now recorded as a browser.web_vital.lcp.id attribute.", + status=DeprecationStatus.BACKFILL, + ), + aliases=["browser.web_vital.lcp.id"], changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.5.0", prs=[233]), + ChangelogEntry(version="0.1.0", prs=[127]), ChangelogEntry(version="0.0.0"), ], ), - "http.response.status_code": AttributeMetadata( - brief="The status code of the HTTP response.", + "lcp.loadTime": AttributeMetadata( + brief="The time it took for the LCP element to be loaded", type=AttributeType.INTEGER, keys=( - "http.response.status_code", - "http.response_status_code", - "http.status_code", + "browser.web_vital.lcp.load_time", + "lcp.loadTime", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example=404, - aliases=["http.status_code"], + example=1402, + deprecation=DeprecationInfo( + replacement="browser.web_vital.lcp.load_time", + reason="The LCP load time is now recorded as a browser.web_vital.lcp.load_time attribute.", + status=DeprecationStatus.BACKFILL, + ), + aliases=["browser.web_vital.lcp.load_time"], changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.5.0", prs=[233]), ], - search_alias=SearchAlias(name="http.response_status_code"), ), - "http.response.status_text": AttributeMetadata( - brief="The reason phrase of the HTTP response.", - type=AttributeType.STRING, + "lcp.renderTime": AttributeMetadata( + brief="The time it took for the LCP element to be rendered", + type=AttributeType.INTEGER, keys=( - "http.response.status_text", - "http.status_text", + "browser.web_vital.lcp.render_time", + "lcp.renderTime", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="NOT FOUND", - aliases=["http.status_text"], + example=1685, + deprecation=DeprecationInfo( + replacement="browser.web_vital.lcp.render_time", + reason="The LCP render time is now recorded as a browser.web_vital.lcp.render_time attribute.", + status=DeprecationStatus.BACKFILL, + ), + aliases=["browser.web_vital.lcp.render_time"], changelog=[ - ChangelogEntry( - version="0.21.0", - prs=[574], - description="Added http.response.status_text attribute", - ), - ], - additional_context=[ - "HTTP/2 and HTTP/3 do not carry a reason phrase. Do not set this attribute when the protocol provides none; use `http.response.status_code` instead." + ChangelogEntry(version="0.5.0", prs=[233]), ], ), - "http.response_content_length": AttributeMetadata( - brief="The encoded body size of the response (in bytes).", + "lcp.size": AttributeMetadata( + brief="The size of the largest contentful paint element.", type=AttributeType.INTEGER, keys=( - "http.response.body.size", - "http.response.header.content-length", - "http.response_content_length", + "browser.web_vital.lcp.size", + "lcp.size", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example=123, + example=1234, deprecation=DeprecationInfo( - replacement="http.response.body.size", status=DeprecationStatus.BACKFILL + replacement="browser.web_vital.lcp.size", + reason="The LCP size is now recorded as a browser.web_vital.lcp.size attribute.", + status=DeprecationStatus.BACKFILL, ), - aliases=["http.response.body.size", "http.response.header.content-length"], + aliases=["browser.web_vital.lcp.size"], changelog=[ + ChangelogEntry(version="0.5.0", prs=[233]), ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[61, 106]), ChangelogEntry(version="0.0.0"), ], - search_alias=SearchAlias(name="http.response_content_length", type="byte"), ), - "http.response_content_length_uncompressed": AttributeMetadata( - brief="The decoded body size of the response (in bytes).", - type=AttributeType.INTEGER, + "lcp.url": AttributeMetadata( + brief="The url of the dom element responsible for the largest contentful paint.", + type=AttributeType.STRING, keys=( - "http.response.body.decoded_size", - "http.decoded_response_content_length", - "http.response_content_length_uncompressed", + "browser.web_vital.lcp.url", + "lcp.url", ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + is_in_otel=False, visibility=Visibility.PUBLIC, - example=456, + example="https://example.com", deprecation=DeprecationInfo( - replacement="http.response.body.decoded_size", + replacement="browser.web_vital.lcp.url", + reason="The LCP url is now recorded as a browser.web_vital.lcp.url attribute.", status=DeprecationStatus.BACKFILL, ), - aliases=[ - "http.response.body.decoded_size", - "http.decoded_response_content_length", - ], + aliases=["browser.web_vital.lcp.url"], changelog=[ - ChangelogEntry( - version="0.21.0", - prs=[574], - description="Added http.response_content_length_uncompressed attribute, deprecated in favor of http.response.body.decoded_size", - ), + ChangelogEntry(version="0.5.0", prs=[233]), + ChangelogEntry(version="0.1.0", prs=[127]), + ChangelogEntry(version="0.0.0"), ], ), - "http.response_transfer_size": AttributeMetadata( - brief="The transfer size of the response (in bytes).", - type=AttributeType.INTEGER, + "lcp": AttributeMetadata( + brief="The value of the recorded Largest Contentful Paint (LCP) web vital", + type=AttributeType.DOUBLE, keys=( - "http.response.size", - "http.response_transfer_size", + "browser.web_vital.lcp.value", + "lcp", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=456, + example=2500, deprecation=DeprecationInfo( - replacement="http.response.size", status=DeprecationStatus.BACKFILL + replacement="browser.web_vital.lcp.value", + reason="The LCP web vital is now recorded as a browser.web_vital.lcp.value attribute.", + status=DeprecationStatus.BACKFILL, ), - aliases=["http.response.size"], + aliases=["browser.web_vital.lcp.value"], changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[61]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry( + version="0.5.0", + prs=[229], + description="Added and deprecated attribute to document JS SDK's current behaviour", + ), ], - search_alias=SearchAlias(name="http.response_transfer_size", type="byte"), ), - "http.route": AttributeMetadata( - brief="The matched route, that is, the path template in the format used by the respective server framework.", + "litestar.middleware_name": AttributeMetadata( + brief="The name of the Litestar middleware.", type=AttributeType.STRING, - keys=("http.route",), + keys=( + "middleware.name", + "django.middleware_name", + "litestar.middleware_name", + "starlette.middleware_name", + "starlite.middleware_name", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="/users/:id", - examples=["/users/:id", "my-controller/my-action/{id}", "/posts"], - aliases=["route"], + example="AuthenticationMiddleware", + deprecation=DeprecationInfo( + replacement="middleware.name", + reason="This attribute is being deprecated in favor of middleware.name, which is the framework-agnostic replacement.", + status=DeprecationStatus.BACKFILL, + ), + aliases=["middleware.name"], changelog=[ ChangelogEntry( version="0.19.0", - prs=[505, 521], - description="Added multiple examples, removed alias to `url.template`, added additional context", + prs=[486], + description="Added litestar.middleware_name attribute, deprecated in favor of middleware.name", ), - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), - ], - additional_context=[ - "This attribute should primarily be set by server-side instrumentation that captures the framework route of an incoming request.", - "For `http.client` spans and client-side routing, use `url.template` instead.", ], ), - "http.scheme": AttributeMetadata( - brief="The URI scheme component identifying the used protocol.", - type=AttributeType.STRING, - keys=( - "url.scheme", - "http.scheme", - ), + "logger.name": AttributeMetadata( + brief="The name of the logger that generated this event.", + type=AttributeType.STRING, + keys=("logger.name",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="https", - deprecation=DeprecationInfo( - replacement="url.scheme", status=DeprecationStatus.BACKFILL - ), - aliases=["url.scheme"], + example="myLogger", changelog=[ - ChangelogEntry(version="0.1.0", prs=[61, 127]), + ChangelogEntry(version="0.1.0", prs=[127]), ChangelogEntry(version="0.0.0"), ], ), - "http.server.request.time_in_queue": AttributeMetadata( - 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=AttributeType.DOUBLE, - keys=("http.server.request.time_in_queue",), + "mcp.auth.client.name": AttributeMetadata( + brief="Registered OAuth client application name associated with the authenticated MCP request. Taken from OAuth client registration metadata (client_name) made available by the authentication layer. This is distinct from the MCP implementation name in mcp.client.name; omit it when the OAuth client name is unavailable.", + type=AttributeType.STRING, + keys=("mcp.auth.client.name",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=50, + example="Example Desktop", + examples=["Example Desktop", "Example CLI"], changelog=[ - ChangelogEntry(version="0.5.0", prs=[267]), + ChangelogEntry( + version="next", + prs=[671], + description="Added mcp.auth.client.name attribute", + ), ], ), - "http.server_name": AttributeMetadata( - brief="The server domain name", + "mcp.cancelled.reason": AttributeMetadata( + brief="Reason for the cancellation of an MCP operation.", type=AttributeType.STRING, - keys=( - "server.address", - "address", - "http.server_name", - "net.host.name", - "server_name", + keys=("mcp.cancelled.reason",), + apply_scrubbing=ApplyScrubbingInfo( + key=ApplyScrubbing.MANUAL, + reason="Cancellation reasons may contain user-specific or sensitive information", ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="example.com", - deprecation=DeprecationInfo( - replacement="server.address", status=DeprecationStatus.BACKFILL - ), - aliases=[ - "address", - "server.address", - "net.host.name", - "http.host", - "server_name", - "net.peer.name", - ], + example="User cancelled the request", changelog=[ - ChangelogEntry( - version="0.24.0", prs=[647], description="Added server_name as an alias" - ), - ChangelogEntry( - version="0.21.0", - prs=[588, 602], - description="Added net.peer.name as an alias", - ), - ChangelogEntry( - version="0.19.0", prs=[534], description="Added address as an alias" - ), - ChangelogEntry(version="0.1.0", prs=[61, 108, 127]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "http.status_code": AttributeMetadata( - brief="The status code of the HTTP response.", - type=AttributeType.INTEGER, - keys=( - "http.response.status_code", - "http.response_status_code", - "http.status_code", - ), + "mcp.cancelled.request_id": AttributeMetadata( + brief="Request ID of the cancelled MCP operation.", + type=AttributeType.STRING, + keys=("mcp.cancelled.request_id",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example=404, - deprecation=DeprecationInfo( - replacement="http.response.status_code", status=DeprecationStatus.BACKFILL - ), - aliases=["http.response.status_code"], + example="123", changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.1.0", prs=[61]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "http.status_text": AttributeMetadata( - brief="The reason phrase of the HTTP response", + "mcp.client.name": AttributeMetadata( + brief="Name of the MCP client implementation, as declared in clientInfo. This is distinct from the registered OAuth application name in mcp.auth.client.name.", type=AttributeType.STRING, - keys=( - "http.response.status_text", - "http.status_text", - ), + keys=("mcp.client.name",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="NOT FOUND", - examples=["NOT FOUND"], - deprecation=DeprecationInfo( - replacement="http.response.status_text", status=DeprecationStatus.BACKFILL - ), - aliases=["http.response.status_text"], + example="example-mcp-client", + examples=["example-mcp-client"], changelog=[ ChangelogEntry( - version="0.21.0", - prs=[574], - description="Added http.status_text attribute, deprecated in favor of http.response.status_text", + version="next", + prs=[671], + description="Clarified that the attribute describes declared MCP implementation metadata", ), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "http.target": AttributeMetadata( - brief="The pathname and query string of the URL.", + "mcp.client.title": AttributeMetadata( + brief="Display title of the MCP client implementation, as declared in clientInfo.", type=AttributeType.STRING, - keys=("http.target",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), - is_in_otel=True, - visibility=Visibility.PUBLIC, - example="/test?foo=bar#buzz", - deprecation=DeprecationInfo( - reason="This attribute is being deprecated in favor of url.path, url.query and url.fragment. The value holds all three parts at once, so it has no single replacement." + keys=("mcp.client.title",), + apply_scrubbing=ApplyScrubbingInfo( + key=ApplyScrubbing.MANUAL, + reason="Client titles may reveal user-specific application configurations or custom setups", ), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example="Example MCP Client", + examples=["Example MCP Client"], changelog=[ ChangelogEntry( - version="0.21.0", - prs=[587], - description="Documented url.path, url.query and url.fragment as the replacements for http.target", + version="next", + prs=[671], + description="Clarified that the attribute describes declared MCP implementation metadata", ), - ChangelogEntry(version="0.1.0", prs=[61]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "http.url": AttributeMetadata( - brief="The URL of the resource that was fetched.", + "mcp.client.version": AttributeMetadata( + brief="Version of the MCP client implementation, as declared in clientInfo.", type=AttributeType.STRING, - keys=( - "url.full", - "aws.request.url", - "http.url", - "messaging.url", - "url", - ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), - is_in_otel=True, + keys=("mcp.client.version",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, visibility=Visibility.PUBLIC, - example="https://example.com/test?foo=bar#buzz", - deprecation=DeprecationInfo( - replacement="url.full", status=DeprecationStatus.BACKFILL - ), - aliases=["url.full", "url", "aws.request.url", "messaging.url"], + example="1.0.0", + examples=["1.0.0"], changelog=[ ChangelogEntry( - version="0.21.0", - prs=[581], - description="Added messaging.url as an alias", + version="next", + prs=[671], + description="Clarified that the attribute describes declared MCP implementation metadata", ), - ChangelogEntry(version="0.1.0", prs=[61, 108]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "http.user_agent": AttributeMetadata( - brief="Value of the HTTP User-Agent header sent by the client.", + "mcp.lifecycle.phase": AttributeMetadata( + brief="Lifecycle phase indicator for MCP operations.", type=AttributeType.STRING, - keys=( - "user_agent.original", - "http.user_agent", - ), + keys=("mcp.lifecycle.phase",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Mobile/15E148 Safari/604.1", - deprecation=DeprecationInfo( - replacement="user_agent.original", status=DeprecationStatus.BACKFILL - ), - aliases=["user_agent.original"], + example="initialization_complete", changelog=[ - ChangelogEntry(version="0.1.0", prs=[61, 127]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "id": AttributeMetadata( - brief="A unique identifier for the span.", + "mcp.logging.data_type": AttributeMetadata( + brief="Data type of the logged message content.", type=AttributeType.STRING, - keys=("id",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.NEVER), + keys=("mcp.logging.data_type",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="f47ac10b58cc4372a5670e02b2c3d479", + example="string", changelog=[ - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "inp": AttributeMetadata( - brief="The value of the recorded Interaction to Next Paint (INP) web vital", - type=AttributeType.DOUBLE, - keys=( - "browser.web_vital.inp.value", - "inp", - ), + "mcp.logging.level": AttributeMetadata( + brief="Log level for MCP logging operations.", + type=AttributeType.STRING, + keys=("mcp.logging.level",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=200, - deprecation=DeprecationInfo( - replacement="browser.web_vital.inp.value", - reason="The INP web vital is now recorded as a browser.web_vital.inp.value attribute.", - status=DeprecationStatus.BACKFILL, + example="info", + changelog=[ + ChangelogEntry(version="0.3.0", prs=[171]), + ], + ), + "mcp.logging.logger": AttributeMetadata( + brief="Logger name for MCP logging operations.", + type=AttributeType.STRING, + keys=("mcp.logging.logger",), + apply_scrubbing=ApplyScrubbingInfo( + key=ApplyScrubbing.MANUAL, + reason="Logger names may be user-defined and could contain sensitive information", + ), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example="mcp_server", + changelog=[ + ChangelogEntry(version="0.3.0", prs=[171]), + ], + ), + "mcp.logging.message": AttributeMetadata( + brief="Log message content from MCP logging operations.", + type=AttributeType.STRING, + keys=("mcp.logging.message",), + apply_scrubbing=ApplyScrubbingInfo( + key=ApplyScrubbing.AUTO, reason="Log messages can contain user data" ), - aliases=["browser.web_vital.inp.value"], + is_in_otel=False, + visibility=Visibility.PUBLIC, + example="Tool execution completed successfully", changelog=[ - ChangelogEntry( - version="0.5.0", - prs=[229], - description="Added and deprecated attribute to document JS SDK's current behaviour", - ), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "jsonrpc.protocol.version": AttributeMetadata( - brief="The version of the JSON-RPC protocol used.", + "mcp.method.name": AttributeMetadata( + brief="The name of the MCP request or notification method being called.", type=AttributeType.STRING, - keys=("jsonrpc.protocol.version",), + keys=("mcp.method.name",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=True, visibility=Visibility.PUBLIC, - example="2.0", + example="tools/call", changelog=[ ChangelogEntry( version="0.12.0", prs=[420], - description="Added jsonrpc.protocol.version attribute", + description="Set is_in_otel=true, attribute exists in OTel MCP registry", ), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "jsonrpc.request.id": AttributeMetadata( - brief="The JSON-RPC request identifier, used to correlate a request with its response.", - type=AttributeType.STRING, - keys=( - "jsonrpc.request.id", - "mcp.request.id", - ), + "mcp.progress.current": AttributeMetadata( + brief="Current progress value of an MCP operation.", + type=AttributeType.DOUBLE, + keys=("mcp.progress.current",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="1", - examples=["1"], - aliases=["mcp.request.id"], + example=0.2, + examples=[0.2, 50], changelog=[ ChangelogEntry( version="next", prs=[671], - description="Removed the session-scoped uniqueness requirement from the request identifier", - ), - ChangelogEntry( - version="0.12.0", - prs=[420], - description="Added jsonrpc.request.id attribute", + description="Changed the type to double to support fractional MCP progress values", ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "jvm.gc.action": AttributeMetadata( - brief="Name of the garbage collector action.", - type=AttributeType.STRING, - keys=("jvm.gc.action",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, - visibility=Visibility.PUBLIC, - example="end of minor GC", - changelog=[ - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), - ], - ), - "jvm.gc.name": AttributeMetadata( - brief="Name of the garbage collector.", + "mcp.progress.message": AttributeMetadata( + brief="Progress message describing the current state of an MCP operation.", type=AttributeType.STRING, - keys=("jvm.gc.name",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + keys=("mcp.progress.message",), + apply_scrubbing=ApplyScrubbingInfo( + key=ApplyScrubbing.MANUAL, + reason="Progress messages may contain user-specific or sensitive information", + ), + is_in_otel=False, visibility=Visibility.PUBLIC, - example="G1 Young Generation", + example="Processing 50 of 100 items", changelog=[ - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "jvm.memory.pool.name": AttributeMetadata( - brief="Name of the memory pool.", - type=AttributeType.STRING, - keys=("jvm.memory.pool.name",), + "mcp.progress.percentage": AttributeMetadata( + brief="Calculated progress percentage of an MCP operation. Computed from current/total * 100.", + type=AttributeType.DOUBLE, + keys=("mcp.progress.percentage",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="G1 Old Gen", + example=50, changelog=[ - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "jvm.memory.type": AttributeMetadata( - brief="Name of the memory pool.", + "mcp.progress.token": AttributeMetadata( + brief="Token for tracking progress of an MCP operation.", type=AttributeType.STRING, - keys=("jvm.memory.type",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, - visibility=Visibility.PUBLIC, - example="G1 Old Gen", - changelog=[ - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), - ], - ), - "jvm.thread.daemon": AttributeMetadata( - brief="Whether the thread is daemon or not.", - type=AttributeType.BOOLEAN, - keys=("jvm.thread.daemon",), + keys=("mcp.progress.token",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example=True, + example="progress-token-123", changelog=[ - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "jvm.thread.state": AttributeMetadata( - brief="State of the thread.", - type=AttributeType.STRING, - keys=("jvm.thread.state",), + "mcp.progress.total": AttributeMetadata( + brief="Total progress target value of an MCP operation.", + type=AttributeType.DOUBLE, + keys=("mcp.progress.total",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="blocked", + example=1, + examples=[1, 100], changelog=[ - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry( + version="next", + prs=[671], + description="Changed the type to double to support fractional MCP progress values", + ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "koa.name": AttributeMetadata( - brief="The name of the Koa middleware or matched route that handled the request.", + "mcp.prompt.name": AttributeMetadata( + brief="Name of the MCP prompt template being used.", type=AttributeType.STRING, - keys=("koa.name",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + keys=( + "gen_ai.prompt.name", + "mcp.prompt.name", + ), + apply_scrubbing=ApplyScrubbingInfo( + key=ApplyScrubbing.MANUAL, + reason="Prompt names may reveal user behavior patterns or sensitive operations", + ), is_in_otel=False, visibility=Visibility.PUBLIC, - example="/users/:id", + example="summarize", deprecation=DeprecationInfo( - reason="No single replacement. SDKs should use http.route for router layers and code.function.name for middleware layers instead." + replacement="gen_ai.prompt.name", + reason="OTel uses gen_ai.prompt.name for MCP prompt names", + status=DeprecationStatus.BACKFILL, ), + aliases=["gen_ai.prompt.name"], changelog=[ ChangelogEntry( - version="0.16.0", - prs=[490], - description="Added koa.name attribute as deprecated", + version="0.12.0", + prs=[420], + description="Deprecated in favor of gen_ai.prompt.name", ), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "koa.type": AttributeMetadata( - brief="The type of the Koa layer that handled the request.", + "mcp.prompt.result.description": AttributeMetadata( + brief="Description of the prompt result.", type=AttributeType.STRING, - keys=("koa.type",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + keys=("mcp.prompt.result.description",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), is_in_otel=False, visibility=Visibility.PUBLIC, - example="router", + example="A summary of the requested information", changelog=[ - ChangelogEntry( - version="0.16.0", prs=[471], description="Added koa.type attribute" - ), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "langchain.chain.name": AttributeMetadata( - brief="The name of the LangChain chain being executed.", + "mcp.prompt.result.message_content": AttributeMetadata( + brief="Content of the message in the prompt result. Used for single message results only.", type=AttributeType.STRING, - keys=( - "gen_ai.pipeline.name", - "ai.pipeline.name", - "langchain.chain.name", - ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + keys=("mcp.prompt.result.message_content",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), is_in_otel=False, visibility=Visibility.PUBLIC, - example="format_prompt", - examples=["format_prompt", "RunnableSequence"], - deprecation=DeprecationInfo( - replacement="gen_ai.pipeline.name", - reason="This attribute is being deprecated in favor of gen_ai.pipeline.name, which is the SDK-agnostic replacement for the name of the AI pipeline or chain being executed.", - status=DeprecationStatus.BACKFILL, - ), - aliases=["gen_ai.pipeline.name", "ai.pipeline.name"], + example="Please provide a summary of the document", changelog=[ - ChangelogEntry( - version="0.22.0", - prs=[599], - description="Added langchain.chain.name attribute", - ), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "lcp.element": AttributeMetadata( - brief="The dom element responsible for the largest contentful paint.", - type=AttributeType.STRING, - keys=( - "browser.web_vital.lcp.element", - "lcp.element", - ), + "mcp.prompt.result.message_count": AttributeMetadata( + brief="Number of messages in the prompt result.", + type=AttributeType.INTEGER, + keys=("mcp.prompt.result.message_count",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="img", - deprecation=DeprecationInfo( - replacement="browser.web_vital.lcp.element", - reason="The LCP element is now recorded as a browser.web_vital.lcp.element attribute.", - status=DeprecationStatus.BACKFILL, - ), - aliases=["browser.web_vital.lcp.element"], + example=3, changelog=[ - ChangelogEntry(version="0.5.0", prs=[233]), - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "lcp.id": AttributeMetadata( - brief="The id of the dom element responsible for the largest contentful paint.", + "mcp.prompt.result.message_role": AttributeMetadata( + brief="Role of the message in the prompt result. Used for single message results only.", type=AttributeType.STRING, - keys=( - "browser.web_vital.lcp.id", - "lcp.id", - ), + keys=("mcp.prompt.result.message_role",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="#hero", - deprecation=DeprecationInfo( - replacement="browser.web_vital.lcp.id", - reason="The LCP id is now recorded as a browser.web_vital.lcp.id attribute.", - status=DeprecationStatus.BACKFILL, - ), - aliases=["browser.web_vital.lcp.id"], - changelog=[ - ChangelogEntry(version="0.5.0", prs=[233]), - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), + example="user", + changelog=[ + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "lcp.loadTime": AttributeMetadata( - brief="The time it took for the LCP element to be loaded", + "mcp.protocol.ready": AttributeMetadata( + brief="Readiness indicator for the legacy MCP initialization handshake. A non-zero value indicates that notifications/initialized has completed initialization. Omit for protocol versions without this handshake.", type=AttributeType.INTEGER, - keys=( - "browser.web_vital.lcp.load_time", - "lcp.loadTime", - ), + keys=("mcp.protocol.ready",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=1402, - deprecation=DeprecationInfo( - replacement="browser.web_vital.lcp.load_time", - reason="The LCP load time is now recorded as a browser.web_vital.lcp.load_time attribute.", - status=DeprecationStatus.BACKFILL, - ), - aliases=["browser.web_vital.lcp.load_time"], + example=1, + examples=[1], changelog=[ - ChangelogEntry(version="0.5.0", prs=[233]), + ChangelogEntry( + version="next", + prs=[671], + description="Clarified that readiness describes the legacy MCP initialization handshake", + ), + ChangelogEntry(version="0.4.0", prs=[228]), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "lcp.renderTime": AttributeMetadata( - brief="The time it took for the LCP element to be rendered", - type=AttributeType.INTEGER, - keys=( - "browser.web_vital.lcp.render_time", - "lcp.renderTime", - ), + "mcp.protocol.version": AttributeMetadata( + brief="Version of the Model Context Protocol used for the operation.", + type=AttributeType.STRING, + keys=("mcp.protocol.version",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=1685, - deprecation=DeprecationInfo( - replacement="browser.web_vital.lcp.render_time", - reason="The LCP render time is now recorded as a browser.web_vital.lcp.render_time attribute.", - status=DeprecationStatus.BACKFILL, - ), - aliases=["browser.web_vital.lcp.render_time"], + example="2024-11-05", + examples=["2024-11-05"], changelog=[ - ChangelogEntry(version="0.5.0", prs=[233]), + ChangelogEntry( + version="next", + prs=[671], + description="Clarified that the protocol version applies to an operation without requiring a session", + ), + ChangelogEntry( + version="0.12.0", + prs=[420], + description="Set is_in_otel=true, attribute exists in OTel MCP registry", + ), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "lcp.size": AttributeMetadata( - brief="The size of the largest contentful paint element.", - type=AttributeType.INTEGER, - keys=( - "browser.web_vital.lcp.size", - "lcp.size", + "mcp.request.argument.": AttributeMetadata( + brief="MCP request argument with dynamic key suffix. The is replaced with the actual argument name. The value is a JSON-stringified representation of the argument value.", + type=AttributeType.STRING, + keys=("mcp.request.argument.",), + apply_scrubbing=ApplyScrubbingInfo( + key=ApplyScrubbing.AUTO, reason="Arguments contain user input" ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=1234, - deprecation=DeprecationInfo( - replacement="browser.web_vital.lcp.size", - reason="The LCP size is now recorded as a browser.web_vital.lcp.size attribute.", - status=DeprecationStatus.BACKFILL, - ), - aliases=["browser.web_vital.lcp.size"], + has_dynamic_suffix=True, + example="mcp.request.argument.query='weather in Paris'", changelog=[ - ChangelogEntry(version="0.5.0", prs=[233]), - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.3.0", prs=[176]), ], ), - "lcp.url": AttributeMetadata( - brief="The url of the dom element responsible for the largest contentful paint.", + "mcp.request.argument.name": AttributeMetadata( + brief="Name argument from prompts/get MCP request.", type=AttributeType.STRING, - keys=( - "browser.web_vital.lcp.url", - "lcp.url", + keys=("mcp.request.argument.name",), + apply_scrubbing=ApplyScrubbingInfo( + key=ApplyScrubbing.AUTO, reason="Prompt names can contain user input" ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), is_in_otel=False, visibility=Visibility.PUBLIC, - example="https://example.com", - deprecation=DeprecationInfo( - replacement="browser.web_vital.lcp.url", - reason="The LCP url is now recorded as a browser.web_vital.lcp.url attribute.", - status=DeprecationStatus.BACKFILL, - ), - aliases=["browser.web_vital.lcp.url"], + example="summarize", changelog=[ - ChangelogEntry(version="0.5.0", prs=[233]), - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "lcp": AttributeMetadata( - brief="The value of the recorded Largest Contentful Paint (LCP) web vital", - type=AttributeType.DOUBLE, - keys=( - "browser.web_vital.lcp.value", - "lcp", + "mcp.request.argument.uri": AttributeMetadata( + brief="URI argument from resources/read MCP request.", + type=AttributeType.STRING, + keys=("mcp.request.argument.uri",), + apply_scrubbing=ApplyScrubbingInfo( + key=ApplyScrubbing.AUTO, reason="URIs can contain user file paths" ), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=2500, - deprecation=DeprecationInfo( - replacement="browser.web_vital.lcp.value", - reason="The LCP web vital is now recorded as a browser.web_vital.lcp.value attribute.", - status=DeprecationStatus.BACKFILL, - ), - aliases=["browser.web_vital.lcp.value"], + example="file:///path/to/resource", changelog=[ - ChangelogEntry( - version="0.5.0", - prs=[229], - description="Added and deprecated attribute to document JS SDK's current behaviour", - ), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "litestar.middleware_name": AttributeMetadata( - brief="The name of the Litestar middleware.", + "mcp.request.id": AttributeMetadata( + brief="JSON-RPC request identifier for the MCP request, used to correlate the request with its response.", type=AttributeType.STRING, keys=( - "middleware.name", - "django.middleware_name", - "litestar.middleware_name", - "starlette.middleware_name", - "starlite.middleware_name", + "jsonrpc.request.id", + "mcp.request.id", ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="AuthenticationMiddleware", + example="1", + examples=["1"], deprecation=DeprecationInfo( - replacement="middleware.name", - reason="This attribute is being deprecated in favor of middleware.name, which is the framework-agnostic replacement.", + replacement="jsonrpc.request.id", + reason="OTel models MCP as JSON-RPC, uses jsonrpc.request.id", status=DeprecationStatus.BACKFILL, ), - aliases=["middleware.name"], + aliases=["jsonrpc.request.id"], changelog=[ ChangelogEntry( - version="0.19.0", - prs=[486], - description="Added litestar.middleware_name attribute, deprecated in favor of middleware.name", + version="next", + prs=[671], + description="Removed the session-scoped uniqueness requirement from the request identifier", ), + ChangelogEntry( + version="0.12.0", + prs=[420], + description="Deprecated in favor of jsonrpc.request.id", + ), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "logger.name": AttributeMetadata( - brief="The name of the logger that generated this event.", - type=AttributeType.STRING, - keys=("logger.name",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, - visibility=Visibility.PUBLIC, - example="myLogger", - changelog=[ - ChangelogEntry(version="0.1.0", prs=[127]), - ChangelogEntry(version="0.0.0"), - ], - ), - "mcp.auth.client.name": AttributeMetadata( - brief="Registered OAuth client application name associated with the authenticated MCP request. Taken from OAuth client registration metadata (client_name) made available by the authentication layer. This is distinct from the MCP implementation name in mcp.client.name; omit it when the OAuth client name is unavailable.", + "mcp.resource.protocol": AttributeMetadata( + brief="URI scheme of the MCP resource being accessed, extracted from its URI. This is distinct from the network protocol used to communicate with the MCP server.", type=AttributeType.STRING, - keys=("mcp.auth.client.name",), + keys=("mcp.resource.protocol",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="Example Desktop", - examples=["Example Desktop", "Example CLI"], + example="file", + examples=["file", "postgres"], changelog=[ ChangelogEntry( version="next", prs=[671], - description="Added mcp.auth.client.name attribute", + description="Clarified Sentry-specific semantics and removed the incorrect network attribute alias and deprecation", + ), + ChangelogEntry( + version="0.21.0", + prs=[581], + description="Added messaging.protocol as an alias", ), + ChangelogEntry( + version="0.12.0", + prs=[420], + description="Deprecated in favor of network.protocol.name", + ), + ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "mcp.cancelled.reason": AttributeMetadata( - brief="Reason for the cancellation of an MCP operation.", + "mcp.resource.uri": AttributeMetadata( + brief="The resource URI being accessed in an MCP operation.", type=AttributeType.STRING, - keys=("mcp.cancelled.reason",), + keys=("mcp.resource.uri",), apply_scrubbing=ApplyScrubbingInfo( - key=ApplyScrubbing.MANUAL, - reason="Cancellation reasons may contain user-specific or sensitive information", + key=ApplyScrubbing.AUTO, reason="URIs can contain sensitive file paths" ), - is_in_otel=False, - visibility=Visibility.PUBLIC, - example="User cancelled the request", - changelog=[ - ChangelogEntry(version="0.3.0", prs=[171]), - ], - ), - "mcp.cancelled.request_id": AttributeMetadata( - brief="Request ID of the cancelled MCP operation.", - type=AttributeType.STRING, - keys=("mcp.cancelled.request_id",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="123", + example="file:///path/to/file.txt", changelog=[ + ChangelogEntry( + version="0.12.0", + prs=[420], + description="Set is_in_otel=true, attribute exists in OTel MCP registry", + ), ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "mcp.client.name": AttributeMetadata( - brief="Name of the MCP client implementation, as declared in clientInfo. This is distinct from the registered OAuth application name in mcp.auth.client.name.", + "mcp.server.name": AttributeMetadata( + brief="Name of the MCP server implementation, as declared in serverInfo.", type=AttributeType.STRING, - keys=("mcp.client.name",), + keys=("mcp.server.name",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="example-mcp-client", - examples=["example-mcp-client"], + example="example-mcp-server", + examples=["example-mcp-server"], changelog=[ ChangelogEntry( version="next", @@ -22412,18 +22336,18 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "mcp.client.title": AttributeMetadata( - brief="Display title of the MCP client implementation, as declared in clientInfo.", + "mcp.server.title": AttributeMetadata( + brief="Display title of the MCP server implementation, as declared in serverInfo.", type=AttributeType.STRING, - keys=("mcp.client.title",), + keys=("mcp.server.title",), apply_scrubbing=ApplyScrubbingInfo( key=ApplyScrubbing.MANUAL, - reason="Client titles may reveal user-specific application configurations or custom setups", + reason="Server titles may reveal user-specific application configurations or custom setups", ), is_in_otel=False, visibility=Visibility.PUBLIC, - example="Example MCP Client", - examples=["Example MCP Client"], + example="Example MCP Server", + examples=["Example MCP Server"], changelog=[ ChangelogEntry( version="next", @@ -22433,15 +22357,15 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "mcp.client.version": AttributeMetadata( - brief="Version of the MCP client implementation, as declared in clientInfo.", + "mcp.server.version": AttributeMetadata( + brief="Version of the MCP server implementation, as declared in serverInfo.", type=AttributeType.STRING, - keys=("mcp.client.version",), + keys=("mcp.server.version",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="1.0.0", - examples=["1.0.0"], + example="0.1.0", + examples=["0.1.0"], changelog=[ ChangelogEntry( version="next", @@ -22451,650 +22375,758 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "mcp.lifecycle.phase": AttributeMetadata( - brief="Lifecycle phase indicator for MCP operations.", + "mcp.session.id": AttributeMetadata( + brief="Identifier for an MCP protocol session, when the operation belongs to a session.", type=AttributeType.STRING, - keys=("mcp.lifecycle.phase",), + keys=("mcp.session.id",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example="initialization_complete", + example="550e8400-e29b-41d4-a716-446655440000", + examples=["550e8400-e29b-41d4-a716-446655440000"], changelog=[ + ChangelogEntry( + version="next", + prs=[671], + description="Clarified that the identifier requires a real MCP protocol session", + ), + ChangelogEntry( + version="0.12.0", + prs=[420], + description="Set is_in_otel=true, attribute exists in OTel MCP registry", + ), ChangelogEntry(version="0.3.0", prs=[171]), ], - ), - "mcp.logging.data_type": AttributeMetadata( - brief="Data type of the logged message content.", - type=AttributeType.STRING, - keys=("mcp.logging.data_type",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, - visibility=Visibility.PUBLIC, - example="string", - changelog=[ - ChangelogEntry(version="0.3.0", prs=[171]), + additional_context=[ + "Applies to protocol versions and transports that provide MCP session management, including legacy Streamable HTTP sessions. Omit for operations without a protocol session; do not synthesize a session identifier from a request, connection, or conversation." ], ), - "mcp.logging.level": AttributeMetadata( - brief="Log level for MCP logging operations.", + "mcp.tool.name": AttributeMetadata( + brief="Name of the MCP tool being called.", type=AttributeType.STRING, - keys=("mcp.logging.level",), + keys=( + "gen_ai.tool.name", + "ai.function_call", + "mcp.tool.name", + ), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="info", + example="calculator", + deprecation=DeprecationInfo( + replacement="gen_ai.tool.name", + reason="OTel uses gen_ai.tool.name for MCP tool names", + status=DeprecationStatus.BACKFILL, + ), + aliases=["gen_ai.tool.name", "ai.function_call"], changelog=[ + ChangelogEntry( + version="0.12.0", + prs=[420], + description="Deprecated in favor of gen_ai.tool.name", + ), ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "mcp.logging.logger": AttributeMetadata( - brief="Logger name for MCP logging operations.", + "mcp.tool.result.content": AttributeMetadata( + brief="The content of the tool result.", type=AttributeType.STRING, - keys=("mcp.logging.logger",), + keys=( + "gen_ai.tool.call.result", + "ai.toolCall.result", + "anthropic.tool_result.content", + "gen_ai.tool.message", + "gen_ai.tool.output", + "mcp.tool.result.content", + ), apply_scrubbing=ApplyScrubbingInfo( - key=ApplyScrubbing.MANUAL, - reason="Logger names may be user-defined and could contain sensitive information", + key=ApplyScrubbing.AUTO, reason="Tool results can contain user data" ), is_in_otel=False, visibility=Visibility.PUBLIC, - example="mcp_server", + example='{"output": "rainy", "toolCallId": "1"}', + deprecation=DeprecationInfo( + replacement="gen_ai.tool.call.result", + reason="OTel uses gen_ai.tool.call.result for MCP tool results", + status=DeprecationStatus.BACKFILL, + ), + aliases=[ + "gen_ai.tool.call.result", + "gen_ai.tool.message", + "gen_ai.tool.output", + "ai.toolCall.result", + "anthropic.tool_result.content", + ], changelog=[ + ChangelogEntry( + version="0.12.0", + prs=[420], + description="Deprecated in favor of gen_ai.tool.call.result", + ), ChangelogEntry(version="0.3.0", prs=[171]), + ChangelogEntry(version="0.2.0", prs=[164]), ], ), - "mcp.logging.message": AttributeMetadata( - brief="Log message content from MCP logging operations.", - type=AttributeType.STRING, - keys=("mcp.logging.message",), - apply_scrubbing=ApplyScrubbingInfo( - key=ApplyScrubbing.AUTO, reason="Log messages can contain user data" - ), + "mcp.tool.result.content_count": AttributeMetadata( + brief="Number of content items in the tool result.", + type=AttributeType.INTEGER, + keys=("mcp.tool.result.content_count",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="Tool execution completed successfully", + example=1, + deprecation=DeprecationInfo( + reason="A count can be calculcated from the value of the gen_ai.tool.call.result attribute." + ), changelog=[ + ChangelogEntry( + version="next", + prs=[669], + description="Deprecate the attribute since it is redundant given gen_ai.tool.call.result.", + ), + ChangelogEntry(version="0.4.0", prs=[228]), ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "mcp.method.name": AttributeMetadata( - brief="The name of the MCP request or notification method being called.", - type=AttributeType.STRING, - keys=("mcp.method.name",), + "mcp.tool.result.is_error": AttributeMetadata( + brief="Whether a tool execution resulted in an error.", + type=AttributeType.BOOLEAN, + keys=("mcp.tool.result.is_error",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="tools/call", + example=False, + deprecation=DeprecationInfo( + replacement="error.type", + reason="OTel uses error.type set to 'tool_error' when isError is true. Cannot be automatically backfilled due to type mismatch (boolean vs string).", + ), changelog=[ ChangelogEntry( version="0.12.0", prs=[420], - description="Set is_in_otel=true, attribute exists in OTel MCP registry", + description="Deprecated in favor of error.type", ), ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "mcp.progress.current": AttributeMetadata( - brief="Current progress value of an MCP operation.", - type=AttributeType.DOUBLE, - keys=("mcp.progress.current",), + "mcp.transport": AttributeMetadata( + brief="MCP transport implementation name, such as the transport class name. This identifies the implementation, not the network transport or application protocol.", + type=AttributeType.STRING, + keys=("mcp.transport",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=0.2, - examples=[0.2, 50], + example="StdioServerTransport", + examples=["StdioServerTransport", "CustomHTTPTransport"], changelog=[ ChangelogEntry( version="next", prs=[671], - description="Changed the type to double to support fractional MCP progress values", + description="Clarified Sentry-specific semantics and removed the incorrect network attribute alias and deprecation", + ), + ChangelogEntry( + version="0.12.0", + prs=[420], + description="Deprecated in favor of network.transport", ), - ChangelogEntry(version="0.4.0", prs=[228]), ChangelogEntry(version="0.3.0", prs=[171]), ], ), - "mcp.progress.message": AttributeMetadata( - brief="Progress message describing the current state of an MCP operation.", + "mdc.": AttributeMetadata( + 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.", type=AttributeType.STRING, - keys=("mcp.progress.message",), - apply_scrubbing=ApplyScrubbingInfo( - key=ApplyScrubbing.MANUAL, - reason="Progress messages may contain user-specific or sensitive information", - ), + keys=("mdc.",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), is_in_otel=False, visibility=Visibility.PUBLIC, - example="Processing 50 of 100 items", + has_dynamic_suffix=True, + example="mdc.some_key='some_value'", changelog=[ - ChangelogEntry(version="0.3.0", prs=[171]), + ChangelogEntry(version="0.3.0", prs=[176]), ], ), - "mcp.progress.percentage": AttributeMetadata( - brief="Calculated progress percentage of an MCP operation. Computed from current/total * 100.", - type=AttributeType.DOUBLE, - keys=("mcp.progress.percentage",), + "messaging.batch.message_count": AttributeMetadata( + brief="The number of messages sent, received, or processed in the scope of the batching operation.", + type=AttributeType.INTEGER, + keys=("messaging.batch.message_count",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, + is_in_otel=True, visibility=Visibility.PUBLIC, - example=50, + example=10, changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.3.0", prs=[171]), + ChangelogEntry( + version="0.6.0", + prs=[341], + description="Added messaging.batch.message_count attribute", + ), ], ), - "mcp.progress.token": AttributeMetadata( - brief="Token for tracking progress of an MCP operation.", + "messaging.bullmq.flow.name": AttributeMetadata( + brief="The name of the root job of the BullMQ flow that FlowProducer.add() adds.", type=AttributeType.STRING, - keys=("mcp.progress.token",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, - visibility=Visibility.PUBLIC, - example="progress-token-123", - changelog=[ - ChangelogEntry(version="0.3.0", prs=[171]), - ], - ), - "mcp.progress.total": AttributeMetadata( - brief="Total progress target value of an MCP operation.", - type=AttributeType.DOUBLE, - keys=("mcp.progress.total",), + keys=("messaging.bullmq.flow.name",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=1, - examples=[1, 100], + example="build-report", + examples=["build-report"], changelog=[ ChangelogEntry( version="next", - prs=[671], - description="Changed the type to double to support fractional MCP progress values", + prs=[690], + description="Added messaging.bullmq.flow.name attribute", ), - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.3.0", prs=[171]), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.flow.name` attribute of BullMQ's telemetry interface." ], ), - "mcp.prompt.name": AttributeMetadata( - brief="Name of the MCP prompt template being used.", - type=AttributeType.STRING, - keys=( - "gen_ai.prompt.name", - "mcp.prompt.name", - ), - apply_scrubbing=ApplyScrubbingInfo( - key=ApplyScrubbing.MANUAL, - reason="Prompt names may reveal user behavior patterns or sensitive operations", - ), + "messaging.bullmq.job.attempt_finished_timestamp": AttributeMetadata( + brief="The time in milliseconds since the Unix epoch when the current attempt of the BullMQ job finished.", + type=AttributeType.INTEGER, + keys=("messaging.bullmq.job.attempt_finished_timestamp",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="summarize", - deprecation=DeprecationInfo( - replacement="gen_ai.prompt.name", - reason="OTel uses gen_ai.prompt.name for MCP prompt names", - status=DeprecationStatus.BACKFILL, - ), - aliases=["gen_ai.prompt.name"], + example=1791184722406, + examples=[1791184722406], changelog=[ ChangelogEntry( - version="0.12.0", - prs=[420], - description="Deprecated in favor of gen_ai.prompt.name", + version="next", + prs=[690], + description="Added messaging.bullmq.job.attempt_finished_timestamp attribute", ), - ChangelogEntry(version="0.3.0", prs=[171]), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.job.attempt_finished_timestamp` attribute of BullMQ's telemetry interface." ], ), - "mcp.prompt.result.description": AttributeMetadata( - brief="Description of the prompt result.", - type=AttributeType.STRING, - keys=("mcp.prompt.result.description",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + "messaging.bullmq.job.bulk.names": AttributeMetadata( + brief="The names of the BullMQ jobs or flows that one bulk operation adds, for example Queue.addBulk().", + type=AttributeType.STRING_ARRAY, + keys=("messaging.bullmq.job.bulk.names",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="A summary of the requested information", + example=["send-welcome-email", "generate-report"], + examples=[["send-welcome-email", "generate-report"]], changelog=[ - ChangelogEntry(version="0.3.0", prs=[171]), + ChangelogEntry( + version="next", + prs=[690], + description="Added messaging.bullmq.job.bulk.names attribute", + ), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.job.bulk.names` attribute of BullMQ's telemetry interface." ], ), - "mcp.prompt.result.message_content": AttributeMetadata( - brief="Content of the message in the prompt result. Used for single message results only.", + "messaging.bullmq.job.deduplication.key": AttributeMetadata( + brief="The deduplication ID that Queue.removeDeduplicationKey() removes.", type=AttributeType.STRING, - keys=("mcp.prompt.result.message_content",), + keys=("messaging.bullmq.job.deduplication.key",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), is_in_otel=False, visibility=Visibility.PUBLIC, - example="Please provide a summary of the document", + example="user-42-sync", + examples=["user-42-sync"], changelog=[ - ChangelogEntry(version="0.3.0", prs=[171]), + ChangelogEntry( + version="next", + prs=[690], + description="Added messaging.bullmq.job.deduplication.key attribute", + ), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.job.deduplication.key` attribute of BullMQ's telemetry interface." ], ), - "mcp.prompt.result.message_count": AttributeMetadata( - brief="Number of messages in the prompt result.", + "messaging.bullmq.job.finished.timestamp": AttributeMetadata( + brief="The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job.", type=AttributeType.INTEGER, - keys=("mcp.prompt.result.message_count",), + keys=("messaging.bullmq.job.finished.timestamp",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=3, + example=1791184722411, + examples=[1791184722411], changelog=[ - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.3.0", prs=[171]), + ChangelogEntry( + version="next", + prs=[690], + description="Added messaging.bullmq.job.finished.timestamp attribute", + ), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.job.finished.timestamp` attribute of BullMQ's telemetry interface.", + "BullMQ 5.79.1 sets this attribute. BullMQ 6.3.11 does not.", ], ), - "mcp.prompt.result.message_role": AttributeMetadata( - brief="Role of the message in the prompt result. Used for single message results only.", - type=AttributeType.STRING, - keys=("mcp.prompt.result.message_role",), + "messaging.bullmq.job.ids": AttributeMetadata( + brief="The IDs of the BullMQ jobs that Queue.clean() removed.", + type=AttributeType.STRING_ARRAY, + keys=("messaging.bullmq.job.ids",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="user", + example=["1", "2", "3"], + examples=[["1", "2", "3"]], changelog=[ - ChangelogEntry(version="0.3.0", prs=[171]), + ChangelogEntry( + version="next", + prs=[690], + description="Added messaging.bullmq.job.ids attribute", + ), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.job.ids` attribute of BullMQ's telemetry interface.", + "BullMQ 5.79.1 sets this attribute. BullMQ 6.3.11 does not.", ], ), - "mcp.protocol.ready": AttributeMetadata( - brief="Readiness indicator for the legacy MCP initialization handshake. A non-zero value indicates that notifications/initialized has completed initialization. Omit for protocol versions without this handshake.", - type=AttributeType.INTEGER, - keys=("mcp.protocol.ready",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + "messaging.bullmq.job.key": AttributeMetadata( + brief="The key that a BullMQ remove operation for a debounce or repeatable key gets, for example Queue.removeDebounceKey().", + type=AttributeType.STRING, + keys=("messaging.bullmq.job.key",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), is_in_otel=False, visibility=Visibility.PUBLIC, - example=1, - examples=[1], + example="user-42-sync", + examples=["user-42-sync"], changelog=[ ChangelogEntry( version="next", - prs=[671], - description="Clarified that readiness describes the legacy MCP initialization handshake", + prs=[690], + description="Added messaging.bullmq.job.key attribute", ), - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.3.0", prs=[171]), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.job.key` attribute of BullMQ's telemetry interface." ], ), - "mcp.protocol.version": AttributeMetadata( - brief="Version of the Model Context Protocol used for the operation.", + "messaging.bullmq.job.name": AttributeMetadata( + brief="The name of the BullMQ job, which the user passes to Queue.add() to identify the kind of work.", type=AttributeType.STRING, - keys=("mcp.protocol.version",), + keys=("messaging.bullmq.job.name",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="2024-11-05", - examples=["2024-11-05"], + example="send-welcome-email", + examples=["send-welcome-email", "generate-report"], changelog=[ ChangelogEntry( version="next", - prs=[671], - description="Clarified that the protocol version applies to an operation without requiring a session", + prs=[690], + description="Added messaging.bullmq.job.name attribute", ), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.job.name` attribute of BullMQ's telemetry interface.", + "Also set on the BullMQ job metrics.", + ], + ), + "messaging.bullmq.job.processed.timestamp": AttributeMetadata( + brief="The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job.", + type=AttributeType.INTEGER, + keys=("messaging.bullmq.job.processed.timestamp",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=1791184722281, + examples=[1791184722281], + changelog=[ ChangelogEntry( - version="0.12.0", - prs=[420], - description="Set is_in_otel=true, attribute exists in OTel MCP registry", + version="next", + prs=[690], + description="Added messaging.bullmq.job.processed.timestamp attribute", ), - ChangelogEntry(version="0.3.0", prs=[171]), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.job.processed.timestamp` attribute of BullMQ's telemetry interface." ], ), - "mcp.request.argument.": AttributeMetadata( - brief="MCP request argument with dynamic key suffix. The is replaced with the actual argument name. The value is a JSON-stringified representation of the argument value.", + "messaging.bullmq.job.progress": AttributeMetadata( + brief="The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress().", type=AttributeType.STRING, - keys=("mcp.request.argument.",), - apply_scrubbing=ApplyScrubbingInfo( - key=ApplyScrubbing.AUTO, reason="Arguments contain user input" - ), + keys=("messaging.bullmq.job.progress",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), is_in_otel=False, visibility=Visibility.PUBLIC, - has_dynamic_suffix=True, - example="mcp.request.argument.query='weather in Paris'", + example='{"percentage":50}', + examples=['{"percentage":50}'], changelog=[ - ChangelogEntry(version="0.3.0", prs=[176]), + ChangelogEntry( + version="next", + prs=[690], + description="Added messaging.bullmq.job.progress attribute", + ), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.job.progress` attribute of BullMQ's telemetry interface." ], ), - "mcp.request.argument.name": AttributeMetadata( - brief="Name argument from prompts/get MCP request.", + "messaging.bullmq.job.scheduler.id": AttributeMetadata( + brief="The ID of the BullMQ job scheduler that adds the job.", type=AttributeType.STRING, - keys=("mcp.request.argument.name",), - apply_scrubbing=ApplyScrubbingInfo( - key=ApplyScrubbing.AUTO, reason="Prompt names can contain user input" - ), + keys=("messaging.bullmq.job.scheduler.id",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="summarize", + example="daily-report", + examples=["daily-report"], changelog=[ - ChangelogEntry(version="0.3.0", prs=[171]), + ChangelogEntry( + version="next", + prs=[690], + description="Added messaging.bullmq.job.scheduler.id attribute", + ), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.job.scheduler.id` attribute of BullMQ's telemetry interface." ], ), - "mcp.request.argument.uri": AttributeMetadata( - brief="URI argument from resources/read MCP request.", + "messaging.bullmq.job.state": AttributeMetadata( + brief="The state of the BullMQ job that a job metric counts.", type=AttributeType.STRING, - keys=("mcp.request.argument.uri",), - apply_scrubbing=ApplyScrubbingInfo( - key=ApplyScrubbing.AUTO, reason="URIs can contain user file paths" - ), + keys=("messaging.bullmq.job.state",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="file:///path/to/resource", + example="completed", + examples=["completed", "failed", "delayed"], changelog=[ - ChangelogEntry(version="0.3.0", prs=[171]), + ChangelogEntry( + version="next", + prs=[690], + description="Added messaging.bullmq.job.state attribute", + ), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.job.state` attribute of BullMQ's telemetry interface.", + "Set on the BullMQ job metrics with BullMQ 6.3.11. With BullMQ 5.79.1, `messaging.bullmq.job.status` is set instead.", ], ), - "mcp.request.id": AttributeMetadata( - brief="JSON-RPC request identifier for the MCP request, used to correlate the request with its response.", + "messaging.bullmq.job.status": AttributeMetadata( + brief="The state of the BullMQ job that a job metric counts.", type=AttributeType.STRING, - keys=( - "jsonrpc.request.id", - "mcp.request.id", - ), + keys=("messaging.bullmq.job.status",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="1", - examples=["1"], - deprecation=DeprecationInfo( - replacement="jsonrpc.request.id", - reason="OTel models MCP as JSON-RPC, uses jsonrpc.request.id", - status=DeprecationStatus.BACKFILL, - ), - aliases=["jsonrpc.request.id"], + example="completed", + examples=["completed", "failed", "delayed"], changelog=[ ChangelogEntry( version="next", - prs=[671], - description="Removed the session-scoped uniqueness requirement from the request identifier", - ), - ChangelogEntry( - version="0.12.0", - prs=[420], - description="Deprecated in favor of jsonrpc.request.id", + prs=[690], + description="Added messaging.bullmq.job.status attribute", ), - ChangelogEntry(version="0.3.0", prs=[171]), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.job.status` attribute of BullMQ's telemetry interface.", + "Set on the BullMQ job metrics with BullMQ 5.79.1. With BullMQ 6.3.11, `messaging.bullmq.job.state` is set instead.", ], ), - "mcp.resource.protocol": AttributeMetadata( - brief="URI scheme of the MCP resource being accessed, extracted from its URI. This is distinct from the network protocol used to communicate with the MCP server.", + "messaging.bullmq.job.type": AttributeMetadata( + brief="The job state from which Queue.clean() removes BullMQ jobs.", type=AttributeType.STRING, - keys=("mcp.resource.protocol",), + keys=("messaging.bullmq.job.type",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="file", - examples=["file", "postgres"], + example="completed", + examples=["completed", "failed"], changelog=[ ChangelogEntry( version="next", - prs=[671], - description="Clarified Sentry-specific semantics and removed the incorrect network attribute alias and deprecation", - ), - ChangelogEntry( - version="0.21.0", - prs=[581], - description="Added messaging.protocol as an alias", - ), - ChangelogEntry( - version="0.12.0", - prs=[420], - description="Deprecated in favor of network.protocol.name", + prs=[690], + description="Added messaging.bullmq.job.type attribute", ), - ChangelogEntry(version="0.3.0", prs=[171]), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.job.type` attribute of BullMQ's telemetry interface." ], ), - "mcp.resource.uri": AttributeMetadata( - brief="The resource URI being accessed in an MCP operation.", - type=AttributeType.STRING, - keys=("mcp.resource.uri",), - apply_scrubbing=ApplyScrubbingInfo( - key=ApplyScrubbing.AUTO, reason="URIs can contain sensitive file paths" - ), - is_in_otel=True, + "messaging.bullmq.queue.clean.count": AttributeMetadata( + brief="The number of BullMQ jobs that Queue.clean() removed.", + type=AttributeType.INTEGER, + keys=("messaging.bullmq.queue.clean.count",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, visibility=Visibility.PUBLIC, - example="file:///path/to/file.txt", + example=25, + examples=[25], changelog=[ ChangelogEntry( - version="0.12.0", - prs=[420], - description="Set is_in_otel=true, attribute exists in OTel MCP registry", + version="next", + prs=[690], + description="Added messaging.bullmq.queue.clean.count attribute", ), - ChangelogEntry(version="0.3.0", prs=[171]), ], - ), - "mcp.server.name": AttributeMetadata( - brief="Name of the MCP server implementation, as declared in serverInfo.", - type=AttributeType.STRING, - keys=("mcp.server.name",), + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.queue.clean.count` attribute of BullMQ's telemetry interface.", + "BullMQ 6.3.11 sets this attribute. BullMQ 5.79.1 does not.", + ], + ), + "messaging.bullmq.queue.clean.limit": AttributeMetadata( + brief="The maximum number of BullMQ jobs that Queue.clean() removes.", + type=AttributeType.INTEGER, + keys=("messaging.bullmq.queue.clean.limit",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="example-mcp-server", - examples=["example-mcp-server"], + example=1000, + examples=[1000], changelog=[ ChangelogEntry( version="next", - prs=[671], - description="Clarified that the attribute describes declared MCP implementation metadata", + prs=[690], + description="Added messaging.bullmq.queue.clean.limit attribute", ), - ChangelogEntry(version="0.3.0", prs=[171]), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.queue.clean.limit` attribute of BullMQ's telemetry interface." ], ), - "mcp.server.title": AttributeMetadata( - brief="Display title of the MCP server implementation, as declared in serverInfo.", - type=AttributeType.STRING, - keys=("mcp.server.title",), - apply_scrubbing=ApplyScrubbingInfo( - key=ApplyScrubbing.MANUAL, - reason="Server titles may reveal user-specific application configurations or custom setups", - ), + "messaging.bullmq.queue.drain.delay": AttributeMetadata( + brief="Whether Queue.drain() also removes the delayed BullMQ jobs.", + type=AttributeType.BOOLEAN, + keys=("messaging.bullmq.queue.drain.delay",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="Example MCP Server", - examples=["Example MCP Server"], + example=True, + examples=[True], changelog=[ ChangelogEntry( version="next", - prs=[671], - description="Clarified that the attribute describes declared MCP implementation metadata", + prs=[690], + description="Added messaging.bullmq.queue.drain.delay attribute", ), - ChangelogEntry(version="0.3.0", prs=[171]), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.queue.drain.delay` attribute of BullMQ's telemetry interface." ], ), - "mcp.server.version": AttributeMetadata( - brief="Version of the MCP server implementation, as declared in serverInfo.", - type=AttributeType.STRING, - keys=("mcp.server.version",), + "messaging.bullmq.queue.event.max.length": AttributeMetadata( + brief="The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream.", + type=AttributeType.INTEGER, + keys=("messaging.bullmq.queue.event.max.length",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="0.1.0", - examples=["0.1.0"], + example=10000, + examples=[10000], changelog=[ ChangelogEntry( version="next", - prs=[671], - description="Clarified that the attribute describes declared MCP implementation metadata", + prs=[690], + description="Added messaging.bullmq.queue.event.max.length attribute", ), - ChangelogEntry(version="0.3.0", prs=[171]), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.queue.event.max.length` attribute of BullMQ's telemetry interface." ], ), - "mcp.session.id": AttributeMetadata( - brief="Identifier for an MCP protocol session, when the operation belongs to a session.", - type=AttributeType.STRING, - keys=("mcp.session.id",), + "messaging.bullmq.queue.grace": AttributeMetadata( + brief="The grace period in milliseconds that Queue.clean() uses. Only BullMQ jobs that are older are removed.", + type=AttributeType.INTEGER, + keys=("messaging.bullmq.queue.grace",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example="550e8400-e29b-41d4-a716-446655440000", - examples=["550e8400-e29b-41d4-a716-446655440000"], + example=60000, + examples=[60000], changelog=[ ChangelogEntry( version="next", - prs=[671], - description="Clarified that the identifier requires a real MCP protocol session", - ), - ChangelogEntry( - version="0.12.0", - prs=[420], - description="Set is_in_otel=true, attribute exists in OTel MCP registry", + prs=[690], + description="Added messaging.bullmq.queue.grace attribute", ), - ChangelogEntry(version="0.3.0", prs=[171]), ], additional_context=[ - "Applies to protocol versions and transports that provide MCP session management, including legacy Streamable HTTP sessions. Omit for operations without a protocol session; do not synthesize a session identifier from a request, connection, or conversation." + "The Sentry SDK sets this attribute from the `bullmq.queue.grace` attribute of BullMQ's telemetry interface." ], ), - "mcp.tool.name": AttributeMetadata( - brief="Name of the MCP tool being called.", + "messaging.bullmq.queue.jobs.state": AttributeMetadata( + brief="The BullMQ job state that the queue job count metric counts.", type=AttributeType.STRING, - keys=( - "gen_ai.tool.name", - "ai.function_call", - "mcp.tool.name", - ), + keys=("messaging.bullmq.queue.jobs.state",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="calculator", - deprecation=DeprecationInfo( - replacement="gen_ai.tool.name", - reason="OTel uses gen_ai.tool.name for MCP tool names", - status=DeprecationStatus.BACKFILL, - ), - aliases=["gen_ai.tool.name", "ai.function_call"], + example="waiting", + examples=["waiting", "active", "completed"], changelog=[ ChangelogEntry( - version="0.12.0", - prs=[420], - description="Deprecated in favor of gen_ai.tool.name", + version="next", + prs=[690], + description="Added messaging.bullmq.queue.jobs.state attribute", ), - ChangelogEntry(version="0.3.0", prs=[171]), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.queue.jobs.state` attribute of BullMQ's telemetry interface.", + "Set on the BullMQ queue job count metric.", ], ), - "mcp.tool.result.content": AttributeMetadata( - brief="The content of the tool result.", - type=AttributeType.STRING, - keys=( - "gen_ai.tool.call.result", - "ai.toolCall.result", - "anthropic.tool_result.content", - "gen_ai.tool.message", - "gen_ai.tool.output", - "mcp.tool.result.content", - ), - apply_scrubbing=ApplyScrubbingInfo( - key=ApplyScrubbing.AUTO, reason="Tool results can contain user data" - ), + "messaging.bullmq.queue.rate.limit": AttributeMetadata( + brief="The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue.", + type=AttributeType.INTEGER, + keys=("messaging.bullmq.queue.rate.limit",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example='{"output": "rainy", "toolCallId": "1"}', - deprecation=DeprecationInfo( - replacement="gen_ai.tool.call.result", - reason="OTel uses gen_ai.tool.call.result for MCP tool results", - status=DeprecationStatus.BACKFILL, - ), - aliases=[ - "gen_ai.tool.call.result", - "gen_ai.tool.message", - "gen_ai.tool.output", - "ai.toolCall.result", - "anthropic.tool_result.content", - ], + example=5000, + examples=[5000], changelog=[ ChangelogEntry( - version="0.12.0", - prs=[420], - description="Deprecated in favor of gen_ai.tool.call.result", + version="next", + prs=[690], + description="Added messaging.bullmq.queue.rate.limit attribute", ), - ChangelogEntry(version="0.3.0", prs=[171]), - ChangelogEntry(version="0.2.0", prs=[164]), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.queue.rate.limit` attribute of BullMQ's telemetry interface." ], ), - "mcp.tool.result.content_count": AttributeMetadata( - brief="Number of content items in the tool result.", - type=AttributeType.INTEGER, - keys=("mcp.tool.result.content_count",), + "messaging.bullmq.worker.do.not.wait.active": AttributeMetadata( + brief="Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish.", + type=AttributeType.BOOLEAN, + keys=("messaging.bullmq.worker.do.not.wait.active",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example=1, - deprecation=DeprecationInfo( - reason="A count can be calculcated from the value of the gen_ai.tool.call.result attribute." - ), + example=False, + examples=[False], changelog=[ ChangelogEntry( version="next", - prs=[669], - description="Deprecate the attribute since it is redundant given gen_ai.tool.call.result.", + prs=[690], + description="Added messaging.bullmq.worker.do.not.wait.active attribute", ), - ChangelogEntry(version="0.4.0", prs=[228]), - ChangelogEntry(version="0.3.0", prs=[171]), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.worker.do.not.wait.active` attribute of BullMQ's telemetry interface." ], ), - "mcp.tool.result.is_error": AttributeMetadata( - brief="Whether a tool execution resulted in an error.", + "messaging.bullmq.worker.force.close": AttributeMetadata( + brief="Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish.", type=AttributeType.BOOLEAN, - keys=("mcp.tool.result.is_error",), + keys=("messaging.bullmq.worker.force.close",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, example=False, - deprecation=DeprecationInfo( - replacement="error.type", - reason="OTel uses error.type set to 'tool_error' when isError is true. Cannot be automatically backfilled due to type mismatch (boolean vs string).", - ), + examples=[False], changelog=[ ChangelogEntry( - version="0.12.0", - prs=[420], - description="Deprecated in favor of error.type", + version="next", + prs=[690], + description="Added messaging.bullmq.worker.force.close attribute", ), - ChangelogEntry(version="0.3.0", prs=[171]), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.worker.force.close` attribute of BullMQ's telemetry interface." ], ), - "mcp.transport": AttributeMetadata( - brief="MCP transport implementation name, such as the transport class name. This identifies the implementation, not the network transport or application protocol.", + "messaging.bullmq.worker.id": AttributeMetadata( + brief="The ID that BullMQ generates for the Worker instance.", type=AttributeType.STRING, - keys=("mcp.transport",), + keys=("messaging.bullmq.worker.id",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - example="StdioServerTransport", - examples=["StdioServerTransport", "CustomHTTPTransport"], + example="03327d57-05cc-4528-9d24-c59bf6520039", + examples=["03327d57-05cc-4528-9d24-c59bf6520039"], changelog=[ ChangelogEntry( version="next", - prs=[671], - description="Clarified Sentry-specific semantics and removed the incorrect network attribute alias and deprecation", + prs=[690], + description="Added messaging.bullmq.worker.id attribute", ), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.worker.id` attribute of BullMQ's telemetry interface." + ], + ), + "messaging.bullmq.worker.jobs.to.extend.locks": AttributeMetadata( + brief="The IDs of the BullMQ jobs whose locks the Worker extends.", + type=AttributeType.STRING_ARRAY, + keys=("messaging.bullmq.worker.jobs.to.extend.locks",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=["1", "2"], + examples=[["1", "2"]], + changelog=[ ChangelogEntry( - version="0.12.0", - prs=[420], - description="Deprecated in favor of network.transport", + version="next", + prs=[690], + description="Added messaging.bullmq.worker.jobs.to.extend.locks attribute", ), - ChangelogEntry(version="0.3.0", prs=[171]), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.worker.jobs.to.extend.locks` attribute of BullMQ's telemetry interface." ], ), - "mdc.": AttributeMetadata( - 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.", + "messaging.bullmq.worker.name": AttributeMetadata( + brief="The name that the user gives to the BullMQ Worker in its options.", type=AttributeType.STRING, - keys=("mdc.",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), + keys=("messaging.bullmq.worker.name",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, - has_dynamic_suffix=True, - example="mdc.some_key='some_value'", + example="email-worker", + examples=["email-worker"], changelog=[ - ChangelogEntry(version="0.3.0", prs=[176]), + ChangelogEntry( + version="next", + prs=[690], + description="Added messaging.bullmq.worker.name attribute", + ), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.worker.name` attribute of BullMQ's telemetry interface." ], ), - "messaging.batch.message_count": AttributeMetadata( - brief="The number of messages sent, received, or processed in the scope of the batching operation.", + "messaging.bullmq.worker.rate.limit": AttributeMetadata( + brief="The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker.", type=AttributeType.INTEGER, - keys=("messaging.batch.message_count",), + keys=("messaging.bullmq.worker.rate.limit",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=True, + is_in_otel=False, visibility=Visibility.PUBLIC, - example=10, + example=5000, + examples=[5000], changelog=[ ChangelogEntry( - version="0.6.0", - prs=[341], - description="Added messaging.batch.message_count attribute", + version="next", + prs=[690], + description="Added messaging.bullmq.worker.rate.limit attribute", + ), + ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.worker.rate.limit` attribute of BullMQ's telemetry interface." + ], + ), + "messaging.bullmq.worker.stalled.jobs": AttributeMetadata( + brief="The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state.", + type=AttributeType.STRING_ARRAY, + keys=("messaging.bullmq.worker.stalled.jobs",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=False, + visibility=Visibility.PUBLIC, + example=["1", "2"], + examples=[["1", "2"]], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added messaging.bullmq.worker.stalled.jobs attribute", ), ], + additional_context=[ + "The Sentry SDK sets this attribute from the `bullmq.worker.stalled.jobs` attribute of BullMQ's telemetry interface." + ], ), "messaging.conversation_id": AttributeMetadata( brief='The conversation ID identifying the conversation to which the message belongs, represented as a string. Sometimes called "Correlation ID".', @@ -29480,34 +29512,6 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "browser.web_vital.lcp.value": float, "browser.web_vital.ttfb.request_time": float, "browser.web_vital.ttfb.value": float, - "bullmq.flow.name": str, - "bullmq.job.attempt_finished_timestamp": int, - "bullmq.job.bulk.names": List[str], - "bullmq.job.deduplication.key": str, - "bullmq.job.finished.timestamp": int, - "bullmq.job.ids": List[str], - "bullmq.job.key": str, - "bullmq.job.name": str, - "bullmq.job.processed.timestamp": int, - "bullmq.job.progress": str, - "bullmq.job.scheduler.id": str, - "bullmq.job.state": str, - "bullmq.job.status": str, - "bullmq.job.type": str, - "bullmq.queue.clean.count": int, - "bullmq.queue.clean.limit": int, - "bullmq.queue.drain.delay": bool, - "bullmq.queue.event.max.length": int, - "bullmq.queue.grace": int, - "bullmq.queue.jobs.state": str, - "bullmq.queue.rate.limit": int, - "bullmq.worker.do.not.wait.active": bool, - "bullmq.worker.force.close": bool, - "bullmq.worker.id": str, - "bullmq.worker.jobs.to.extend.locks": List[str], - "bullmq.worker.name": str, - "bullmq.worker.rate.limit": int, - "bullmq.worker.stalled.jobs": List[str], "cache.hit": bool, "cache.item_age": int, "cache.item_size": int, @@ -29878,6 +29882,34 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "mcp.transport": str, "mdc.": str, "messaging.batch.message_count": int, + "messaging.bullmq.flow.name": str, + "messaging.bullmq.job.attempt_finished_timestamp": int, + "messaging.bullmq.job.bulk.names": List[str], + "messaging.bullmq.job.deduplication.key": str, + "messaging.bullmq.job.finished.timestamp": int, + "messaging.bullmq.job.ids": List[str], + "messaging.bullmq.job.key": str, + "messaging.bullmq.job.name": str, + "messaging.bullmq.job.processed.timestamp": int, + "messaging.bullmq.job.progress": str, + "messaging.bullmq.job.scheduler.id": str, + "messaging.bullmq.job.state": str, + "messaging.bullmq.job.status": str, + "messaging.bullmq.job.type": str, + "messaging.bullmq.queue.clean.count": int, + "messaging.bullmq.queue.clean.limit": int, + "messaging.bullmq.queue.drain.delay": bool, + "messaging.bullmq.queue.event.max.length": int, + "messaging.bullmq.queue.grace": int, + "messaging.bullmq.queue.jobs.state": str, + "messaging.bullmq.queue.rate.limit": int, + "messaging.bullmq.worker.do.not.wait.active": bool, + "messaging.bullmq.worker.force.close": bool, + "messaging.bullmq.worker.id": str, + "messaging.bullmq.worker.jobs.to.extend.locks": List[str], + "messaging.bullmq.worker.name": str, + "messaging.bullmq.worker.rate.limit": int, + "messaging.bullmq.worker.stalled.jobs": List[str], "messaging.conversation_id": str, "messaging.destination": str, "messaging.destination.connection": str, From cf94f945f80a667effa6afe5beb51ba1f2cdae2b Mon Sep 17 00:00:00 2001 From: JPeer264 Date: Tue, 20 Oct 2026 13:28:10 +0200 Subject: [PATCH 04/11] fixup! feat: Add BullMQ attributes and metrics --- .../sentry-conventions/src/attributes.ts | 40 ------------------- javascript/sentry-conventions/src/search.ts | 12 ------ .../messaging__bullmq__job__progress.json | 21 ---------- python/src/sentry_conventions/attributes.py | 34 ---------------- 4 files changed, 107 deletions(-) delete mode 100644 model/attributes/messaging/messaging__bullmq__job__progress.json diff --git a/javascript/sentry-conventions/src/attributes.ts b/javascript/sentry-conventions/src/attributes.ts index 5122f329e..42bc921c6 100644 --- a/javascript/sentry-conventions/src/attributes.ts +++ b/javascript/sentry-conventions/src/attributes.ts @@ -12526,27 +12526,6 @@ export const MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP = 'messaging.bullmq.job.pr */ export type MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP_TYPE = number; -// Path: model/attributes/messaging/messaging__bullmq__job__progress.json - -/** - * The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress(). `messaging.bullmq.job.progress` - * - * Attribute Value Type: `string` {@link MESSAGING_BULLMQ_JOB_PROGRESS_TYPE} - * - * Apply Scrubbing: auto - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example "{\"percentage\":50}" - */ -export const MESSAGING_BULLMQ_JOB_PROGRESS = 'messaging.bullmq.job.progress'; - -/** - * Type for {@link MESSAGING_BULLMQ_JOB_PROGRESS} messaging.bullmq.job.progress - */ -export type MESSAGING_BULLMQ_JOB_PROGRESS_TYPE = string; - // Path: model/attributes/messaging/messaging__bullmq__job__scheduler__id.json /** @@ -21113,7 +21092,6 @@ export const ATTRIBUTE_TYPE: Record = { 'messaging.bullmq.job.key': 'string', 'messaging.bullmq.job.name': 'string', 'messaging.bullmq.job.processed.timestamp': 'integer', - 'messaging.bullmq.job.progress': 'string', 'messaging.bullmq.job.scheduler.id': 'string', 'messaging.bullmq.job.state': 'string', 'messaging.bullmq.job.status': 'string', @@ -22028,7 +22006,6 @@ export type AttributeName = | typeof MESSAGING_BULLMQ_JOB_KEY | typeof MESSAGING_BULLMQ_JOB_NAME | typeof MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP - | typeof MESSAGING_BULLMQ_JOB_PROGRESS | typeof MESSAGING_BULLMQ_JOB_SCHEDULER_ID | typeof MESSAGING_BULLMQ_JOB_STATE | typeof MESSAGING_BULLMQ_JOB_STATUS @@ -31531,22 +31508,6 @@ export const ATTRIBUTE_METADATA: Record = { "The Sentry SDK sets this attribute from the `bullmq.job.processed.timestamp` attribute of BullMQ's telemetry interface.", ], }, - 'messaging.bullmq.job.progress': { - brief: 'The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress().', - type: 'string', - keys: ['messaging.bullmq.job.progress'], - applyScrubbing: { - key: 'auto', - }, - isInOtel: false, - visibility: 'public', - example: '{"percentage":50}', - examples: ['{"percentage":50}'], - changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.job.progress attribute' }], - additionalContext: [ - "The Sentry SDK sets this attribute from the `bullmq.job.progress` attribute of BullMQ's telemetry interface.", - ], - }, 'messaging.bullmq.job.scheduler.id': { brief: 'The ID of the BullMQ job scheduler that adds the job.', type: 'string', @@ -37800,7 +37761,6 @@ export type Attributes = { [MESSAGING_BULLMQ_JOB_KEY]?: MESSAGING_BULLMQ_JOB_KEY_TYPE; [MESSAGING_BULLMQ_JOB_NAME]?: MESSAGING_BULLMQ_JOB_NAME_TYPE; [MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP]?: MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP_TYPE; - [MESSAGING_BULLMQ_JOB_PROGRESS]?: MESSAGING_BULLMQ_JOB_PROGRESS_TYPE; [MESSAGING_BULLMQ_JOB_SCHEDULER_ID]?: MESSAGING_BULLMQ_JOB_SCHEDULER_ID_TYPE; [MESSAGING_BULLMQ_JOB_STATE]?: MESSAGING_BULLMQ_JOB_STATE_TYPE; [MESSAGING_BULLMQ_JOB_STATUS]?: MESSAGING_BULLMQ_JOB_STATUS_TYPE; diff --git a/javascript/sentry-conventions/src/search.ts b/javascript/sentry-conventions/src/search.ts index a9fd26aba..ab64da722 100644 --- a/javascript/sentry-conventions/src/search.ts +++ b/javascript/sentry-conventions/src/search.ts @@ -3167,11 +3167,6 @@ export const SEARCH_MESSAGING__BULLMQ__JOB__NAME = 'messaging.bullmq.job.name'; */ export const SEARCH_MESSAGING__BULLMQ__JOB__PROCESSED__TIMESTAMP = 'messaging.bullmq.job.processed.timestamp'; -/** - * Search name for {@link attributes.MESSAGING_BULLMQ_JOB_PROGRESS}. `messaging.bullmq.job.progress` - */ -export const SEARCH_MESSAGING__BULLMQ__JOB__PROGRESS = 'messaging.bullmq.job.progress'; - /** * Search name for {@link attributes.MESSAGING_BULLMQ_JOB_SCHEDULER_ID}. `messaging.bullmq.job.scheduler.id` */ @@ -5820,7 +5815,6 @@ export type AttributeSearchName = | typeof SEARCH_MESSAGING__BULLMQ__JOB__KEY | typeof SEARCH_MESSAGING__BULLMQ__JOB__NAME | typeof SEARCH_MESSAGING__BULLMQ__JOB__PROCESSED__TIMESTAMP - | typeof SEARCH_MESSAGING__BULLMQ__JOB__PROGRESS | typeof SEARCH_MESSAGING__BULLMQ__JOB__SCHEDULER__ID | typeof SEARCH_MESSAGING__BULLMQ__JOB__STATE | typeof SEARCH_MESSAGING__BULLMQ__JOB__STATUS @@ -9914,12 +9908,6 @@ export const ATTRIBUTE_SEARCH_METADATA: Record brief: 'The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job.', deprecationChain: ['messaging.bullmq.job.processed.timestamp'], }, - 'messaging.bullmq.job.progress': { - canonicalName: 'messaging.bullmq.job.progress', - type: 'string', - brief: 'The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress().', - deprecationChain: ['messaging.bullmq.job.progress'], - }, 'messaging.bullmq.job.scheduler.id': { canonicalName: 'messaging.bullmq.job.scheduler.id', type: 'string', diff --git a/model/attributes/messaging/messaging__bullmq__job__progress.json b/model/attributes/messaging/messaging__bullmq__job__progress.json deleted file mode 100644 index 825cc27ff..000000000 --- a/model/attributes/messaging/messaging__bullmq__job__progress.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "key": "messaging.bullmq.job.progress", - "brief": "The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress().", - "type": "string", - "apply_scrubbing": { - "key": "auto" - }, - "is_in_otel": false, - "visibility": "public", - "examples": ["{\"percentage\":50}"], - "additional_context": [ - "The Sentry SDK sets this attribute from the `bullmq.job.progress` attribute of BullMQ's telemetry interface." - ], - "changelog": [ - { - "version": "next", - "prs": [690], - "description": "Added messaging.bullmq.job.progress attribute" - } - ] -} diff --git a/python/src/sentry_conventions/attributes.py b/python/src/sentry_conventions/attributes.py index 6b5329ef8..dcac557cc 100644 --- a/python/src/sentry_conventions/attributes.py +++ b/python/src/sentry_conventions/attributes.py @@ -7526,19 +7526,6 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: 1791184722281 """ - # Path: model/attributes/messaging/messaging__bullmq__job__progress.json - MESSAGING_BULLMQ_JOB_PROGRESS: Literal["messaging.bullmq.job.progress"] = ( - "messaging.bullmq.job.progress" - ) - """The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress(). - - Type: str - Apply Scrubbing: auto - Defined in OTEL: No - Visibility: public - Example: "{\"percentage\":50}" - """ - # Path: model/attributes/messaging/messaging__bullmq__job__scheduler__id.json MESSAGING_BULLMQ_JOB_SCHEDULER_ID: Literal["messaging.bullmq.job.scheduler.id"] = ( "messaging.bullmq.job.scheduler.id" @@ -22744,26 +22731,6 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "The Sentry SDK sets this attribute from the `bullmq.job.processed.timestamp` attribute of BullMQ's telemetry interface." ], ), - "messaging.bullmq.job.progress": AttributeMetadata( - brief="The progress value of a BullMQ job as a JSON string, as passed to Queue.updateJobProgress().", - type=AttributeType.STRING, - keys=("messaging.bullmq.job.progress",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.AUTO), - is_in_otel=False, - visibility=Visibility.PUBLIC, - example='{"percentage":50}', - examples=['{"percentage":50}'], - changelog=[ - ChangelogEntry( - version="next", - prs=[690], - description="Added messaging.bullmq.job.progress attribute", - ), - ], - additional_context=[ - "The Sentry SDK sets this attribute from the `bullmq.job.progress` attribute of BullMQ's telemetry interface." - ], - ), "messaging.bullmq.job.scheduler.id": AttributeMetadata( brief="The ID of the BullMQ job scheduler that adds the job.", type=AttributeType.STRING, @@ -29891,7 +29858,6 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "messaging.bullmq.job.key": str, "messaging.bullmq.job.name": str, "messaging.bullmq.job.processed.timestamp": int, - "messaging.bullmq.job.progress": str, "messaging.bullmq.job.scheduler.id": str, "messaging.bullmq.job.state": str, "messaging.bullmq.job.status": str, From 27d552528754ae009ca31f326c1073b4919ef215 Mon Sep 17 00:00:00 2001 From: JPeer264 Date: Tue, 20 Oct 2026 13:58:45 +0200 Subject: [PATCH 05/11] fixup! feat: Add BullMQ attributes and metrics --- .../messaging__bullmq__job__duration.json} | 2 +- .../messaging__bullmq__jobs__completed.json} | 2 +- .../messaging__bullmq__jobs__delayed.json} | 2 +- .../messaging__bullmq__jobs__failed.json} | 2 +- .../messaging__bullmq__jobs__retried.json} | 2 +- .../messaging__bullmq__jobs__waiting.json} | 2 +- .../messaging__bullmq__jobs__waiting_children.json} | 2 +- .../messaging__bullmq__queue__jobs.json} | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) rename model/metrics/{bullmq/bullmq__job__duration.json => messaging/messaging__bullmq__job__duration.json} (90%) rename model/metrics/{bullmq/bullmq__jobs__completed.json => messaging/messaging__bullmq__jobs__completed.json} (87%) rename model/metrics/{bullmq/bullmq__jobs__delayed.json => messaging/messaging__bullmq__jobs__delayed.json} (90%) rename model/metrics/{bullmq/bullmq__jobs__failed.json => messaging/messaging__bullmq__jobs__failed.json} (89%) rename model/metrics/{bullmq/bullmq__jobs__retried.json => messaging/messaging__bullmq__jobs__retried.json} (89%) rename model/metrics/{bullmq/bullmq__jobs__waiting.json => messaging/messaging__bullmq__jobs__waiting.json} (89%) rename model/metrics/{bullmq/bullmq__jobs__waiting_children.json => messaging/messaging__bullmq__jobs__waiting_children.json} (87%) rename model/metrics/{bullmq/bullmq__queue__jobs.json => messaging/messaging__bullmq__queue__jobs.json} (88%) diff --git a/model/metrics/bullmq/bullmq__job__duration.json b/model/metrics/messaging/messaging__bullmq__job__duration.json similarity index 90% rename from model/metrics/bullmq/bullmq__job__duration.json rename to model/metrics/messaging/messaging__bullmq__job__duration.json index 5eadcd6f5..9382ec38e 100644 --- a/model/metrics/bullmq/bullmq__job__duration.json +++ b/model/metrics/messaging/messaging__bullmq__job__duration.json @@ -1,5 +1,5 @@ { - "key": "bullmq.job.duration", + "key": "messaging.bullmq.job.duration", "brief": "The time in milliseconds from when a Worker started to process a BullMQ job until the job left the active state.", "instrument": "distribution", "unit": "millisecond", diff --git a/model/metrics/bullmq/bullmq__jobs__completed.json b/model/metrics/messaging/messaging__bullmq__jobs__completed.json similarity index 87% rename from model/metrics/bullmq/bullmq__jobs__completed.json rename to model/metrics/messaging/messaging__bullmq__jobs__completed.json index 5355d73f6..0f67e162d 100644 --- a/model/metrics/bullmq/bullmq__jobs__completed.json +++ b/model/metrics/messaging/messaging__bullmq__jobs__completed.json @@ -1,5 +1,5 @@ { - "key": "bullmq.jobs.completed", + "key": "messaging.bullmq.jobs.completed", "brief": "The number of BullMQ jobs that completed.", "instrument": "counter", "unit": "none", diff --git a/model/metrics/bullmq/bullmq__jobs__delayed.json b/model/metrics/messaging/messaging__bullmq__jobs__delayed.json similarity index 90% rename from model/metrics/bullmq/bullmq__jobs__delayed.json rename to model/metrics/messaging/messaging__bullmq__jobs__delayed.json index 49d02f774..2184149e8 100644 --- a/model/metrics/bullmq/bullmq__jobs__delayed.json +++ b/model/metrics/messaging/messaging__bullmq__jobs__delayed.json @@ -1,5 +1,5 @@ { - "key": "bullmq.jobs.delayed", + "key": "messaging.bullmq.jobs.delayed", "brief": "The number of BullMQ jobs that moved to the delayed state, for a retry with a backoff delay or through Job.moveToDelayed().", "instrument": "counter", "unit": "none", diff --git a/model/metrics/bullmq/bullmq__jobs__failed.json b/model/metrics/messaging/messaging__bullmq__jobs__failed.json similarity index 89% rename from model/metrics/bullmq/bullmq__jobs__failed.json rename to model/metrics/messaging/messaging__bullmq__jobs__failed.json index f649fbc3b..5bf242a70 100644 --- a/model/metrics/bullmq/bullmq__jobs__failed.json +++ b/model/metrics/messaging/messaging__bullmq__jobs__failed.json @@ -1,5 +1,5 @@ { - "key": "bullmq.jobs.failed", + "key": "messaging.bullmq.jobs.failed", "brief": "The number of BullMQ jobs that failed and are not retried.", "instrument": "counter", "unit": "none", diff --git a/model/metrics/bullmq/bullmq__jobs__retried.json b/model/metrics/messaging/messaging__bullmq__jobs__retried.json similarity index 89% rename from model/metrics/bullmq/bullmq__jobs__retried.json rename to model/metrics/messaging/messaging__bullmq__jobs__retried.json index 29f5307a1..23b66fdf8 100644 --- a/model/metrics/bullmq/bullmq__jobs__retried.json +++ b/model/metrics/messaging/messaging__bullmq__jobs__retried.json @@ -1,5 +1,5 @@ { - "key": "bullmq.jobs.retried", + "key": "messaging.bullmq.jobs.retried", "brief": "The number of failed BullMQ jobs that are retried without a delay.", "instrument": "counter", "unit": "none", diff --git a/model/metrics/bullmq/bullmq__jobs__waiting.json b/model/metrics/messaging/messaging__bullmq__jobs__waiting.json similarity index 89% rename from model/metrics/bullmq/bullmq__jobs__waiting.json rename to model/metrics/messaging/messaging__bullmq__jobs__waiting.json index 9417dbaaa..e158c3061 100644 --- a/model/metrics/bullmq/bullmq__jobs__waiting.json +++ b/model/metrics/messaging/messaging__bullmq__jobs__waiting.json @@ -1,5 +1,5 @@ { - "key": "bullmq.jobs.waiting", + "key": "messaging.bullmq.jobs.waiting", "brief": "The number of BullMQ jobs that Job.moveToWait() moved back to the wait state.", "instrument": "counter", "unit": "none", diff --git a/model/metrics/bullmq/bullmq__jobs__waiting_children.json b/model/metrics/messaging/messaging__bullmq__jobs__waiting_children.json similarity index 87% rename from model/metrics/bullmq/bullmq__jobs__waiting_children.json rename to model/metrics/messaging/messaging__bullmq__jobs__waiting_children.json index 6f5ecefeb..7eb9e9f5a 100644 --- a/model/metrics/bullmq/bullmq__jobs__waiting_children.json +++ b/model/metrics/messaging/messaging__bullmq__jobs__waiting_children.json @@ -1,5 +1,5 @@ { - "key": "bullmq.jobs.waiting_children", + "key": "messaging.bullmq.jobs.waiting_children", "brief": "The number of BullMQ jobs that moved to the waiting-children state to wait for their child jobs.", "instrument": "counter", "unit": "none", diff --git a/model/metrics/bullmq/bullmq__queue__jobs.json b/model/metrics/messaging/messaging__bullmq__queue__jobs.json similarity index 88% rename from model/metrics/bullmq/bullmq__queue__jobs.json rename to model/metrics/messaging/messaging__bullmq__queue__jobs.json index 0b00b5d42..5ef5862d2 100644 --- a/model/metrics/bullmq/bullmq__queue__jobs.json +++ b/model/metrics/messaging/messaging__bullmq__queue__jobs.json @@ -1,5 +1,5 @@ { - "key": "bullmq.queue.jobs", + "key": "messaging.bullmq.queue.jobs", "brief": "The number of BullMQ jobs in a queue in one job state, as counted by Queue.recordJobCountsMetric().", "instrument": "gauge", "unit": "none", From 8f067ffa926cabdce6dde8fda3fdb53135a205d5 Mon Sep 17 00:00:00 2001 From: JPeer264 Date: Wed, 21 Oct 2026 09:16:45 +0200 Subject: [PATCH 06/11] fixup! feat: Add BullMQ attributes and metrics --- .../sentry-conventions/src/attributes.ts | 81 ++++++++++--------- javascript/sentry-conventions/src/search.ts | 24 +++--- .../messaging__bullmq__worker__id.json | 21 ----- .../messaging/messaging__client__id.json | 21 +++++ python/src/sentry_conventions/attributes.py | 67 ++++++++------- 5 files changed, 107 insertions(+), 107 deletions(-) delete mode 100644 model/attributes/messaging/messaging__bullmq__worker__id.json create mode 100644 model/attributes/messaging/messaging__client__id.json diff --git a/javascript/sentry-conventions/src/attributes.ts b/javascript/sentry-conventions/src/attributes.ts index 42bc921c6..c0c57d97e 100644 --- a/javascript/sentry-conventions/src/attributes.ts +++ b/javascript/sentry-conventions/src/attributes.ts @@ -12806,27 +12806,6 @@ export const MESSAGING_BULLMQ_WORKER_FORCE_CLOSE = 'messaging.bullmq.worker.forc */ export type MESSAGING_BULLMQ_WORKER_FORCE_CLOSE_TYPE = boolean; -// Path: model/attributes/messaging/messaging__bullmq__worker__id.json - -/** - * The ID that BullMQ generates for the Worker instance. `messaging.bullmq.worker.id` - * - * Attribute Value Type: `string` {@link MESSAGING_BULLMQ_WORKER_ID_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example "03327d57-05cc-4528-9d24-c59bf6520039" - */ -export const MESSAGING_BULLMQ_WORKER_ID = 'messaging.bullmq.worker.id'; - -/** - * Type for {@link MESSAGING_BULLMQ_WORKER_ID} messaging.bullmq.worker.id - */ -export type MESSAGING_BULLMQ_WORKER_ID_TYPE = string; - // Path: model/attributes/messaging/messaging__bullmq__worker__jobs__to__extend__locks.json /** @@ -12911,6 +12890,28 @@ export const MESSAGING_BULLMQ_WORKER_STALLED_JOBS = 'messaging.bullmq.worker.sta */ export type MESSAGING_BULLMQ_WORKER_STALLED_JOBS_TYPE = Array; +// Path: model/attributes/messaging/messaging__client__id.json + +/** + * A unique identifier for the client that consumes or produces a message. `messaging.client.id` + * + * Attribute Value Type: `string` {@link MESSAGING_CLIENT_ID_TYPE} + * + * Apply Scrubbing: manual + * + * Attribute defined in OTEL: Yes + * Visibility: public + * + * @example "client-5" + * @example "myhost@8742@s8083jm" + */ +export const MESSAGING_CLIENT_ID = 'messaging.client.id'; + +/** + * Type for {@link MESSAGING_CLIENT_ID} messaging.client.id + */ +export type MESSAGING_CLIENT_ID_TYPE = string; + // Path: model/attributes/messaging/messaging__conversation_id.json /** @@ -21105,11 +21106,11 @@ export const ATTRIBUTE_TYPE: Record = { 'messaging.bullmq.queue.rate.limit': 'integer', 'messaging.bullmq.worker.do.not.wait.active': 'boolean', 'messaging.bullmq.worker.force.close': 'boolean', - 'messaging.bullmq.worker.id': 'string', 'messaging.bullmq.worker.jobs.to.extend.locks': 'string[]', 'messaging.bullmq.worker.name': 'string', 'messaging.bullmq.worker.rate.limit': 'integer', 'messaging.bullmq.worker.stalled.jobs': 'string[]', + 'messaging.client.id': 'string', 'messaging.conversation_id': 'string', 'messaging.destination': 'string', 'messaging.destination.connection': 'string', @@ -22019,11 +22020,11 @@ export type AttributeName = | typeof MESSAGING_BULLMQ_QUEUE_RATE_LIMIT | typeof MESSAGING_BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE | typeof MESSAGING_BULLMQ_WORKER_FORCE_CLOSE - | typeof MESSAGING_BULLMQ_WORKER_ID | typeof MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS | typeof MESSAGING_BULLMQ_WORKER_NAME | typeof MESSAGING_BULLMQ_WORKER_RATE_LIMIT | typeof MESSAGING_BULLMQ_WORKER_STALLED_JOBS + | typeof MESSAGING_CLIENT_ID | typeof MESSAGING_CONVERSATION_ID | typeof MESSAGING_DESTINATION | typeof MESSAGING_DESTINATION_CONNECTION @@ -31724,22 +31725,6 @@ export const ATTRIBUTE_METADATA: Record = { "The Sentry SDK sets this attribute from the `bullmq.worker.force.close` attribute of BullMQ's telemetry interface.", ], }, - 'messaging.bullmq.worker.id': { - brief: 'The ID that BullMQ generates for the Worker instance.', - type: 'string', - keys: ['messaging.bullmq.worker.id'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: '03327d57-05cc-4528-9d24-c59bf6520039', - examples: ['03327d57-05cc-4528-9d24-c59bf6520039'], - changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.worker.id attribute' }], - additionalContext: [ - "The Sentry SDK sets this attribute from the `bullmq.worker.id` attribute of BullMQ's telemetry interface.", - ], - }, 'messaging.bullmq.worker.jobs.to.extend.locks': { brief: 'The IDs of the BullMQ jobs whose locks the Worker extends.', type: 'string[]', @@ -31806,6 +31791,22 @@ export const ATTRIBUTE_METADATA: Record = { "The Sentry SDK sets this attribute from the `bullmq.worker.stalled.jobs` attribute of BullMQ's telemetry interface.", ], }, + 'messaging.client.id': { + brief: 'A unique identifier for the client that consumes or produces a message.', + type: 'string', + keys: ['messaging.client.id'], + applyScrubbing: { + key: 'manual', + }, + isInOtel: true, + visibility: 'public', + example: 'client-5', + examples: ['client-5', 'myhost@8742@s8083jm'], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.client.id attribute' }], + additionalContext: [ + "The Sentry SDK sets this attribute on BullMQ spans from the `bullmq.worker.id` attribute of BullMQ's telemetry interface, which is the ID of the Worker.", + ], + }, 'messaging.conversation_id': { brief: 'The conversation ID identifying the conversation to which the message belongs, represented as a string. Sometimes called "Correlation ID".', @@ -37774,11 +37775,11 @@ export type Attributes = { [MESSAGING_BULLMQ_QUEUE_RATE_LIMIT]?: MESSAGING_BULLMQ_QUEUE_RATE_LIMIT_TYPE; [MESSAGING_BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE]?: MESSAGING_BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE_TYPE; [MESSAGING_BULLMQ_WORKER_FORCE_CLOSE]?: MESSAGING_BULLMQ_WORKER_FORCE_CLOSE_TYPE; - [MESSAGING_BULLMQ_WORKER_ID]?: MESSAGING_BULLMQ_WORKER_ID_TYPE; [MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS]?: MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS_TYPE; [MESSAGING_BULLMQ_WORKER_NAME]?: MESSAGING_BULLMQ_WORKER_NAME_TYPE; [MESSAGING_BULLMQ_WORKER_RATE_LIMIT]?: MESSAGING_BULLMQ_WORKER_RATE_LIMIT_TYPE; [MESSAGING_BULLMQ_WORKER_STALLED_JOBS]?: MESSAGING_BULLMQ_WORKER_STALLED_JOBS_TYPE; + [MESSAGING_CLIENT_ID]?: MESSAGING_CLIENT_ID_TYPE; [MESSAGING_CONVERSATION_ID]?: MESSAGING_CONVERSATION_ID_TYPE; [MESSAGING_DESTINATION]?: MESSAGING_DESTINATION_TYPE; [MESSAGING_DESTINATION_CONNECTION]?: MESSAGING_DESTINATION_CONNECTION_TYPE; diff --git a/javascript/sentry-conventions/src/search.ts b/javascript/sentry-conventions/src/search.ts index ab64da722..bb5f6b2c2 100644 --- a/javascript/sentry-conventions/src/search.ts +++ b/javascript/sentry-conventions/src/search.ts @@ -3232,11 +3232,6 @@ export const SEARCH_MESSAGING__BULLMQ__WORKER__DO__NOT__WAIT__ACTIVE = 'messagin */ export const SEARCH_MESSAGING__BULLMQ__WORKER__FORCE__CLOSE = 'messaging.bullmq.worker.force.close'; -/** - * Search name for {@link attributes.MESSAGING_BULLMQ_WORKER_ID}. `messaging.bullmq.worker.id` - */ -export const SEARCH_MESSAGING__BULLMQ__WORKER__ID = 'messaging.bullmq.worker.id'; - /** * Search name for {@link attributes.MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS}. `messaging.bullmq.worker.jobs.to.extend.locks` */ @@ -3257,6 +3252,11 @@ export const SEARCH_MESSAGING__BULLMQ__WORKER__RATE__LIMIT = 'messaging.bullmq.w */ export const SEARCH_MESSAGING__BULLMQ__WORKER__STALLED__JOBS = 'messaging.bullmq.worker.stalled.jobs'; +/** + * Search name for {@link attributes.MESSAGING_CLIENT_ID}. `messaging.client.id` + */ +export const SEARCH_MESSAGING__CLIENT__ID = 'messaging.client.id'; + /** * Search name for {@link attributes.MESSAGING_CONVERSATION_ID}. `messaging.conversation_id` * @@ -5828,11 +5828,11 @@ export type AttributeSearchName = | typeof SEARCH_MESSAGING__BULLMQ__QUEUE__RATE__LIMIT | typeof SEARCH_MESSAGING__BULLMQ__WORKER__DO__NOT__WAIT__ACTIVE | typeof SEARCH_MESSAGING__BULLMQ__WORKER__FORCE__CLOSE - | typeof SEARCH_MESSAGING__BULLMQ__WORKER__ID | typeof SEARCH_MESSAGING__BULLMQ__WORKER__JOBS__TO__EXTEND__LOCKS | typeof SEARCH_MESSAGING__BULLMQ__WORKER__NAME | typeof SEARCH_MESSAGING__BULLMQ__WORKER__RATE__LIMIT | typeof SEARCH_MESSAGING__BULLMQ__WORKER__STALLED__JOBS + | typeof SEARCH_MESSAGING__CLIENT__ID | typeof SEARCH_MESSAGING__CONVERSATION_ID | typeof SEARCH_MESSAGING__DESTINATION | typeof SEARCH_MESSAGING__DESTINATION__CONNECTION @@ -9986,12 +9986,6 @@ export const ATTRIBUTE_SEARCH_METADATA: Record brief: 'Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish.', deprecationChain: ['messaging.bullmq.worker.force.close'], }, - 'messaging.bullmq.worker.id': { - canonicalName: 'messaging.bullmq.worker.id', - type: 'string', - brief: 'The ID that BullMQ generates for the Worker instance.', - deprecationChain: ['messaging.bullmq.worker.id'], - }, 'messaging.bullmq.worker.jobs.to.extend.locks': { canonicalName: 'messaging.bullmq.worker.jobs.to.extend.locks', type: 'string[]', @@ -10016,6 +10010,12 @@ export const ATTRIBUTE_SEARCH_METADATA: Record brief: 'The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state.', deprecationChain: ['messaging.bullmq.worker.stalled.jobs'], }, + 'messaging.client.id': { + canonicalName: 'messaging.client.id', + type: 'string', + brief: 'A unique identifier for the client that consumes or produces a message.', + deprecationChain: ['messaging.client.id'], + }, 'messaging.conversation_id': { canonicalName: 'messaging.message.conversation_id', type: 'string', diff --git a/model/attributes/messaging/messaging__bullmq__worker__id.json b/model/attributes/messaging/messaging__bullmq__worker__id.json deleted file mode 100644 index 027b35e98..000000000 --- a/model/attributes/messaging/messaging__bullmq__worker__id.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "key": "messaging.bullmq.worker.id", - "brief": "The ID that BullMQ generates for the Worker instance.", - "type": "string", - "apply_scrubbing": { - "key": "manual" - }, - "is_in_otel": false, - "visibility": "public", - "examples": ["03327d57-05cc-4528-9d24-c59bf6520039"], - "additional_context": [ - "The Sentry SDK sets this attribute from the `bullmq.worker.id` attribute of BullMQ's telemetry interface." - ], - "changelog": [ - { - "version": "next", - "prs": [690], - "description": "Added messaging.bullmq.worker.id attribute" - } - ] -} diff --git a/model/attributes/messaging/messaging__client__id.json b/model/attributes/messaging/messaging__client__id.json new file mode 100644 index 000000000..6a778d893 --- /dev/null +++ b/model/attributes/messaging/messaging__client__id.json @@ -0,0 +1,21 @@ +{ + "key": "messaging.client.id", + "brief": "A unique identifier for the client that consumes or produces a message.", + "type": "string", + "apply_scrubbing": { + "key": "manual" + }, + "is_in_otel": true, + "visibility": "public", + "examples": ["client-5", "myhost@8742@s8083jm"], + "additional_context": [ + "The Sentry SDK sets this attribute on BullMQ spans from the `bullmq.worker.id` attribute of BullMQ's telemetry interface, which is the ID of the Worker." + ], + "changelog": [ + { + "version": "next", + "prs": [690], + "description": "Added messaging.client.id attribute" + } + ] +} diff --git a/python/src/sentry_conventions/attributes.py b/python/src/sentry_conventions/attributes.py index dcac557cc..123955dae 100644 --- a/python/src/sentry_conventions/attributes.py +++ b/python/src/sentry_conventions/attributes.py @@ -7702,19 +7702,6 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: false """ - # Path: model/attributes/messaging/messaging__bullmq__worker__id.json - MESSAGING_BULLMQ_WORKER_ID: Literal["messaging.bullmq.worker.id"] = ( - "messaging.bullmq.worker.id" - ) - """The ID that BullMQ generates for the Worker instance. - - Type: str - Apply Scrubbing: manual - Defined in OTEL: No - Visibility: public - Example: "03327d57-05cc-4528-9d24-c59bf6520039" - """ - # Path: model/attributes/messaging/messaging__bullmq__worker__jobs__to__extend__locks.json MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS: Literal[ "messaging.bullmq.worker.jobs.to.extend.locks" @@ -7767,6 +7754,18 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: ["1","2"] """ + # Path: model/attributes/messaging/messaging__client__id.json + MESSAGING_CLIENT_ID: Literal["messaging.client.id"] = "messaging.client.id" + """A unique identifier for the client that consumes or produces a message. + + Type: str + Apply Scrubbing: manual + Defined in OTEL: Yes + Visibility: public + Example: "client-5" + Example: "myhost@8742@s8083jm" + """ + # Path: model/attributes/messaging/messaging__conversation_id.json MESSAGING_CONVERSATION_ID: Literal["messaging.conversation_id"] = ( "messaging.conversation_id" @@ -22995,26 +22994,6 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "The Sentry SDK sets this attribute from the `bullmq.worker.force.close` attribute of BullMQ's telemetry interface." ], ), - "messaging.bullmq.worker.id": AttributeMetadata( - brief="The ID that BullMQ generates for the Worker instance.", - type=AttributeType.STRING, - keys=("messaging.bullmq.worker.id",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, - visibility=Visibility.PUBLIC, - example="03327d57-05cc-4528-9d24-c59bf6520039", - examples=["03327d57-05cc-4528-9d24-c59bf6520039"], - changelog=[ - ChangelogEntry( - version="next", - prs=[690], - description="Added messaging.bullmq.worker.id attribute", - ), - ], - additional_context=[ - "The Sentry SDK sets this attribute from the `bullmq.worker.id` attribute of BullMQ's telemetry interface." - ], - ), "messaging.bullmq.worker.jobs.to.extend.locks": AttributeMetadata( brief="The IDs of the BullMQ jobs whose locks the Worker extends.", type=AttributeType.STRING_ARRAY, @@ -23095,6 +23074,26 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "The Sentry SDK sets this attribute from the `bullmq.worker.stalled.jobs` attribute of BullMQ's telemetry interface." ], ), + "messaging.client.id": AttributeMetadata( + brief="A unique identifier for the client that consumes or produces a message.", + type=AttributeType.STRING, + keys=("messaging.client.id",), + apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), + is_in_otel=True, + visibility=Visibility.PUBLIC, + example="client-5", + examples=["client-5", "myhost@8742@s8083jm"], + changelog=[ + ChangelogEntry( + version="next", + prs=[690], + description="Added messaging.client.id attribute", + ), + ], + additional_context=[ + "The Sentry SDK sets this attribute on BullMQ spans from the `bullmq.worker.id` attribute of BullMQ's telemetry interface, which is the ID of the Worker." + ], + ), "messaging.conversation_id": AttributeMetadata( brief='The conversation ID identifying the conversation to which the message belongs, represented as a string. Sometimes called "Correlation ID".', type=AttributeType.STRING, @@ -29871,11 +29870,11 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "messaging.bullmq.queue.rate.limit": int, "messaging.bullmq.worker.do.not.wait.active": bool, "messaging.bullmq.worker.force.close": bool, - "messaging.bullmq.worker.id": str, "messaging.bullmq.worker.jobs.to.extend.locks": List[str], "messaging.bullmq.worker.name": str, "messaging.bullmq.worker.rate.limit": int, "messaging.bullmq.worker.stalled.jobs": List[str], + "messaging.client.id": str, "messaging.conversation_id": str, "messaging.destination": str, "messaging.destination.connection": str, From 5ad433d12262bb35bbed3fa908bb7c223ae61ff1 Mon Sep 17 00:00:00 2001 From: JPeer264 Date: Wed, 21 Oct 2026 09:16:53 +0200 Subject: [PATCH 07/11] fixup! feat: Add BullMQ attributes and metrics --- .../sentry-conventions/src/attributes.ts | 46 +------------------ javascript/sentry-conventions/src/search.ts | 12 ----- .../messaging__bullmq__job__state.json | 3 +- .../messaging__bullmq__job__status.json | 22 --------- .../messaging__bullmq__job__duration.json | 7 +-- .../messaging__bullmq__jobs__completed.json | 7 +-- .../messaging__bullmq__jobs__delayed.json | 7 +-- .../messaging__bullmq__jobs__failed.json | 7 +-- .../messaging__bullmq__jobs__retried.json | 7 +-- .../messaging__bullmq__jobs__waiting.json | 7 +-- ...aging__bullmq__jobs__waiting_children.json | 7 +-- python/src/sentry_conventions/attributes.py | 40 +--------------- 12 files changed, 10 insertions(+), 162 deletions(-) delete mode 100644 model/attributes/messaging/messaging__bullmq__job__status.json diff --git a/javascript/sentry-conventions/src/attributes.ts b/javascript/sentry-conventions/src/attributes.ts index c0c57d97e..fba64f0a5 100644 --- a/javascript/sentry-conventions/src/attributes.ts +++ b/javascript/sentry-conventions/src/attributes.ts @@ -12570,29 +12570,6 @@ export const MESSAGING_BULLMQ_JOB_STATE = 'messaging.bullmq.job.state'; */ export type MESSAGING_BULLMQ_JOB_STATE_TYPE = string; -// Path: model/attributes/messaging/messaging__bullmq__job__status.json - -/** - * The state of the BullMQ job that a job metric counts. `messaging.bullmq.job.status` - * - * Attribute Value Type: `string` {@link MESSAGING_BULLMQ_JOB_STATUS_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example "completed" - * @example "failed" - * @example "delayed" - */ -export const MESSAGING_BULLMQ_JOB_STATUS = 'messaging.bullmq.job.status'; - -/** - * Type for {@link MESSAGING_BULLMQ_JOB_STATUS} messaging.bullmq.job.status - */ -export type MESSAGING_BULLMQ_JOB_STATUS_TYPE = string; - // Path: model/attributes/messaging/messaging__bullmq__job__type.json /** @@ -21095,7 +21072,6 @@ export const ATTRIBUTE_TYPE: Record = { 'messaging.bullmq.job.processed.timestamp': 'integer', 'messaging.bullmq.job.scheduler.id': 'string', 'messaging.bullmq.job.state': 'string', - 'messaging.bullmq.job.status': 'string', 'messaging.bullmq.job.type': 'string', 'messaging.bullmq.queue.clean.count': 'integer', 'messaging.bullmq.queue.clean.limit': 'integer', @@ -22009,7 +21985,6 @@ export type AttributeName = | typeof MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP | typeof MESSAGING_BULLMQ_JOB_SCHEDULER_ID | typeof MESSAGING_BULLMQ_JOB_STATE - | typeof MESSAGING_BULLMQ_JOB_STATUS | typeof MESSAGING_BULLMQ_JOB_TYPE | typeof MESSAGING_BULLMQ_QUEUE_CLEAN_COUNT | typeof MESSAGING_BULLMQ_QUEUE_CLEAN_LIMIT @@ -31538,25 +31513,7 @@ export const ATTRIBUTE_METADATA: Record = { examples: ['completed', 'failed', 'delayed'], changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.job.state attribute' }], additionalContext: [ - "The Sentry SDK sets this attribute from the `bullmq.job.state` attribute of BullMQ's telemetry interface.", - 'Set on the BullMQ job metrics with BullMQ 6.3.11. With BullMQ 5.79.1, `messaging.bullmq.job.status` is set instead.', - ], - }, - 'messaging.bullmq.job.status': { - brief: 'The state of the BullMQ job that a job metric counts.', - type: 'string', - keys: ['messaging.bullmq.job.status'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: 'completed', - examples: ['completed', 'failed', 'delayed'], - changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.job.status attribute' }], - additionalContext: [ - "The Sentry SDK sets this attribute from the `bullmq.job.status` attribute of BullMQ's telemetry interface.", - 'Set on the BullMQ job metrics with BullMQ 5.79.1. With BullMQ 6.3.11, `messaging.bullmq.job.state` is set instead.', + "The Sentry SDK sets this attribute from the `bullmq.job.state` attribute of BullMQ's telemetry interface. BullMQ before 5.81.2 sets `bullmq.job.status` instead, and the SDK then uses that value.", ], }, 'messaging.bullmq.job.type': { @@ -37764,7 +37721,6 @@ export type Attributes = { [MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP]?: MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP_TYPE; [MESSAGING_BULLMQ_JOB_SCHEDULER_ID]?: MESSAGING_BULLMQ_JOB_SCHEDULER_ID_TYPE; [MESSAGING_BULLMQ_JOB_STATE]?: MESSAGING_BULLMQ_JOB_STATE_TYPE; - [MESSAGING_BULLMQ_JOB_STATUS]?: MESSAGING_BULLMQ_JOB_STATUS_TYPE; [MESSAGING_BULLMQ_JOB_TYPE]?: MESSAGING_BULLMQ_JOB_TYPE_TYPE; [MESSAGING_BULLMQ_QUEUE_CLEAN_COUNT]?: MESSAGING_BULLMQ_QUEUE_CLEAN_COUNT_TYPE; [MESSAGING_BULLMQ_QUEUE_CLEAN_LIMIT]?: MESSAGING_BULLMQ_QUEUE_CLEAN_LIMIT_TYPE; diff --git a/javascript/sentry-conventions/src/search.ts b/javascript/sentry-conventions/src/search.ts index bb5f6b2c2..e860e0dc6 100644 --- a/javascript/sentry-conventions/src/search.ts +++ b/javascript/sentry-conventions/src/search.ts @@ -3177,11 +3177,6 @@ export const SEARCH_MESSAGING__BULLMQ__JOB__SCHEDULER__ID = 'messaging.bullmq.jo */ export const SEARCH_MESSAGING__BULLMQ__JOB__STATE = 'messaging.bullmq.job.state'; -/** - * Search name for {@link attributes.MESSAGING_BULLMQ_JOB_STATUS}. `messaging.bullmq.job.status` - */ -export const SEARCH_MESSAGING__BULLMQ__JOB__STATUS = 'messaging.bullmq.job.status'; - /** * Search name for {@link attributes.MESSAGING_BULLMQ_JOB_TYPE}. `messaging.bullmq.job.type` */ @@ -5817,7 +5812,6 @@ export type AttributeSearchName = | typeof SEARCH_MESSAGING__BULLMQ__JOB__PROCESSED__TIMESTAMP | typeof SEARCH_MESSAGING__BULLMQ__JOB__SCHEDULER__ID | typeof SEARCH_MESSAGING__BULLMQ__JOB__STATE - | typeof SEARCH_MESSAGING__BULLMQ__JOB__STATUS | typeof SEARCH_MESSAGING__BULLMQ__JOB__TYPE | typeof SEARCH_MESSAGING__BULLMQ__QUEUE__CLEAN__COUNT | typeof SEARCH_MESSAGING__BULLMQ__QUEUE__CLEAN__LIMIT @@ -9920,12 +9914,6 @@ export const ATTRIBUTE_SEARCH_METADATA: Record brief: 'The state of the BullMQ job that a job metric counts.', deprecationChain: ['messaging.bullmq.job.state'], }, - 'messaging.bullmq.job.status': { - canonicalName: 'messaging.bullmq.job.status', - type: 'string', - brief: 'The state of the BullMQ job that a job metric counts.', - deprecationChain: ['messaging.bullmq.job.status'], - }, 'messaging.bullmq.job.type': { canonicalName: 'messaging.bullmq.job.type', type: 'string', diff --git a/model/attributes/messaging/messaging__bullmq__job__state.json b/model/attributes/messaging/messaging__bullmq__job__state.json index f74d034ae..0c3e59060 100644 --- a/model/attributes/messaging/messaging__bullmq__job__state.json +++ b/model/attributes/messaging/messaging__bullmq__job__state.json @@ -9,8 +9,7 @@ "visibility": "public", "examples": ["completed", "failed", "delayed"], "additional_context": [ - "The Sentry SDK sets this attribute from the `bullmq.job.state` attribute of BullMQ's telemetry interface.", - "Set on the BullMQ job metrics with BullMQ 6.3.11. With BullMQ 5.79.1, `messaging.bullmq.job.status` is set instead." + "The Sentry SDK sets this attribute from the `bullmq.job.state` attribute of BullMQ's telemetry interface. BullMQ before 5.81.2 sets `bullmq.job.status` instead, and the SDK then uses that value." ], "changelog": [ { diff --git a/model/attributes/messaging/messaging__bullmq__job__status.json b/model/attributes/messaging/messaging__bullmq__job__status.json deleted file mode 100644 index 9cbd92317..000000000 --- a/model/attributes/messaging/messaging__bullmq__job__status.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "key": "messaging.bullmq.job.status", - "brief": "The state of the BullMQ job that a job metric counts.", - "type": "string", - "apply_scrubbing": { - "key": "manual" - }, - "is_in_otel": false, - "visibility": "public", - "examples": ["completed", "failed", "delayed"], - "additional_context": [ - "The Sentry SDK sets this attribute from the `bullmq.job.status` attribute of BullMQ's telemetry interface.", - "Set on the BullMQ job metrics with BullMQ 5.79.1. With BullMQ 6.3.11, `messaging.bullmq.job.state` is set instead." - ], - "changelog": [ - { - "version": "next", - "prs": [690], - "description": "Added messaging.bullmq.job.status attribute" - } - ] -} diff --git a/model/metrics/messaging/messaging__bullmq__job__duration.json b/model/metrics/messaging/messaging__bullmq__job__duration.json index 9382ec38e..c5aa2dfd1 100644 --- a/model/metrics/messaging/messaging__bullmq__job__duration.json +++ b/model/metrics/messaging/messaging__bullmq__job__duration.json @@ -5,10 +5,5 @@ "unit": "millisecond", "is_in_otel": false, "requirement_level": "opt_in", - "attributes": [ - "messaging.destination.name", - "messaging.bullmq.job.name", - "messaging.bullmq.job.status", - "messaging.bullmq.job.state" - ] + "attributes": ["messaging.destination.name", "messaging.bullmq.job.name", "messaging.bullmq.job.state"] } diff --git a/model/metrics/messaging/messaging__bullmq__jobs__completed.json b/model/metrics/messaging/messaging__bullmq__jobs__completed.json index 0f67e162d..de1e3a0ad 100644 --- a/model/metrics/messaging/messaging__bullmq__jobs__completed.json +++ b/model/metrics/messaging/messaging__bullmq__jobs__completed.json @@ -5,10 +5,5 @@ "unit": "none", "is_in_otel": false, "requirement_level": "opt_in", - "attributes": [ - "messaging.destination.name", - "messaging.bullmq.job.name", - "messaging.bullmq.job.status", - "messaging.bullmq.job.state" - ] + "attributes": ["messaging.destination.name", "messaging.bullmq.job.name", "messaging.bullmq.job.state"] } diff --git a/model/metrics/messaging/messaging__bullmq__jobs__delayed.json b/model/metrics/messaging/messaging__bullmq__jobs__delayed.json index 2184149e8..51e1daec0 100644 --- a/model/metrics/messaging/messaging__bullmq__jobs__delayed.json +++ b/model/metrics/messaging/messaging__bullmq__jobs__delayed.json @@ -5,10 +5,5 @@ "unit": "none", "is_in_otel": false, "requirement_level": "opt_in", - "attributes": [ - "messaging.destination.name", - "messaging.bullmq.job.name", - "messaging.bullmq.job.status", - "messaging.bullmq.job.state" - ] + "attributes": ["messaging.destination.name", "messaging.bullmq.job.name", "messaging.bullmq.job.state"] } diff --git a/model/metrics/messaging/messaging__bullmq__jobs__failed.json b/model/metrics/messaging/messaging__bullmq__jobs__failed.json index 5bf242a70..6a5ef4f93 100644 --- a/model/metrics/messaging/messaging__bullmq__jobs__failed.json +++ b/model/metrics/messaging/messaging__bullmq__jobs__failed.json @@ -5,10 +5,5 @@ "unit": "none", "is_in_otel": false, "requirement_level": "opt_in", - "attributes": [ - "messaging.destination.name", - "messaging.bullmq.job.name", - "messaging.bullmq.job.status", - "messaging.bullmq.job.state" - ] + "attributes": ["messaging.destination.name", "messaging.bullmq.job.name", "messaging.bullmq.job.state"] } diff --git a/model/metrics/messaging/messaging__bullmq__jobs__retried.json b/model/metrics/messaging/messaging__bullmq__jobs__retried.json index 23b66fdf8..6a51effd0 100644 --- a/model/metrics/messaging/messaging__bullmq__jobs__retried.json +++ b/model/metrics/messaging/messaging__bullmq__jobs__retried.json @@ -5,10 +5,5 @@ "unit": "none", "is_in_otel": false, "requirement_level": "opt_in", - "attributes": [ - "messaging.destination.name", - "messaging.bullmq.job.name", - "messaging.bullmq.job.status", - "messaging.bullmq.job.state" - ] + "attributes": ["messaging.destination.name", "messaging.bullmq.job.name", "messaging.bullmq.job.state"] } diff --git a/model/metrics/messaging/messaging__bullmq__jobs__waiting.json b/model/metrics/messaging/messaging__bullmq__jobs__waiting.json index e158c3061..60681b661 100644 --- a/model/metrics/messaging/messaging__bullmq__jobs__waiting.json +++ b/model/metrics/messaging/messaging__bullmq__jobs__waiting.json @@ -5,10 +5,5 @@ "unit": "none", "is_in_otel": false, "requirement_level": "opt_in", - "attributes": [ - "messaging.destination.name", - "messaging.bullmq.job.name", - "messaging.bullmq.job.status", - "messaging.bullmq.job.state" - ] + "attributes": ["messaging.destination.name", "messaging.bullmq.job.name", "messaging.bullmq.job.state"] } diff --git a/model/metrics/messaging/messaging__bullmq__jobs__waiting_children.json b/model/metrics/messaging/messaging__bullmq__jobs__waiting_children.json index 7eb9e9f5a..096d2f951 100644 --- a/model/metrics/messaging/messaging__bullmq__jobs__waiting_children.json +++ b/model/metrics/messaging/messaging__bullmq__jobs__waiting_children.json @@ -5,10 +5,5 @@ "unit": "none", "is_in_otel": false, "requirement_level": "opt_in", - "attributes": [ - "messaging.destination.name", - "messaging.bullmq.job.name", - "messaging.bullmq.job.status", - "messaging.bullmq.job.state" - ] + "attributes": ["messaging.destination.name", "messaging.bullmq.job.name", "messaging.bullmq.job.state"] } diff --git a/python/src/sentry_conventions/attributes.py b/python/src/sentry_conventions/attributes.py index 123955dae..079e0bb30 100644 --- a/python/src/sentry_conventions/attributes.py +++ b/python/src/sentry_conventions/attributes.py @@ -7554,21 +7554,6 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: "delayed" """ - # Path: model/attributes/messaging/messaging__bullmq__job__status.json - MESSAGING_BULLMQ_JOB_STATUS: Literal["messaging.bullmq.job.status"] = ( - "messaging.bullmq.job.status" - ) - """The state of the BullMQ job that a job metric counts. - - Type: str - Apply Scrubbing: manual - Defined in OTEL: No - Visibility: public - Example: "completed" - Example: "failed" - Example: "delayed" - """ - # Path: model/attributes/messaging/messaging__bullmq__job__type.json MESSAGING_BULLMQ_JOB_TYPE: Literal["messaging.bullmq.job.type"] = ( "messaging.bullmq.job.type" @@ -22767,29 +22752,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ), ], additional_context=[ - "The Sentry SDK sets this attribute from the `bullmq.job.state` attribute of BullMQ's telemetry interface.", - "Set on the BullMQ job metrics with BullMQ 6.3.11. With BullMQ 5.79.1, `messaging.bullmq.job.status` is set instead.", - ], - ), - "messaging.bullmq.job.status": AttributeMetadata( - brief="The state of the BullMQ job that a job metric counts.", - type=AttributeType.STRING, - keys=("messaging.bullmq.job.status",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, - visibility=Visibility.PUBLIC, - example="completed", - examples=["completed", "failed", "delayed"], - changelog=[ - ChangelogEntry( - version="next", - prs=[690], - description="Added messaging.bullmq.job.status attribute", - ), - ], - additional_context=[ - "The Sentry SDK sets this attribute from the `bullmq.job.status` attribute of BullMQ's telemetry interface.", - "Set on the BullMQ job metrics with BullMQ 5.79.1. With BullMQ 6.3.11, `messaging.bullmq.job.state` is set instead.", + "The Sentry SDK sets this attribute from the `bullmq.job.state` attribute of BullMQ's telemetry interface. BullMQ before 5.81.2 sets `bullmq.job.status` instead, and the SDK then uses that value." ], ), "messaging.bullmq.job.type": AttributeMetadata( @@ -29859,7 +29822,6 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "messaging.bullmq.job.processed.timestamp": int, "messaging.bullmq.job.scheduler.id": str, "messaging.bullmq.job.state": str, - "messaging.bullmq.job.status": str, "messaging.bullmq.job.type": str, "messaging.bullmq.queue.clean.count": int, "messaging.bullmq.queue.clean.limit": int, From c7d038004f68a03194027dc63b658fa37d85f846 Mon Sep 17 00:00:00 2001 From: JPeer264 Date: Wed, 21 Oct 2026 09:17:02 +0200 Subject: [PATCH 08/11] fixup! feat: Add BullMQ attributes and metrics --- .../sentry-conventions/src/attributes.ts | 44 ------------------- javascript/sentry-conventions/src/search.ts | 13 ------ ...ing__bullmq__job__finished__timestamp.json | 22 ---------- python/src/sentry_conventions/attributes.py | 35 --------------- 4 files changed, 114 deletions(-) delete mode 100644 model/attributes/messaging/messaging__bullmq__job__finished__timestamp.json diff --git a/javascript/sentry-conventions/src/attributes.ts b/javascript/sentry-conventions/src/attributes.ts index fba64f0a5..6e578ff9d 100644 --- a/javascript/sentry-conventions/src/attributes.ts +++ b/javascript/sentry-conventions/src/attributes.ts @@ -12420,27 +12420,6 @@ export const MESSAGING_BULLMQ_JOB_DEDUPLICATION_KEY = 'messaging.bullmq.job.dedu */ export type MESSAGING_BULLMQ_JOB_DEDUPLICATION_KEY_TYPE = string; -// Path: model/attributes/messaging/messaging__bullmq__job__finished__timestamp.json - -/** - * The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job. `messaging.bullmq.job.finished.timestamp` - * - * Attribute Value Type: `number` {@link MESSAGING_BULLMQ_JOB_FINISHED_TIMESTAMP_TYPE} - * - * Apply Scrubbing: manual - * - * Attribute defined in OTEL: No - * Visibility: public - * - * @example 1791184722411 - */ -export const MESSAGING_BULLMQ_JOB_FINISHED_TIMESTAMP = 'messaging.bullmq.job.finished.timestamp'; - -/** - * Type for {@link MESSAGING_BULLMQ_JOB_FINISHED_TIMESTAMP} messaging.bullmq.job.finished.timestamp - */ -export type MESSAGING_BULLMQ_JOB_FINISHED_TIMESTAMP_TYPE = number; - // Path: model/attributes/messaging/messaging__bullmq__job__ids.json /** @@ -21065,7 +21044,6 @@ export const ATTRIBUTE_TYPE: Record = { 'messaging.bullmq.job.attempt_finished_timestamp': 'integer', 'messaging.bullmq.job.bulk.names': 'string[]', 'messaging.bullmq.job.deduplication.key': 'string', - 'messaging.bullmq.job.finished.timestamp': 'integer', 'messaging.bullmq.job.ids': 'string[]', 'messaging.bullmq.job.key': 'string', 'messaging.bullmq.job.name': 'string', @@ -21978,7 +21956,6 @@ export type AttributeName = | typeof MESSAGING_BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP | typeof MESSAGING_BULLMQ_JOB_BULK_NAMES | typeof MESSAGING_BULLMQ_JOB_DEDUPLICATION_KEY - | typeof MESSAGING_BULLMQ_JOB_FINISHED_TIMESTAMP | typeof MESSAGING_BULLMQ_JOB_IDS | typeof MESSAGING_BULLMQ_JOB_KEY | typeof MESSAGING_BULLMQ_JOB_NAME @@ -31395,26 +31372,6 @@ export const ATTRIBUTE_METADATA: Record = { "The Sentry SDK sets this attribute from the `bullmq.job.deduplication.key` attribute of BullMQ's telemetry interface.", ], }, - 'messaging.bullmq.job.finished.timestamp': { - brief: - 'The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job.', - type: 'integer', - keys: ['messaging.bullmq.job.finished.timestamp'], - applyScrubbing: { - key: 'manual', - }, - isInOtel: false, - visibility: 'public', - example: 1791184722411, - examples: [1791184722411], - changelog: [ - { version: 'next', prs: [690], description: 'Added messaging.bullmq.job.finished.timestamp attribute' }, - ], - additionalContext: [ - "The Sentry SDK sets this attribute from the `bullmq.job.finished.timestamp` attribute of BullMQ's telemetry interface.", - 'BullMQ 5.79.1 sets this attribute. BullMQ 6.3.11 does not.', - ], - }, 'messaging.bullmq.job.ids': { brief: 'The IDs of the BullMQ jobs that Queue.clean() removed.', type: 'string[]', @@ -37714,7 +37671,6 @@ export type Attributes = { [MESSAGING_BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP]?: MESSAGING_BULLMQ_JOB_ATTEMPT_FINISHED_TIMESTAMP_TYPE; [MESSAGING_BULLMQ_JOB_BULK_NAMES]?: MESSAGING_BULLMQ_JOB_BULK_NAMES_TYPE; [MESSAGING_BULLMQ_JOB_DEDUPLICATION_KEY]?: MESSAGING_BULLMQ_JOB_DEDUPLICATION_KEY_TYPE; - [MESSAGING_BULLMQ_JOB_FINISHED_TIMESTAMP]?: MESSAGING_BULLMQ_JOB_FINISHED_TIMESTAMP_TYPE; [MESSAGING_BULLMQ_JOB_IDS]?: MESSAGING_BULLMQ_JOB_IDS_TYPE; [MESSAGING_BULLMQ_JOB_KEY]?: MESSAGING_BULLMQ_JOB_KEY_TYPE; [MESSAGING_BULLMQ_JOB_NAME]?: MESSAGING_BULLMQ_JOB_NAME_TYPE; diff --git a/javascript/sentry-conventions/src/search.ts b/javascript/sentry-conventions/src/search.ts index e860e0dc6..67b236170 100644 --- a/javascript/sentry-conventions/src/search.ts +++ b/javascript/sentry-conventions/src/search.ts @@ -3142,11 +3142,6 @@ export const SEARCH_MESSAGING__BULLMQ__JOB__BULK__NAMES = 'messaging.bullmq.job. */ export const SEARCH_MESSAGING__BULLMQ__JOB__DEDUPLICATION__KEY = 'messaging.bullmq.job.deduplication.key'; -/** - * Search name for {@link attributes.MESSAGING_BULLMQ_JOB_FINISHED_TIMESTAMP}. `messaging.bullmq.job.finished.timestamp` - */ -export const SEARCH_MESSAGING__BULLMQ__JOB__FINISHED__TIMESTAMP = 'messaging.bullmq.job.finished.timestamp'; - /** * Search name for {@link attributes.MESSAGING_BULLMQ_JOB_IDS}. `messaging.bullmq.job.ids` */ @@ -5805,7 +5800,6 @@ export type AttributeSearchName = | typeof SEARCH_MESSAGING__BULLMQ__JOB__ATTEMPT_FINISHED_TIMESTAMP | typeof SEARCH_MESSAGING__BULLMQ__JOB__BULK__NAMES | typeof SEARCH_MESSAGING__BULLMQ__JOB__DEDUPLICATION__KEY - | typeof SEARCH_MESSAGING__BULLMQ__JOB__FINISHED__TIMESTAMP | typeof SEARCH_MESSAGING__BULLMQ__JOB__IDS | typeof SEARCH_MESSAGING__BULLMQ__JOB__KEY | typeof SEARCH_MESSAGING__BULLMQ__JOB__NAME @@ -9870,13 +9864,6 @@ export const ATTRIBUTE_SEARCH_METADATA: Record brief: 'The deduplication ID that Queue.removeDeduplicationKey() removes.', deprecationChain: ['messaging.bullmq.job.deduplication.key'], }, - 'messaging.bullmq.job.finished.timestamp': { - canonicalName: 'messaging.bullmq.job.finished.timestamp', - type: 'integer', - brief: - 'The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job.', - deprecationChain: ['messaging.bullmq.job.finished.timestamp'], - }, 'messaging.bullmq.job.ids': { canonicalName: 'messaging.bullmq.job.ids', type: 'string[]', diff --git a/model/attributes/messaging/messaging__bullmq__job__finished__timestamp.json b/model/attributes/messaging/messaging__bullmq__job__finished__timestamp.json deleted file mode 100644 index b8e2ba534..000000000 --- a/model/attributes/messaging/messaging__bullmq__job__finished__timestamp.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "key": "messaging.bullmq.job.finished.timestamp", - "brief": "The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job.", - "type": "integer", - "apply_scrubbing": { - "key": "manual" - }, - "is_in_otel": false, - "visibility": "public", - "examples": [1791184722411], - "additional_context": [ - "The Sentry SDK sets this attribute from the `bullmq.job.finished.timestamp` attribute of BullMQ's telemetry interface.", - "BullMQ 5.79.1 sets this attribute. BullMQ 6.3.11 does not." - ], - "changelog": [ - { - "version": "next", - "prs": [690], - "description": "Added messaging.bullmq.job.finished.timestamp attribute" - } - ] -} diff --git a/python/src/sentry_conventions/attributes.py b/python/src/sentry_conventions/attributes.py index 079e0bb30..22e2bf207 100644 --- a/python/src/sentry_conventions/attributes.py +++ b/python/src/sentry_conventions/attributes.py @@ -7460,19 +7460,6 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: "user-42-sync" """ - # Path: model/attributes/messaging/messaging__bullmq__job__finished__timestamp.json - MESSAGING_BULLMQ_JOB_FINISHED_TIMESTAMP: Literal[ - "messaging.bullmq.job.finished.timestamp" - ] = "messaging.bullmq.job.finished.timestamp" - """The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job. - - Type: int - Apply Scrubbing: manual - Defined in OTEL: No - Visibility: public - Example: 1791184722411 - """ - # Path: model/attributes/messaging/messaging__bullmq__job__ids.json MESSAGING_BULLMQ_JOB_IDS: Literal["messaging.bullmq.job.ids"] = ( "messaging.bullmq.job.ids" @@ -22612,27 +22599,6 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "The Sentry SDK sets this attribute from the `bullmq.job.deduplication.key` attribute of BullMQ's telemetry interface." ], ), - "messaging.bullmq.job.finished.timestamp": AttributeMetadata( - brief="The time in milliseconds since the Unix epoch when the Worker finished its processing call for the BullMQ job.", - type=AttributeType.INTEGER, - keys=("messaging.bullmq.job.finished.timestamp",), - apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), - is_in_otel=False, - visibility=Visibility.PUBLIC, - example=1791184722411, - examples=[1791184722411], - changelog=[ - ChangelogEntry( - version="next", - prs=[690], - description="Added messaging.bullmq.job.finished.timestamp attribute", - ), - ], - additional_context=[ - "The Sentry SDK sets this attribute from the `bullmq.job.finished.timestamp` attribute of BullMQ's telemetry interface.", - "BullMQ 5.79.1 sets this attribute. BullMQ 6.3.11 does not.", - ], - ), "messaging.bullmq.job.ids": AttributeMetadata( brief="The IDs of the BullMQ jobs that Queue.clean() removed.", type=AttributeType.STRING_ARRAY, @@ -29815,7 +29781,6 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "messaging.bullmq.job.attempt_finished_timestamp": int, "messaging.bullmq.job.bulk.names": List[str], "messaging.bullmq.job.deduplication.key": str, - "messaging.bullmq.job.finished.timestamp": int, "messaging.bullmq.job.ids": List[str], "messaging.bullmq.job.key": str, "messaging.bullmq.job.name": str, From a1d4420297bb5252163072b59a0a783bc75c548b Mon Sep 17 00:00:00 2001 From: JPeer264 Date: Wed, 21 Oct 2026 09:17:11 +0200 Subject: [PATCH 09/11] fixup! feat: Add BullMQ attributes and metrics --- .../sentry-conventions/src/attributes.ts | 128 +++++++++--------- javascript/sentry-conventions/src/search.ts | 96 ++++++------- ...ng__bullmq__job__processed_timestamp.json} | 4 +- ...ng__bullmq__queue__event__max_length.json} | 4 +- ...messaging__bullmq__queue__rate_limit.json} | 4 +- ...__bullmq__worker__do_not_wait_active.json} | 4 +- ...ssaging__bullmq__worker__force_close.json} | 4 +- ...bullmq__worker__jobs_to_extend_locks.json} | 4 +- ...essaging__bullmq__worker__rate_limit.json} | 4 +- ...saging__bullmq__worker__stalled_jobs.json} | 4 +- python/src/sentry_conventions/attributes.py | 112 +++++++-------- 11 files changed, 184 insertions(+), 184 deletions(-) rename model/attributes/messaging/{messaging__bullmq__job__processed__timestamp.json => messaging__bullmq__job__processed_timestamp.json} (81%) rename model/attributes/messaging/{messaging__bullmq__queue__event__max__length.json => messaging__bullmq__queue__event__max_length.json} (81%) rename model/attributes/messaging/{messaging__bullmq__queue__rate__limit.json => messaging__bullmq__queue__rate_limit.json} (81%) rename model/attributes/messaging/{messaging__bullmq__worker__do__not__wait__active.json => messaging__bullmq__worker__do_not_wait_active.json} (80%) rename model/attributes/messaging/{messaging__bullmq__worker__force__close.json => messaging__bullmq__worker__force_close.json} (81%) rename model/attributes/messaging/{messaging__bullmq__worker__jobs__to__extend__locks.json => messaging__bullmq__worker__jobs_to_extend_locks.json} (76%) rename model/attributes/messaging/{messaging__bullmq__worker__rate__limit.json => messaging__bullmq__worker__rate_limit.json} (81%) rename model/attributes/messaging/{messaging__bullmq__worker__stalled__jobs.json => messaging__bullmq__worker__stalled_jobs.json} (81%) diff --git a/javascript/sentry-conventions/src/attributes.ts b/javascript/sentry-conventions/src/attributes.ts index 6e578ff9d..2faa48d6b 100644 --- a/javascript/sentry-conventions/src/attributes.ts +++ b/javascript/sentry-conventions/src/attributes.ts @@ -12484,10 +12484,10 @@ export const MESSAGING_BULLMQ_JOB_NAME = 'messaging.bullmq.job.name'; */ export type MESSAGING_BULLMQ_JOB_NAME_TYPE = string; -// Path: model/attributes/messaging/messaging__bullmq__job__processed__timestamp.json +// Path: model/attributes/messaging/messaging__bullmq__job__processed_timestamp.json /** - * The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job. `messaging.bullmq.job.processed.timestamp` + * The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job. `messaging.bullmq.job.processed_timestamp` * * Attribute Value Type: `number` {@link MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP_TYPE} * @@ -12498,10 +12498,10 @@ export type MESSAGING_BULLMQ_JOB_NAME_TYPE = string; * * @example 1791184722281 */ -export const MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP = 'messaging.bullmq.job.processed.timestamp'; +export const MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP = 'messaging.bullmq.job.processed_timestamp'; /** - * Type for {@link MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP} messaging.bullmq.job.processed.timestamp + * Type for {@link MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP} messaging.bullmq.job.processed_timestamp */ export type MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP_TYPE = number; @@ -12634,10 +12634,10 @@ export const MESSAGING_BULLMQ_QUEUE_DRAIN_DELAY = 'messaging.bullmq.queue.drain. */ export type MESSAGING_BULLMQ_QUEUE_DRAIN_DELAY_TYPE = boolean; -// Path: model/attributes/messaging/messaging__bullmq__queue__event__max__length.json +// Path: model/attributes/messaging/messaging__bullmq__queue__event__max_length.json /** - * The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream. `messaging.bullmq.queue.event.max.length` + * The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream. `messaging.bullmq.queue.event.max_length` * * Attribute Value Type: `number` {@link MESSAGING_BULLMQ_QUEUE_EVENT_MAX_LENGTH_TYPE} * @@ -12648,10 +12648,10 @@ export type MESSAGING_BULLMQ_QUEUE_DRAIN_DELAY_TYPE = boolean; * * @example 10000 */ -export const MESSAGING_BULLMQ_QUEUE_EVENT_MAX_LENGTH = 'messaging.bullmq.queue.event.max.length'; +export const MESSAGING_BULLMQ_QUEUE_EVENT_MAX_LENGTH = 'messaging.bullmq.queue.event.max_length'; /** - * Type for {@link MESSAGING_BULLMQ_QUEUE_EVENT_MAX_LENGTH} messaging.bullmq.queue.event.max.length + * Type for {@link MESSAGING_BULLMQ_QUEUE_EVENT_MAX_LENGTH} messaging.bullmq.queue.event.max_length */ export type MESSAGING_BULLMQ_QUEUE_EVENT_MAX_LENGTH_TYPE = number; @@ -12699,10 +12699,10 @@ export const MESSAGING_BULLMQ_QUEUE_JOBS_STATE = 'messaging.bullmq.queue.jobs.st */ export type MESSAGING_BULLMQ_QUEUE_JOBS_STATE_TYPE = string; -// Path: model/attributes/messaging/messaging__bullmq__queue__rate__limit.json +// Path: model/attributes/messaging/messaging__bullmq__queue__rate_limit.json /** - * The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue. `messaging.bullmq.queue.rate.limit` + * The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue. `messaging.bullmq.queue.rate_limit` * * Attribute Value Type: `number` {@link MESSAGING_BULLMQ_QUEUE_RATE_LIMIT_TYPE} * @@ -12713,17 +12713,17 @@ export type MESSAGING_BULLMQ_QUEUE_JOBS_STATE_TYPE = string; * * @example 5000 */ -export const MESSAGING_BULLMQ_QUEUE_RATE_LIMIT = 'messaging.bullmq.queue.rate.limit'; +export const MESSAGING_BULLMQ_QUEUE_RATE_LIMIT = 'messaging.bullmq.queue.rate_limit'; /** - * Type for {@link MESSAGING_BULLMQ_QUEUE_RATE_LIMIT} messaging.bullmq.queue.rate.limit + * Type for {@link MESSAGING_BULLMQ_QUEUE_RATE_LIMIT} messaging.bullmq.queue.rate_limit */ export type MESSAGING_BULLMQ_QUEUE_RATE_LIMIT_TYPE = number; -// Path: model/attributes/messaging/messaging__bullmq__worker__do__not__wait__active.json +// Path: model/attributes/messaging/messaging__bullmq__worker__do_not_wait_active.json /** - * Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish. `messaging.bullmq.worker.do.not.wait.active` + * Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish. `messaging.bullmq.worker.do_not_wait_active` * * Attribute Value Type: `boolean` {@link MESSAGING_BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE_TYPE} * @@ -12734,17 +12734,17 @@ export type MESSAGING_BULLMQ_QUEUE_RATE_LIMIT_TYPE = number; * * @example false */ -export const MESSAGING_BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE = 'messaging.bullmq.worker.do.not.wait.active'; +export const MESSAGING_BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE = 'messaging.bullmq.worker.do_not_wait_active'; /** - * Type for {@link MESSAGING_BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE} messaging.bullmq.worker.do.not.wait.active + * Type for {@link MESSAGING_BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE} messaging.bullmq.worker.do_not_wait_active */ export type MESSAGING_BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE_TYPE = boolean; -// Path: model/attributes/messaging/messaging__bullmq__worker__force__close.json +// Path: model/attributes/messaging/messaging__bullmq__worker__force_close.json /** - * Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish. `messaging.bullmq.worker.force.close` + * Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish. `messaging.bullmq.worker.force_close` * * Attribute Value Type: `boolean` {@link MESSAGING_BULLMQ_WORKER_FORCE_CLOSE_TYPE} * @@ -12755,17 +12755,17 @@ export type MESSAGING_BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE_TYPE = boolean; * * @example false */ -export const MESSAGING_BULLMQ_WORKER_FORCE_CLOSE = 'messaging.bullmq.worker.force.close'; +export const MESSAGING_BULLMQ_WORKER_FORCE_CLOSE = 'messaging.bullmq.worker.force_close'; /** - * Type for {@link MESSAGING_BULLMQ_WORKER_FORCE_CLOSE} messaging.bullmq.worker.force.close + * Type for {@link MESSAGING_BULLMQ_WORKER_FORCE_CLOSE} messaging.bullmq.worker.force_close */ export type MESSAGING_BULLMQ_WORKER_FORCE_CLOSE_TYPE = boolean; -// Path: model/attributes/messaging/messaging__bullmq__worker__jobs__to__extend__locks.json +// Path: model/attributes/messaging/messaging__bullmq__worker__jobs_to_extend_locks.json /** - * The IDs of the BullMQ jobs whose locks the Worker extends. `messaging.bullmq.worker.jobs.to.extend.locks` + * The IDs of the BullMQ jobs whose locks the Worker extends. `messaging.bullmq.worker.jobs_to_extend_locks` * * Attribute Value Type: `Array` {@link MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS_TYPE} * @@ -12776,10 +12776,10 @@ export type MESSAGING_BULLMQ_WORKER_FORCE_CLOSE_TYPE = boolean; * * @example ["1","2"] */ -export const MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS = 'messaging.bullmq.worker.jobs.to.extend.locks'; +export const MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS = 'messaging.bullmq.worker.jobs_to_extend_locks'; /** - * Type for {@link MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS} messaging.bullmq.worker.jobs.to.extend.locks + * Type for {@link MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS} messaging.bullmq.worker.jobs_to_extend_locks */ export type MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS_TYPE = Array; @@ -12804,10 +12804,10 @@ export const MESSAGING_BULLMQ_WORKER_NAME = 'messaging.bullmq.worker.name'; */ export type MESSAGING_BULLMQ_WORKER_NAME_TYPE = string; -// Path: model/attributes/messaging/messaging__bullmq__worker__rate__limit.json +// Path: model/attributes/messaging/messaging__bullmq__worker__rate_limit.json /** - * The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker. `messaging.bullmq.worker.rate.limit` + * The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker. `messaging.bullmq.worker.rate_limit` * * Attribute Value Type: `number` {@link MESSAGING_BULLMQ_WORKER_RATE_LIMIT_TYPE} * @@ -12818,17 +12818,17 @@ export type MESSAGING_BULLMQ_WORKER_NAME_TYPE = string; * * @example 5000 */ -export const MESSAGING_BULLMQ_WORKER_RATE_LIMIT = 'messaging.bullmq.worker.rate.limit'; +export const MESSAGING_BULLMQ_WORKER_RATE_LIMIT = 'messaging.bullmq.worker.rate_limit'; /** - * Type for {@link MESSAGING_BULLMQ_WORKER_RATE_LIMIT} messaging.bullmq.worker.rate.limit + * Type for {@link MESSAGING_BULLMQ_WORKER_RATE_LIMIT} messaging.bullmq.worker.rate_limit */ export type MESSAGING_BULLMQ_WORKER_RATE_LIMIT_TYPE = number; -// Path: model/attributes/messaging/messaging__bullmq__worker__stalled__jobs.json +// Path: model/attributes/messaging/messaging__bullmq__worker__stalled_jobs.json /** - * The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state. `messaging.bullmq.worker.stalled.jobs` + * The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state. `messaging.bullmq.worker.stalled_jobs` * * Attribute Value Type: `Array` {@link MESSAGING_BULLMQ_WORKER_STALLED_JOBS_TYPE} * @@ -12839,10 +12839,10 @@ export type MESSAGING_BULLMQ_WORKER_RATE_LIMIT_TYPE = number; * * @example ["1","2"] */ -export const MESSAGING_BULLMQ_WORKER_STALLED_JOBS = 'messaging.bullmq.worker.stalled.jobs'; +export const MESSAGING_BULLMQ_WORKER_STALLED_JOBS = 'messaging.bullmq.worker.stalled_jobs'; /** - * Type for {@link MESSAGING_BULLMQ_WORKER_STALLED_JOBS} messaging.bullmq.worker.stalled.jobs + * Type for {@link MESSAGING_BULLMQ_WORKER_STALLED_JOBS} messaging.bullmq.worker.stalled_jobs */ export type MESSAGING_BULLMQ_WORKER_STALLED_JOBS_TYPE = Array; @@ -21047,23 +21047,23 @@ export const ATTRIBUTE_TYPE: Record = { 'messaging.bullmq.job.ids': 'string[]', 'messaging.bullmq.job.key': 'string', 'messaging.bullmq.job.name': 'string', - 'messaging.bullmq.job.processed.timestamp': 'integer', + 'messaging.bullmq.job.processed_timestamp': 'integer', 'messaging.bullmq.job.scheduler.id': 'string', 'messaging.bullmq.job.state': 'string', 'messaging.bullmq.job.type': 'string', 'messaging.bullmq.queue.clean.count': 'integer', 'messaging.bullmq.queue.clean.limit': 'integer', 'messaging.bullmq.queue.drain.delay': 'boolean', - 'messaging.bullmq.queue.event.max.length': 'integer', + 'messaging.bullmq.queue.event.max_length': 'integer', 'messaging.bullmq.queue.grace': 'integer', 'messaging.bullmq.queue.jobs.state': 'string', - 'messaging.bullmq.queue.rate.limit': 'integer', - 'messaging.bullmq.worker.do.not.wait.active': 'boolean', - 'messaging.bullmq.worker.force.close': 'boolean', - 'messaging.bullmq.worker.jobs.to.extend.locks': 'string[]', + 'messaging.bullmq.queue.rate_limit': 'integer', + 'messaging.bullmq.worker.do_not_wait_active': 'boolean', + 'messaging.bullmq.worker.force_close': 'boolean', + 'messaging.bullmq.worker.jobs_to_extend_locks': 'string[]', 'messaging.bullmq.worker.name': 'string', - 'messaging.bullmq.worker.rate.limit': 'integer', - 'messaging.bullmq.worker.stalled.jobs': 'string[]', + 'messaging.bullmq.worker.rate_limit': 'integer', + 'messaging.bullmq.worker.stalled_jobs': 'string[]', 'messaging.client.id': 'string', 'messaging.conversation_id': 'string', 'messaging.destination': 'string', @@ -31423,10 +31423,10 @@ export const ATTRIBUTE_METADATA: Record = { 'Also set on the BullMQ job metrics.', ], }, - 'messaging.bullmq.job.processed.timestamp': { + 'messaging.bullmq.job.processed_timestamp': { brief: 'The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job.', type: 'integer', - keys: ['messaging.bullmq.job.processed.timestamp'], + keys: ['messaging.bullmq.job.processed_timestamp'], applyScrubbing: { key: 'manual', }, @@ -31435,7 +31435,7 @@ export const ATTRIBUTE_METADATA: Record = { example: 1791184722281, examples: [1791184722281], changelog: [ - { version: 'next', prs: [690], description: 'Added messaging.bullmq.job.processed.timestamp attribute' }, + { version: 'next', prs: [690], description: 'Added messaging.bullmq.job.processed_timestamp attribute' }, ], additionalContext: [ "The Sentry SDK sets this attribute from the `bullmq.job.processed.timestamp` attribute of BullMQ's telemetry interface.", @@ -31538,10 +31538,10 @@ export const ATTRIBUTE_METADATA: Record = { "The Sentry SDK sets this attribute from the `bullmq.queue.drain.delay` attribute of BullMQ's telemetry interface.", ], }, - 'messaging.bullmq.queue.event.max.length': { + 'messaging.bullmq.queue.event.max_length': { brief: 'The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream.', type: 'integer', - keys: ['messaging.bullmq.queue.event.max.length'], + keys: ['messaging.bullmq.queue.event.max_length'], applyScrubbing: { key: 'manual', }, @@ -31550,7 +31550,7 @@ export const ATTRIBUTE_METADATA: Record = { example: 10000, examples: [10000], changelog: [ - { version: 'next', prs: [690], description: 'Added messaging.bullmq.queue.event.max.length attribute' }, + { version: 'next', prs: [690], description: 'Added messaging.bullmq.queue.event.max_length attribute' }, ], additionalContext: [ "The Sentry SDK sets this attribute from the `bullmq.queue.event.max.length` attribute of BullMQ's telemetry interface.", @@ -31589,10 +31589,10 @@ export const ATTRIBUTE_METADATA: Record = { 'Set on the BullMQ queue job count metric.', ], }, - 'messaging.bullmq.queue.rate.limit': { + 'messaging.bullmq.queue.rate_limit': { brief: 'The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue.', type: 'integer', - keys: ['messaging.bullmq.queue.rate.limit'], + keys: ['messaging.bullmq.queue.rate_limit'], applyScrubbing: { key: 'manual', }, @@ -31600,15 +31600,15 @@ export const ATTRIBUTE_METADATA: Record = { visibility: 'public', example: 5000, examples: [5000], - changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.queue.rate.limit attribute' }], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.queue.rate_limit attribute' }], additionalContext: [ "The Sentry SDK sets this attribute from the `bullmq.queue.rate.limit` attribute of BullMQ's telemetry interface.", ], }, - 'messaging.bullmq.worker.do.not.wait.active': { + 'messaging.bullmq.worker.do_not_wait_active': { brief: 'Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish.', type: 'boolean', - keys: ['messaging.bullmq.worker.do.not.wait.active'], + keys: ['messaging.bullmq.worker.do_not_wait_active'], applyScrubbing: { key: 'manual', }, @@ -31617,16 +31617,16 @@ export const ATTRIBUTE_METADATA: Record = { example: false, examples: [false], changelog: [ - { version: 'next', prs: [690], description: 'Added messaging.bullmq.worker.do.not.wait.active attribute' }, + { version: 'next', prs: [690], description: 'Added messaging.bullmq.worker.do_not_wait_active attribute' }, ], additionalContext: [ "The Sentry SDK sets this attribute from the `bullmq.worker.do.not.wait.active` attribute of BullMQ's telemetry interface.", ], }, - 'messaging.bullmq.worker.force.close': { + 'messaging.bullmq.worker.force_close': { brief: 'Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish.', type: 'boolean', - keys: ['messaging.bullmq.worker.force.close'], + keys: ['messaging.bullmq.worker.force_close'], applyScrubbing: { key: 'manual', }, @@ -31634,15 +31634,15 @@ export const ATTRIBUTE_METADATA: Record = { visibility: 'public', example: false, examples: [false], - changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.worker.force.close attribute' }], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.worker.force_close attribute' }], additionalContext: [ "The Sentry SDK sets this attribute from the `bullmq.worker.force.close` attribute of BullMQ's telemetry interface.", ], }, - 'messaging.bullmq.worker.jobs.to.extend.locks': { + 'messaging.bullmq.worker.jobs_to_extend_locks': { brief: 'The IDs of the BullMQ jobs whose locks the Worker extends.', type: 'string[]', - keys: ['messaging.bullmq.worker.jobs.to.extend.locks'], + keys: ['messaging.bullmq.worker.jobs_to_extend_locks'], applyScrubbing: { key: 'manual', }, @@ -31651,7 +31651,7 @@ export const ATTRIBUTE_METADATA: Record = { example: ['1', '2'], examples: [['1', '2']], changelog: [ - { version: 'next', prs: [690], description: 'Added messaging.bullmq.worker.jobs.to.extend.locks attribute' }, + { version: 'next', prs: [690], description: 'Added messaging.bullmq.worker.jobs_to_extend_locks attribute' }, ], additionalContext: [ "The Sentry SDK sets this attribute from the `bullmq.worker.jobs.to.extend.locks` attribute of BullMQ's telemetry interface.", @@ -31673,10 +31673,10 @@ export const ATTRIBUTE_METADATA: Record = { "The Sentry SDK sets this attribute from the `bullmq.worker.name` attribute of BullMQ's telemetry interface.", ], }, - 'messaging.bullmq.worker.rate.limit': { + 'messaging.bullmq.worker.rate_limit': { brief: 'The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker.', type: 'integer', - keys: ['messaging.bullmq.worker.rate.limit'], + keys: ['messaging.bullmq.worker.rate_limit'], applyScrubbing: { key: 'manual', }, @@ -31684,15 +31684,15 @@ export const ATTRIBUTE_METADATA: Record = { visibility: 'public', example: 5000, examples: [5000], - changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.worker.rate.limit attribute' }], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.worker.rate_limit attribute' }], additionalContext: [ "The Sentry SDK sets this attribute from the `bullmq.worker.rate.limit` attribute of BullMQ's telemetry interface.", ], }, - 'messaging.bullmq.worker.stalled.jobs': { + 'messaging.bullmq.worker.stalled_jobs': { brief: 'The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state.', type: 'string[]', - keys: ['messaging.bullmq.worker.stalled.jobs'], + keys: ['messaging.bullmq.worker.stalled_jobs'], applyScrubbing: { key: 'manual', }, @@ -31700,7 +31700,7 @@ export const ATTRIBUTE_METADATA: Record = { visibility: 'public', example: ['1', '2'], examples: [['1', '2']], - changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.worker.stalled.jobs attribute' }], + changelog: [{ version: 'next', prs: [690], description: 'Added messaging.bullmq.worker.stalled_jobs attribute' }], additionalContext: [ "The Sentry SDK sets this attribute from the `bullmq.worker.stalled.jobs` attribute of BullMQ's telemetry interface.", ], diff --git a/javascript/sentry-conventions/src/search.ts b/javascript/sentry-conventions/src/search.ts index 67b236170..4168a7f88 100644 --- a/javascript/sentry-conventions/src/search.ts +++ b/javascript/sentry-conventions/src/search.ts @@ -3158,9 +3158,9 @@ export const SEARCH_MESSAGING__BULLMQ__JOB__KEY = 'messaging.bullmq.job.key'; export const SEARCH_MESSAGING__BULLMQ__JOB__NAME = 'messaging.bullmq.job.name'; /** - * Search name for {@link attributes.MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP}. `messaging.bullmq.job.processed.timestamp` + * Search name for {@link attributes.MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP}. `messaging.bullmq.job.processed_timestamp` */ -export const SEARCH_MESSAGING__BULLMQ__JOB__PROCESSED__TIMESTAMP = 'messaging.bullmq.job.processed.timestamp'; +export const SEARCH_MESSAGING__BULLMQ__JOB__PROCESSED_TIMESTAMP = 'messaging.bullmq.job.processed_timestamp'; /** * Search name for {@link attributes.MESSAGING_BULLMQ_JOB_SCHEDULER_ID}. `messaging.bullmq.job.scheduler.id` @@ -3193,9 +3193,9 @@ export const SEARCH_MESSAGING__BULLMQ__QUEUE__CLEAN__LIMIT = 'messaging.bullmq.q export const SEARCH_MESSAGING__BULLMQ__QUEUE__DRAIN__DELAY = 'messaging.bullmq.queue.drain.delay'; /** - * Search name for {@link attributes.MESSAGING_BULLMQ_QUEUE_EVENT_MAX_LENGTH}. `messaging.bullmq.queue.event.max.length` + * Search name for {@link attributes.MESSAGING_BULLMQ_QUEUE_EVENT_MAX_LENGTH}. `messaging.bullmq.queue.event.max_length` */ -export const SEARCH_MESSAGING__BULLMQ__QUEUE__EVENT__MAX__LENGTH = 'messaging.bullmq.queue.event.max.length'; +export const SEARCH_MESSAGING__BULLMQ__QUEUE__EVENT__MAX_LENGTH = 'messaging.bullmq.queue.event.max_length'; /** * Search name for {@link attributes.MESSAGING_BULLMQ_QUEUE_GRACE}. `messaging.bullmq.queue.grace` @@ -3208,24 +3208,24 @@ export const SEARCH_MESSAGING__BULLMQ__QUEUE__GRACE = 'messaging.bullmq.queue.gr export const SEARCH_MESSAGING__BULLMQ__QUEUE__JOBS__STATE = 'messaging.bullmq.queue.jobs.state'; /** - * Search name for {@link attributes.MESSAGING_BULLMQ_QUEUE_RATE_LIMIT}. `messaging.bullmq.queue.rate.limit` + * Search name for {@link attributes.MESSAGING_BULLMQ_QUEUE_RATE_LIMIT}. `messaging.bullmq.queue.rate_limit` */ -export const SEARCH_MESSAGING__BULLMQ__QUEUE__RATE__LIMIT = 'messaging.bullmq.queue.rate.limit'; +export const SEARCH_MESSAGING__BULLMQ__QUEUE__RATE_LIMIT = 'messaging.bullmq.queue.rate_limit'; /** - * Search name for {@link attributes.MESSAGING_BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE}. `messaging.bullmq.worker.do.not.wait.active` + * Search name for {@link attributes.MESSAGING_BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE}. `messaging.bullmq.worker.do_not_wait_active` */ -export const SEARCH_MESSAGING__BULLMQ__WORKER__DO__NOT__WAIT__ACTIVE = 'messaging.bullmq.worker.do.not.wait.active'; +export const SEARCH_MESSAGING__BULLMQ__WORKER__DO_NOT_WAIT_ACTIVE = 'messaging.bullmq.worker.do_not_wait_active'; /** - * Search name for {@link attributes.MESSAGING_BULLMQ_WORKER_FORCE_CLOSE}. `messaging.bullmq.worker.force.close` + * Search name for {@link attributes.MESSAGING_BULLMQ_WORKER_FORCE_CLOSE}. `messaging.bullmq.worker.force_close` */ -export const SEARCH_MESSAGING__BULLMQ__WORKER__FORCE__CLOSE = 'messaging.bullmq.worker.force.close'; +export const SEARCH_MESSAGING__BULLMQ__WORKER__FORCE_CLOSE = 'messaging.bullmq.worker.force_close'; /** - * Search name for {@link attributes.MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS}. `messaging.bullmq.worker.jobs.to.extend.locks` + * Search name for {@link attributes.MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS}. `messaging.bullmq.worker.jobs_to_extend_locks` */ -export const SEARCH_MESSAGING__BULLMQ__WORKER__JOBS__TO__EXTEND__LOCKS = 'messaging.bullmq.worker.jobs.to.extend.locks'; +export const SEARCH_MESSAGING__BULLMQ__WORKER__JOBS_TO_EXTEND_LOCKS = 'messaging.bullmq.worker.jobs_to_extend_locks'; /** * Search name for {@link attributes.MESSAGING_BULLMQ_WORKER_NAME}. `messaging.bullmq.worker.name` @@ -3233,14 +3233,14 @@ export const SEARCH_MESSAGING__BULLMQ__WORKER__JOBS__TO__EXTEND__LOCKS = 'messag export const SEARCH_MESSAGING__BULLMQ__WORKER__NAME = 'messaging.bullmq.worker.name'; /** - * Search name for {@link attributes.MESSAGING_BULLMQ_WORKER_RATE_LIMIT}. `messaging.bullmq.worker.rate.limit` + * Search name for {@link attributes.MESSAGING_BULLMQ_WORKER_RATE_LIMIT}. `messaging.bullmq.worker.rate_limit` */ -export const SEARCH_MESSAGING__BULLMQ__WORKER__RATE__LIMIT = 'messaging.bullmq.worker.rate.limit'; +export const SEARCH_MESSAGING__BULLMQ__WORKER__RATE_LIMIT = 'messaging.bullmq.worker.rate_limit'; /** - * Search name for {@link attributes.MESSAGING_BULLMQ_WORKER_STALLED_JOBS}. `messaging.bullmq.worker.stalled.jobs` + * Search name for {@link attributes.MESSAGING_BULLMQ_WORKER_STALLED_JOBS}. `messaging.bullmq.worker.stalled_jobs` */ -export const SEARCH_MESSAGING__BULLMQ__WORKER__STALLED__JOBS = 'messaging.bullmq.worker.stalled.jobs'; +export const SEARCH_MESSAGING__BULLMQ__WORKER__STALLED_JOBS = 'messaging.bullmq.worker.stalled_jobs'; /** * Search name for {@link attributes.MESSAGING_CLIENT_ID}. `messaging.client.id` @@ -5803,23 +5803,23 @@ export type AttributeSearchName = | typeof SEARCH_MESSAGING__BULLMQ__JOB__IDS | typeof SEARCH_MESSAGING__BULLMQ__JOB__KEY | typeof SEARCH_MESSAGING__BULLMQ__JOB__NAME - | typeof SEARCH_MESSAGING__BULLMQ__JOB__PROCESSED__TIMESTAMP + | typeof SEARCH_MESSAGING__BULLMQ__JOB__PROCESSED_TIMESTAMP | typeof SEARCH_MESSAGING__BULLMQ__JOB__SCHEDULER__ID | typeof SEARCH_MESSAGING__BULLMQ__JOB__STATE | typeof SEARCH_MESSAGING__BULLMQ__JOB__TYPE | typeof SEARCH_MESSAGING__BULLMQ__QUEUE__CLEAN__COUNT | typeof SEARCH_MESSAGING__BULLMQ__QUEUE__CLEAN__LIMIT | typeof SEARCH_MESSAGING__BULLMQ__QUEUE__DRAIN__DELAY - | typeof SEARCH_MESSAGING__BULLMQ__QUEUE__EVENT__MAX__LENGTH + | typeof SEARCH_MESSAGING__BULLMQ__QUEUE__EVENT__MAX_LENGTH | typeof SEARCH_MESSAGING__BULLMQ__QUEUE__GRACE | typeof SEARCH_MESSAGING__BULLMQ__QUEUE__JOBS__STATE - | typeof SEARCH_MESSAGING__BULLMQ__QUEUE__RATE__LIMIT - | typeof SEARCH_MESSAGING__BULLMQ__WORKER__DO__NOT__WAIT__ACTIVE - | typeof SEARCH_MESSAGING__BULLMQ__WORKER__FORCE__CLOSE - | typeof SEARCH_MESSAGING__BULLMQ__WORKER__JOBS__TO__EXTEND__LOCKS + | typeof SEARCH_MESSAGING__BULLMQ__QUEUE__RATE_LIMIT + | typeof SEARCH_MESSAGING__BULLMQ__WORKER__DO_NOT_WAIT_ACTIVE + | typeof SEARCH_MESSAGING__BULLMQ__WORKER__FORCE_CLOSE + | typeof SEARCH_MESSAGING__BULLMQ__WORKER__JOBS_TO_EXTEND_LOCKS | typeof SEARCH_MESSAGING__BULLMQ__WORKER__NAME - | typeof SEARCH_MESSAGING__BULLMQ__WORKER__RATE__LIMIT - | typeof SEARCH_MESSAGING__BULLMQ__WORKER__STALLED__JOBS + | typeof SEARCH_MESSAGING__BULLMQ__WORKER__RATE_LIMIT + | typeof SEARCH_MESSAGING__BULLMQ__WORKER__STALLED_JOBS | typeof SEARCH_MESSAGING__CLIENT__ID | typeof SEARCH_MESSAGING__CONVERSATION_ID | typeof SEARCH_MESSAGING__DESTINATION @@ -9883,11 +9883,11 @@ export const ATTRIBUTE_SEARCH_METADATA: Record brief: 'The name of the BullMQ job, which the user passes to Queue.add() to identify the kind of work.', deprecationChain: ['messaging.bullmq.job.name'], }, - 'messaging.bullmq.job.processed.timestamp': { - canonicalName: 'messaging.bullmq.job.processed.timestamp', + 'messaging.bullmq.job.processed_timestamp': { + canonicalName: 'messaging.bullmq.job.processed_timestamp', type: 'integer', brief: 'The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job.', - deprecationChain: ['messaging.bullmq.job.processed.timestamp'], + deprecationChain: ['messaging.bullmq.job.processed_timestamp'], }, 'messaging.bullmq.job.scheduler.id': { canonicalName: 'messaging.bullmq.job.scheduler.id', @@ -9925,11 +9925,11 @@ export const ATTRIBUTE_SEARCH_METADATA: Record brief: 'Whether Queue.drain() also removes the delayed BullMQ jobs.', deprecationChain: ['messaging.bullmq.queue.drain.delay'], }, - 'messaging.bullmq.queue.event.max.length': { - canonicalName: 'messaging.bullmq.queue.event.max.length', + 'messaging.bullmq.queue.event.max_length': { + canonicalName: 'messaging.bullmq.queue.event.max_length', type: 'integer', brief: 'The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream.', - deprecationChain: ['messaging.bullmq.queue.event.max.length'], + deprecationChain: ['messaging.bullmq.queue.event.max_length'], }, 'messaging.bullmq.queue.grace': { canonicalName: 'messaging.bullmq.queue.grace', @@ -9943,29 +9943,29 @@ export const ATTRIBUTE_SEARCH_METADATA: Record brief: 'The BullMQ job state that the queue job count metric counts.', deprecationChain: ['messaging.bullmq.queue.jobs.state'], }, - 'messaging.bullmq.queue.rate.limit': { - canonicalName: 'messaging.bullmq.queue.rate.limit', + 'messaging.bullmq.queue.rate_limit': { + canonicalName: 'messaging.bullmq.queue.rate_limit', type: 'integer', brief: 'The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue.', - deprecationChain: ['messaging.bullmq.queue.rate.limit'], + deprecationChain: ['messaging.bullmq.queue.rate_limit'], }, - 'messaging.bullmq.worker.do.not.wait.active': { - canonicalName: 'messaging.bullmq.worker.do.not.wait.active', + 'messaging.bullmq.worker.do_not_wait_active': { + canonicalName: 'messaging.bullmq.worker.do_not_wait_active', type: 'boolean', brief: 'Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish.', - deprecationChain: ['messaging.bullmq.worker.do.not.wait.active'], + deprecationChain: ['messaging.bullmq.worker.do_not_wait_active'], }, - 'messaging.bullmq.worker.force.close': { - canonicalName: 'messaging.bullmq.worker.force.close', + 'messaging.bullmq.worker.force_close': { + canonicalName: 'messaging.bullmq.worker.force_close', type: 'boolean', brief: 'Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish.', - deprecationChain: ['messaging.bullmq.worker.force.close'], + deprecationChain: ['messaging.bullmq.worker.force_close'], }, - 'messaging.bullmq.worker.jobs.to.extend.locks': { - canonicalName: 'messaging.bullmq.worker.jobs.to.extend.locks', + 'messaging.bullmq.worker.jobs_to_extend_locks': { + canonicalName: 'messaging.bullmq.worker.jobs_to_extend_locks', type: 'string[]', brief: 'The IDs of the BullMQ jobs whose locks the Worker extends.', - deprecationChain: ['messaging.bullmq.worker.jobs.to.extend.locks'], + deprecationChain: ['messaging.bullmq.worker.jobs_to_extend_locks'], }, 'messaging.bullmq.worker.name': { canonicalName: 'messaging.bullmq.worker.name', @@ -9973,17 +9973,17 @@ export const ATTRIBUTE_SEARCH_METADATA: Record brief: 'The name that the user gives to the BullMQ Worker in its options.', deprecationChain: ['messaging.bullmq.worker.name'], }, - 'messaging.bullmq.worker.rate.limit': { - canonicalName: 'messaging.bullmq.worker.rate.limit', + 'messaging.bullmq.worker.rate_limit': { + canonicalName: 'messaging.bullmq.worker.rate_limit', type: 'integer', brief: 'The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker.', - deprecationChain: ['messaging.bullmq.worker.rate.limit'], + deprecationChain: ['messaging.bullmq.worker.rate_limit'], }, - 'messaging.bullmq.worker.stalled.jobs': { - canonicalName: 'messaging.bullmq.worker.stalled.jobs', + 'messaging.bullmq.worker.stalled_jobs': { + canonicalName: 'messaging.bullmq.worker.stalled_jobs', type: 'string[]', brief: 'The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state.', - deprecationChain: ['messaging.bullmq.worker.stalled.jobs'], + deprecationChain: ['messaging.bullmq.worker.stalled_jobs'], }, 'messaging.client.id': { canonicalName: 'messaging.client.id', diff --git a/model/attributes/messaging/messaging__bullmq__job__processed__timestamp.json b/model/attributes/messaging/messaging__bullmq__job__processed_timestamp.json similarity index 81% rename from model/attributes/messaging/messaging__bullmq__job__processed__timestamp.json rename to model/attributes/messaging/messaging__bullmq__job__processed_timestamp.json index b881347e7..79f8a1efd 100644 --- a/model/attributes/messaging/messaging__bullmq__job__processed__timestamp.json +++ b/model/attributes/messaging/messaging__bullmq__job__processed_timestamp.json @@ -1,5 +1,5 @@ { - "key": "messaging.bullmq.job.processed.timestamp", + "key": "messaging.bullmq.job.processed_timestamp", "brief": "The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job.", "type": "integer", "apply_scrubbing": { @@ -15,7 +15,7 @@ { "version": "next", "prs": [690], - "description": "Added messaging.bullmq.job.processed.timestamp attribute" + "description": "Added messaging.bullmq.job.processed_timestamp attribute" } ] } diff --git a/model/attributes/messaging/messaging__bullmq__queue__event__max__length.json b/model/attributes/messaging/messaging__bullmq__queue__event__max_length.json similarity index 81% rename from model/attributes/messaging/messaging__bullmq__queue__event__max__length.json rename to model/attributes/messaging/messaging__bullmq__queue__event__max_length.json index 7a121788b..d6f64fd37 100644 --- a/model/attributes/messaging/messaging__bullmq__queue__event__max__length.json +++ b/model/attributes/messaging/messaging__bullmq__queue__event__max_length.json @@ -1,5 +1,5 @@ { - "key": "messaging.bullmq.queue.event.max.length", + "key": "messaging.bullmq.queue.event.max_length", "brief": "The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream.", "type": "integer", "apply_scrubbing": { @@ -15,7 +15,7 @@ { "version": "next", "prs": [690], - "description": "Added messaging.bullmq.queue.event.max.length attribute" + "description": "Added messaging.bullmq.queue.event.max_length attribute" } ] } diff --git a/model/attributes/messaging/messaging__bullmq__queue__rate__limit.json b/model/attributes/messaging/messaging__bullmq__queue__rate_limit.json similarity index 81% rename from model/attributes/messaging/messaging__bullmq__queue__rate__limit.json rename to model/attributes/messaging/messaging__bullmq__queue__rate_limit.json index 1fec8bcc1..30fbd4d6f 100644 --- a/model/attributes/messaging/messaging__bullmq__queue__rate__limit.json +++ b/model/attributes/messaging/messaging__bullmq__queue__rate_limit.json @@ -1,5 +1,5 @@ { - "key": "messaging.bullmq.queue.rate.limit", + "key": "messaging.bullmq.queue.rate_limit", "brief": "The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue.", "type": "integer", "apply_scrubbing": { @@ -15,7 +15,7 @@ { "version": "next", "prs": [690], - "description": "Added messaging.bullmq.queue.rate.limit attribute" + "description": "Added messaging.bullmq.queue.rate_limit attribute" } ] } diff --git a/model/attributes/messaging/messaging__bullmq__worker__do__not__wait__active.json b/model/attributes/messaging/messaging__bullmq__worker__do_not_wait_active.json similarity index 80% rename from model/attributes/messaging/messaging__bullmq__worker__do__not__wait__active.json rename to model/attributes/messaging/messaging__bullmq__worker__do_not_wait_active.json index 73391499b..211db28bc 100644 --- a/model/attributes/messaging/messaging__bullmq__worker__do__not__wait__active.json +++ b/model/attributes/messaging/messaging__bullmq__worker__do_not_wait_active.json @@ -1,5 +1,5 @@ { - "key": "messaging.bullmq.worker.do.not.wait.active", + "key": "messaging.bullmq.worker.do_not_wait_active", "brief": "Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish.", "type": "boolean", "apply_scrubbing": { @@ -15,7 +15,7 @@ { "version": "next", "prs": [690], - "description": "Added messaging.bullmq.worker.do.not.wait.active attribute" + "description": "Added messaging.bullmq.worker.do_not_wait_active attribute" } ] } diff --git a/model/attributes/messaging/messaging__bullmq__worker__force__close.json b/model/attributes/messaging/messaging__bullmq__worker__force_close.json similarity index 81% rename from model/attributes/messaging/messaging__bullmq__worker__force__close.json rename to model/attributes/messaging/messaging__bullmq__worker__force_close.json index 849329678..5ce54e6eb 100644 --- a/model/attributes/messaging/messaging__bullmq__worker__force__close.json +++ b/model/attributes/messaging/messaging__bullmq__worker__force_close.json @@ -1,5 +1,5 @@ { - "key": "messaging.bullmq.worker.force.close", + "key": "messaging.bullmq.worker.force_close", "brief": "Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish.", "type": "boolean", "apply_scrubbing": { @@ -15,7 +15,7 @@ { "version": "next", "prs": [690], - "description": "Added messaging.bullmq.worker.force.close attribute" + "description": "Added messaging.bullmq.worker.force_close attribute" } ] } diff --git a/model/attributes/messaging/messaging__bullmq__worker__jobs__to__extend__locks.json b/model/attributes/messaging/messaging__bullmq__worker__jobs_to_extend_locks.json similarity index 76% rename from model/attributes/messaging/messaging__bullmq__worker__jobs__to__extend__locks.json rename to model/attributes/messaging/messaging__bullmq__worker__jobs_to_extend_locks.json index bcf9c35ab..1aef53c99 100644 --- a/model/attributes/messaging/messaging__bullmq__worker__jobs__to__extend__locks.json +++ b/model/attributes/messaging/messaging__bullmq__worker__jobs_to_extend_locks.json @@ -1,5 +1,5 @@ { - "key": "messaging.bullmq.worker.jobs.to.extend.locks", + "key": "messaging.bullmq.worker.jobs_to_extend_locks", "brief": "The IDs of the BullMQ jobs whose locks the Worker extends.", "type": "string[]", "apply_scrubbing": { @@ -15,7 +15,7 @@ { "version": "next", "prs": [690], - "description": "Added messaging.bullmq.worker.jobs.to.extend.locks attribute" + "description": "Added messaging.bullmq.worker.jobs_to_extend_locks attribute" } ] } diff --git a/model/attributes/messaging/messaging__bullmq__worker__rate__limit.json b/model/attributes/messaging/messaging__bullmq__worker__rate_limit.json similarity index 81% rename from model/attributes/messaging/messaging__bullmq__worker__rate__limit.json rename to model/attributes/messaging/messaging__bullmq__worker__rate_limit.json index 09bf20e58..998c3a77a 100644 --- a/model/attributes/messaging/messaging__bullmq__worker__rate__limit.json +++ b/model/attributes/messaging/messaging__bullmq__worker__rate_limit.json @@ -1,5 +1,5 @@ { - "key": "messaging.bullmq.worker.rate.limit", + "key": "messaging.bullmq.worker.rate_limit", "brief": "The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker.", "type": "integer", "apply_scrubbing": { @@ -15,7 +15,7 @@ { "version": "next", "prs": [690], - "description": "Added messaging.bullmq.worker.rate.limit attribute" + "description": "Added messaging.bullmq.worker.rate_limit attribute" } ] } diff --git a/model/attributes/messaging/messaging__bullmq__worker__stalled__jobs.json b/model/attributes/messaging/messaging__bullmq__worker__stalled_jobs.json similarity index 81% rename from model/attributes/messaging/messaging__bullmq__worker__stalled__jobs.json rename to model/attributes/messaging/messaging__bullmq__worker__stalled_jobs.json index bfcf17d33..2d0ea5fcc 100644 --- a/model/attributes/messaging/messaging__bullmq__worker__stalled__jobs.json +++ b/model/attributes/messaging/messaging__bullmq__worker__stalled_jobs.json @@ -1,5 +1,5 @@ { - "key": "messaging.bullmq.worker.stalled.jobs", + "key": "messaging.bullmq.worker.stalled_jobs", "brief": "The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state.", "type": "string[]", "apply_scrubbing": { @@ -15,7 +15,7 @@ { "version": "next", "prs": [690], - "description": "Added messaging.bullmq.worker.stalled.jobs attribute" + "description": "Added messaging.bullmq.worker.stalled_jobs attribute" } ] } diff --git a/python/src/sentry_conventions/attributes.py b/python/src/sentry_conventions/attributes.py index 22e2bf207..a82368d9b 100644 --- a/python/src/sentry_conventions/attributes.py +++ b/python/src/sentry_conventions/attributes.py @@ -7500,10 +7500,10 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: "generate-report" """ - # Path: model/attributes/messaging/messaging__bullmq__job__processed__timestamp.json + # Path: model/attributes/messaging/messaging__bullmq__job__processed_timestamp.json MESSAGING_BULLMQ_JOB_PROCESSED_TIMESTAMP: Literal[ - "messaging.bullmq.job.processed.timestamp" - ] = "messaging.bullmq.job.processed.timestamp" + "messaging.bullmq.job.processed_timestamp" + ] = "messaging.bullmq.job.processed_timestamp" """The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job. Type: int @@ -7594,10 +7594,10 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: true """ - # Path: model/attributes/messaging/messaging__bullmq__queue__event__max__length.json + # Path: model/attributes/messaging/messaging__bullmq__queue__event__max_length.json MESSAGING_BULLMQ_QUEUE_EVENT_MAX_LENGTH: Literal[ - "messaging.bullmq.queue.event.max.length" - ] = "messaging.bullmq.queue.event.max.length" + "messaging.bullmq.queue.event.max_length" + ] = "messaging.bullmq.queue.event.max_length" """The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream. Type: int @@ -7635,9 +7635,9 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: "completed" """ - # Path: model/attributes/messaging/messaging__bullmq__queue__rate__limit.json - MESSAGING_BULLMQ_QUEUE_RATE_LIMIT: Literal["messaging.bullmq.queue.rate.limit"] = ( - "messaging.bullmq.queue.rate.limit" + # Path: model/attributes/messaging/messaging__bullmq__queue__rate_limit.json + MESSAGING_BULLMQ_QUEUE_RATE_LIMIT: Literal["messaging.bullmq.queue.rate_limit"] = ( + "messaging.bullmq.queue.rate_limit" ) """The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue. @@ -7648,10 +7648,10 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: 5000 """ - # Path: model/attributes/messaging/messaging__bullmq__worker__do__not__wait__active.json + # Path: model/attributes/messaging/messaging__bullmq__worker__do_not_wait_active.json MESSAGING_BULLMQ_WORKER_DO_NOT_WAIT_ACTIVE: Literal[ - "messaging.bullmq.worker.do.not.wait.active" - ] = "messaging.bullmq.worker.do.not.wait.active" + "messaging.bullmq.worker.do_not_wait_active" + ] = "messaging.bullmq.worker.do_not_wait_active" """Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish. Type: bool @@ -7661,10 +7661,10 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: false """ - # Path: model/attributes/messaging/messaging__bullmq__worker__force__close.json + # Path: model/attributes/messaging/messaging__bullmq__worker__force_close.json MESSAGING_BULLMQ_WORKER_FORCE_CLOSE: Literal[ - "messaging.bullmq.worker.force.close" - ] = "messaging.bullmq.worker.force.close" + "messaging.bullmq.worker.force_close" + ] = "messaging.bullmq.worker.force_close" """Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish. Type: bool @@ -7674,10 +7674,10 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: false """ - # Path: model/attributes/messaging/messaging__bullmq__worker__jobs__to__extend__locks.json + # Path: model/attributes/messaging/messaging__bullmq__worker__jobs_to_extend_locks.json MESSAGING_BULLMQ_WORKER_JOBS_TO_EXTEND_LOCKS: Literal[ - "messaging.bullmq.worker.jobs.to.extend.locks" - ] = "messaging.bullmq.worker.jobs.to.extend.locks" + "messaging.bullmq.worker.jobs_to_extend_locks" + ] = "messaging.bullmq.worker.jobs_to_extend_locks" """The IDs of the BullMQ jobs whose locks the Worker extends. Type: List[str] @@ -7700,10 +7700,10 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: "email-worker" """ - # Path: model/attributes/messaging/messaging__bullmq__worker__rate__limit.json + # Path: model/attributes/messaging/messaging__bullmq__worker__rate_limit.json MESSAGING_BULLMQ_WORKER_RATE_LIMIT: Literal[ - "messaging.bullmq.worker.rate.limit" - ] = "messaging.bullmq.worker.rate.limit" + "messaging.bullmq.worker.rate_limit" + ] = "messaging.bullmq.worker.rate_limit" """The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker. Type: int @@ -7713,10 +7713,10 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): Example: 5000 """ - # Path: model/attributes/messaging/messaging__bullmq__worker__stalled__jobs.json + # Path: model/attributes/messaging/messaging__bullmq__worker__stalled_jobs.json MESSAGING_BULLMQ_WORKER_STALLED_JOBS: Literal[ - "messaging.bullmq.worker.stalled.jobs" - ] = "messaging.bullmq.worker.stalled.jobs" + "messaging.bullmq.worker.stalled_jobs" + ] = "messaging.bullmq.worker.stalled_jobs" """The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state. Type: List[str] @@ -22661,10 +22661,10 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "Also set on the BullMQ job metrics.", ], ), - "messaging.bullmq.job.processed.timestamp": AttributeMetadata( + "messaging.bullmq.job.processed_timestamp": AttributeMetadata( brief="The time in milliseconds since the Unix epoch when the Worker started to process the BullMQ job.", type=AttributeType.INTEGER, - keys=("messaging.bullmq.job.processed.timestamp",), + keys=("messaging.bullmq.job.processed_timestamp",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, @@ -22674,7 +22674,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ChangelogEntry( version="next", prs=[690], - description="Added messaging.bullmq.job.processed.timestamp attribute", + description="Added messaging.bullmq.job.processed_timestamp attribute", ), ], additional_context=[ @@ -22802,10 +22802,10 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "The Sentry SDK sets this attribute from the `bullmq.queue.drain.delay` attribute of BullMQ's telemetry interface." ], ), - "messaging.bullmq.queue.event.max.length": AttributeMetadata( + "messaging.bullmq.queue.event.max_length": AttributeMetadata( brief="The maximum number of events that Queue.trimEvents() keeps in the BullMQ event stream.", type=AttributeType.INTEGER, - keys=("messaging.bullmq.queue.event.max.length",), + keys=("messaging.bullmq.queue.event.max_length",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, @@ -22815,7 +22815,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ChangelogEntry( version="next", prs=[690], - description="Added messaging.bullmq.queue.event.max.length attribute", + description="Added messaging.bullmq.queue.event.max_length attribute", ), ], additional_context=[ @@ -22863,10 +22863,10 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "Set on the BullMQ queue job count metric.", ], ), - "messaging.bullmq.queue.rate.limit": AttributeMetadata( + "messaging.bullmq.queue.rate_limit": AttributeMetadata( brief="The time in milliseconds for which Queue.rateLimit() rate-limits the BullMQ queue.", type=AttributeType.INTEGER, - keys=("messaging.bullmq.queue.rate.limit",), + keys=("messaging.bullmq.queue.rate_limit",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, @@ -22876,17 +22876,17 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ChangelogEntry( version="next", prs=[690], - description="Added messaging.bullmq.queue.rate.limit attribute", + description="Added messaging.bullmq.queue.rate_limit attribute", ), ], additional_context=[ "The Sentry SDK sets this attribute from the `bullmq.queue.rate.limit` attribute of BullMQ's telemetry interface." ], ), - "messaging.bullmq.worker.do.not.wait.active": AttributeMetadata( + "messaging.bullmq.worker.do_not_wait_active": AttributeMetadata( brief="Whether Worker.pause() returns without waiting for the active BullMQ jobs to finish.", type=AttributeType.BOOLEAN, - keys=("messaging.bullmq.worker.do.not.wait.active",), + keys=("messaging.bullmq.worker.do_not_wait_active",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, @@ -22896,17 +22896,17 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ChangelogEntry( version="next", prs=[690], - description="Added messaging.bullmq.worker.do.not.wait.active attribute", + description="Added messaging.bullmq.worker.do_not_wait_active attribute", ), ], additional_context=[ "The Sentry SDK sets this attribute from the `bullmq.worker.do.not.wait.active` attribute of BullMQ's telemetry interface." ], ), - "messaging.bullmq.worker.force.close": AttributeMetadata( + "messaging.bullmq.worker.force_close": AttributeMetadata( brief="Whether Worker.close() closes the Worker without waiting for the active BullMQ jobs to finish.", type=AttributeType.BOOLEAN, - keys=("messaging.bullmq.worker.force.close",), + keys=("messaging.bullmq.worker.force_close",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, @@ -22916,17 +22916,17 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ChangelogEntry( version="next", prs=[690], - description="Added messaging.bullmq.worker.force.close attribute", + description="Added messaging.bullmq.worker.force_close attribute", ), ], additional_context=[ "The Sentry SDK sets this attribute from the `bullmq.worker.force.close` attribute of BullMQ's telemetry interface." ], ), - "messaging.bullmq.worker.jobs.to.extend.locks": AttributeMetadata( + "messaging.bullmq.worker.jobs_to_extend_locks": AttributeMetadata( brief="The IDs of the BullMQ jobs whose locks the Worker extends.", type=AttributeType.STRING_ARRAY, - keys=("messaging.bullmq.worker.jobs.to.extend.locks",), + keys=("messaging.bullmq.worker.jobs_to_extend_locks",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, @@ -22936,7 +22936,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ChangelogEntry( version="next", prs=[690], - description="Added messaging.bullmq.worker.jobs.to.extend.locks attribute", + description="Added messaging.bullmq.worker.jobs_to_extend_locks attribute", ), ], additional_context=[ @@ -22963,10 +22963,10 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "The Sentry SDK sets this attribute from the `bullmq.worker.name` attribute of BullMQ's telemetry interface." ], ), - "messaging.bullmq.worker.rate.limit": AttributeMetadata( + "messaging.bullmq.worker.rate_limit": AttributeMetadata( brief="The time in milliseconds for which Worker.rateLimit() rate-limits the BullMQ Worker.", type=AttributeType.INTEGER, - keys=("messaging.bullmq.worker.rate.limit",), + keys=("messaging.bullmq.worker.rate_limit",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, @@ -22976,17 +22976,17 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ChangelogEntry( version="next", prs=[690], - description="Added messaging.bullmq.worker.rate.limit attribute", + description="Added messaging.bullmq.worker.rate_limit attribute", ), ], additional_context=[ "The Sentry SDK sets this attribute from the `bullmq.worker.rate.limit` attribute of BullMQ's telemetry interface." ], ), - "messaging.bullmq.worker.stalled.jobs": AttributeMetadata( + "messaging.bullmq.worker.stalled_jobs": AttributeMetadata( brief="The IDs of the stalled BullMQ jobs that the Worker moved back to the wait state.", type=AttributeType.STRING_ARRAY, - keys=("messaging.bullmq.worker.stalled.jobs",), + keys=("messaging.bullmq.worker.stalled_jobs",), apply_scrubbing=ApplyScrubbingInfo(key=ApplyScrubbing.MANUAL), is_in_otel=False, visibility=Visibility.PUBLIC, @@ -22996,7 +22996,7 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): ChangelogEntry( version="next", prs=[690], - description="Added messaging.bullmq.worker.stalled.jobs attribute", + description="Added messaging.bullmq.worker.stalled_jobs attribute", ), ], additional_context=[ @@ -29784,23 +29784,23 @@ class ATTRIBUTE_NAMES(metaclass=_AttributeNamesMeta): "messaging.bullmq.job.ids": List[str], "messaging.bullmq.job.key": str, "messaging.bullmq.job.name": str, - "messaging.bullmq.job.processed.timestamp": int, + "messaging.bullmq.job.processed_timestamp": int, "messaging.bullmq.job.scheduler.id": str, "messaging.bullmq.job.state": str, "messaging.bullmq.job.type": str, "messaging.bullmq.queue.clean.count": int, "messaging.bullmq.queue.clean.limit": int, "messaging.bullmq.queue.drain.delay": bool, - "messaging.bullmq.queue.event.max.length": int, + "messaging.bullmq.queue.event.max_length": int, "messaging.bullmq.queue.grace": int, "messaging.bullmq.queue.jobs.state": str, - "messaging.bullmq.queue.rate.limit": int, - "messaging.bullmq.worker.do.not.wait.active": bool, - "messaging.bullmq.worker.force.close": bool, - "messaging.bullmq.worker.jobs.to.extend.locks": List[str], + "messaging.bullmq.queue.rate_limit": int, + "messaging.bullmq.worker.do_not_wait_active": bool, + "messaging.bullmq.worker.force_close": bool, + "messaging.bullmq.worker.jobs_to_extend_locks": List[str], "messaging.bullmq.worker.name": str, - "messaging.bullmq.worker.rate.limit": int, - "messaging.bullmq.worker.stalled.jobs": List[str], + "messaging.bullmq.worker.rate_limit": int, + "messaging.bullmq.worker.stalled_jobs": List[str], "messaging.client.id": str, "messaging.conversation_id": str, "messaging.destination": str, From 6014b7140b7e1584143bb299afc1439c40381db0 Mon Sep 17 00:00:00 2001 From: JPeer264 Date: Wed, 21 Oct 2026 09:17:20 +0200 Subject: [PATCH 10/11] fixup! feat: Add BullMQ attributes and metrics --- .../messaging__bullmq__job__duration.json | 9 --------- .../messaging/messaging__process__duration.json | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 9 deletions(-) delete mode 100644 model/metrics/messaging/messaging__bullmq__job__duration.json create mode 100644 model/metrics/messaging/messaging__process__duration.json diff --git a/model/metrics/messaging/messaging__bullmq__job__duration.json b/model/metrics/messaging/messaging__bullmq__job__duration.json deleted file mode 100644 index c5aa2dfd1..000000000 --- a/model/metrics/messaging/messaging__bullmq__job__duration.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "key": "messaging.bullmq.job.duration", - "brief": "The time in milliseconds from when a Worker started to process a BullMQ job until the job left the active state.", - "instrument": "distribution", - "unit": "millisecond", - "is_in_otel": false, - "requirement_level": "opt_in", - "attributes": ["messaging.destination.name", "messaging.bullmq.job.name", "messaging.bullmq.job.state"] -} diff --git a/model/metrics/messaging/messaging__process__duration.json b/model/metrics/messaging/messaging__process__duration.json new file mode 100644 index 000000000..04fdf11b5 --- /dev/null +++ b/model/metrics/messaging/messaging__process__duration.json @@ -0,0 +1,15 @@ +{ + "key": "messaging.process.duration", + "brief": "The duration of the operation that processes a message.", + "instrument": "distribution", + "unit": "second", + "is_in_otel": true, + "requirement_level": "opt_in", + "attributes": [ + "messaging.system", + "messaging.operation.name", + "messaging.destination.name", + "messaging.bullmq.job.name", + "messaging.bullmq.job.state" + ] +} From bae9d7c338ba1f4c0f20072f37ac58820c0b6d8b Mon Sep 17 00:00:00 2001 From: JPeer264 Date: Wed, 21 Oct 2026 15:35:53 +0200 Subject: [PATCH 11/11] fixup! feat: Add BullMQ attributes and metrics --- model/metrics/messaging/messaging__bullmq__jobs__completed.json | 2 +- model/metrics/messaging/messaging__bullmq__jobs__delayed.json | 2 +- model/metrics/messaging/messaging__bullmq__jobs__failed.json | 2 +- model/metrics/messaging/messaging__bullmq__jobs__retried.json | 2 +- model/metrics/messaging/messaging__bullmq__jobs__waiting.json | 2 +- .../messaging/messaging__bullmq__jobs__waiting_children.json | 2 +- model/metrics/messaging/messaging__bullmq__queue__jobs.json | 2 +- model/metrics/messaging/messaging__process__duration.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/model/metrics/messaging/messaging__bullmq__jobs__completed.json b/model/metrics/messaging/messaging__bullmq__jobs__completed.json index de1e3a0ad..496854a57 100644 --- a/model/metrics/messaging/messaging__bullmq__jobs__completed.json +++ b/model/metrics/messaging/messaging__bullmq__jobs__completed.json @@ -4,6 +4,6 @@ "instrument": "counter", "unit": "none", "is_in_otel": false, - "requirement_level": "opt_in", + "requirement_level": "recommended", "attributes": ["messaging.destination.name", "messaging.bullmq.job.name", "messaging.bullmq.job.state"] } diff --git a/model/metrics/messaging/messaging__bullmq__jobs__delayed.json b/model/metrics/messaging/messaging__bullmq__jobs__delayed.json index 51e1daec0..1ad9d3ed6 100644 --- a/model/metrics/messaging/messaging__bullmq__jobs__delayed.json +++ b/model/metrics/messaging/messaging__bullmq__jobs__delayed.json @@ -4,6 +4,6 @@ "instrument": "counter", "unit": "none", "is_in_otel": false, - "requirement_level": "opt_in", + "requirement_level": "recommended", "attributes": ["messaging.destination.name", "messaging.bullmq.job.name", "messaging.bullmq.job.state"] } diff --git a/model/metrics/messaging/messaging__bullmq__jobs__failed.json b/model/metrics/messaging/messaging__bullmq__jobs__failed.json index 6a5ef4f93..ae95d9a60 100644 --- a/model/metrics/messaging/messaging__bullmq__jobs__failed.json +++ b/model/metrics/messaging/messaging__bullmq__jobs__failed.json @@ -4,6 +4,6 @@ "instrument": "counter", "unit": "none", "is_in_otel": false, - "requirement_level": "opt_in", + "requirement_level": "recommended", "attributes": ["messaging.destination.name", "messaging.bullmq.job.name", "messaging.bullmq.job.state"] } diff --git a/model/metrics/messaging/messaging__bullmq__jobs__retried.json b/model/metrics/messaging/messaging__bullmq__jobs__retried.json index 6a51effd0..1d6ff43a9 100644 --- a/model/metrics/messaging/messaging__bullmq__jobs__retried.json +++ b/model/metrics/messaging/messaging__bullmq__jobs__retried.json @@ -4,6 +4,6 @@ "instrument": "counter", "unit": "none", "is_in_otel": false, - "requirement_level": "opt_in", + "requirement_level": "recommended", "attributes": ["messaging.destination.name", "messaging.bullmq.job.name", "messaging.bullmq.job.state"] } diff --git a/model/metrics/messaging/messaging__bullmq__jobs__waiting.json b/model/metrics/messaging/messaging__bullmq__jobs__waiting.json index 60681b661..e463fae36 100644 --- a/model/metrics/messaging/messaging__bullmq__jobs__waiting.json +++ b/model/metrics/messaging/messaging__bullmq__jobs__waiting.json @@ -4,6 +4,6 @@ "instrument": "counter", "unit": "none", "is_in_otel": false, - "requirement_level": "opt_in", + "requirement_level": "recommended", "attributes": ["messaging.destination.name", "messaging.bullmq.job.name", "messaging.bullmq.job.state"] } diff --git a/model/metrics/messaging/messaging__bullmq__jobs__waiting_children.json b/model/metrics/messaging/messaging__bullmq__jobs__waiting_children.json index 096d2f951..eed197eae 100644 --- a/model/metrics/messaging/messaging__bullmq__jobs__waiting_children.json +++ b/model/metrics/messaging/messaging__bullmq__jobs__waiting_children.json @@ -4,6 +4,6 @@ "instrument": "counter", "unit": "none", "is_in_otel": false, - "requirement_level": "opt_in", + "requirement_level": "recommended", "attributes": ["messaging.destination.name", "messaging.bullmq.job.name", "messaging.bullmq.job.state"] } diff --git a/model/metrics/messaging/messaging__bullmq__queue__jobs.json b/model/metrics/messaging/messaging__bullmq__queue__jobs.json index 5ef5862d2..16e22e3fa 100644 --- a/model/metrics/messaging/messaging__bullmq__queue__jobs.json +++ b/model/metrics/messaging/messaging__bullmq__queue__jobs.json @@ -4,6 +4,6 @@ "instrument": "gauge", "unit": "none", "is_in_otel": false, - "requirement_level": "opt_in", + "requirement_level": "recommended", "attributes": ["messaging.destination.name", "messaging.bullmq.queue.jobs.state"] } diff --git a/model/metrics/messaging/messaging__process__duration.json b/model/metrics/messaging/messaging__process__duration.json index 04fdf11b5..475fe39d9 100644 --- a/model/metrics/messaging/messaging__process__duration.json +++ b/model/metrics/messaging/messaging__process__duration.json @@ -4,7 +4,7 @@ "instrument": "distribution", "unit": "second", "is_in_otel": true, - "requirement_level": "opt_in", + "requirement_level": "recommended", "attributes": [ "messaging.system", "messaging.operation.name",