{"record":{"id":"feae1ed72200a5ef","repo":"pinpoint-apm/pinpoint","slug":"statdatasender-close-fail","errorCode":null,"errorMessage":"statDataSender close fail","messagePattern":"statDataSender close fail","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/module/GrpcModuleLifeCycle.java","lineNumber":110,"sourceCode":"        this.spanDataSender = spanDataSenderProvider.get();\n        logger.info(\"spanDataSenderProvider:{}\", spanDataSender);\n\n        this.statDataSender = this.statDataSenderProvider.get();\n        logger.info(\"statDataSenderProvider:{}\", statDataSender);\n\n        this.dnsExecutorService = dnsExecutorServiceProvider.get();\n        logger.info(\"dnsExecutorServiceProvider:{}\", dnsExecutorService);\n\n        this.reconnectScheduledExecutorService = reconnectScheduledExecutorProvider.get();\n        logger.info(\"reconnectScheduledExecutorServiceProvider:{}\", reconnectScheduledExecutorService);\n\n    }\n\n    @Override\n    public void shutdown() {\n        logger.info(\"shutdown()\");\n        IOUtils.closeQuietly(spanDataSender, (ex) -> logger.warn(\"spanDataSender close fail\", ex));\n        IOUtils.closeQuietly(statDataSender, (ex) -> logger.warn(\"statDataSender close fail\", ex));\n        IOUtils.closeQuietly(agentDataSender, (ex) -> logger.warn(\"agentDataSender close fail\", ex));\n        IOUtils.closeQuietly(metadataDataSender, (ex) -> logger.warn(\"metadataDataSender close fail\", ex));\n\n        if (dnsExecutorService != null) {\n            if (!MoreExecutors.shutdownAndAwaitTermination(dnsExecutorService, Duration.ofSeconds(3))) {\n                logger.warn(\"dnsExecutor shutdown failed\");\n            }\n        }\n        if (reconnectScheduledExecutorService != null) {\n            if (!MoreExecutors.shutdownAndAwaitTermination(reconnectScheduledExecutorService, Duration.ofSeconds(3))) {\n                logger.warn(\"reconnectScheduledExecutor shutdown failed\");\n            }\n        }\n        IOUtils.closeQuietly(reporter, (ex) -> logger.warn(\"reporter close fail\", ex));\n    }\n\n    @Override\n    public String toString() {","sourceCodeStart":92,"sourceCodeEnd":128,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/module/GrpcModuleLifeCycle.java#L92-L128","documentation":"Same shutdown path as the span sender: during GrpcModuleLifeCycle.shutdown(), statDataSender is closed with IOUtils.closeQuietly and any close exception is logged as \"statDataSender close fail\". It is a warning during teardown, not a thrown error.","triggerScenarios":"Closing statDataSender on shutdown while its gRPC channel is already broken or closed (network down, collector unreachable, channel previously aborted).","commonSituations":"Agent/collector connection lost before shutdown, repeated lifecycle start/stop cycles in embedded usage, container termination racing with RPC shutdown timeouts.","solutions":["Check the nested cause to confirm it is a channel/network error versus a logic bug","Confirm collector reachability and gRPC port before agent shutdown in scripts","Avoid invoking module shutdown twice; guard lifecycle with a state flag","Treat as benign if it only occurs during process exit after connection loss"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"if (channel != null && channel.isShutdown()) { logger.warn(\"stat channel already closed; skip graceful close\"); }","typeGuard":"boolean isClosable(Object sender) { return sender instanceof io.grpc.ManagedChannel && !((io.grpc.ManagedChannel) sender).isShutdown(); }","tryCatchPattern":"try {\n  profiler.stop();\n} catch (Throwable t) {\n  logger.warn(\"Profiler shutdown incomplete; statDataSender failure logged separately\", t);\n}","preventionTips":["Monitor collector connectivity so senders are not closed in a permanently broken state","Do not restart lifecycle modules repeatedly in embedded agents without full rebuild of senders","Use container stop timeouts long enough for gRPC graceful shutdown"],"tags":["grpc","shutdown","network","resource-cleanup"],"backgroundTag":"broken-pipe","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}