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

  1. Ensure nodes are created for all applications appearing in link data (including unknown/RPC-client placeholder nodes) before LinkListFactory runs.
  2. Check that the node-building and link-building stages use the same application list/time window so the toApplication exists in nodeList.
  3. Verify ServiceType descriptors for the destination: RPC-client toNodes should be converted to unknown nodes beforehand, as the code comment notes.
  4. 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

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)