{"record":{"id":"c9be674ac8d47901","repo":"pinpoint-apm/pinpoint","slug":"internal","errorCode":"INTERNAL","errorMessage":"export failed","messagePattern":"export failed","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"otlptrace/otlptrace-collector/src/main/java/com/navercorp/pinpoint/otlp/trace/collector/service/GrpcOtlpTraceService.java","lineNumber":101,"sourceCode":"        // Offload the mapping/insert work onto the worker pool so the gRPC handler thread\n        // (server.executor) is not blocked. A saturated worker queue surfaces to the client\n        // as UNAVAILABLE (retryable), providing backpressure instead of dropping spans.\n        final Context current = Context.current();\n        final Runnable exportTask = current.wrap(() -> {\n            try {\n                if (Context.current().isCancelled()) {\n                    // Client already gave up (deadline exceeded / cancelled) before this task ran.\n                    // Skip the wasted mapping/insert; the admission reservation is freed in finally.\n                    return;\n                }\n                handleExport(resourceSpanList, responseObserver);\n            } catch (Throwable t) {\n                // Unexpected failure (e.g. mapping fault on malformed input). Without this catch the\n                // exception would escape to the worker thread: the response would never be closed\n                // (client hangs until deadline) and the worker thread would die on an uncaught error.\n                // INTERNAL is non-retryable, avoiding a retry storm on deterministic (poison-data) faults.\n                logger.warn(\"Unexpected error while exporting otlp trace\", t);\n                safeOnError(responseObserver, Status.INTERNAL.withDescription(\"export failed\"));\n            } finally {\n                admissionBytes.release(requestBytes);\n            }\n        });\n        try {\n            workerExecutor.execute(exportTask);\n        } catch (RejectedExecutionException e) {\n            admissionBytes.release(requestBytes);\n            logger.warn(\"Failed to export. Worker executor rejected.\");\n            ingestMetrics.requestRejected(OtlpTraceIngestMetrics.Transport.GRPC, OtlpTraceIngestMetrics.RequestRejectReason.EXECUTOR_REJECTED);\n            safeOnError(responseObserver, EXECUTOR_REJECTED);\n        }\n    }\n\n    private void handleExport(List<ResourceSpans> resourceSpanList, StreamObserver<ExportTraceServiceResponse> responseObserver) {\n        final OtlpTraceExportResult result = exportService.export(resourceSpanList, OtlpTraceIngestMetrics.Transport.GRPC);\n\n        if (OtlpTraceResponseMapper.isServerError(result)) {","sourceCodeStart":83,"sourceCodeEnd":119,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/otlptrace/otlptrace-collector/src/main/java/com/navercorp/pinpoint/otlp/trace/collector/service/GrpcOtlpTraceService.java#L83-L119","documentation":"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.","triggerScenarios":"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.","commonSituations":"See trigger scenarios.","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"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}