pinpoint-apm/pinpoint · warning
fromNode rpc client not found
Error message
fromNode rpc client not found:{} What it means
In LinkListFactory.createTargetLink, the source node of a link (fromNode) was not found in the node list, so the factory logs 'fromNode rpc client not found' and skips the link. Map generation continues, but the link and its traffic volume are omitted from the application map.
Solutions
- Verify the from-application is included in node building for the same range/filter used for links so findNode succeeds.
- Check agent data collection for the source application; gaps in node data leave links dangling.
- Align the node and link query time windows so both see the same set of applications.
- Purge stale link records if the source application no longer exists.
Example fix
// before: dangling fromNode silently drops the link
if (fromNode == null) {
logger.warn("fromNode rpc client not found:{}", toApplicationId);
continue;
}
// after: surface and reconcile missing source nodes upstream
if (fromNode == null) {
logger.warn("fromNode not found for link to {}; adding unknown placeholder", toApplicationId);
fromNode = createUnknownNodeForRpcClient(linkData.getFromApplication());
nodeList.addNode(fromNode);
} Defensive patterns
Strategy: validation
Validate before calling
// Before building links, assert every link fromApplication has a node
Set<Application> nodeApps = nodeList.getNodes().stream().map(Node::getApplication).collect(Collectors.toSet());
linkDataList.stream()
.map(LinkData::getFromApplication)
.filter(app -> !nodeApps.contains(app))
.forEach(app -> logger.warn("link fromApplication missing from node list: {}", app)); Type guard
boolean sourceResolvable(LinkData l, NodeList nodes) { return nodes.findNode(l.getFromApplication()) != null; } Prevention
- Ensure source agents are actively reporting so their applications appear in the node set
- Keep node/link building in the same filter and time-window context
- Expire stale link rows referencing decommissioned applications
When it happens
Trigger: createLinkList processes link data where the fromApplication has no corresponding Node in nodeList when createTargetLink resolves it — the source application was never materialized as a node.
Common situations: Source application data missing (agent stopped reporting or app filtered out), mismatched filters/time windows between node and link building, or stale link rows referencing removed applications.
Understand the failure class
Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.
Related errors
AI-assisted analysis of pinpoint-apm/pinpoint@744c3d3075 (2026-09-07).
Data as JSON: /api/errors/5abef5411be86d48.
Report an issue: GitHub.
Appendix: source
Thrown at web/src/main/java/com/navercorp/pinpoint/web/applicationmap/link/LinkListFactory.java:94
final Link link = addLink(linkList, fromNode, toNode, LinkDirection.IN_LINK, range);
if (link != null) {
logger.debug("createSourceLink:{}", link);
}
}
}
}
private static void createTargetLink(NodeList nodeList, LinkList.Builder linkList, LinkDataMap linkDataMap, Range range) {
for (LinkData linkData : linkDataMap.getLinkDataList()) {
final Application fromApplicationId = linkData.getFromApplication();
Node fromNode = nodeList.findNode(fromApplicationId);
final Application toApplicationId = linkData.getToApplication();
Node toNode = nodeList.findNode(toApplicationId);
// rpc client missing
if (fromNode == null) {
logger.warn("fromNode rpc client not found:{}", toApplicationId);
continue;
}
// for RPC clients: skip if there is a dest application, convert to "unknown cloud" if not
if (toNode.getServiceType().isRpcClient()) {
// check if "to" node exists
if (!nodeList.contains(toNode.getApplication())) {
final Link link = addLink(linkList, fromNode, toNode, LinkDirection.OUT_LINK, range);
if (link != null) {
logger.debug("createRpcTargetLink:{}", link);
}
}
} else {
final Link link = addLink(linkList, fromNode, toNode, LinkDirection.OUT_LINK, range);
if (link != null) {
logger.debug("createTargetLink:{}", link);
}
}View on GitHub (pinned to 744c3d3075)