pinpoint-apm/pinpoint · warning
statDataSender close fail
Error message
statDataSender close fail
What it means
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.
Source
Thrown at agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/module/GrpcModuleLifeCycle.java:110
this.spanDataSender = spanDataSenderProvider.get();
logger.info("spanDataSenderProvider:{}", spanDataSender);
this.statDataSender = this.statDataSenderProvider.get();
logger.info("statDataSenderProvider:{}", statDataSender);
this.dnsExecutorService = dnsExecutorServiceProvider.get();
logger.info("dnsExecutorServiceProvider:{}", dnsExecutorService);
this.reconnectScheduledExecutorService = reconnectScheduledExecutorProvider.get();
logger.info("reconnectScheduledExecutorServiceProvider:{}", reconnectScheduledExecutorService);
}
@Override
public void shutdown() {
logger.info("shutdown()");
IOUtils.closeQuietly(spanDataSender, (ex) -> logger.warn("spanDataSender close fail", ex));
IOUtils.closeQuietly(statDataSender, (ex) -> logger.warn("statDataSender close fail", ex));
IOUtils.closeQuietly(agentDataSender, (ex) -> logger.warn("agentDataSender close fail", ex));
IOUtils.closeQuietly(metadataDataSender, (ex) -> logger.warn("metadataDataSender close fail", ex));
if (dnsExecutorService != null) {
if (!MoreExecutors.shutdownAndAwaitTermination(dnsExecutorService, Duration.ofSeconds(3))) {
logger.warn("dnsExecutor shutdown failed");
}
}
if (reconnectScheduledExecutorService != null) {
if (!MoreExecutors.shutdownAndAwaitTermination(reconnectScheduledExecutorService, Duration.ofSeconds(3))) {
logger.warn("reconnectScheduledExecutor shutdown failed");
}
}
IOUtils.closeQuietly(reporter, (ex) -> logger.warn("reporter close fail", ex));
}
@Override
public String toString() {View on GitHub (pinned to 744c3d3075)
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
Defensive patterns
Strategy: try-catch
Validate before calling
if (channel != null && channel.isShutdown()) { logger.warn("stat channel already closed; skip graceful close"); } Type guard
boolean isClosable(Object sender) { return sender instanceof io.grpc.ManagedChannel && !((io.grpc.ManagedChannel) sender).isShutdown(); } Try / catch
try {
profiler.stop();
} catch (Throwable t) {
logger.warn("Profiler shutdown incomplete; statDataSender failure logged separately", t);
} Prevention
- 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
When it happens
Trigger: Closing statDataSender on shutdown while its gRPC channel is already broken or closed (network down, collector unreachable, channel previously aborted).
Common situations: Agent/collector connection lost before shutdown, repeated lifecycle start/stop cycles in embedded usage, container termination racing with RPC shutdown timeouts.
Related errors
- spanDataSender close fail
- agentDataSender close fail
- metadataDataSender close fail
- reporter close fail
- dnsExecutor shutdown failed
AI-assisted analysis of pinpoint-apm/pinpoint@744c3d3075 (2026-09-07).
Data as JSON: /api/errors/feae1ed72200a5ef.
Report an issue: GitHub.