Skip to main content

Observability

View as Markdown

Observability

Every RocketRide run is recorded. This guide is the map: the mental model behind run logs, the two ways to watch a pipeline (live and replayed), and which surface to reach for — each section links to the page that owns the detail.

The mental model: a DVR, not a log file

The engine writes every run into a durable, append-only stream — one continuum per pipeline identity, where each run is a chapter inside it. There are no per-run log files to collect. Watching a run live and replaying it tomorrow are the same data at different positions: live is just a position pinned to "now".

Two identities matter, and they do different jobs:

IdentityWhat it isWhat it's for
Task token (tk_...)The live control handle a run returns when startedSend data, poll status, terminate — dies with the run
projectId + source (+ teamId)The pipeline's durable log identityMonitoring subscriptions and everything recorded — outlives the run, works after it finished

Omitting teamId addresses your own dev stream; passing it addresses that team's deploy continuum. Team membership is the read right. Inside the stream, beginSeq is a run's (and a trace's) permanent id.

The two planes

Live plane — event subscriptions (rrext_monitor on the wire, add_monitor/addMonitor in the SDKs). Push-based, per-connection, and non-durable: if you weren't subscribed, you missed it. Covers lifecycle, status updates (with metrics and billing), component-level flow events, and console output. The full event schema lives on WebSocket Events.

Recorded plane — the run-log continuum (client.log in the SDKs, the log_* MCP tools). Pull-based and durable: chapters, ranged reads, per-object traces, and a DVR session that can seek, replay at any speed, and pin to live. The full API lives on the SDK run-log pages.

They are two views of the same events: a flow event you watch live is the same record you replay from the log later.

Trace levels

pipelineTraceLevel — set when a run starts — decides how much of the run gets recorded (and emitted live as flow events):

LevelRecordsCost
noneLifecycle, status, console only — no tracesNone
metadataComponent enter/leave, object identitiesMinimal
summaryAbove, plus lane writes and final resultsModest — the debugging sweet spot
fullEverything, entire payloads inlined (including images)Can slow runs and swell the log

The default depends on where you start the run — each surface picks what its users typically want, so don't assume:

SurfaceDefaultWhy
Wire / SDK use()noneProduction callers opt in to tracing
MCP server toolssummaryAssistants need replayable content to debug
VS Code extensionfullInteractive debugging wants everything

A run recorded with none still has chapters and console output — but its traces are empty, which is the most common "why can't I replay this?" answer.

Retention

Runs are kept 7 days (dev streams) / 30 days (deploy continuums) on a bounded (~1 GB) ring, evicted earlier under storage pressure. Reads below the horizon fail explicitly (TraceExpired on MCP, truncation markers in the SDKs) rather than returning partial silence.

Which surface, when

You are…Reach forWhere
Writing Python/TypeScriptget_task_status / add_monitor live; client.log chapters, reads, and DVR sessionsPython · TypeScript
In an AI assistant (MCP)monitor and list_running_pipelines live; log_chapters/log_read/log_traces/log_trace for replay — traces render in the trace-viewer widgetMCP tools
In VS CodeThe Status page, Flow and Trace tabs, and the component debuggerVS Code usage
Building your own ingester / dashboardsRaw rrext_monitor subscriptions over the WebSocket protocolWebSocket Events

What RocketRide observability is not: there is no OpenTelemetry, Prometheus, or webhook emitter — the wire protocol is the integration point if you need one.

Two workflows

Watch a live run. Start the pipeline (keep projectId/source from the result), subscribe with add_monitor({project_id, source}) or open the VS Code Status page, and watch status/flow events arrive. Poll-style alternatives: get_task_status(token) in the SDKs, monitor over MCP.

Autopsy yesterday's failed run. No token needed — the run is gone but the log isn't. List the chapters for projectId + source, pick the failed run's beginSeq, list its traces, and pull the failing object's full journey — every component it entered and left, with lane data at each hop. In the SDKs that's chapters(), then a DVR session's get_traces()get_trace(); over MCP it's log_chapterslog_traceslog_trace.

One naming trap

The SDK constructor option on_trace/onTrace has nothing to do with pipeline traces — it's a client-side hook that logs the SDK's own request/response frames for debugging your integration (and in Python it is not credential-redacted). Pipeline tracing is controlled by pipelineTraceLevel alone. See Configuration.