Every OpenTelemetry setup faces the same early decision: should applications export telemetry directly to your observability backend, or route it through an OpenTelemetry Collector? Both are fully supported, and the honest answer is "it depends on your stage" โ but the trade-offs are concrete.
Direct SDK export: the simple path
The SDK in your application batches spans, metrics, and logs and sends them over OTLP straight to the backend. Configuration is two environment variables:
export OTEL_EXPORTER_OTLP_ENDPOINT="https://ingest.aiaxoniq.com" export OTEL_EXPORTER_OTLP_HEADERS="x-license-key=$LICENSE_KEY"
That's the whole pipeline. No extra process to deploy, monitor, or upgrade. The SDK's built-in BatchSpanProcessor handles batching and retry-on-failure well enough for most workloads.
The Collector: an ops layer for telemetry
The OpenTelemetry Collector is a standalone process (sidecar, DaemonSet, or central gateway) that receives telemetry, runs it through a processor pipeline, and exports it wherever you point it. What that buys you:
- Decoupling. Applications export to a local endpoint and forget about backend availability, credentials, and retries โ the Collector owns durability.
- Enrichment. Processors like
k8sattributesstamp pod, namespace, and node metadata onto every span without touching application code. - Control. Sampling, filtering, and redaction happen in one place instead of in every service's config.
- Fan-out. Send traces to one backend and metrics to another, or run two backends in parallel during a migration โ a config change, not a redeploy.
- Credential hygiene. Only the Collector holds the backend license key; applications never see it.
When direct export is enough
- A handful of services, one backend, no per-signal routing needs
- Serverless or edge runtimes where running an agent isn't practical
- Early-stage projects where every extra moving part delays the actual goal: seeing your traces
- Managed platforms where you can't deploy infrastructure anyway
When you want a Collector
- Kubernetes โ the
k8sattributesenrichment alone justifies the DaemonSet - You need tail-based sampling, attribute scrubbing, or PII redaction before data leaves your network
- More than ~a dozen services, where per-app exporter config becomes drift-prone
- Migrations and evaluations โ dual-shipping from a Collector is how you compare backends without touching app code
A practical middle path: start direct, add a gateway
This isn't a one-way door. Because everything speaks OTLP, the migration from direct export to a Collector is a config change: point OTEL_EXPORTER_OTLP_ENDPOINT at the Collector instead of the backend. Most teams we see follow the same arc: direct export on day one, a gateway Collector once Kubernetes metadata and sampling policy start to matter, and the application code never changes.
Bottom line
Direct export optimizes for time-to-first-trace; the Collector optimizes for operational control. Start with whichever removes today's bottleneck โ since aiAxonIQ ingests OTLP either way, switching later costs you an environment variable, not a re-instrumentation.