Пример #1
0
        private IEnumerable <Instantiation> GenerateRedisAutoscalingRules(RuleGeneratorArguments arguments)
        {
            if (!arguments.DynamicStampProperties.RedisAutoscalingEnabled)
            {
                yield break;
            }

            var autoscalingAgentConfiguration = new RedisAutoscalingAgent.Configuration();

            if (arguments.DynamicStampProperties.RedisAutoscalingMaximumClusterMemoryAllowedMb > 0)
            {
                autoscalingAgentConfiguration.MaximumClusterMemoryAllowedMb = arguments.DynamicStampProperties.RedisAutoscalingMaximumClusterMemoryAllowedMb;
            }

            var redisAutoscalingAgent = new RedisAutoscalingAgent(autoscalingAgentConfiguration, arguments.EnvironmentResources.MonitorManagementClient);
            var configuration         = new RedisAutoscalingRule.Configuration(arguments.BaseConfiguration);

            var primaryRedisInstance = RedisInstance
                                       .FromPreloaded(arguments.EnvironmentResources.Azure, arguments.EnvironmentResources.RedisCaches[arguments.StampId.PrimaryRedisName])
                                       .ThrowIfFailure();

            var secondaryRedisInstance = RedisInstance
                                         .FromPreloaded(arguments.EnvironmentResources.Azure, arguments.EnvironmentResources.RedisCaches[arguments.StampId.SecondaryRedisName])
                                         .ThrowIfFailure();

            yield return(new Instantiation
            {
                Rule = new RedisAutoscalingRule(configuration, redisAutoscalingAgent, primaryRedisInstance, secondaryRedisInstance),
                PollingPeriod = TimeSpan.FromMinutes(10),
            });
        }
Пример #2
0
        private async Task RunTestAsync(Func <OperationContext, TestableRedisAutoscalingAgent, Task> testFunc)
        {
            // Console is forwarded to XUnit as per TestBase
            using var consoleLog = new ConsoleLog();
            using var logger     = new Logger(new[] { consoleLog });
            var configuration         = new RedisAutoscalingAgent.Configuration();
            var redisAutoscalingAgent = new TestableRedisAutoscalingAgent(configuration);

            var tracingContext   = new Context(logger);
            var operationContext = new OperationContext(tracingContext, token: default);

            await testFunc(operationContext, redisAutoscalingAgent);
        }
Пример #3
0
        private IEnumerable <Instantiation> GenerateRedisAutoscalingRules(SingleStampRuleArguments arguments)
        {
            if (!arguments.DynamicStampProperties.RedisAutoscalingEnabled)
            {
                yield break;
            }

            if (!arguments.EnvironmentResources.RedisCaches.ContainsKey(arguments.StampId.PrimaryRedisName) || !arguments.EnvironmentResources.RedisCaches.ContainsKey(arguments.StampId.SecondaryRedisName))
            {
                _logger.Error($"Attempt to create Redis autoscaler for stamp `{arguments.StampId}` failed due to missing Redis instance. Skipping rule");
                yield break;
            }

            var autoscalingAgentConfiguration = new RedisAutoscalingAgent.Configuration();

            if (arguments.DynamicStampProperties.RedisAutoscalingMaximumClusterMemoryAllowedMb > 0)
            {
                autoscalingAgentConfiguration.MaximumClusterMemoryAllowedMb = arguments.DynamicStampProperties.RedisAutoscalingMaximumClusterMemoryAllowedMb;
            }

            var azureMetricsClient    = new AzureMetricsClient(arguments.EnvironmentResources.MonitorManagementClient);
            var redisAutoscalingAgent = new RedisAutoscalingAgent(autoscalingAgentConfiguration, azureMetricsClient);
            var configuration         = new RedisAutoscalingRule.Configuration(arguments.BaseConfiguration);

            var primaryRedisInstance = RedisInstance
                                       .FromPreloaded(
                arguments.EnvironmentResources.Azure,
                arguments.EnvironmentResources.RedisCaches[arguments.StampId.PrimaryRedisName],
                readOnly: _configuration.ReadOnly)
                                       .ThrowIfFailure();

            var secondaryRedisInstance = RedisInstance
                                         .FromPreloaded(
                arguments.EnvironmentResources.Azure,
                arguments.EnvironmentResources.RedisCaches[arguments.StampId.SecondaryRedisName],
                readOnly: _configuration.ReadOnly)
                                         .ThrowIfFailure();

            yield return(new Instantiation
            {
                Rule = new RedisAutoscalingRule(configuration, redisAutoscalingAgent, primaryRedisInstance, secondaryRedisInstance),
                PollingPeriod = TimeSpan.FromMinutes(10),
            });
        }