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

  1. Check the health of every node listed by the node registry (availableNodes) and restart unhealthy ones
  2. Verify the apps-engine service is running and reachable on the failing nodeID
  3. 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

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


AI-assisted analysis of RocketChat/Rocket.Chat@b2c16d5842 (2026-08-18). Data as JSON: /api/errors/2975ecf47cb27f36. Report an issue: GitHub.