04

Telemetry

Errors in, changes out. ChangeBox groups production errors by what actually broke and files one change when a group repeats — reported by the Telemetry agent, through the same gates as everything else.

Not a log drain

No model reads your logs. Grouping is deterministic: service, environment, error type, normalised message and the top frames. A group that crosses the threshold inside the window becomes one change with a Change Spec, a policy decision and a Slack card that updates in place with the count. One defect, one change — never a card per error, never a refile of something you already fixed or declined.

Any language, one request

POST /api/ingest/events     x-changebox-ingest-key: cbi_…
{ "events": [{
    "level": "error",
    "message": "Segmind 422 on seedance",
    "service": "cinema-backend", "env": "production",
    "url": "https://api.cinema.test/v1/shots/sh_1",
    "error": { "type": "ProviderError", "message": "…", "stack": "…" },
    "attributes": { "model": "seedance-2.5", "requestId": "req_1" }
}] }

error and fatal only; anything lower is dropped on arrival. The ingest key can only write signals. Create it on the app's Signals page; it is shown once. From TypeScript, @changebox/sdk ships a batching client that never throws and never blocks.

Already on OpenTelemetry?

OTEL_EXPORTER_OTLP_LOGS_ENDPOINT=https://changebox.ai/api/ingest/otlp/v1/logs
OTEL_EXPORTER_OTLP_LOGS_PROTOCOL=http/json
OTEL_EXPORTER_OTLP_LOGS_HEADERS=x-changebox-ingest-key=cbi_…
OTEL_RESOURCE_ATTRIBUTES=service.name=cinema-backend,deployment.environment=production

Point the OTLP/HTTP JSON logs exporter here and change nothing else. Cloudflare Workers export natively: add a Logs destination with the same URL and header. Traces and metrics are not accepted — ChangeBox is a defect intake, not an APM. Send those to your observability platform; ChangeBox will happily sit beside it.

What gets filed

threshold        3 errors in 15 minutes        → file a change
max per day      5 changes                     → the rest stay cards
environments     production                    → staging noise stays noise
card only        changebox: "card"             → vendor outage: card in Slack, no change

Tune all of it on the app's Signals page. A service can mark an error changebox: "card" to say “tell the team, do not file” — right for a provider being down. A group whose change was confirmed and then recurs reopens that change with the new evidence instead of starting over.