Optional<NodeMessage> contentNodeIssueWarningIfDistributorsReportErrors(
                ClusterStateBundle stateBundle, NodeInfo nodeInfo,
                TreeMap<Integer, NodeInfo> distributorNodeInfos,
                ClusterStatsAggregator statsAggregator) {
            var nodeStats = statsAggregator.getAggregatedStats().getErrorStats().getNodeErrorStats(nodeInfo.getNodeIndex());
            if (nodeStats != null && !nodeStats.getStatsFromDistributors().isEmpty()) {
                // Distributor error stats mapping should only be non-empty if at least one distributor
                // is reporting errors towards this particular node. To avoid swamping the status page
                // from transient hiccups, have a lower-bound for inclusion at >1% of all requests failing.
                var distributorsWithRpcErrors = nodeStats.getStatsFromDistributors().entrySet().stream()
                        .filter(e -> e.getValue().networkErrorRatio() > 0.01) // TODO make this configurable?
                        .sorted(Comparator.comparingInt(e -> e.getKey()))
                        .toList();
                if (!distributorsWithRpcErrors.isEmpty()) {
                    String rawWarning = renderContentNodeNetworkIssuesWarning(stateBundle, distributorNodeInfos, distributorsWithRpcErrors);
                    // TODO consider ERROR severity if e.g. > a particular ratio threshold for at least 1 node
                    return Optional.of(new NodeMessage(MessageSeverity.WARNING, rawWarning));
                }
            }
            return Optional.empty();
        }
Renders web page with cluster status.
clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/status/statuspage/VdsClusterHtmlRenderer.java