{"record":{"id":"5abef5411be86d48","repo":"pinpoint-apm/pinpoint","slug":"fromnode-rpc-client-not-found","errorCode":null,"errorMessage":"fromNode rpc client not found:{}","messagePattern":"fromNode 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":94,"sourceCode":"                final Link link = addLink(linkList, fromNode, toNode, LinkDirection.IN_LINK, range);\n                if (link != null) {\n                    logger.debug(\"createSourceLink:{}\", link);\n                }\n            }\n        }\n    }\n\n    private static void createTargetLink(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 (fromNode == null) {\n                logger.warn(\"fromNode 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            if (toNode.getServiceType().isRpcClient()) {\n                // check if \"to\" node exists\n                if (!nodeList.contains(toNode.getApplication())) {\n                    final Link link = addLink(linkList, fromNode, toNode, LinkDirection.OUT_LINK, range);\n                    if (link != null) {\n                        logger.debug(\"createRpcTargetLink:{}\", link);\n                    }\n                }\n            } else {\n                final Link link = addLink(linkList, fromNode, toNode, LinkDirection.OUT_LINK, range);\n                if (link != null) {\n                    logger.debug(\"createTargetLink:{}\", link);\n                }\n            }","sourceCodeStart":76,"sourceCodeEnd":112,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/link/LinkListFactory.java#L76-L112","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before: dangling fromNode silently drops the link\nif (fromNode == null) {\n    logger.warn(\"fromNode rpc client not found:{}\", toApplicationId);\n    continue;\n}\n\n// after: surface and reconcile missing source nodes upstream\nif (fromNode == null) {\n    logger.warn(\"fromNode not found for link to {}; adding unknown placeholder\", toApplicationId);\n    fromNode = createUnknownNodeForRpcClient(linkData.getFromApplication());\n    nodeList.addNode(fromNode);\n}","handlingStrategy":"validation","validationCode":"// Before building links, assert every link fromApplication has a node\nSet<Application> nodeApps = nodeList.getNodes().stream().map(Node::getApplication).collect(Collectors.toSet());\nlinkDataList.stream()\n    .map(LinkData::getFromApplication)\n    .filter(app -> !nodeApps.contains(app))\n    .forEach(app -> logger.warn(\"link fromApplication missing from node list: {}\", app));","typeGuard":"boolean sourceResolvable(LinkData l, NodeList nodes) { return nodes.findNode(l.getFromApplication()) != null; }","tryCatchPattern":null,"preventionTips":["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"],"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"}