jaegertracing/jaeger · error
failed to export traces: %w
Error message
failed to export traces: %w
What it means
TraceWriter.WriteTraces wraps any error from the gRPC Export RPC with this message. It means the batch of traces could not be exported to the remote storage service — the write failed at transport, server-side, or serialization level.
Source
Thrown at internal/storage/v2/grpc/tracewriter.go:37
type TraceWriter struct {
client ptraceotlp.GRPCClient
}
// NewTraceWriter creates a TraceWriter that exports traces to a remote gRPC storage server.
//
// The provided gRPC connection is used exclusively for sending trace data to the backend.
// To prevent recursive trace generation, this connection should not have instrumentation enabled.
func NewTraceWriter(conn *grpc.ClientConn) *TraceWriter {
return &TraceWriter{
client: ptraceotlp.NewGRPCClient(conn),
}
}
func (tw *TraceWriter) WriteTraces(ctx context.Context, td ptrace.Traces) error {
req := ptraceotlp.NewExportRequestFromTraces(td)
_, err := tw.client.Export(ctx, req)
if err != nil {
return fmt.Errorf("failed to export traces: %w", err)
}
return nil
}
View on GitHub (pinned to 806f444784)
Solutions
- Check the wrapped error's gRPC status for the root cause
- Reduce batch size or raise max send message size if ResourceExhausted
- Retry with backoff on codes.Unavailable; consider a queueing/buffering writer upstream
- Verify server health, auth, and TLS configuration
Example fix
// before
err := writer.WriteTraces(ctx, hugeBatch) // ResourceExhausted
// after
for _, chunk := range splitTraces(td, 1000) {
if err := writer.WriteTraces(ctx, chunk); err != nil { return err }
} Defensive patterns
Strategy: retry
Validate before calling
if td.SpanCount() == 0 { return nil }
if size := approximateSize(td); size > maxGRPCMessageSize { return errors.New("batch too large; split") } Try / catch
err := writer.WriteTraces(ctx, td)
if err != nil {
if status.Code(err) == codes.Unavailable {
// retry with exponential backoff
}
return fmt.Errorf("export failed: %w", err)
} Prevention
- Split large trace batches to stay under gRPC max message size
- Use a buffering/queued writer for resilience
- Monitor server ingestion health
- Set sane deadlines and retry policies
When it happens
Trigger: Calling traceWriter.WriteTraces(ctx, td) when client.Export(...) returns an error: server unavailable, message larger than max gRPC size, context deadline exceeded, or server-side persistence failure.
Common situations: Remote storage collector down or overloaded; trace batch exceeding max message size (4MB default); ingestion timeouts under high load; auth/TLS mismatch.
Related errors
- access denied
- malformed token: multiple tokens found
- authenticator is not supported
- invalid gRPC server host:port: %w
- query server failed to initialize listener: %w
AI-assisted analysis of jaegertracing/jaeger@806f444784 (2026-09-01).
Data as JSON: /api/errors/92945fb0ce2786d5.
Report an issue: GitHub.