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

  1. Check the nested cause to confirm it is a channel/network error versus a logic bug
  2. Confirm collector reachability and gRPC port before agent shutdown in scripts
  3. Avoid invoking module shutdown twice; guard lifecycle with a state flag
  4. 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

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


AI-assisted analysis of pinpoint-apm/pinpoint@744c3d3075 (2026-09-07). Data as JSON: /api/errors/feae1ed72200a5ef. Report an issue: GitHub.