Skip to content

Commit fe87746

Browse files
Configurable metrics in data stream auto-sharding
This adds cluster settings to allow for a choice of write load metrics in the data stream auto-sharding calculations. There are separate settings for the increasing and decreasing calculations. Both default to the existing 'all-time' metric for now.
1 parent a35f531 commit fe87746

File tree

4 files changed

+505
-65
lines changed

4 files changed

+505
-65
lines changed

server/src/main/java/org/elasticsearch/action/admin/indices/rollover/TransportRolloverAction.java

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import org.elasticsearch.common.util.concurrent.EsExecutors;
5454
import org.elasticsearch.core.Nullable;
5555
import org.elasticsearch.index.shard.DocsStats;
56+
import org.elasticsearch.index.shard.IndexingStats;
5657
import org.elasticsearch.injection.guice.Inject;
5758
import org.elasticsearch.tasks.CancellableTask;
5859
import org.elasticsearch.tasks.Task;
@@ -68,6 +69,7 @@
6869
import java.util.Objects;
6970
import java.util.Optional;
7071
import java.util.function.Consumer;
72+
import java.util.function.Function;
7173
import java.util.stream.Collectors;
7274

7375
/**
@@ -280,17 +282,13 @@ protected void masterOperation(
280282
DataStream dataStream = (DataStream) indexAbstraction;
281283
final Optional<IndexStats> indexStats = Optional.ofNullable(statsResponse)
282284
.map(stats -> stats.getIndex(dataStream.getWriteIndex().getName()));
283-
284-
Double indexWriteLoad = indexStats.map(
285-
stats -> Arrays.stream(stats.getShards())
286-
.filter(shardStats -> shardStats.getStats().indexing != null)
287-
// only take primaries into account as in stateful the replicas also index data
288-
.filter(shardStats -> shardStats.getShardRouting().primary())
289-
.map(shardStats -> shardStats.getStats().indexing.getTotal().getWriteLoad())
290-
.reduce(0.0, Double::sum)
291-
).orElse(null);
292-
293-
rolloverAutoSharding = dataStreamAutoShardingService.calculate(projectState, dataStream, indexWriteLoad);
285+
rolloverAutoSharding = dataStreamAutoShardingService.calculate(
286+
projectState,
287+
dataStream,
288+
indexStats.map(stats -> sumLoadMetrics(stats, IndexingStats.Stats::getWriteLoad)).orElse(null),
289+
indexStats.map(stats -> sumLoadMetrics(stats, IndexingStats.Stats::getRecentWriteLoad)).orElse(null),
290+
indexStats.map(stats -> sumLoadMetrics(stats, IndexingStats.Stats::getPeakWriteLoad)).orElse(null)
291+
);
294292
logger.debug("auto sharding result for data stream [{}] is [{}]", dataStream.getName(), rolloverAutoSharding);
295293

296294
// if auto sharding recommends increasing the number of shards we want to trigger a rollover even if there are no
@@ -354,6 +352,16 @@ protected void masterOperation(
354352
);
355353
}
356354

355+
private static Double sumLoadMetrics(IndexStats stats, Function<IndexingStats.Stats, Double> loadMetric) {
356+
return Arrays.stream(stats.getShards())
357+
.filter(shardStats -> shardStats.getStats().indexing != null)
358+
// only take primaries into account as in stateful the replicas also index data
359+
.filter(shardStats -> shardStats.getShardRouting().primary())
360+
.map(shardStats -> shardStats.getStats().indexing.getTotal())
361+
.map(loadMetric)
362+
.reduce(0.0, Double::sum);
363+
}
364+
357365
private void markForLazyRollover(
358366
RolloverRequest rolloverRequest,
359367
ActionListener<RolloverResponse> listener,

0 commit comments

Comments
 (0)