pinpoint-apm/pinpoint · warning

from UserNode not found:{}

Error message

from UserNode not found:{}

What it means

In DefaultNodeHistogramFactory.createUserNodeHistogram, a User node's histogram is derived from its single incoming (source) link. When linkList.findFromLink(userApplication) returns no links, the factory logs 'from UserNode not found' and returns an empty NodeHistogram instead of throwing. It signals the application map builder never created the user-to-application link this node depends on.

Source

Thrown at web/src/main/java/com/navercorp/pinpoint/web/applicationmap/appender/histogram/DefaultNodeHistogramFactory.java:115

                    find.add(histogram.getHistogram());
                }
                nodeBuilder.setAgentHistogramMap(agentHistogramMap);
            }

            AgentTimeHistogramBuilder agentTimeBuilder = new AgentTimeHistogramBuilder(terminalApplication, range);
            AgentTimeHistogram agentTimeHistogram = agentTimeBuilder.buildTarget(mergeSource);
            nodeBuilder.setAgentTimeHistogram(agentTimeHistogram);
        }

        return nodeBuilder.build();
    }

    @Override
    public NodeHistogram createUserNodeHistogram(Application userApplication, Range range, LinkList linkList) {
        // for User nodes, find its source link and create the histogram
        final List<Link> fromLink = linkList.findFromLink(userApplication);
        if (fromLink.isEmpty()) {
            logger.warn("from UserNode not found:{}", userApplication);
            return createEmptyNodeHistogram(userApplication, range);
        } else if (fromLink.size() > 1) {
            // log and use first(0) link.
            logger.warn("Invalid from UserNode:{}", linkList.getLinkList());
        }
        final Link sourceLink = fromLink.get(0);

        final NodeHistogram.Builder builder = NodeHistogram.newBuilder(userApplication, range);
        builder.setApplicationHistogram(sourceLink.getHistogram());

        ApplicationTimeHistogram histogramData = sourceLink.getTargetApplicationTimeSeriesHistogramData();
        builder.setApplicationTimeHistogram(histogramData);
        return builder.build();
    }

    @Override
    public NodeHistogram createQueueNodeHistogram(Application queueApplication, Range range, LinkList linkList) {
        final List<Link> toLinkList = linkList.findToLink(queueApplication);

View on GitHub (pinned to 744c3d3075)

Solutions

  1. Ensure the link-building phase includes user links (verify user-link creation in the map appender when User nodes are enabled).
  2. Confirm the same Range is used for both node and link creation so the user link is present in linkList.
  3. Check whether link building hit the maximum-link limit and dropped the user link; increase the limit or narrow the range.
  4. Accept the empty NodeHistogram fallback if user-node data is optional for your view.

Example fix

// before
NodeHistogram nh = factory.createUserNodeHistogram(userApp, range, linkList);
// after
List<Link> fromLink = linkList.findFromLink(userApp);
if (!fromLink.isEmpty()) {
    NodeHistogram nh = factory.createUserNodeHistogram(userApp, range, linkList);
} else {
    logger.debug("user link absent for {}; skipping user node histogram", userApp);
}
Defensive patterns

Strategy: fallback

Validate before calling

// check before building the user node histogram
boolean hasUserLink = !linkList.findFromLink(userApplication).isEmpty();
if (!hasUserLink) {
    logger.debug("user link missing for {} in range {}", userApplication, range);
}

Prevention

When it happens

Trigger: Calling createUserNodeHistogram(userApplication, range, linkList) where the LinkList contains no link whose to-service equals the user Application — i.e. the map builder skipped adding the USER->APP link while the USER node was still created.

Common situations: User nodes enabled (user scatter / virtual node 'user') but link data collection skipped the user link; link search range/time mismatch between node and link build phases; link limit reached so the user link was dropped; mixed node/link datasets from different map snapshots.

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/ea8a431785bd60b2. Report an issue: GitHub.