Any language with an OpenTelemetry SDK can send server telemetry — point its OTLP/HTTP exporter at the ingester and add the key as a header.
Structured logs require a logs exporter and logger bridge in addition to
tracing. Node/Next.js operation APIs require a release containing them;
check installed and deployed support.
Ordinary logs remain diagnostics; exception and failed-outcome traces produce
issues. Keep your existing logging and provider ownership.
React / SPA / static sites
Static / serverless: same-origin relay (no backend needed)
Direct browser ingest (https://otlp.autter.dev/v1/browser with autter_rtc_…) is cross-origin and ad-blockers silently drop it. You avoid that loss on static sites by deploying the same-origin relay and keeping the tracker on /api/autter-runtime.
- Cloudflare: deploy
examples/runtime-relay(wrangler deploy), then route/api/autter-runtime*to it. - Vercel: copy
examples/runtime-relay/vercel-edge-route.tstoapp/api/autter-runtime/route.ts. - Init (all relay modes):
POST-only, 64KB cap, Origin forwarded, Cookie stripped, 202 on accept. Set the AUTTER_RUNTIME_KEY secret to forward with your server key.
Without a relay (lossy fallback for pure-static only, publishable client key, origin-restricted):
<AutterErrorBoundary> (from @autter/runtime-next/client, works in any React app). Vue/Svelte/Angular: call captureException(err) from the framework’s error hook (app.config.errorHandler, handleError, ErrorHandler).
Node.js (Express, Fastify, Koa, NestJS)
GET /route returned 500, no stack).
Express is the exception from @autter/runtime-node 1.10.0: the SDK records
the error behind every 5xx itself, in every router, including routers with
their own error handler. autterErrorHandler() then only adds coded errors
that end in a 4xx, and an error is never reported twice. Set
captureExpressErrors: false in initAutterServer to turn the automatic
capture off.
Relay for your frontend:
withRuntimeOperation for steps and explicit business outcomes. Await flushing
before short-lived work ends, and inspect stored logs plus linked issue evidence.
Next.js
instrumentation.ts, a relay route, and a client init + boundary. See the package README.
Server initialization, relay and operation logging use
@autter/runtime-next/server; browser components use
@autter/runtime-next/client. Logging operations require Node, not edge.
See the Next.js logging example.
OTLP logs in other backends
Python, Go, Rust, Java, .NET and other backends can use their installed OTel logs SDK or a Collector logs pipeline with/v1/logs. Endpoint variables
alone do not install a logger bridge. Include service/environment/release,
active trace/span IDs and scrubbed context, and configure exporter buffering
and lifecycle flushing. Node’s limits and helper APIs do not apply to these
stacks. See OTLP logger setup and the operation attribute contract.
Go
Rust
Python, Java, .NET, or anything else
Standard OpenTelemetry environment variables work with every SDK:exception events (every SDK’s record_exception / RecordError does this) or ERROR status. The ingester parses each language’s native stack format (Go, Rust, Java, .NET, Python, JavaScript), so errors group by function and file, not by message alone — the same defect stays one issue and unrelated errors that share a message stay apart.
Warnings (any language): add an autter.severity attribute to the exception event — "fatal" | "error" | "warning" | "info" (default error; the Node SDK’s crash marker autter.unhandled: true implies fatal). Warnings share the errors table with a severity column, so they group and aggregate identically:
Sampling guidance (all stacks)
Errors are always worth sending; keep successful-trace sampling at ~1% (OTEL_TRACES_SAMPLER_ARG=0.01). Request/usage metrics are derived server-side from spans and the http.server.duration histogram — no extra setup.
No @autter/* package for your language?
Send telemetry with just an OpenTelemetry SDK, a Collector, or a hand-rolled HTTP request.

