{"record":{"id":"92945fb0ce2786d5","repo":"jaegertracing/jaeger","slug":"failed-to-export-traces-w","errorCode":null,"errorMessage":"failed to export traces: %w","messagePattern":"failed to export traces: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/storage/v2/grpc/tracewriter.go","lineNumber":37,"sourceCode":"type TraceWriter struct {\n\tclient ptraceotlp.GRPCClient\n}\n\n// NewTraceWriter creates a TraceWriter that exports traces to a remote gRPC storage server.\n//\n// The provided gRPC connection is used exclusively for sending trace data to the backend.\n// To prevent recursive trace generation, this connection should not have instrumentation enabled.\nfunc NewTraceWriter(conn *grpc.ClientConn) *TraceWriter {\n\treturn &TraceWriter{\n\t\tclient: ptraceotlp.NewGRPCClient(conn),\n\t}\n}\n\nfunc (tw *TraceWriter) WriteTraces(ctx context.Context, td ptrace.Traces) error {\n\treq := ptraceotlp.NewExportRequestFromTraces(td)\n\t_, err := tw.client.Export(ctx, req)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"failed to export traces: %w\", err)\n\t}\n\treturn nil\n}\n","sourceCodeStart":19,"sourceCodeEnd":41,"githubUrl":"https://github.com/jaegertracing/jaeger/blob/806f4447841ecdb60519f408b004a599d515f437/internal/storage/v2/grpc/tracewriter.go#L19-L41","documentation":"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.","triggerScenarios":"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.","commonSituations":"Remote storage collector down or overloaded; trace batch exceeding max message size (4MB default); ingestion timeouts under high load; auth/TLS mismatch.","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"],"exampleFix":"// before\nerr := writer.WriteTraces(ctx, hugeBatch) // ResourceExhausted\n// after\nfor _, chunk := range splitTraces(td, 1000) {\n    if err := writer.WriteTraces(ctx, chunk); err != nil { return err }\n}","handlingStrategy":"retry","validationCode":"if td.SpanCount() == 0 { return nil }\nif size := approximateSize(td); size > maxGRPCMessageSize { return errors.New(\"batch too large; split\") }","typeGuard":null,"tryCatchPattern":"err := writer.WriteTraces(ctx, td)\nif err != nil {\n    if status.Code(err) == codes.Unavailable {\n        // retry with exponential backoff\n    }\n    return fmt.Errorf(\"export failed: %w\", err)\n}","preventionTips":["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"],"tags":["grpc","trace-writer","export"],"backgroundTag":"grpc-rpc-failed","analyzedSha":"806f4447841ecdb60519f408b004a599d515f437","analyzedAt":"2026-09-01T02:39:22.140Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}