This is an automated email from the ASF dual-hosted git repository.
gianm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git
The following commit(s) were added to refs/heads/master by this push:
new a1181533931 fix: web console services card omits most service types
without SQL (#19481)
a1181533931 is described below
commit a11815339311a56ed1292b1965c4e39ba8bc572a
Author: nuyb <[email protected]>
AuthorDate: Tue May 19 14:27:12 2026 +0900
fix: web console services card omits most service types without SQL (#19481)
The home dashboard's Services card has two code paths: the SQL path
counts every node role via sys.servers, while the coordinator-only
fallback was calling /druid/coordinator/v1/servers?simple — an
inventory-backed endpoint that only reports segment-loading servers
(historical, peon, and brokers that hold broadcast segments). As a
result, on clusters where the console talks to the coordinator without
SQL, overlord, coordinator, router, broker, and indexer counts were
silently dropped from the card, making the cluster look smaller than it
actually is.
---
.../home-view/services-card/services-card.tsx | 26 +++++++++++++++-------
1 file changed, 18 insertions(+), 8 deletions(-)
diff --git a/web-console/src/views/home-view/services-card/services-card.tsx
b/web-console/src/views/home-view/services-card/services-card.tsx
index 722c8a43c61..3923c6f3456 100644
--- a/web-console/src/views/home-view/services-card/services-card.tsx
+++ b/web-console/src/views/home-view/services-card/services-card.tsx
@@ -22,6 +22,7 @@ import { PluralPairIfNeeded } from '../../../components';
import { getConsoleViewIcon } from '../../../druid-models';
import type { Capabilities } from '../../../helpers';
import { useQueryManager } from '../../../hooks';
+import { Api } from '../../../singletons';
import { getApiArray, lookupBy, queryDruidSql } from '../../../utils';
import { HomeViewCard } from '../home-view-card/home-view-card';
@@ -60,16 +61,25 @@ export const ServicesCard = React.memo(function
ServicesCard(props: ServicesCard
x => x.count,
);
} else if (capabilities.hasCoordinatorAccess()) {
- const services = await
getApiArray('/druid/coordinator/v1/servers?simple', signal);
-
- const middleManager = capabilities.hasOverlordAccess()
- ? await getApiArray('/druid/indexer/v1/workers', signal)
- : [];
+ // /druid/coordinator/v1/cluster is discovery-backed and reports every
node role
+ // (the same source sys.servers uses), so the fallback matches the SQL
branch.
+ // /druid/coordinator/v1/servers?simple is segment-inventory-backed
and only sees
+ // historical, indexer-executor (peon), and any broker that holds
broadcast segments,
+ // so it is only used here to surface the peon count, which the
cluster endpoint
+ // does not return.
+ const clusterResp = await
Api.instance.get('/druid/coordinator/v1/cluster', { signal });
+ const cluster: Record<string, unknown[]> = clusterResp.data || {};
+ const segmentServers = await
getApiArray('/druid/coordinator/v1/servers?simple', signal);
return {
- historical: services.filter((s: any) => s.type ===
'historical').length,
- middle_manager: middleManager.length,
- peon: services.filter((s: any) => s.type ===
'indexer-executor').length,
+ coordinator: (cluster.coordinator || []).length,
+ overlord: (cluster.overlord || []).length,
+ router: (cluster.router || []).length,
+ broker: (cluster.broker || []).length,
+ historical: (cluster.historical || []).length,
+ middle_manager: (cluster.middleManager || []).length,
+ indexer: (cluster.indexer || []).length,
+ peon: segmentServers.filter((s: any) => s.type ===
'indexer-executor').length,
};
} else {
throw new Error(`must have SQL or coordinator access`);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]