Where to send
Host:https://intake.focale.io in production. Do not add an /otlp/ prefix.
There is no gRPC. Unknown versions such as
/v2/... return 404.
Auth
FOCALE_DSN=https://<key>@host into endpoint + Bearer. Also honor OTEL_EXPORTER_OTLP_* if already set. Missing or invalid keys return 401.
Body
Send OTLP/HTTP JSON (Content-Type: application/json) or protobuf (application/x-protobuf, application/protobuf, or application/vnd.google.protobuf). Anything else returns 415.
GET /healthz does not require a key. It only tells you the intake is up.
When to use each signal
Enable exporters for all three at boot, then instrument confirmed handlers with judgment:
Do not dump verbose success logs per request. Redact secrets and PII.
Focale attributes
Set on spans, metrics, and error logs:focale.flow_key= confirmed flow keyfocale.signal={flowKey}.started|.succeeded|.failedwhen relevant- Boot:
focale.boot=trueonly
service.name, span status OK/ERROR, record exceptions, HTTP semantic conventions when auto-instrumentation exists.
Suggested metric names: focale.flow.started, focale.flow.succeeded, focale.flow.failed, focale.flow.duration (unit ms), with attribute focale.flow_key.