Integrations / OTLP over HTTP

OpenTelemetry Collector

Keep your trace pipeline. Add a decision export.

Define the Recourse exporter, then add otlphttp/recourse to the exporters list in your existing traces pipeline. This is a configuration addition; ordinary spans do not become decision records automatically.

Add one exporter reference
exporters: [otlphttp/recourse] # append alongside your existing exporters

Pin the decision mapping

Pin your tenant to mapping 0.1. Only spans with adr.decision set to the boolean true are selected. Strings such as "true" do not select a span. The span needs a valid nonzero trace ID, span ID and startTimeUnixNano.

Trace and span IDs survive the mapping. If adr.subject_id is absent, the subject is a trace-scoped handle. Arbitrary source labels become opaque public codes; only the selected span and scoped context are retained as encrypted raw material. Other spans are dropped and counted.

Inspect mapping v0.1 and the synthetic export ↗

Configure the Collector

Use RECOURSE_OTLP_BASE_ENDPOINT as a base URL without /v1/traces; the exporter appends that path. Point a separately configured local Collector at the Worker port for its own tenant setup. The launcher defaults to RECOURSE_WORKER_PORT=18787. Both are Worker ports, not review ports. Its tenant and API key must come from the Collector process environment. The browser launcher’s in-memory credentials are not exported to your shell.

collector.yaml
# Review-only local example. No live export was run.
# Supply credentials in the Collector process environment; never paste them here.
# RECOURSE_OTLP_BASE_ENDPOINT=http://127.0.0.1:18787 is plaintext local development.
# Remote endpoints must use https:// with certificate verification enabled.
# The endpoint is a BASE URL, without /v1/traces; otlphttp appends that path.
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 127.0.0.1:4317
      http:
        endpoint: 127.0.0.1:4318
processors:
  batch:
    send_batch_size: 100
    send_batch_max_size: 100
exporters:
  otlphttp/recourse:
    endpoint: ${env:RECOURSE_OTLP_BASE_ENDPOINT}
    headers:
      Authorization: "Bearer ${env:RECOURSE_API_KEY}"
      X-Tenant-ID: ${env:RECOURSE_TENANT_ID}
    encoding: proto
    compression: none
    tls:
      insecure_skip_verify: false
    retry_on_failure:
      enabled: true
    sending_queue:
      enabled: true
service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlphttp/recourse] # Add this exporter reference to an existing traces pipeline.

Download Collector configuration

Replay safely and measure the drop

Do not set a static Idempotency-Key header on the Collector exporter. The Recourse backend derives export replay identity for the tenant and mapping version. Exact retries preserve the original record identities without recounting dropped spans.

The mapping endpoint reports accepted_records, dropped_spans, exports and deduplicated_exports. Review these counters before widening a pipeline. A successful export does not contain a receipt for each selected span. Sealing follows the normal minute boundary. Available today: a record is retrievable by the trace ID that produced it. GET /v1/adr accepts trace_id and span_id, and every response states the population it searched, its Searchable-through watermark and a count. Fetching the receipt itself still takes the ADR identifier that lookup returns.

This configuration is a review-only example. No Collector or live export was executed. Remote endpoints require HTTPS and certificate verification. The preview uses synthetic inputs and development timestamp trust. The source documents are available; the ADR schema remains provisional pending a separate field-conformance audit.

API references checked 5 September 2026: OTLP specification · Collector configuration. Documentation examples only; no provider call or live Collector export was executed.

Received: request acknowledged. Acknowledged is not durable. Durable: committed to the configured persistence layer. Sealed: included in a signed root with a receipt. The API wire values remain accepted, durable and sealed. Searchable-through is a separate index coverage watermark: not available in this preview.

Development signer means integrity under a published dev key and no independently trusted time.