pinpoint-apm/pinpoint · error
INTERNAL
INTERNAL
Error message
export failed
What it means
Error path in GrpcOtlpTraceService.export: the OTLP span export task failed (worker pool rejection surfaces as UNAVAILABLE for backpressure, or mapping/insert threw), so the export request could not complete.
Solutions
- Scale the worker executor/queue to handle export load
- Verify trace storage availability and inspect the chained cause
- Let clients retry on UNAVAILABLE per gRPC retry semantics for transient saturation
Defensive patterns
Strategy: retry
When it happens
Trigger: Thrown at otlptrace/otlptrace-collector/src/main/java/com/navercorp/pinpoint/otlp/trace/collector/service/GrpcOtlpTraceService.java:101 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of pinpoint-apm/pinpoint@744c3d3075 (2026-09-07).
Data as JSON: /api/errors/c9be674ac8d47901.
Report an issue: GitHub.
Appendix: source
Thrown at otlptrace/otlptrace-collector/src/main/java/com/navercorp/pinpoint/otlp/trace/collector/service/GrpcOtlpTraceService.java:101
// Offload the mapping/insert work onto the worker pool so the gRPC handler thread
// (server.executor) is not blocked. A saturated worker queue surfaces to the client
// as UNAVAILABLE (retryable), providing backpressure instead of dropping spans.
final Context current = Context.current();
final Runnable exportTask = current.wrap(() -> {
try {
if (Context.current().isCancelled()) {
// Client already gave up (deadline exceeded / cancelled) before this task ran.
// Skip the wasted mapping/insert; the admission reservation is freed in finally.
return;
}
handleExport(resourceSpanList, responseObserver);
} catch (Throwable t) {
// Unexpected failure (e.g. mapping fault on malformed input). Without this catch the
// exception would escape to the worker thread: the response would never be closed
// (client hangs until deadline) and the worker thread would die on an uncaught error.
// INTERNAL is non-retryable, avoiding a retry storm on deterministic (poison-data) faults.
logger.warn("Unexpected error while exporting otlp trace", t);
safeOnError(responseObserver, Status.INTERNAL.withDescription("export failed"));
} finally {
admissionBytes.release(requestBytes);
}
});
try {
workerExecutor.execute(exportTask);
} catch (RejectedExecutionException e) {
admissionBytes.release(requestBytes);
logger.warn("Failed to export. Worker executor rejected.");
ingestMetrics.requestRejected(OtlpTraceIngestMetrics.Transport.GRPC, OtlpTraceIngestMetrics.RequestRejectReason.EXECUTOR_REJECTED);
safeOnError(responseObserver, EXECUTOR_REJECTED);
}
}
private void handleExport(List<ResourceSpans> resourceSpanList, StreamObserver<ExportTraceServiceResponse> responseObserver) {
final OtlpTraceExportResult result = exportService.export(resourceSpanList, OtlpTraceIngestMetrics.Transport.GRPC);
if (OtlpTraceResponseMapper.isServerError(result)) {View on GitHub (pinned to 744c3d3075)