Skip to main content
Retained telemetry is the session record available for post-session review and live-gap reconciliation. It contains completed span frames and point-in-time log frames, addressed by session_id. The retained path is best-effort. Treat it as the available record, not an exactly-once audit ledger or a promise that every live frame was stored.

Retrieve a session trace

  1. Open Sessions.
  2. Select an active or completed session.
  3. Click Observability.
  4. Use Timeline for operations and Console for output and errors.
The Dashboard reconciles live telemetry with retained history when a session completes. It currently loads at most the first 1,000 retained frames. Use the CLI, an SDK, or paginated REST when you need every available page from a large trace.
Use /frames for current integrations. The retired /events route and its older event shapes are not a compatibility interface.

Paginate the complete available result

Read total, limit, and offset from every response. After processing a page, add the number of returned frames to your offset. Stop when the new offset reaches total or when a page returns no frames. Do not stop only because a page contains fewer items than the requested limit. The CLI and high-level Python and Go helpers handle pagination for you. Frames are ordered by ascending timeline time: start_time_unix_nano for a span and time_unix_nano for a log. Do not rely on a particular order between span and log frames with exactly equal timestamps. There is no server-side frame-kind or telemetry-type filter. Retrieve pages, then filter by kind, span_type, or log_type in your application.

Interpret the response

The response contains these seven top-level properties: The published schema also permits frames to be null even though the current runtime returns arrays. If your generated client exposes that possibility, normalize null to an empty collection before iteration and use retention_expired to interpret the result.

Distinguish empty and expired results

retention_expired is an access decision. It does not prove that every physical copy was deleted at that instant. See Data controls for retention and deletion boundaries.

Interpret cost maps

Cost maps belong to the response, not to individual immutable frames. Join an SDK-call cost through its span_id. Join an inference cost through the axilio.inference.id attribute on the inference span. 1,000,000 microdollars (µ$) equals $1.00. Cost joins are point-in-time and best-effort. A missing key, an empty or null map, and a present numeric zero have different possible causes. Do not interpret zero alone as proof that an operation was free or that billing is final. Use Usage and your finalized billing records for organization-wide reconciliation.

Recover after a live gap

When a raw reader receives RESYNC_REQUIRED, or an SDK reports a gap:
  1. Retrieve every available /frames page for the session.
  2. Rebuild or reconcile your local trace by frame identity and timeline time.
  3. If the session is still active, reconnect to live telemetry using a current opaque cursor.
  4. Continue to tolerate replayed frames after reconnect.
A live reconnect does not fill missing retained history automatically. The available retained record is the recovery source.

Next steps

Frame reference

Interpret frame fields, types, relationships, and attributes.

Live telemetry

Follow an active session and resume from an opaque cursor.

Telemetry dashboard

Diagnose timing, output, failures, and cost annotations.

Reliability and troubleshooting

Diagnose empty, interrupted, incompatible, or expired telemetry.