Skip to content

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 200 with an empty ExportLogsServiceResponse

The stream comes from the API key (no stream id in the path).

How LogRecords become events

Each LogRecord becomes one JSON event:

  • If Body is 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