Skip to content

Commit a7e2430

Browse files
authored
Include node ID in balance API (#93823)
Today we report node stats by name, but the desired nodes work in terms of node IDs. This commit adds a mapping between node name and ID to make the output easier to interpret.
1 parent 8cb2bb5 commit a7e2430

File tree

5 files changed

+58
-21
lines changed

5 files changed

+58
-21
lines changed

docs/reference/cluster/get-desired-balance.asciidoc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,18 +97,21 @@ The API returns the following result:
9797
},
9898
"nodes": {
9999
"node-1": {
100+
"node_id": "UPYt8VwWTt-IADAEbqpLxA",
100101
"shard_count": 10,
101102
"forecast_write_load": 8.5,
102103
"forecast_disk_usage_bytes": 498435,
103104
"actual_disk_usage_bytes": 498435
104105
},
105106
"node-2": {
107+
"node_id": "bgC66tboTIeFQ0VgRGI4Gg",
106108
"shard_count": 15,
107109
"forecast_write_load": 3.25,
108110
"forecast_disk_usage_bytes": 384935,
109111
"actual_disk_usage_bytes": 384935
110112
},
111113
"node-3": {
114+
"node_id": "2x1VTuSOQdeguXPdN73yRw",
112115
"shard_count": 12,
113116
"forecast_write_load": 6.0,
114117
"forecast_disk_usage_bytes": 648766,

rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/cluster.desired_balance/10_basic.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,24 @@ setup:
6767
- gte: { 'cluster_balance_stats.nodes.$node_name.forecast_disk_usage_bytes' : 0 }
6868
- gte: { 'cluster_balance_stats.nodes.$node_name.actual_disk_usage_bytes' : 0 }
6969

70+
---
71+
"Test cluster_balance_stats contains node ID":
72+
73+
- skip:
74+
version: " - 8.7.99"
75+
reason: "Node ID added in in 8.8.0"
76+
77+
- do:
78+
cluster.state: {}
79+
- set: { nodes._arbitrary_key_ : node_id }
80+
- set: { nodes.$node_id.name : node_name }
81+
82+
- do:
83+
_internal.get_desired_balance: { }
84+
85+
- is_true: 'cluster_balance_stats.nodes.$node_name'
86+
- is_true: 'cluster_balance_stats.nodes.$node_name.node_id'
87+
7088
---
7189
"Test get desired balance for single shard":
7290
- do:

server/src/main/java/org/elasticsearch/cluster/routing/allocation/allocator/ClusterBalanceStats.java

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
package org.elasticsearch.cluster.routing.allocation.allocator;
1010

11+
import org.elasticsearch.TransportVersion;
1112
import org.elasticsearch.cluster.ClusterInfo;
1213
import org.elasticsearch.cluster.ClusterState;
1314
import org.elasticsearch.cluster.metadata.Metadata;
@@ -170,11 +171,13 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
170171
}
171172
}
172173

173-
public record NodeBalanceStats(int shards, double forecastWriteLoad, long forecastShardSize, long actualShardSize)
174+
public record NodeBalanceStats(String nodeId, int shards, double forecastWriteLoad, long forecastShardSize, long actualShardSize)
174175
implements
175176
Writeable,
176177
ToXContentObject {
177178

179+
private static final String UNKNOWN_NODE_ID = "UNKNOWN";
180+
178181
private static NodeBalanceStats createFrom(
179182
RoutingNode routingNode,
180183
Metadata metadata,
@@ -194,15 +197,24 @@ private static NodeBalanceStats createFrom(
194197
actualShardSize += shardSize;
195198
}
196199

197-
return new NodeBalanceStats(routingNode.size(), forecastWriteLoad, forecastShardSize, actualShardSize);
200+
return new NodeBalanceStats(routingNode.nodeId(), routingNode.size(), forecastWriteLoad, forecastShardSize, actualShardSize);
198201
}
199202

200203
public static NodeBalanceStats readFrom(StreamInput in) throws IOException {
201-
return new NodeBalanceStats(in.readInt(), in.readDouble(), in.readLong(), in.readLong());
204+
return new NodeBalanceStats(
205+
in.getTransportVersion().onOrAfter(TransportVersion.V_8_8_0) ? in.readString() : UNKNOWN_NODE_ID,
206+
in.readInt(),
207+
in.readDouble(),
208+
in.readLong(),
209+
in.readLong()
210+
);
202211
}
203212

204213
@Override
205214
public void writeTo(StreamOutput out) throws IOException {
215+
if (out.getTransportVersion().onOrAfter(TransportVersion.V_8_8_0)) {
216+
out.writeString(nodeId);
217+
}
206218
out.writeInt(shards);
207219
out.writeDouble(forecastWriteLoad);
208220
out.writeLong(forecastShardSize);
@@ -211,8 +223,11 @@ public void writeTo(StreamOutput out) throws IOException {
211223

212224
@Override
213225
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
214-
return builder.startObject()
215-
.field("shard_count", shards)
226+
builder.startObject();
227+
if (UNKNOWN_NODE_ID.equals(nodeId) == false) {
228+
builder.field("node_id", nodeId);
229+
}
230+
return builder.field("shard_count", shards)
216231
.field("forecast_write_load", forecastWriteLoad)
217232
.humanReadableField("forecast_disk_usage_bytes", "forecast_disk_usage", ByteSizeValue.ofBytes(forecastShardSize))
218233
.humanReadableField("actual_disk_usage_bytes", "actual_disk_usage", ByteSizeValue.ofBytes(actualShardSize))

server/src/test/java/org/elasticsearch/action/admin/cluster/allocation/DesiredBalanceResponseTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ private ClusterBalanceStats.TierBalanceStats randomTierBalanceStats() {
8282

8383
private ClusterBalanceStats.NodeBalanceStats randomNodeBalanceStats() {
8484
return new ClusterBalanceStats.NodeBalanceStats(
85+
randomAlphaOfLength(10),
8586
randomIntBetween(0, Integer.MAX_VALUE),
8687
randomDouble(),
8788
randomLongBetween(0, Long.MAX_VALUE),
@@ -228,7 +229,7 @@ public void testToXContent() throws IOException {
228229
Map<String, Object> nodesStats = (Map<String, Object>) nodes.get(entry.getKey());
229230
assertThat(
230231
nodesStats.keySet(),
231-
containsInAnyOrder("shard_count", "forecast_write_load", "forecast_disk_usage_bytes", "actual_disk_usage_bytes")
232+
containsInAnyOrder("node_id", "shard_count", "forecast_write_load", "forecast_disk_usage_bytes", "actual_disk_usage_bytes")
232233
);
233234

234235
assertEquals(nodesStats.get("shard_count"), entry.getValue().shards());

server/src/test/java/org/elasticsearch/cluster/routing/allocation/allocator/ClusterBalanceStatsTests.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,9 @@ public void testStatsForSingleTierClusterWithNoForecasts() {
7272
)
7373
),
7474
Map.ofEntries(
75-
Map.entry("node-1", new ClusterBalanceStats.NodeBalanceStats(2, 0.0, 4L, 4L)),
76-
Map.entry("node-2", new ClusterBalanceStats.NodeBalanceStats(2, 0.0, 3L, 3L)),
77-
Map.entry("node-3", new ClusterBalanceStats.NodeBalanceStats(2, 0.0, 5L, 5L))
75+
Map.entry("node-1", new ClusterBalanceStats.NodeBalanceStats("node-1", 2, 0.0, 4L, 4L)),
76+
Map.entry("node-2", new ClusterBalanceStats.NodeBalanceStats("node-2", 2, 0.0, 3L, 3L)),
77+
Map.entry("node-3", new ClusterBalanceStats.NodeBalanceStats("node-3", 2, 0.0, 5L, 5L))
7878
)
7979
)
8080
)
@@ -116,9 +116,9 @@ public void testStatsForSingleTierClusterWithForecasts() {
116116
)
117117
),
118118
Map.ofEntries(
119-
Map.entry("node-1", new ClusterBalanceStats.NodeBalanceStats(2, 3.5, 14L, 4L)),
120-
Map.entry("node-2", new ClusterBalanceStats.NodeBalanceStats(2, 4.0, 12L, 3L)),
121-
Map.entry("node-3", new ClusterBalanceStats.NodeBalanceStats(2, 4.5, 10L, 5L))
119+
Map.entry("node-1", new ClusterBalanceStats.NodeBalanceStats("node-1", 2, 3.5, 14L, 4L)),
120+
Map.entry("node-2", new ClusterBalanceStats.NodeBalanceStats("node-2", 2, 4.0, 12L, 3L)),
121+
Map.entry("node-3", new ClusterBalanceStats.NodeBalanceStats("node-3", 2, 4.5, 10L, 5L))
122122
)
123123
)
124124
)
@@ -185,12 +185,12 @@ public void testStatsForHotWarmClusterWithForecasts() {
185185
)
186186
),
187187
Map.ofEntries(
188-
Map.entry("node-hot-1", new ClusterBalanceStats.NodeBalanceStats(3, 8.5, 16L, 15L)),
189-
Map.entry("node-hot-2", new ClusterBalanceStats.NodeBalanceStats(2, 6.0, 10L, 9L)),
190-
Map.entry("node-hot-3", new ClusterBalanceStats.NodeBalanceStats(2, 6.5, 10L, 10L)),
191-
Map.entry("node-warm-1", new ClusterBalanceStats.NodeBalanceStats(1, 0.0, 12L, 12L)),
192-
Map.entry("node-warm-2", new ClusterBalanceStats.NodeBalanceStats(1, 0.0, 12L, 12L)),
193-
Map.entry("node-warm-3", new ClusterBalanceStats.NodeBalanceStats(1, 0.0, 18L, 18L))
188+
Map.entry("node-hot-1", new ClusterBalanceStats.NodeBalanceStats("node-hot-1", 3, 8.5, 16L, 15L)),
189+
Map.entry("node-hot-2", new ClusterBalanceStats.NodeBalanceStats("node-hot-2", 2, 6.0, 10L, 9L)),
190+
Map.entry("node-hot-3", new ClusterBalanceStats.NodeBalanceStats("node-hot-3", 2, 6.5, 10L, 10L)),
191+
Map.entry("node-warm-1", new ClusterBalanceStats.NodeBalanceStats("node-warm-1", 1, 0.0, 12L, 12L)),
192+
Map.entry("node-warm-2", new ClusterBalanceStats.NodeBalanceStats("node-warm-2", 1, 0.0, 12L, 12L)),
193+
Map.entry("node-warm-3", new ClusterBalanceStats.NodeBalanceStats("node-warm-3", 1, 0.0, 18L, 18L))
194194
)
195195
)
196196
)
@@ -225,9 +225,9 @@ public void testStatsForNoIndicesInTier() {
225225
)
226226
),
227227
Map.ofEntries(
228-
Map.entry("node-1", new ClusterBalanceStats.NodeBalanceStats(0, 0.0, 0L, 0L)),
229-
Map.entry("node-2", new ClusterBalanceStats.NodeBalanceStats(0, 0.0, 0L, 0L)),
230-
Map.entry("node-3", new ClusterBalanceStats.NodeBalanceStats(0, 0.0, 0L, 0L))
228+
Map.entry("node-1", new ClusterBalanceStats.NodeBalanceStats("node-1", 0, 0.0, 0L, 0L)),
229+
Map.entry("node-2", new ClusterBalanceStats.NodeBalanceStats("node-2", 0, 0.0, 0L, 0L)),
230+
Map.entry("node-3", new ClusterBalanceStats.NodeBalanceStats("node-3", 0, 0.0, 0L, 0L))
231231
)
232232
)
233233
)

0 commit comments

Comments
 (0)