You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Problem: OTLP exporters never read the partial_success field, so collector-rejected spans / data points / log records vanish with no log line (silent data loss).
Fix: Deserialize the export response for both transports (gRPC + HTTP) and all three signals (traces, metrics, logs); log a warning with the rejected count / error_message on partial success. Never downgrade a SUCCESS.
📣 Public-facing draft — to be opened upstream in open-telemetry/opentelemetry-python. No internal references; copy verbatim.
Title: OTLP exporters ignore partial_success in export responses (silent data loss)
Summary
The OTLP exporters never read the partial_success field of the export response. When a collector accepts an export request but rejects some of the items in it (a partial success — e.g. some spans/data points/log records are dropped due to a resource limit or a bad payload), those rejections are discarded silently: no log line, no metric. Users lose telemetry with no signal that anything went wrong. This affects both transports (gRPC and HTTP/protobuf) and all three signals (traces, metrics, logs).
Evidence
gRPC: OTLPExporterMixin._export calls self._client.Export(...) but does not bind or inspect the return value (exporter/opentelemetry-exporter-otlp-proto-grpc/.../grpc/exporter.py, around the Export(...) call).
HTTP: the trace, metric, and log exporters return SUCCESS on resp.ok without deserializing the response body (exporter/opentelemetry-exporter-otlp-proto-http/.../{trace_exporter,metric_exporter,_log_exporter}/__init__.py).
A repository-wide grep for partial_success / rejected_ in exporter source returns zero hits.
Spec
The OTLP exporter specification (specification/protocol/exporter.md) and the OTLP protocol (docs/specification.md, "Partial Success") require that a client handle partial success: when rejected_spans / rejected_data_points / rejected_log_records is non-zero, or error_message is non-empty, the client SHOULD log the message as a warning. A partial success is still a successful request (the server returned 200/OK), so the export result stays SUCCESS.
Reference implementations
Go handles this (exporters/otlp/otlptrace/otlptracegrpc/... and internal/partialsuccess.go). Java's behavior is inconsistent/absent, so Python matching Go here is the right target.
Proposed fix
Deserialize the export response for both transports and all three signals. When a rejected count is non-zero or error_message is present, log a warning that includes the rejected count and the message. Keep returning SUCCESS (the request itself was accepted). Guard the deserialization so that an unparseable body cannot turn a successful export into a failure.
Activity
ocelotl commentedon Jul 22, 2026
🔒 Internal (dash0) — not for upstream.
Tracking for the OTLP partial-success fix.
oss_10_otlp_partial_success9a2699c7docelotl commentedon Jul 22, 2026
📣 Public-facing draft — to be opened upstream in
open-telemetry/opentelemetry-python. No internal references; copy verbatim.Title: OTLP exporters ignore
partial_successin export responses (silent data loss)Summary
The OTLP exporters never read the
partial_successfield of the export response. When a collector accepts an export request but rejects some of the items in it (a partial success — e.g. some spans/data points/log records are dropped due to a resource limit or a bad payload), those rejections are discarded silently: no log line, no metric. Users lose telemetry with no signal that anything went wrong. This affects both transports (gRPC and HTTP/protobuf) and all three signals (traces, metrics, logs).Evidence
OTLPExporterMixin._exportcallsself._client.Export(...)but does not bind or inspect the return value (exporter/opentelemetry-exporter-otlp-proto-grpc/.../grpc/exporter.py, around theExport(...)call).SUCCESSonresp.okwithout deserializing the response body (exporter/opentelemetry-exporter-otlp-proto-http/.../{trace_exporter,metric_exporter,_log_exporter}/__init__.py).partial_success/rejected_in exporter source returns zero hits.Spec
The OTLP exporter specification (
specification/protocol/exporter.md) and the OTLP protocol (docs/specification.md, "Partial Success") require that a client handle partial success: whenrejected_spans/rejected_data_points/rejected_log_recordsis non-zero, orerror_messageis non-empty, the client SHOULD log the message as a warning. A partial success is still a successful request (the server returned 200/OK), so the export result stays SUCCESS.Reference implementations
Go handles this (
exporters/otlp/otlptrace/otlptracegrpc/...andinternal/partialsuccess.go). Java's behavior is inconsistent/absent, so Python matching Go here is the right target.Proposed fix
Deserialize the export response for both transports and all three signals. When a rejected count is non-zero or
error_messageis present, log a warning that includes the rejected count and the message. Keep returning SUCCESS (the request itself was accepted). Guard the deserialization so that an unparseable body cannot turn a successful export into a failure.