Skip to content

Debugging Collector Pipelines: OTCA practice questions

When telemetry goes missing somewhere between an application and a backend, the useful question is where along the path it stopped. The Collector gives you several tools for answering that question at each hop, and they work best in a fixed order: check the configuration, confirm data is arriving, watch it leave, then look deeper only if needed.

By Ibrahim Yesilay · Published · Updated

Independent community practice, not affiliated with or endorsed by CNCF or The Linux Foundation.

What Debugging Collector Pipelines covers in OTCA

When telemetry goes missing somewhere between an application and a backend, the useful question is where along the path it stopped. The Collector gives you several tools for answering that question at each hop, and they work best in a fixed order: check the configuration, confirm data is arriving, watch it leave, then look deeper only if needed.

Configuration problems come first because they are cheap to rule out. The command otelcol validate with a --config flag checks a file without running pipelines, which makes it a good CI step. The otelcol components sub-command prints every receiver, processor, exporter, connector and extension compiled into the binary you are running, with a stability level per signal, so you can confirm that a vendor or custom build really contains the component you configured. A frequent mistake caught here is a receiver that is defined in the receivers section but never listed in any pipeline, which means it never starts receiving.

To see the data itself, add the debug exporter to a pipeline. With no settings it uses basic verbosity and logs one summary line per batch with record counts. Setting verbosity to normal prints roughly one line per record, and detailed prints every attribute, resource and scope field, including schema URLs. Because it writes through the Collector logger, its output appears wherever the Collector logs go, which is stderr by default.

The Collector's own logs are configured under service::telemetry::logs. The level field defaults to INFO and also accepts DEBUG, WARN and ERROR; encoding can be console or json. Raising the log level is different from raising debug exporter verbosity: one describes what Collector components are doing, the other prints the telemetry passing through.

Internal metrics tell you how far data got. Comparing counters such as otelcol_receiver_accepted_spans, otelcol_processor_incoming_items and otelcol_exporter_sent_spans hop by hop shows whether loss happens at ingestion, inside processing or at export. Refused counts at the receiver, enqueue failures at the exporter and send failures each point to a different stage. The verbosity of these metrics is set with service::telemetry::metrics::level, where normal is the default and none, basic and detailed are the alternatives.

Extensions cover live inspection. The health_check extension answers on localhost:13133 at path / and suits Kubernetes liveness and readiness probes. The zPages extension adds pages such as servicez, pipelinez, extensionz, featurez and tracez for in-process diagnostics without a backend. The pprof extension exposes Go profiling for performance investigations, which most users rarely need.

For multi-hop pipelines, the troubleshooting checklist asks the same things at every hop: are there errors in the logs, how is data ingested, how is it modified, how is it exported, what format is it in, how is the next hop configured, and is any network policy in the way.

Key points

  • otelcol validate --config=<file> checks a configuration without running pipelines.
  • otelcol components lists the components in the running distribution with their stability levels.
  • The debug exporter defaults to basic verbosity; normal and detailed print progressively more of each record.
  • Collector log level is set with service::telemetry::logs::level and defaults to INFO.
  • The health_check extension listens on localhost:13133 at path / and can back Kubernetes probes.

Three sample questions

8 OTCA questions on Debugging Collector Pipelines, 8 with explanations. How practice works

Question 1

You add this exporter to a traces pipeline to check whether data arrives:
exporters:
  debug:
What does the Collector print for each batch it receives?
  1. A.Every span with all attributes and events, because detailed is the default verbosity
  2. B.Nothing, because the debug exporter only writes output when sampling_thereafter is above 1
  3. C.A one-line summary with record counts, because the default verbosity is basic
  4. D.About one line per span with its name and IDs, because normal is the default verbosity

Correct answer: C

The debug exporter README lists verbosity as optional with default "basic". With basic verbosity the exporter outputs a single-line summary of received data with a total count of records for every batch (for example "resource spans": 1, "spans": 2). To see every attribute, the troubleshooting docs set verbosity: detailed. Why the other options are wrong. "Every span with all attributes and events, because…": detailed must be set explicitly; the default is basic. "Nothing, because the debug exporter only writes ou…": sampling_thereafter defaults to 1, which means sampling is disabled; output is written without changing it. "About one line per span with its name and IDs, bec…": that is the normal level, which has to be configured; basic is the default.

Sources: Collector README: debug exporter, OpenTelemetry docs: Collector troubleshooting

Question 2

Users report that some requests hang. You suspect spans that are started but never ended inside the Collector's own receivers and exporters, and you want a live, in-process view grouped by latency bucket without any backend. Which endpoint fits, assuming default settings?
  1. A.The zPages extension at http://localhost:55679/debug/tracez
  2. B.The health_check extension at http://localhost:13133/debug/tracez
  3. C.The pprof extension at http://localhost:1777/debug/pprof
  4. D.The internal metrics endpoint at http://localhost:8888/metrics

Correct answer: A

The Collector troubleshooting docs say the zPages extension is exposed locally on port 55679, and its TraceZ page at /debug/tracez helps with latency issues, deadlocks and instrumentation problems (running spans that do not end) and errors. The zPages README describes TraceZ as bucketizing spans by latency and lists the default endpoint localhost:55679. Why the other options are wrong. "The health_check extension at http://localhost:131…": health_check (default localhost:13133, path "/") only reports whether the Collector is healthy; it has no TraceZ page. "The pprof extension at http://localhost:1777/debug…": pprof (default localhost:1777) serves Go performance profiles of the Collector process, not live spans by latency bucket. "The internal metrics endpoint at http://localhost:…": port 8888 serves the Collector's Prometheus metrics (counters and gauges), not individual spans.

Sources: OpenTelemetry docs: Collector troubleshooting, Collector README: zPages extension

Question 3

A Kubernetes liveness probe should check the Collector process. The configuration contains:
extensions:
  health_check:
service:
  extensions: [health_check]
Which port and path should the probe use, given default settings? (Remember the endpoint must also be reachable from the kubelet.)
  1. A.Port 8888, path /metrics
  2. B.Port 55679, path /debug/servicez
  3. C.Port 1777, path /debug/health
  4. D.Port 13133, path /

Correct answer: D

The Health Check extension README gives the defaults endpoint localhost:13133 and path "/", and says the HTTP URL can be used as a liveness and/or readiness probe on Kubernetes. The README states the default endpoint as localhost:13133. Because that address binds to localhost, the endpoint usually has to be changed (for example to the pod IP) for an external probe to reach it, as the security best-practices link in the README notes. Why the other options are wrong. "Port 8888, path /metrics": that is the Prometheus endpoint for the Collector's internal metrics, not the health check. "Port 55679, path /debug/servicez": that is the zPages ServiceZ page, a debugging overview, not the health check extension. "Port 1777, path /debug/health": 1777 is the pprof extension's default port, and /debug/health is not a documented health check path.

Sources: Collector-contrib README: Health Check extension, OpenTelemetry docs: Collector troubleshooting

Practice this topic

Focus mode keeps every question on Debugging Collector Pipelines until you leave it. 10 free guest answers, then a free account; no credit card.

Or open OTCA practice across all topics.

Sources

The explanation above was checked against these official documents.

Frequently asked questions

My receiver is configured but receives nothing. What should I check first?

Confirm that the receiver is listed in a pipeline under service, because a receiver that is only defined is not enabled. Then check network and client configuration, the Collector logs and zPages.