OTLP ingestion
Perseval embeds a loopback-only OTLP/HTTP trace receiver. It accepts POST /v1/traces and exposes no UI, query, MCP, health, or administration routes on that listener.
Supported transport
Section titled “Supported transport”| Capability | Support |
|---|---|
| OTLP/HTTP JSON | Yes, application/json |
| OTLP/HTTP protobuf | Yes, application/x-protobuf |
| Gzip request body | Yes |
| Official named JSON enums | Yes |
| Numeric JSON enums | Yes |
| OTLP/gRPC | Not yet |
| Remote/non-loopback binding | Rejected |
The default endpoint is http://127.0.0.1:4318/v1/traces, but the effective endpoint shown in Sources is authoritative.
Durable acknowledgement
Section titled “Durable acknowledgement”An accepted request is acknowledged only after Perseval has:
- stored the exact compressed wire payload as a content-addressed blob;
- stored the normalized span batch as another versioned blob; and
- committed the journal row that references both.
DuckDB projection, analysis, and UI updates occur after acknowledgement. This keeps ingest latency independent from trace rendering while preserving admitted data across restart.
Responses and retries
Section titled “Responses and retries”200means the admitted part of the request was durably journaled.200with OTLPpartial_success.rejected_spansmeans some individual spans were permanently rejected; inspect and repair the producer data.400means malformed permanent input; retry only after changing it.413means a wire, decoded-size, span-count, or attribute-count limit was exceeded; split the batch.415means the content type is unsupported.429means the bounded admission queue is full. HonorRetry-After, back off, and retry the same batch.503means the writer is unavailable or shutting down. Retry with backoff.
Perseval never silently drops an admitted span. Identical redelivery is a no-op by canonical content hash. Changed content for the same live span identity creates a new version.
Default bounds
Section titled “Default bounds”- 16 MiB maximum wire body;
- 64 MiB maximum decoded body;
- 100,000 spans per request;
- 1,024 attributes per span;
- 64 queued batches and 256 MiB queued bytes;
Retry-After: 1on overload.
These are request and queue limits, not a recommendation to send 100,000 spans in one batch. Prefer smaller retryable batches.
File import
Section titled “File import”Sources → Import trace file accepts bounded OTLP JSON or protobuf while the network receiver is disabled or enabled. Import uses the same decoder, journal, projection, deduplication, project routing, and committed-delta path as the live receiver.
Data preserved
Section titled “Data preserved”Normalization retains resource and instrumentation scope, trace state, flags, status, dropped counts, nanosecond timestamps, typed attributes, events, and SpanLinks. Known prompts, messages, inputs, outputs, reasoning, source code, and tool payloads are externalized to blobs rather than displayed automatically.
Continue with the agent telemetry contract for deterministic failure analysis.