In some contexts is unclear why an autoscaling policy decides to request
more resources, i.e. if there's an unassigned shard that remains unassigned
even after adding more resources. It would be help to have more information
around the decisions taken by the deciders so it is easier to understand and
track them.
x-pack/plugin/autoscaling/src/main/java/org/elasticsearch/xpack/autoscaling/storage/ProactiveStorageDeciderService.java
allocationDeciders
        );
        long unassignedBytesBeforeForecast = allocationState.storagePreventsAllocation();
        assert unassignedBytesBeforeForecast >= 0;
        TimeValue forecastWindow = FORECAST_WINDOW.get(configuration);
        ReactiveStorageDeciderService.AllocationState allocationStateAfterForecast = allocationState.forecast(
            forecastWindow.millis(),
            System.currentTimeMillis()
        );
        long unassignedBytes = allocationStateAfterForecast.storagePreventsAllocation();
        long assignedBytes = allocationStateAfterForecast.storagePreventsRemainOrMove();
        long maxShardSize = allocationStateAfterForecast.maxShardSize();
        assert assignedBytes >= 0;
        assert unassignedBytes >= unassignedBytesBeforeForecast;
        assert maxShardSize >= 0;
        String message = ReactiveStorageDeciderService.message(unassignedBytes, assignedBytes);
        AutoscalingCapacity requiredCapacity = AutoscalingCapacity.builder()
            .total(autoscalingCapacity.total().storage().getBytes() + unassignedBytes + assignedBytes, null)
            .node(maxShardSize, null)
            .build();
        return new AutoscalingDeciderResult(
            requiredCapacity,
            new ProactiveReason(message, unassignedBytes, assignedBytes, unassignedBytes - unassignedBytesBeforeForecast, forecastWindow)
        );
    }
    @Override
    public List<Setting<?>> deciderSettings() {
        return List.of(FORECAST_WINDOW);
    }
    public static class ProactiveReason implements AutoscalingDeciderResult.Reason {