{"record":{"id":"90daf7d2ad31ef15","repo":"pinpoint-apm/pinpoint","slug":"tonode-rpc-client-not-found","errorCode":null,"errorMessage":"toNode rpc client not found:{}","messagePattern":"toNode rpc client not found:(.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"web/src/main/java/com/navercorp/pinpoint/web/applicationmap/link/LinkListFactory.java","lineNumber":62,"sourceCode":"\n        LinkList linkList = linkBuilder.build();\n        for (Link link : linkList.getLinkList()) {\n            appendLinkHistogram(link, linkDataDuplexMap);\n        }\n        return linkList;\n    }\n\n    private static void createSourceLink(NodeList nodeList, LinkList.Builder linkList, LinkDataMap linkDataMap, Range range) {\n        for (LinkData linkData : linkDataMap.getLinkDataList()) {\n            final Application fromApplicationId = linkData.getFromApplication();\n            Node fromNode = nodeList.findNode(fromApplicationId);\n\n            final Application toApplicationId = linkData.getToApplication();\n            Node toNode = nodeList.findNode(toApplicationId);\n\n            // rpc client missing\n            if (toNode == null) {\n                logger.warn(\"toNode rpc client not found:{}\", toApplicationId);\n                continue;\n            }\n\n            // for RPC clients: skip if there is a dest application, convert to \"unknown cloud\" if not\n            // shouldn't really be necessary as rpc client toNodes are converted to unknown nodes beforehand.\n            if (toNode.getServiceType().isRpcClient()) {\n                if (!nodeList.contains(toNode.getApplication()) || toNode.getServiceType().isAlias()) {\n                    final Link link = addLink(linkList, fromNode, toNode, LinkDirection.IN_LINK, range);\n                    if (link != null) {\n                        logger.debug(\"createRpcSourceLink:{}\", link);\n                    }\n                }\n            } else {\n                final Link link = addLink(linkList, fromNode, toNode, LinkDirection.IN_LINK, range);\n                if (link != null) {\n                    logger.debug(\"createSourceLink:{}\", link);\n                }\n            }","sourceCodeStart":44,"sourceCodeEnd":80,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/link/LinkListFactory.java#L44-L80","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before: link factory assumes toNode always exists\nNode toNode = nodeList.findNode(toApplicationId);\nif (toNode == null) { logger.warn(\"toNode rpc client not found:{}\", toApplicationId); continue; }\n\n// after: guarantee an unknown node placeholder exists before link creation\nNode toNode = nodeList.findNode(toApplicationId);\nif (toNode == null) {\n    toNode = createUnknownNodeForRpcClient(toApplicationId);\n    nodeList.addNode(toNode);\n}","handlingStrategy":"validation","validationCode":"// Before building links, assert every link toApplication has a node\nSet<Application> nodeApps = nodeList.getNodes().stream().map(Node::getApplication).collect(Collectors.toSet());\nlinkDataList.stream()\n    .map(LinkData::getToApplication)\n    .filter(app -> !nodeApps.contains(app))\n    .forEach(app -> logger.warn(\"link toApplication missing from node list: {}\", app));","typeGuard":"boolean linkResolvable(LinkData l, NodeList nodes) { return nodes.findNode(l.getToApplication()) != null; }","tryCatchPattern":null,"preventionTips":["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"],"tags":["service-map","rpc-client","missing-node","data-consistency"],"backgroundTag":"entity-not-found","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}