No traces or logs: finding the cause
By symptom: no data at all, 401/403, 413, 429, a root span without children, logs not linked to traces, working in dev but empty in production.
On this page
Work through the symptom you see. Most problems show up in one of three places: your app's own output (exporter errors), the project's Connection tab, and Project settings → Traces, logs and metrics received, which lists what was dropped and why.
Nothing shows up#
Filters. Traces open on the last hour and Logs on the last 15 minutes, for the environment you last chose. Widen the time range and pick All environments.
Service name. Check
OTEL_SERVICE_NAME— a missing one shows asunknown_service(followed by the process name in some SDKs).The exporter never ran. For Node.js ES modules, the loader hook is missing (Node.js); for Python, the app was not started through
opentelemetry-instrument; for Go,setupOTelwas not called before the server started.The process exits first. Scripts and short jobs must flush before exiting — see each recipe's shutdown note.
Sampling.
OTEL_TRACES_SAMPLER_ARG=0.01keeps one trace in a hundred; set it to1while testing.Node health. If your node is offline, traces and logs wait at the edge for up to 15 minutes and appear when it reconnects; after that they are dropped as Expired in the buffer. Fleet shows the node's state.
Then press Check the OTLP connection on the Connection tab: if that passes but your app's data does not arrive, the problem is in the app's setup, not the path.
The exporter logs an HTTP error#
| Code | Usual cause | Fix |
|---|---|---|
401 | Key missing, mistyped or revoked; or Bearer and the key not separated by %20 in OTEL_EXPORTER_OTLP_HEADERS | Copy the block from Settings → Ingest keys again |
403 | Key from another project, key without the Traces, Logs or Metrics box ticked, or the request came from a browser | Use a server-side key for this project with the right signals |
404 | Wrong path | Endpoint must end in /otlp/<project-id>; exporters add /v1/traces, /v1/logs and /v1/metrics themselves |
413 | One batch is larger than 4 MiB | Lower the batch size (OTEL_BSP_MAX_EXPORT_BATCH_SIZE, OTEL_BLRP_MAX_EXPORT_BATCH_SIZE) |
415 | Unsupported format | Use http/protobuf or http/json; gRPC needs a Collector in front |
429 | Monthly quota used up, or sending too fast | See the card: quota resets monthly, rate limits clear within seconds; exporters retry on their own |
503 | Edge briefly unable to take data, or your node offline for long | Exporters retry after Retry-After; check Fleet |
All codes and limits: OTLP reference.
200, but some records are missing#
A 200 means the edge stored the request durably; your node checks each record afterwards. Records it cannot keep are counted in Traces, logs and metrics received → Dropped in 30 days, by reason:
| Reason | Meaning |
|---|---|
| Malformed | The record broke the OTLP format |
| Timestamp out of range | More than 7 days old or in the future — check the sender's clock |
| Outside the key's scope | The key does not allow this signal or this environment |
| Attributes dropped / Values truncated | Too many attributes, or values over the limits; the rest of the record was kept |
| Expired in the buffer | Waited at the edge longer than 15 minutes while the node was offline |
| Deleted early (node disk full) | The signal outgrew its disk share; old days were deleted before retention |
| Unsupported metric type | OTLP Summary points, which are not stored — export a histogram instead |
| Over the series limit | New metric series or names above the node's caps — see Metrics limits |
A root span without its children#
Instrumentation loaded after the libraries it patches. In Node.js the register flag must be on the command line (or NODE_OPTIONS), not imported in the middle of your code; with ES modules the loader hook is needed too. In Python, start through opentelemetry-instrument and install the instrumentation package for the library. Some libraries have no instrumentation at all — their work shows as time inside the parent span.
Logs arrive but are not linked to traces#
The log call ran outside the request's context. In Go, use the …Context methods with the request's context. In Node.js, use a bridged logger (Pino, Bunyan, Winston with its transport) rather than console.log. A logger that only writes trace ids into the message text does not link them — the ids must be fields of the log record, which the bridges do.
Works in development, empty in production#
Production often runs a different start command (the flag or opentelemetry-instrument is missing), a different environment name, or a different key. Compare Evidence per signal on the Connection tab for both environments — it shows the service, SDK and last time seen for each.
Spotted something wrong or missing? Tell us: hello@belvador.dev