pinpoint-apm/pinpoint · warning
Failed to send agentInfo={}. result not set
Error message
Failed to send agentInfo={}. result not set What it means
AgentInfoSender.sendAgentInfo sends AgentInfo via the async data sender and waits up to 3 seconds for a ResultResponse. If the future returns null, the send is treated as failed (returns false) and this warning is logged with the agent's AgentInformation. It indicates the transport layer completed without producing a result object.
Source
Thrown at agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/AgentInfoSender.java:183
boolean isSuccessful = sendAgentInfo();
if (isSuccessful) {
logger.info("AgentInfo sent.");
this.cancel();
taskHandler.onSuccess();
}
}
private boolean sendAgentInfo() {
AgentInfo agentInfo = null;
try {
agentInfo = agentInfoFactory.createAgentInfo();
logger.info("Sending AgentInfo={}", agentInfo);
CompletableFuture<ResultResponse> future = dataSender.request(agentInfo);
ResultResponse result = future.get(3000, TimeUnit.MILLISECONDS);
if (result == null) {
if (agentInfo != null && agentInfo.getAgentInformation() != null) {
logger.warn("Failed to send agentInfo={}. result not set", agentInfo.getAgentInformation());
} else {
logger.warn("Failed to send agentInfo. result not set");
}
return false;
}
if (!result.isSuccess()) {
if (agentInfo != null && agentInfo.getAgentInformation() != null) {
logger.warn("Failed to send agentInfo={}. request unsuccessful, response={}", agentInfo.getAgentInformation(), result.getMessage());
} else {
logger.warn("Failed to send agentInfo. request unsuccessful, response={}", result.getMessage());
}
}
return result.isSuccess();
} catch (ExecutionException ex) {
logError(agentInfo, ex.getCause());
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
logError(agentInfo, ex);View on GitHub (pinned to 744c3d3075)
Solutions
- Check collector logs to confirm the AgentInfo was actually received and stored (the agent will retry periodically)
- Verify agent and collector (HBase) versions are compatible; mismatched protocols can yield empty results
- Inspect the configured dataSender implementation for code paths that complete the future with null
- The sender retries automatically; ensure the collector becomes reachable and watch for subsequent successful sends
Defensive patterns
Strategy: retry
Validate before calling
// pre-check collector reachability
try (Socket s = new Socket()) { s.connect(new InetSocketAddress(host, tcpPort), 2000); } Try / catch
CompletableFuture<ResultResponse> f = dataSender.request(agentInfo);
ResultResponse r = f.get(3000, TimeUnit.MILLISECONDS);
if (r == null) { logger.warn("no result from collector; will retry"); return false; } Prevention
- Ensure agent and collector protocol versions match
- Monitor collector health and storage (HBase) status
- Rely on AgentInfoSender's built-in retry; alert on repeated null results
When it happens
Trigger: dataSender.request(agentInfo) future completes with a null ResultResponse within the 3000ms timeout — i.e. the transport succeeded at the socket level but produced no result payload.
Common situations: Collector responses routed through a protocol path that resolves the future without setting a result; custom/misconfigured data sender implementations; serialization mismatch between agent and collector versions.
Understand the failure class
Background: "invalid response format", "malformed payload", "missing data field": when an API returns 200 but the response shape is wrong — this error's family across 23 libraries.
Related errors
- Failed to send agentInfo={}
- Failed to send agentInfo={}. request unsuccessful, response=
- Failed to send agentInfo. request unsuccessful, response={}
- Failed to send agentInfo
- traceReference is null
AI-assisted analysis of pinpoint-apm/pinpoint@744c3d3075 (2026-09-07).
Data as JSON: /api/errors/9ab40b8b4051c6d7.
Report an issue: GitHub.