OpenTelemetry ingest
You will learn how to send OTLP Logs over HTTP to Cordo.
Cordo accepts OpenTelemetry Protocol Logs only — traces and metrics endpoints are not implemented.
Endpoint
Collectors set endpoint to https://<host>/v1/otlp (the exporter appends
/v1/logs).
POST /v1/otlp/v1/logs
Content-Type: application/x-protobuf
X-API-Key: lax_<prefix>_<secret>
Also accepted:
Content-Type: application/json(OTLP JSON)Authorization: Bearer lax_…- Optional
Content-Encoding: gzip - Max body 10 MiB; response
200with an emptyExportLogsServiceResponse
The stream comes from the API key (no stream id in the path).
How LogRecords become events
Each LogRecord becomes one JSON event:
- If
Bodyis a map/kvlist → that object is ingested as-is (structured fields are learnable) - Otherwise wrapped as
{ body, attributes, resource, severity, time_unix_nano }
Producer event time is derived at ingest: OTLP TimeUnixNano when set
(including structured/kvlist bodies), otherwise a recognised ISO timestamp
field in the payload. Query and saved views can filter on that clock via
Event time / time_basis=event_time, separately from receipt ingested_at.
OpenTelemetry Collector
exporters:
otlphttp:
endpoint: https://<your-cordo-host>/v1/otlp
headers:
X-API-Key: "lax_<prefix>_<secret>"
compression: gzip
service:
pipelines:
logs:
receivers: [otlp]
exporters: [otlphttp]
curl (protobuf)
Build a binary ExportLogsServiceRequest with your OTLP tooling, then:
curl -sS -X POST "$CORDO_API/v1/otlp/v1/logs" \
-H "Content-Type: application/x-protobuf" \
-H "X-API-Key: $KEY" \
--data-binary @export_logs.bin
Next
- Chooser: Ingest your logs
- Vector / Fluent Bit over OTLP: Ingest with Vector and Fluent Bit