Docs

Data collected

Every field Zevruna stores, what turns it off, and what it defaults to. Two things collect anything at all, and they are independent: the cloud monitor, which needs no code from you, and the optional telemetry you send — from one of the SDKs (@zevruna/observe, zevruna for Python, zevruna-go) or straight from an OpenTelemetry exporter.

The short version

The monitor reads schemas that servers publish to every client, it never invokes a tool and never sits in your execution path. An SDK does sit in your execution path, by design, and reports execution metadata: what ran, in what order, how long it took, and whether it failed. One field can carry your data, and it is off until you turn it on. Sending OpenTelemetry instead moves that judgement to you — we store the spans you export, and nothing is withheld on your behalf.

The monitor

No SDK involved. This is the whole product for most customers.
FieldWhat it isYour controlDefault
Advertised contractThe tools, prompts and resources a server publishes to every client that connects, stored as a canonical, content-hashed snapshot.Stop monitoring the server.on
Endpoint and scheduleThe URL you registered and how often it is polled.Stop monitoring the server.on
Auth headerOnly if you supply one for a private server. Sealed with AES-256-GCM, decrypted solely to poll that server, never returned by the API.Omit it; public servers need none.off

The SDK

Optional. Nothing below is collected unless you install an SDK or export OpenTelemetry to us.
FieldWhat it isYour controlDefault
Run boundaryAgent name, environment, start and end time, duration, status, and the outcome string you pass to markSuccess or markFailure.Do not install the SDK. The monitor works without it.on
Step metadataStep name, kind, parent, attempt number, start and end time, duration, and whether it succeeded.Wrap fewer boundaries.on
Step attributesWhatever you pass yourself. instrumentMcpClient (instrument_mcp_client, InstrumentMCP) adds only the server and tool name.redact in init() runs on every value before it is sent.on
Run attributesWhatever you pass to observeAgent, observe_agent or StartTrace.Also covered by redact.on
Error class and messageThe constructor name and message of an error thrown inside a wrapped boundary. Messages your own code writes are sent as written.redact receives them under the key error_message.on
MCP error textThe text an MCP server returns alongside isError. The server writes it, and it can quote the arguments it rejected, so this is the one field here that can carry your data. With it off, the step records that the tool returned isError and nothing more.captureErrorText: true in init(), or ZEVRUNA_CAPTURE_ERROR_TEXT=1.off

One difference worth knowing if you send OpenTelemetry. The SDKs refuse to transmit error text a remote server wrote unless you opt in, because that text can quote the arguments it rejected. An exporter has no such gate: a span carries exactly what you put on it, and we store what arrives. The key-name redaction on write still applies either way.

Never collected

Two layers of scrubbing

The redact hook runs inside your process, before anything is sent, so a value it removes never leaves your infrastructure. Independently, every write is scrubbed on ingest: attribute keys that look like credentials, password, token, secret, authorization and similar, are stored as [redacted], and oversized values are truncated. That second layer protects you even on a pinned SDK with no hook configured.

It is a key-name denylist, not content inspection. We do not guess at whether a value looks sensitive: a scrubber that guessed would either mangle real diagnostics or hand you false confidence.

Retention

Run telemetry is deleted on your plan’s retention window, three days on Free, thirty on Pro, ninety on Scale, by a sweep that runs daily. Contract snapshots and incidents are kept until you delete the project: a ninety-day stability strip means nothing if the history behind it was swept.

Privacy policyBack to docsAsk a question