Observability configuration
Configure export bindings, sampling, credentials, and capture permissions in Orca Agent Engine.
A binding selects an external observability target and an immutable configuration version. An organization can define a default; a Workspace can inherit it, select its own custom binding, or disable export. Sessions pin that selection when they are created.
Admin endpoint
These operations use the registry admin listener, not the public Workspace API. Set
ORCA_ADMIN_URL to its origin without a path suffix. Organization operations use
ORCA_ORG_ADMIN_KEY; platform policy operations use a separate ORCA_PLATFORM_KEY. Both examples
send x-api-key. Never use a Workspace key or an exporter workload token here. See
observability administration for OIDC and scopes.
Binding configuration fields
The organization PUT body contains target, config, capture_ceiling, and conditional write-only
credentials. A Workspace custom PUT also requires mode: custom. These are full replacements,
not merge patches. The table distinguishes accepted fields from the current exporter recipe.
| Field | Type | Required | Description |
|---|---|---|---|
target.adapter_type | string | Yes | Use otlp_http. |
target.endpoint_kind | string | Yes | Use traces_endpoint, not base_endpoint. |
target.endpoint_class | string | Yes | Use public. |
target.endpoint_url | string | Yes | Public HTTPS URL with exact path /api/public/otel/v1/traces; no userinfo, query, or fragment. |
target.external_project_id | string | For langfuse | Non-null project identity. Credentials determine the receiving project; this field does not route individual events to arbitrary projects. |
config.semantic_profile | string | Yes | Use langfuse, including for Litefuse. |
config.protocol | string | Yes | Use http/json. |
config.compression | string | Yes | Use none. |
config.timeout_ms | integer | Yes | HTTP request timeout, from 1 to 120000 ms. |
config.sample_rate | number | Yes | From 0 to 1, at most four decimal places in mutation requests; whole-trace sampling. |
config.capture_mode | string | Yes | metadata_only or explicitly authorized raw_io; redacted_io is reserved. |
config.environment, config.release | string or null | No | Deployment labels. The API accepts bounded labels up to 256 characters; export attribution additionally requires its 128-character structural label format. Use short labels such as test and release-1. |
capture_ceiling | string | Yes | Organization or Workspace maximum: metadata_only, reserved redacted_io, or raw_io. |
credentials | object | Conditional | Required for a new binding or changed target; forbidden on a same-active-target policy replacement. |
For current delivery, use {type: "basic", username: <public key>, password: <secret key>}.
The API also accepts bearer/custom-header bundles, but the current exporter delivers only Basic
credentials. Store target keys through this API, not in agent metadata, Helm values, or exporter
environment variables. Reads expose configured/version/hint/rotation metadata, never credential bytes
or SecretStore references.
Select a binding
| Workspace mode | Replacement body | Behavior |
|---|---|---|
inherit | mode, capture_ceiling | Select the organization default, if available. |
custom | mode, target, config, capture_ceiling, conditional credentials | Select a Workspace-owned binding. No fallback to the organization default on failure. |
disabled | mode, capture_ceiling | Disable export for this Workspace, including its existing sessions. |
inherit and disabled reject target, config, and credential fields. State responses separate
configured settings from effective source, status, capture mode, disabled reason, and selected
binding. An enabled effective state is a control-plane decision, not an endpoint connectivity test
or a guarantee that the exporter supports the configuration.
Target replacement creates a new binding and drains the previous one. Same-active-target policy replacement creates a new config version without rotating credentials. Existing session pins keep their target/config selection, subject to live revocation and capture restrictions. Create a new session to use a new target, sample rate, environment/release, or expanded capture permission.
Capture modes and privacy
The effective capture capability is the minimum of the requested or pinned mode and all applicable
platform, organization, and Workspace ceilings. The order is metadata_only < redacted_io <
raw_io. The migration-seeded platform maximum is metadata_only; a binding request alone cannot
authorize content export.
| Mode | Content behavior |
|---|---|
metadata_only | No user input, assistant output, tool names/arguments/results, or raw error text. |
raw_io | Kafka state backend only: selected primary user text, non-partial assistant text messages, tool names/arguments/results, and reported error diagnostics. |
redacted_io | Reserved and unsupported by the exporter; not an alias for raw capture. |
Raw capture does not redact secrets, detect PII, filter sensitive fields, or replace token-like
text. Selected tool content can retain fields named password, api_key, or headers.
Authorize this disclosure before enabling it; start with synthetic data and an isolated project.
Each serialized I/O value is limited to 8192 bytes. Pending input and active-turn I/O each have a
262144-byte budget. Oversized values are omitted whole; output accumulation can be truncated.
The langfuse.observation.metadata.orca.io.* attributes identify unsupported, unavailable, partial,
too-large, or budget-limited content. Standalone thinking/signature blocks, partial deltas, system
instructions, and non-text message blocks are not included as root text. This structural selection
does not filter similarly named fields inside tool arguments.
Raw content can persist in Kafka checkpoints/chunks, delivery records, and the local scratch index. Internal delivery retention is unlimited. Restricting capture stops subsequent disallowed delivery; it is not physical deletion of stored content or a deletion request to Litefuse.
Enable raw capture explicitly
Use the Litefuse metadata-only walkthrough first. The steps below
assume its dedicated Workspace now has an active custom binding. Apply Registry migration 0060
through the normal migration runner before requesting raw_io; the exporter must use Kafka state.
- Obtain explicit authorization for unredacted content and its retention. Prefer an isolated Registry/database, organization, Workspace, and Litefuse project.
- A platform administrator reads and replaces the platform policy, preserving its allowlists and
setting
max_capture_mode: raw_io. Raising this ceiling affects eligible new sessions across the deployment, not just the Workspace in this example. - An organization administrator sets the organization's
capture_ceiling: raw_iousing the ceiling-only endpoint. This does not require or create an organization default binding. - Replace the existing Workspace custom config with
config.capture_mode: raw_ioandcapture_ceiling: raw_io. Preserve target/config fields and omit credentials for the same target. - Read the effective state, then create a new session and send synthetic input. An old session does not gain raw permission by changing current configuration.
For the platform step, export ORCA_ADMIN_URL and ORCA_PLATFORM_KEY as described in the
admin API reference. This example preserves the current
allowlists rather than replacing them with a guessed default:
headers=$(mktemp)
policy=$(curl -fsS -D "$headers" "$ORCA_ADMIN_URL/v1/platform/agent_observability" \
-H "x-api-key: $ORCA_PLATFORM_KEY")
ETAG=$(awk 'tolower($1) == "etag:" { sub(/\r$/, "", $2); print $2 }' "$headers")
rm -f "$headers"
IDEMPOTENCY_KEY=$(uuidgen)
jq '{allowed_adapters, allowed_endpoint_classes, max_capture_mode: "raw_io"}' <<< "$policy" |
curl -fsS -X PUT "$ORCA_ADMIN_URL/v1/platform/agent_observability" \
-H "x-api-key: $ORCA_PLATFORM_KEY" \
-H "Content-Type: application/json" \
-H "If-Match: $ETAG" \
-H "Idempotency-Key: $IDEMPOTENCY_KEY" --data-binary @-Use organization credentials, a fresh organization GET ETag, and a new idempotency key for
PUT /v1/organizations/agent_observability/capture_ceiling with this body:
{ "capture_ceiling": "raw_io" }For the Workspace step, read its current state and ETag. Build the full replacement from
configured.binding.target and the mutable config fields in the table above. Do not send response-only
version, config_schema_version, credential metadata, or lifecycle fields back to PUT. See
replacement and concurrency.
Lowering any capture ceiling advances its restriction epoch. Older affected pins remain metadata-only even if that ceiling is later raised. Pending raw projection is scrubbed on restriction; queued content that no longer has authorization is terminally suppressed, not rewritten and resent. Do not reset epochs, rewind offsets, or recreate internal topics to restore content capture.
Rotate credentials or stop export
- Use the organization or Workspace
:rotate_credentialsoperation with onlycredentialsin the body. It advances the active binding's credential head without changing target/config or session pins. Delivery resolves current credentials before sending. - Use Workspace
mode: disabledto stop that Workspace. - Organization
:disablestops the organization default, not Workspace custom bindings. It accepts an empty body and optionalIf-Matchfor emergency use.
Neither disabling export nor credential rotation deletes already ingested traces.
Permissions
| Operation | Authority |
|---|---|
| Read organization/Workspace settings | observability:read or org:admin |
| Replace binding settings; disable organization default | observability:write or org:admin |
| Rotate target credentials | observability:rotate or org:admin |
| Replace organization capture ceiling only | org:admin |
| Read/replace platform policy | Independent platform:admin identity |
Scoped organization roles are available through admin API keys; organization OIDC requires
org:admin. These are not public Workspace API permissions.