Exemplo n.º 1
0
        public override async Task Run(RuleContext context)
        {
            // Short-circuit if either instance is being scaled, as the autoscaling is either externally triggered or a
            // monitor bug.
            await Task.WhenAll(_primaryRedisInstance.RefreshAsync(context.CancellationToken), _secondaryRedisInstance.RefreshAsync(context.CancellationToken)).ThrowIfFailureAsync();

            if (!_primaryRedisInstance.IsReadyToScale)
            {
                Emit(context, "Autoscale", Severity.Info, $"Instance `{_primaryRedisInstance.Name}` is undergoing maintenance or autoscaling operation");
                return;
            }

            if (!_secondaryRedisInstance.IsReadyToScale)
            {
                Emit(context, "Autoscale", Severity.Info, $"Instance `{_secondaryRedisInstance.Name}` is undergoing maintenance or autoscaling operation");
                return;
            }

            await AttemptToScaleAsync(context, _primaryRedisInstance, context.CancellationToken);

            // A long time may have passed since the first scale, so we refresh the data and re-check before looking at
            // the secondary.
            await Task.WhenAll(_primaryRedisInstance.RefreshAsync(context.CancellationToken), _secondaryRedisInstance.RefreshAsync(context.CancellationToken)).ThrowIfFailureAsync();

            if (!_primaryRedisInstance.IsReadyToScale)
            {
                Emit(context, "Autoscale", Severity.Info, $"Instance `{_primaryRedisInstance.Name}` is undergoing maintenance or autoscaling operation");
                return;
            }

            if (!_secondaryRedisInstance.IsReadyToScale)
            {
                Emit(context, "Autoscale", Severity.Info, $"Instance `{_secondaryRedisInstance.Name}` is undergoing maintenance or autoscaling operation");
                return;
            }

            await AttemptToScaleAsync(context, _secondaryRedisInstance, context.CancellationToken);
        }