Continuous forward sink
Self-hosted deployments can continuously forward telemetry to an object store you control — for audit retention, SIEM ingestion, or a data warehouse — without querying. When enabled, every batch of events the gateway flushes to its own cold storage is also written to your bucket as newline-delimited JSON (JSONL): one event per line.-
Off by default, opt-in. Set the forward URL to enable it (see the
Helm reference
export.*values); leave it empty to disable. -
What lands. One JSONL object per flushed batch, laid out by organization and date so you can retrieve a
window without a full scan:
Each line is one event carrying its
event_id,org_id,project_id,run_id,root_run_id,lineage_path, and trace/span IDs — so you can correlate runs, sandboxes, and lineage on your side outside hiloop. -
Redaction. The sink applies no transformation and runs no redaction of its own. Events forwarded
here carry exactly whatever scrubbing happened upstream, which for runs captured by
hiloop runis the narrow capture-side pattern set, and for telemetry sent straight to the ingest endpoints is none at all. See redaction before pointing this at a destination with its own handling requirements. - Delivery is best-effort. Forwarding runs off the flush path and never blocks ingest: if your bucket is briefly unreachable or slow, that batch is dropped (and logged) rather than retried, and ingest continues uninterrupted. Treat the sink as a near-real-time archive, not a guaranteed, gap-free ledger.
- Tamper-evidence. Point the sink at a bucket with Object Lock (WORM) enabled to keep an append-only, immutable audit trail; grant the sink least-privilege, write-only credentials.
The sink writes to any S3-compatible object store (AWS S3 or MinIO). Credentials for the sink bucket
are configured separately from the events store, so the audit sink can use its own write-only
credentials. See the Helm reference
export.* values.OTLP collector forward
Self-hosted deployments can also push the same continuous stream to an OTLP collector — for SIEM and observability pipelines that speak OTLP (Splunk, Chronosphere, Grafana, or any OpenTelemetry Collector). When enabled, every batch of events the gateway flushes to its own cold storage is also exported over OTLP/gRPC as log records.- Off by default, opt-in. Set the collector endpoint to enable it (see the
Helm reference
otlpExport.*values); leave it empty to disable. It is independent of the object-store sink — enable either or both. - What lands. One
LogsService.Exportcall per flushed batch. Each event becomes one log record whose timestamp is the event’s causal wall clock and whoseevent_nameis the event name; the record body carries the event’s attributes as JSON, and the record attributes carry the correlation identity you join on:hiloop.event.id,hiloop.signal,hiloop.project.id, and — when the event belongs to a run —hiloop.run.idandhiloop.lineage.path. Events captured with trace context export their trace and span IDs natively, so trace-aware backends correlate without custom joins. The batch’s resource carriesservice.nameandhiloop.org.id. - Authentication. Optional collector headers (for example
authorization=Bearer <token>) are supplied from a secret and attached to every export call; they are never logged. - Redaction. The exporter applies no transformation and runs no redaction of its own. Exported
events carry exactly whatever scrubbing happened upstream, which for runs captured by
hiloop runis the narrow capture-side pattern set, and for telemetry sent straight to the ingest endpoints is none at all. See redaction before pointing this at a destination with its own handling requirements. - Delivery is best-effort. Exporting runs off the flush path and never blocks ingest: if the collector is unreachable, slow, or rejects records, that batch is dropped (and logged) rather than retried, and ingest continues uninterrupted. If you need buffering or retries, front the endpoint with an OpenTelemetry Collector you operate — the standard deployment shape for OTLP pipelines.
Query API export
For small exports, run aSELECT and save the rows. The CLI builds the SQL from scoping flags and
--output json writes the raw {"rows": […]} body:
--sql, or POST /v1/telemetry/sql with a
{"sql": "<SELECT …>"} body.
For aggregate output, group in the SELECT — here over the otel_genai_calls
data view, which derives one row per LLM exchange from the raw
captured payloads:
Reproducibility bundle
A useful manual export bundle includes:manifest.json should record:
Governance
Before export:- confirm the destination is approved;
- apply your redaction policy;
- prefer digests and metadata when full payloads are not needed;
- record who requested the export;
- set retention on the exported object;
- encrypt exported files at rest and in transit.