RocketChat/Rocket.Chat · error · Error
Failed to get apps status from node ${nodeID}
Error message
Failed to get apps status from node ${nodeID} What it means
Thrown while aggregating app status in the apps-engine service: the RPC call 'apps-engine.getAppsStatusLocal' to a workspace node returned undefined. In multi-node deployments the local node fans out to every available node; any node that fails to answer (or answers with nothing) produces this per-node Error, which fails the whole Promise.all aggregation.
Source
Thrown at apps/meteor/server/services/apps-engine/service.ts:234
// We can filter out the local node because we already know its status
const availableNodes = services?.find((service) => service.name === 'apps-engine')?.nodes;
// Subtract 1 for the local node
if (!availableNodes || availableNodes.length - 1 < 1) {
throw new AppsEngineNoNodesFoundError();
}
const statusByApp: AppStatusReport = {};
const apps: Promise<void>[] = availableNodes.map(async (nodeID) => {
const appsStatus: Awaited<ReturnType<typeof this.getAppsStatusLocal>> | undefined = await this.api?.call(
'apps-engine.getAppsStatusLocal',
[],
{ nodeID },
);
if (!appsStatus) {
throw new Error(`Failed to get apps status from node ${nodeID}`);
}
appsStatus.forEach(({ status, appId }) => {
if (!statusByApp[appId]) {
statusByApp[appId] = [];
}
statusByApp[appId].push({ instanceId: nodeID, isLocal: nodeID === localNodeId, status });
});
});
await Promise.all(apps);
return statusByApp;
}
}
View on GitHub (pinned to b2c16d5842)
Solutions
- Check the health of every node listed by the node registry (availableNodes) and restart unhealthy ones
- Verify the apps-engine service is running and reachable on the failing nodeID
- Retry the status call after the node recovers
Defensive patterns
Strategy: retry
Validate before calling
const healthy = await Promise.all(availableNodes.map((id) => api.call('apps-engine.getAppsStatusLocal', [], { nodeID: id }).then(Boolean).catch(() => false)));
if (healthy.some((ok) => !ok)) { /* skip or report degraded before aggregating */ } Type guard
function isAppsStatusReport(v: unknown): v is AppStatusReport {
return Array.isArray(v) && v.every((e) => e && typeof e.appId === 'string' && typeof e.status !== 'undefined');
} Try / catch
try { await service.getAppsStatus(); } catch (e) { if (e.message.startsWith('Failed to get apps status from node')) { /* wait for node recovery, then retry the sweep */ } } Prevention
- Run health checks on nodes before fanning out status calls
- Drain nodes from the registry before restarting them
When it happens
Trigger: Any node in the cluster being down or restarted during the status sweep; the apps-engine microservice unreachable from the calling node; API timeouts returning undefined rather than a payload.
Common situations: Rolling restarts where one node is briefly absent; network partitions between workspace nodes; apps-engine service crashed on a remote node while the orchestrator still lists it as available.
Related errors
- error-invalid-command
- error-invalid-command
- error-app-prevented
- No_results_found
- error-provider-not-found
AI-assisted analysis of RocketChat/Rocket.Chat@b2c16d5842 (2026-08-18).
Data as JSON: /api/errors/2975ecf47cb27f36.
Report an issue: GitHub.