Skip to content

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.

Markdown
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#

  1. 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.

  2. Service name. Check OTEL_SERVICE_NAME — a missing one shows as unknown_service (followed by the process name in some SDKs).

  3. 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, setupOTel was not called before the server started.

  4. The process exits first. Scripts and short jobs must flush before exiting — see each recipe's shutdown note.

  5. Sampling. OTEL_TRACES_SAMPLER_ARG=0.01 keeps one trace in a hundred; set it to 1 while testing.

  6. 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#

CodeUsual causeFix
401Key missing, mistyped or revoked; or Bearer and the key not separated by %20 in OTEL_EXPORTER_OTLP_HEADERSCopy the block from Settings → Ingest keys again
403Key from another project, key without the Traces, Logs or Metrics box ticked, or the request came from a browserUse a server-side key for this project with the right signals
404Wrong pathEndpoint must end in /otlp/<project-id>; exporters add /v1/traces, /v1/logs and /v1/metrics themselves
413One batch is larger than 4 MiBLower the batch size (OTEL_BSP_MAX_EXPORT_BATCH_SIZE, OTEL_BLRP_MAX_EXPORT_BATCH_SIZE)
415Unsupported formatUse http/protobuf or http/json; gRPC needs a Collector in front
429Monthly quota used up, or sending too fastSee the card: quota resets monthly, rate limits clear within seconds; exporters retry on their own
503Edge briefly unable to take data, or your node offline for longExporters 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:

ReasonMeaning
MalformedThe record broke the OTLP format
Timestamp out of rangeMore than 7 days old or in the future — check the sender's clock
Outside the key's scopeThe key does not allow this signal or this environment
Attributes dropped / Values truncatedToo many attributes, or values over the limits; the rest of the record was kept
Expired in the bufferWaited 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 typeOTLP Summary points, which are not stored — export a histogram instead
Over the series limitNew 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