pinpoint-apm/pinpoint · warning
toNode rpc client not found
Error message
toNode rpc client not found:{} What it means
In LinkListFactory.createSourceLink, the destination application of a link (linkData.getToApplication()) could not be found in the already-built node list, so the factory logs 'toNode rpc client not found' and skips the link (continue). The map is still generated, but this source link and its traffic are dropped from the rendered map.
Solutions
- Ensure nodes are created for all applications appearing in link data (including unknown/RPC-client placeholder nodes) before LinkListFactory runs.
- Check that the node-building and link-building stages use the same application list/time window so the toApplication exists in nodeList.
- Verify ServiceType descriptors for the destination: RPC-client toNodes should be converted to unknown nodes beforehand, as the code comment notes.
- If the link is legitimately orphaned (dest app decommissioned), ignore the warning or purge the stale link data.
Example fix
// before: link factory assumes toNode always exists
Node toNode = nodeList.findNode(toApplicationId);
if (toNode == null) { logger.warn("toNode rpc client not found:{}", toApplicationId); continue; }
// after: guarantee an unknown node placeholder exists before link creation
Node toNode = nodeList.findNode(toApplicationId);
if (toNode == null) {
toNode = createUnknownNodeForRpcClient(toApplicationId);
nodeList.addNode(toNode);
} Defensive patterns
Strategy: validation
Validate before calling
// Before building links, assert every link toApplication has a node
Set<Application> nodeApps = nodeList.getNodes().stream().map(Node::getApplication).collect(Collectors.toSet());
linkDataList.stream()
.map(LinkData::getToApplication)
.filter(app -> !nodeApps.contains(app))
.forEach(app -> logger.warn("link toApplication missing from node list: {}", app)); Type guard
boolean linkResolvable(LinkData l, NodeList nodes) { return nodes.findNode(l.getToApplication()) != null; } Prevention
- Always convert RPC-client toNodes to unknown placeholder nodes before link creation
- Use identical application sets and time windows for node and link construction
- Monitor for 'toNode rpc client not found' warnings as a signal of dropped links in maps
When it happens
Trigger: createLinkList builds links from link data whose toApplication has no matching Node in nodeList — typically an RPC-client destination that was never converted into an 'unknown' node before link creation.
Common situations: RPC-client calls where the destination application was filtered out or not collected, so no node exists; inconsistent time windows between node creation and link creation; custom service-type plugins whose to-application was never added to the map.
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/90daf7d2ad31ef15.
Report an issue: GitHub.
Appendix: source
Thrown at web/src/main/java/com/navercorp/pinpoint/web/applicationmap/link/LinkListFactory.java:62
LinkList linkList = linkBuilder.build();
for (Link link : linkList.getLinkList()) {
appendLinkHistogram(link, linkDataDuplexMap);
}
return linkList;
}
private static void createSourceLink(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 (toNode == null) {
logger.warn("toNode rpc client not found:{}", toApplicationId);
continue;
}
// for RPC clients: skip if there is a dest application, convert to "unknown cloud" if not
// shouldn't really be necessary as rpc client toNodes are converted to unknown nodes beforehand.
if (toNode.getServiceType().isRpcClient()) {
if (!nodeList.contains(toNode.getApplication()) || toNode.getServiceType().isAlias()) {
final Link link = addLink(linkList, fromNode, toNode, LinkDirection.IN_LINK, range);
if (link != null) {
logger.debug("createRpcSourceLink:{}", link);
}
}
} else {
final Link link = addLink(linkList, fromNode, toNode, LinkDirection.IN_LINK, range);
if (link != null) {
logger.debug("createSourceLink:{}", link);
}
}View on GitHub (pinned to 744c3d3075)