> ## Documentation Index
> Fetch the complete documentation index at: https://mantle.rasa.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Observability

> The traces available for monitoring Maestro agents.

Rasa emits OpenTelemetry traces for monitoring conversations. This page
catalogs each voice trace span and explains how to interpret its attributes and
events. Availability and privacy labels are summarized in
[How to read attribute tables](#how-to-read-attribute-tables).

## Configure tracing

Create an `endpoints.yml` file in your project and add a `tracing` section:

```yaml theme={null}
tracing:
  type: otlp
  endpoint: <your-otel-collector-endpoint>
  insecure: true
```

Replace the endpoint with your OpenTelemetry collector's gRPC endpoint.

## Voice traces

When voice tracing is enabled, each call produces a trace that follows provider
connections, input handling, engine turns, speech synthesis, and audio playback.
This section catalogs those spans, their attributes, and the events recorded on
each span.

### Typical trace

The tree shows common parent-child relationships, not execution order.

<div style={{ fontFamily: "monospace", whiteSpace: "pre", lineHeight: 1.7 }}>
  <div>📞 <a href="#voice-call-span">voice call</a></div>
  <div>├── 🔌 <a href="#connect-asr-span">connect asr</a></div>
  <div>├── 🔌 <a href="#connect-tts-span">connect tts</a></div>
  <div>├── 📝 <a href="#transcribe-audio-span">transcribe audio</a></div>
  <div>├── ⚡ <a href="#handle-barge-in-span">handle barge-in</a></div>
  <div>├── 🔢 <a href="#handle-dtmf-span">handle dtmf</a></div>
  <div>├── ⏱️ <a href="#handle-silence-span">handle silence</a></div>
  <div>├── 🔄 <a href="#handle-turn-span">handle turn</a></div>
  <div>│   ├── 🗣️ <a href="#synthesize-speech-span">synthesize speech</a></div>
  <div>│   └── 🔊 <a href="#play-audio-span">play audio</a></div>
  <div>├── ⚠️ <a href="#process-channel-message-span">process channel message</a> (failures only)</div>
  <div>├── ⚠️ <a href="#compose-event-span">compose event</a> (failures only)</div>
  <div>├── 🔌 <a href="#disconnect-asr-span">disconnect asr</a></div>
  <div>└── 🔌 <a href="#disconnect-tts-span">disconnect tts</a></div>
</div>

### Content capture

Content capture is off by default. Set the `RASA_VOICE_CAPTURE_CONTENT`
environment variable to `true`, `1`, or `yes` (case-insensitive, surrounding
whitespace ignored) to include supported transcript and generated-text
attributes in traces.

<Info>
  Content capture never includes raw audio, partial transcripts, or DTMF digits.
  Audio is reported only as byte and chunk totals.
</Info>

### Attributes shared by voice spans

The following correlation fields are added to every span created inside an active
voice call. They are not included when the span does not belong to a voice call.

| Attribute               | Type   | Availability        | Data classification               | Description                                                             |
| ----------------------- | ------ | ------------------- | --------------------------------- | ----------------------------------------------------------------------- |
| `rasa.conversation.id`  | string | Inside a voice call | [Identifier](#privacy-identifier) | Conversation ID used to correlate the voice call with its conversation. |
| `voice.channel.call_id` | string | Inside a voice call | [Identifier](#privacy-identifier) | Channel-assigned call ID. It can differ from the conversation ID.       |

Every span that Rasa marks `ERROR` also has:

| Attribute    | Type   | Availability | Data classification                 | Description                                   |
| ------------ | ------ | ------------ | ----------------------------------- | --------------------------------------------- |
| `error.type` | string | On error     | [Operational](#privacy-operational) | Exception class name, such as `RuntimeError`. |

<Info>
  `exception` events can include messages and stack traces.
  `RASA_VOICE_CAPTURE_CONTENT` does not redact them.
</Info>

### `voice call` span

| Detail         | Description                                                                                                          |
| -------------- | -------------------------------------------------------------------------------------------------------------------- |
| Span kind      | `INTERNAL`                                                                                                           |
| Lifetime       | Opens before provider and session setup. Ends after active processing, provider disconnects, and transport teardown. |
| Typical parent | The active OpenTelemetry span, when present. Otherwise `voice call` is the trace root.                               |
| Error behavior | Failures during setup, active processing, or teardown mark it `ERROR`. Cancellation alone does not.                  |

**Attributes**

| Attribute                  | Type    | Availability    | Data classification                 | Description                                                |
| -------------------------- | ------- | --------------- | ----------------------------------- | ---------------------------------------------------------- |
| `rasa.conversation.id`     | string  | Always          | [Identifier](#privacy-identifier)   | Conversation correlation ID.                               |
| `voice.channel.call_id`    | string  | Always          | [Identifier](#privacy-identifier)   | Channel call ID.                                           |
| `voice.channel.name`       | string  | Always          | [Operational](#privacy-operational) | Voice channel name.                                        |
| `voice.asr.provider`       | string  | When configured | [Operational](#privacy-operational) | Configured ASR provider.                                   |
| `voice.tts.provider`       | string  | When configured | [Operational](#privacy-operational) | Configured TTS provider.                                   |
| `voice.locale`             | string  | When known      | [Operational](#privacy-operational) | Call locale at span creation.                              |
| `audio.input.bytes.total`  | integer | At span end     | [Operational](#privacy-operational) | Total incoming audio bytes observed during the call.       |
| `audio.input.chunk.count`  | integer | At span end     | [Operational](#privacy-operational) | Number of incoming audio chunks observed during the call.  |
| `audio.output.bytes.total` | integer | At span end     | [Operational](#privacy-operational) | Total outgoing audio bytes delivered during the call.      |
| `audio.output.chunk.count` | integer | At span end     | [Operational](#privacy-operational) | Number of outgoing audio chunks delivered during the call. |
| `error.type`               | string  | On error        | [Operational](#privacy-operational) | Present only when the call is marked `ERROR`.              |

**Events**

| Event                       | Description                                                         | Attribute               | Type    | Availability | Data classification                 |
| --------------------------- | ------------------------------------------------------------------- | ----------------------- | ------- | ------------ | ----------------------------------- |
| `voice.call_started`        | Call setup completed and the session started.                       | None                    | —       | —            | —                                   |
| `voice.hangup_requested`    | The agent requested a hangup. Goodbye audio can still finish first. | None                    | —       | —            | —                                   |
| `voice.disconnect`          | The channel reported a transport-level disconnect.                  | None                    | —       | —            | —                                   |
| `voice.call_ended`          | Active call processing handed over to teardown.                     | None                    | —       | —            | —                                   |
| `voice.turn_event_enqueued` | A voice input was processed and sent to the agent for handling.     | `voice.turn_event.type` | string  | Always       | [Operational](#privacy-operational) |
|                             |                                                                     | `voice.queue.size`      | integer | Always       | [Operational](#privacy-operational) |

<Info>
  `voice.call_ended` ends active processing, not the `voice call` span.
  Disconnect of ASR and TTS and teardown can follow.
</Info>

### Provider connection spans

The four connection spans are `CLIENT` spans. Each span covers one provider
connection or disconnection attempt. A failed attempt adds `error.type`,
records a standard `exception` event, and marks the span `ERROR`.

#### `connect asr` span

Opens for every ASR connection attempt, including reconnects, and ends when the
attempt succeeds or fails.

| Detail         | Description                                                                                        |
| -------------- | -------------------------------------------------------------------------------------------------- |
| Span kind      | `CLIENT`                                                                                           |
| Lifetime       | One ASR connection attempt, including a reconnect.                                                 |
| Typical parent | `voice call`.                                                                                      |
| Error behavior | A failed attempt records `error.type` and a standard `exception` event and marks the span `ERROR`. |

**Attributes**

| Attribute                 | Type    | Availability    | Data classification                 | Description                                    |
| ------------------------- | ------- | --------------- | ----------------------------------- | ---------------------------------------------- |
| `voice.asr.provider`      | string  | Always          | [Operational](#privacy-operational) | ASR provider name.                             |
| `voice.locale`            | string  | When configured | [Operational](#privacy-operational) | Rasa language key.                             |
| `voice.asr.language`      | string  | When configured | [Operational](#privacy-operational) | Provider language key.                         |
| `voice.asr.model`         | string  | When configured | [Operational](#privacy-operational) | Provider model.                                |
| `voice.connect.reconnect` | boolean | On reconnect    | [Operational](#privacy-operational) | `true` after an earlier successful connection. |
| `error.type`              | string  | On error        | [Operational](#privacy-operational) | Present only on failure.                       |

**Events**

No custom span events. A standard `exception` event is recorded on failure.

#### `disconnect asr` span

Opens for every ASR disconnection attempt and ends when the attempt succeeds or
fails. It never carries `voice.connect.reconnect`.

| Detail         | Description                                                                                        |
| -------------- | -------------------------------------------------------------------------------------------------- |
| Span kind      | `CLIENT`                                                                                           |
| Lifetime       | One ASR disconnection attempt.                                                                     |
| Typical parent | `voice call`.                                                                                      |
| Error behavior | A failed attempt records `error.type` and a standard `exception` event and marks the span `ERROR`. |

**Attributes**

| Attribute            | Type   | Availability    | Data classification                 | Description              |
| -------------------- | ------ | --------------- | ----------------------------------- | ------------------------ |
| `voice.asr.provider` | string | Always          | [Operational](#privacy-operational) | ASR provider name.       |
| `voice.locale`       | string | When configured | [Operational](#privacy-operational) | Rasa language key.       |
| `voice.asr.language` | string | When configured | [Operational](#privacy-operational) | Provider language key.   |
| `voice.asr.model`    | string | When configured | [Operational](#privacy-operational) | Provider model.          |
| `error.type`         | string | On error        | [Operational](#privacy-operational) | Present only on failure. |

**Events**

No custom span events. A standard `exception` event is recorded on failure.

#### `connect tts` span

Opens for every TTS connection attempt, including reconnects, and ends when the
attempt succeeds or fails.

| Detail         | Description                                                                                        |
| -------------- | -------------------------------------------------------------------------------------------------- |
| Span kind      | `CLIENT`                                                                                           |
| Lifetime       | One TTS connection attempt, including a reconnect.                                                 |
| Typical parent | `voice call`.                                                                                      |
| Error behavior | A failed attempt records `error.type` and a standard `exception` event and marks the span `ERROR`. |

**Attributes**

| Attribute                 | Type    | Availability    | Data classification                 | Description                                    |
| ------------------------- | ------- | --------------- | ----------------------------------- | ---------------------------------------------- |
| `voice.tts.provider`      | string  | Always          | [Operational](#privacy-operational) | TTS provider name.                             |
| `voice.locale`            | string  | When configured | [Operational](#privacy-operational) | Rasa language key.                             |
| `voice.tts.language`      | string  | When configured | [Operational](#privacy-operational) | Provider language key.                         |
| `voice.tts.model`         | string  | When configured | [Operational](#privacy-operational) | Provider model.                                |
| `voice.connect.reconnect` | boolean | On reconnect    | [Operational](#privacy-operational) | `true` after an earlier successful connection. |
| `error.type`              | string  | On error        | [Operational](#privacy-operational) | Present only on failure.                       |

**Events**

No custom span events. A standard `exception` event is recorded on failure.

#### `disconnect tts` span

Opens for every TTS disconnection attempt and ends when the attempt succeeds or
fails. It never carries `voice.connect.reconnect`.

| Detail         | Description                                                                                        |
| -------------- | -------------------------------------------------------------------------------------------------- |
| Span kind      | `CLIENT`                                                                                           |
| Lifetime       | One TTS disconnection attempt.                                                                     |
| Typical parent | `voice call`.                                                                                      |
| Error behavior | A failed attempt records `error.type` and a standard `exception` event and marks the span `ERROR`. |

**Attributes**

| Attribute            | Type   | Availability    | Data classification                 | Description              |
| -------------------- | ------ | --------------- | ----------------------------------- | ------------------------ |
| `voice.tts.provider` | string | Always          | [Operational](#privacy-operational) | TTS provider name.       |
| `voice.locale`       | string | When configured | [Operational](#privacy-operational) | Rasa language key.       |
| `voice.tts.language` | string | When configured | [Operational](#privacy-operational) | Provider language key.   |
| `voice.tts.model`    | string | When configured | [Operational](#privacy-operational) | Provider model.          |
| `error.type`         | string | On error        | [Operational](#privacy-operational) | Present only on failure. |

**Events**

No custom span events. A standard `exception` event is recorded on failure.

### `transcribe audio` span

| Detail         | Description                                                                                                                                                                                                      |
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Span kind      | `INTERNAL`                                                                                                                                                                                                       |
| Lifetime       | One user utterance. Opens on the first partial transcript, or on a final transcript when no partial arrived, and normally closes on the final transcript. An empty final with no open utterance creates no span. |
| Typical parent | `voice call`.                                                                                                                                                                                                    |
| Error behavior | An ASR stream error marks it `ERROR`. Stream teardown closes an open span without treating the missing final as an error.                                                                                        |

**Attributes**

| Attribute                  | Type    | Availability                                          | Data classification                 | Description                                                                            |
| -------------------------- | ------- | ----------------------------------------------------- | ----------------------------------- | -------------------------------------------------------------------------------------- |
| `voice.asr.provider`       | string  | Always                                                | [Operational](#privacy-operational) | ASR provider name.                                                                     |
| `voice.locale`             | string  | When configured                                       | [Operational](#privacy-operational) | Rasa language key.                                                                     |
| `voice.asr.language`       | string  | When configured                                       | [Operational](#privacy-operational) | Provider language key.                                                                 |
| `voice.asr.model`          | string  | When configured                                       | [Operational](#privacy-operational) | Provider model.                                                                        |
| `partial_transcript.count` | integer | At span end                                           | [Operational](#privacy-operational) | Total number of partial transcript updates, including updates without a sampled event. |
| `voice.transcript.final`   | string  | On a final transcript when content capture is enabled | [Content](#privacy-content)         | Final transcript.                                                                      |
| `error.type`               | string  | On error                                              | [Operational](#privacy-operational) | Present only on ASR failure.                                                           |

**Events**

| Event                      | Description                                                                                                           | Attribute | Type | Availability | Data classification |
| -------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------- | ---- | ------------ | ------------------- |
| `voice.partial_transcript` | Sampled partial-transcript update. The first partial and then every tenth partial are recorded: 1, 11, 21, and so on. | None      | —    | —            | —                   |
| `voice.final_transcript`   | Final transcript arrived. Its text is never placed on the event.                                                      | None      | —    | —            | —                   |
| `voice.asr_error`          | The ASR stream failed. A standard `exception` event is also recorded.                                                 | None      | —    | —            | —                   |

### Input-decision spans

Input-decision spans show how Rasa handles input received during a call before
passing it to the agent. They cover spoken interruptions, keypad input, and
silence timeouts. They record whether the input was accepted, ignored, or
buffered, as well as any failures.

#### `handle barge-in` span

| Detail         | Description                                                                                                                                                                       |
| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Span kind      | `INTERNAL`                                                                                                                                                                        |
| Lifetime       | One barge-in classification. Opens when interruptions are enabled and caller speech is evaluated as a possible interruption while agent audio is playing or waiting to be played. |
| Typical parent | `voice call`.                                                                                                                                                                     |
| Error behavior | A classification or interruption-processing failure records `voice.barge_in_failed` and a standard `exception` event, then marks the span `ERROR`.                                |

**Attributes**

None beyond the shared correlation and optional failure attributes.

**Events**

| Event                       | Description                                                     | Attribute                   | Type    | Availability                    | Data classification                 |
| --------------------------- | --------------------------------------------------------------- | --------------------------- | ------- | ------------------------------- | ----------------------------------- |
| `voice.barge_in_attempted`  | A gated transcript entered classification.                      | `voice.barge_in.transcript` | string  | When content capture is enabled | [Content](#privacy-content)         |
| `voice.turn_event_enqueued` | The accepted interruption was sent to the agent for processing. | `voice.turn_event.type`     | string  | Always                          | [Operational](#privacy-operational) |
|                             |                                                                 | `voice.queue.size`          | integer | Always                          | [Operational](#privacy-operational) |
| `voice.barge_in_accepted`   | The speech was accepted as a deliberate interruption.           | `voice.barge_in.reason`     | string  | Optional                        | [Operational](#privacy-operational) |
|                             |                                                                 | `voice.barge_in.transcript` | string  | When content capture is enabled | [Content](#privacy-content)         |
| `voice.barge_in_ignored`    | The speech was classified as not being a barge-in.              | `voice.barge_in.reason`     | string  | Optional                        | [Operational](#privacy-operational) |
|                             |                                                                 | `voice.barge_in.transcript` | string  | When content capture is enabled | [Content](#privacy-content)         |
| `voice.barge_in_failed`     | Classification or interruption processing failed.               | None                        | —       | —                               | —                                   |

#### `handle dtmf` span

| Detail         | Description                                                                              |
| -------------- | ---------------------------------------------------------------------------------------- |
| Span kind      | `INTERNAL`                                                                               |
| Lifetime       | One DTMF keypress decision and its resulting action.                                     |
| Typical parent | `voice call`.                                                                            |
| Error behavior | A failure adds `error.type` and a standard `exception` event and marks the span `ERROR`. |

**Attributes**

| Attribute                  | Type    | Availability              | Data classification                 | Description                                                                   |
| -------------------------- | ------- | ------------------------- | ----------------------------------- | ----------------------------------------------------------------------------- |
| `voice.dtmf.buffer_length` | integer | After a digit is buffered | [Operational](#privacy-operational) | Number of buffered digits after this keypress. Digit values are not captured. |
| `error.type`               | string  | On error                  | [Operational](#privacy-operational) | Present only on failure.                                                      |

**Events**

| Event                       | Description                                                    | Attribute               | Type    | Availability | Data classification                 |
| --------------------------- | -------------------------------------------------------------- | ----------------------- | ------- | ------------ | ----------------------------------- |
| `voice.dtmf_started`        | This keypress opened a digit-collection window.                | None                    | —       | —            | —                                   |
| `voice.dtmf_digit`          | One digit was buffered. The value is never attached.           | None                    | —       | —            | —                                   |
| `voice.turn_event_enqueued` | The completed DTMF input was sent to the agent for processing. | `voice.turn_event.type` | string  | Always       | [Operational](#privacy-operational) |
|                             |                                                                | `voice.queue.size`      | integer | Always       | [Operational](#privacy-operational) |
| `voice.dtmf_accepted`       | The buffered input completed the active DTMF collect step.     | None                    | —       | —            | —                                   |
| `voice.dtmf_ignored`        | No active DTMF collect step accepted the keypress.             | None                    | —       | —            | —                                   |

#### `handle silence` span

| Detail         | Description                                                                                                         |
| -------------- | ------------------------------------------------------------------------------------------------------------------- |
| Span kind      | `INTERNAL`                                                                                                          |
| Lifetime       | Starts when the caller has been silent for the configured timeout and ends when Rasa finishes handling the timeout. |
| Typical parent | `voice call`.                                                                                                       |
| Error behavior | A failure adds `error.type` and a standard `exception` event and marks the span `ERROR`.                            |

**Attributes**

None beyond the shared correlation and optional failure attributes.

**Events**

| Event                       | Description                                                                                         | Attribute               | Type    | Availability | Data classification                 |
| --------------------------- | --------------------------------------------------------------------------------------------------- | ----------------------- | ------- | ------------ | ----------------------------------- |
| `voice.silence_detected`    | The armed timer fired.                                                                              | None                    | —       | —            | —                                   |
| `voice.turn_event_enqueued` | The silence timeout was sent to the agent for processing.                                           | `voice.turn_event.type` | string  | Always       | [Operational](#privacy-operational) |
|                             |                                                                                                     | `voice.queue.size`      | integer | Always       | [Operational](#privacy-operational) |
| `voice.silence_accepted`    | Rasa accepted the detected silence as a timeout.                                                    | None                    | —       | —            | —                                   |
| `voice.dtmf_timeout`        | The caller did not complete keypad input before the timeout, so the buffered digits were discarded. | None                    | —       | —            | —                                   |

### `handle turn` span

| Detail         | Description                                                                                 |
| -------------- | ------------------------------------------------------------------------------------------- |
| Span kind      | `INTERNAL`                                                                                  |
| Lifetime       | One Maestro engine turn, including engine processing and output production.                 |
| Typical parent | `voice call`.                                                                               |
| Error behavior | An exception adds `error.type` and a standard `exception` event and marks the span `ERROR`. |

**Attributes**

| Attribute                          | Type    | Availability                                                   | Data classification                 | Description                                                                                                                      |
| ---------------------------------- | ------- | -------------------------------------------------------------- | ----------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `voice.turn.index`                 | integer | Always                                                         | [Operational](#privacy-operational) | One-based turn number within the call, including lifecycle turns.                                                                |
| `voice.latency.rasa_processing_ms` | double  | When processing duration is available                          | [Operational](#privacy-operational) | Engine processing time for the turn.                                                                                             |
| `voice.latency.user_perceived_ms`  | double  | When user input time and an audio or text output are available | [Operational](#privacy-operational) | Time from user input to the first output. Audio output takes precedence; if no audio is produced, the first text output is used. |
| `voice.interrupted`                | boolean | When interrupted                                               | [Operational](#privacy-operational) | Present and `true` when the turn was interrupted.                                                                                |
| `error.type`                       | string  | On error                                                       | [Operational](#privacy-operational) | Present only on failure.                                                                                                         |

**Events**

| Event               | Description                                                   | Attribute                    | Type   | Availability                                  | Data classification                 |
| ------------------- | ------------------------------------------------------------- | ---------------------------- | ------ | --------------------------------------------- | ----------------------------------- |
| `voice.filler_sent` | A filler or acknowledgement message was sent during the turn. | `voice.filler.response_name` | string | Optional                                      | [Operational](#privacy-operational) |
|                     |                                                               | `voice.filler.text`          | string | When available and content capture is enabled | [Content](#privacy-content)         |

### `synthesize speech` span

| Detail         | Description                                                                                                                                                                                           |
| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Span kind      | `INTERNAL`                                                                                                                                                                                            |
| Lifetime       | One agent message, from the start of speech synthesis through generated, cached, or fallback audio completion. Each message gets its own span.                                                        |
| Typical parent | `handle turn`.                                                                                                                                                                                        |
| Error behavior | A TTS failure adds `error.type`, records `voice.tts_error` and a standard `exception` event, and marks the span `ERROR`. The span stays open while fallback silence is produced and closes afterward. |

**Attributes**

| Attribute                         | Type    | Availability                                                | Data classification                 | Description                                                                     |
| --------------------------------- | ------- | ----------------------------------------------------------- | ----------------------------------- | ------------------------------------------------------------------------------- |
| `voice.tts.provider`              | string  | Always                                                      | [Operational](#privacy-operational) | TTS provider name.                                                              |
| `voice.locale`                    | string  | When configured                                             | [Operational](#privacy-operational) | Rasa language key.                                                              |
| `voice.tts.language`              | string  | When configured                                             | [Operational](#privacy-operational) | Provider language key.                                                          |
| `voice.tts.model`                 | string  | When configured                                             | [Operational](#privacy-operational) | Provider model.                                                                 |
| `voice.tts.cache_hit`             | boolean | After cache lookup                                          | [Operational](#privacy-operational) | Whether audio came from the TTS cache.                                          |
| `voice.latency.tts_first_byte_ms` | double  | When first audio is available                               | [Operational](#privacy-operational) | Speech synthesis start to the first generated, cached, or fallback audio chunk. |
| `audio.bytes.total`               | integer | At span end                                                 | [Operational](#privacy-operational) | Total generated, cached, or fallback audio bytes for this message.              |
| `audio.chunk.count`               | integer | At span end                                                 | [Operational](#privacy-operational) | Number of generated, cached, or fallback audio chunks for this message.         |
| `voice.tts.text`                  | string  | For non-streaming messages, when content capture is enabled | [Content](#privacy-content)         | Synthesized text.                                                               |
| `error.type`                      | string  | On error                                                    | [Operational](#privacy-operational) | Present only on failure.                                                        |

<Info>
  Audio totals are added when the span ends and can be zero.
</Info>

**Events**

| Event                             | Description                                                            | Attribute | Type | Availability | Data classification |
| --------------------------------- | ---------------------------------------------------------------------- | --------- | ---- | ------------ | ------------------- |
| `voice.tts_request`               | A synthesis request was sent to the provider. Absent on a cache hit.   | None      | —    | —            | —                   |
| `voice.tts_first_audio_generated` | The first generated, cached, or fallback audio chunk became available. | None      | —    | —            | —                   |
| `voice.tts_complete`              | Generated, cached, or fallback audio processing completed.             | None      | —    | —            | —                   |
| `voice.tts_error`                 | Synthesis failed.                                                      | None      | —    | —            | —                   |

<Info>
  After a TTS failure, fallback audio can still produce completion and audio-total
  signals. The span remains `ERROR`.
</Info>

### `play audio` span

| Detail         | Description                                                                                       |
| -------------- | ------------------------------------------------------------------------------------------------- |
| Span kind      | `INTERNAL`                                                                                        |
| Lifetime       | One agent message's audio delivery.                                                               |
| Typical parent | `handle turn`.                                                                                    |
| Error behavior | A delivery failure adds `error.type` and a standard `exception` event and marks the span `ERROR`. |

**Attributes**

| Attribute           | Type    | Availability     | Data classification                 | Description                                          |
| ------------------- | ------- | ---------------- | ----------------------------------- | ---------------------------------------------------- |
| `voice.interrupted` | boolean | When interrupted | [Operational](#privacy-operational) | Present and `true` when barge-in cut playback short. |
| `audio.bytes.total` | integer | At span end      | [Operational](#privacy-operational) | Bytes delivered before the span ended.               |
| `audio.chunk.count` | integer | At span end      | [Operational](#privacy-operational) | Chunks delivered before the span ended.              |
| `error.type`        | string  | On error         | [Operational](#privacy-operational) | Present only on delivery failure.                    |

**Events**

| Event                        | Description                                                                                   | Attribute | Type | Availability | Data classification |
| ---------------------------- | --------------------------------------------------------------------------------------------- | --------- | ---- | ------------ | ------------------- |
| `voice.playback_start`       | First audio chunk was delivered. Emitted at most once.                                        | None      | —    | —            | —                   |
| `voice.playback_interrupted` | A user barge-in interrupted playback. Emitted at most once.                                   | None      | —    | —            | —                   |
| `voice.playback_cancelled`   | Audio delivery was cancelled during teardown or shutdown.                                     | None      | —    | —            | —                   |
| `voice.playback_finished`    | Audio delivery finished. It can follow an interruption, but is suppressed after cancellation. | None      | —    | —            | —                   |

### Failure-only spans

These spans appear only when an operation fails. They are backdated to the
start of the failed operation and end when the failure is recorded.

#### `process channel message` span

Covers a failed channel-message processing operation. It has only the shared
correlation and failure attributes.

| Detail         | Description                                                                                  |
| -------------- | -------------------------------------------------------------------------------------------- |
| Span kind      | `INTERNAL`                                                                                   |
| Lifetime       | The failed channel operation, backdated to its start and ended when the failure is recorded. |
| Typical parent | `voice call`.                                                                                |
| Error behavior | Always records `error.type` and a standard `exception` event and has `ERROR` status.         |

**Attributes**

| Attribute    | Type   | Availability | Data classification                 | Description           |
| ------------ | ------ | ------------ | ----------------------------------- | --------------------- |
| `error.type` | string | Always       | [Operational](#privacy-operational) | Exception class name. |

**Events**

No custom span events. A standard `exception` event is recorded.

#### `compose event` span

Appears when Rasa fails while interpreting a voice-channel input, such as caller
speech, keypad input, or a silence timeout, and preparing it for the agent.

| Detail         | Description                                                                                                      |
| -------------- | ---------------------------------------------------------------------------------------------------------------- |
| Span kind      | `INTERNAL`                                                                                                       |
| Lifetime       | The failed input-processing attempt, from when Rasa began interpreting the input until the failure was recorded. |
| Typical parent | `voice call`.                                                                                                    |
| Error behavior | Always records `error.type` and a standard `exception` event and has `ERROR` status.                             |

**Attributes**

| Attribute               | Type   | Availability                 | Data classification                 | Description                                      |
| ----------------------- | ------ | ---------------------------- | ----------------------------------- | ------------------------------------------------ |
| `voice.turn_event.type` | string | When event type is available | [Operational](#privacy-operational) | Type of voice input that could not be processed. |
| `error.type`            | string | Always                       | [Operational](#privacy-operational) | Exception class name.                            |

**Events**

No custom span events. A standard `exception` event is recorded.

## How to read attribute tables

The `Availability` column describes when an attribute is eligible or written
relative to an emitted span.

The `Data classification` column uses these privacy labels:

* <a id="privacy-operational" />**Operational** — contains no spoken content
  or direct call identifier.
* <a id="privacy-identifier" />**Identifier** — correlates a call or
  conversation and may be customer data.
* <a id="privacy-content" />**Content** — contains transcript or generated
  text and is emitted only when content capture is enabled.
