public async Task ContinuesWhenAlarmGenerationFailsForOneAlertingGroup() { // arrange var stack = new FakeStackDeployer(); var autoScalingClient = FakeAwsClients.CreateAutoScalingClientForGroups(new[] { new AutoScalingGroup() { AutoScalingGroupName = "group-1", DesiredCapacity = 40 }, new AutoScalingGroup() { AutoScalingGroupName = "group-2", DesiredCapacity = 10 } }); var source = new AutoScalingGroupSource(autoScalingClient); var creator = new CloudFormationAlarmCreator(stack, new ConsoleAlarmLogger(true)); var config1 = new AlertingGroup() { Name = "group-1", AlarmNameSuffix = "suffix-1", Targets = new List <AlertTarget>() { new AlertEmail("*****@*****.**") }, Services = new AlertingGroupServices() { AutoScaling = new AwsServiceAlarms <AutoScalingResourceConfig>() { Resources = new List <ResourceThresholds <AutoScalingResourceConfig> >() { new ResourceThresholds <AutoScalingResourceConfig>() { Name = "group-1", Options = new AutoScalingResourceConfig() { // this will trigger the failure InstanceCountIncreaseDelayMinutes = 5 } } } } } }; var config2 = new AlertingGroup() { Name = "group-2", AlarmNameSuffix = "suffix-2", Targets = new List <AlertTarget>() { new AlertEmail("*****@*****.**") }, Services = new AlertingGroupServices() { AutoScaling = new AwsServiceAlarms <AutoScalingResourceConfig>() { Resources = new List <ResourceThresholds <AutoScalingResourceConfig> >() { new ResourceThresholds <AutoScalingResourceConfig>() { Name = "group-2" } } } } }; var cloudWatch = new Mock <IAmazonCloudWatch>(); cloudWatch .Setup(c => c.GetMetricStatisticsAsync(It.IsAny <GetMetricStatisticsRequest>(), It.IsAny <CancellationToken>())) .ThrowsAsync(new Exception("something bad")); var provider = new AutoScalingGroupAlarmDataProvider(cloudWatch.Object, new CurrentTimeProvider()); var sut = IoCHelper.CreateSystemUnderTest( source, provider, provider, WatchmanServiceConfigurationMapper.MapAutoScaling, creator, ConfigHelper.ConfigLoaderFor(config1, config2) ); Exception caught = null; // act try { await sut.LoadAndGenerateAlarms(RunMode.GenerateAlarms); } catch (Exception ex) { caught = ex; } // assert Assert.That(stack.StackWasDeployed("Watchman-group-1"), Is.EqualTo(false)); Assert.That(stack.StackWasDeployed("Watchman-group-2"), Is.EqualTo(true)); Assert.That(caught, Is.Not.Null); }
public async Task AlarmCreatedWithCorrectProperties() { // arrange var fakeStackDeployer = new FakeStackDeployer(); var dynamoClient = FakeAwsClients.CreateDynamoClientForTables(new[] { new TableDescription() { TableName = "first-dynamo-table", ProvisionedThroughput = new ProvisionedThroughputDescription() { ReadCapacityUnits = 100, WriteCapacityUnits = 200 } } }); var lambdaClient = FakeAwsClients.CreateLambdaClientForFunctions(new[] { new FunctionConfiguration() { FunctionName = "first-lambda-function" } }); var creator = new CloudFormationAlarmCreator(fakeStackDeployer, new ConsoleAlarmLogger(true)); var config = ConfigHelper.CreateBasicConfiguration( "test", "group-suffix", new AlertingGroupServices() { DynamoDb = new AwsServiceAlarms <ResourceConfig>() { Resources = new List <ResourceThresholds <ResourceConfig> >() { new ResourceThresholds <ResourceConfig>() { Name = "first-dynamo-table" } } }, Lambda = new AwsServiceAlarms <ResourceConfig>() { Resources = new List <ResourceThresholds <ResourceConfig> >() { new ResourceThresholds <ResourceConfig>() { Name = "first-lambda-function" } } } } ); var sutBuilder = new Builder(ConfigHelper.ConfigLoaderFor(config), creator); sutBuilder.AddService( new TableDescriptionSource(dynamoClient), new DynamoDbDataProvider(), new DynamoDbDataProvider(), WatchmanServiceConfigurationMapper.MapDynamoDb ); sutBuilder.AddService( new LambdaSource(lambdaClient), new LambdaAlarmDataProvider(), new LambdaAlarmDataProvider(), WatchmanServiceConfigurationMapper.MapLambda ); var sut = sutBuilder.Build(); // act await sut.LoadAndGenerateAlarms(RunMode.GenerateAlarms); // assert var alarmsByTable = fakeStackDeployer .Stack("Watchman-test") .AlarmsByDimension("TableName"); Assert.That(alarmsByTable.ContainsKey("first-dynamo-table"), Is.True); var alarmsByFunction = fakeStackDeployer .Stack("Watchman-test") .AlarmsByDimension("FunctionName"); Assert.That(alarmsByFunction.ContainsKey("first-lambda-function"), Is.True); }
public async Task CanSetExtendedStatisticAtResourceOrServiceLevel() { // arrange var fakeStackDeployer = new FakeStackDeployer(); var elbClient = FakeAwsClients.CreateElbClientForLoadBalancers(new[] { new LoadBalancerDescription() { LoadBalancerName = "elb-1" }, new LoadBalancerDescription() { LoadBalancerName = "elb-2" } }); var creator = new CloudFormationAlarmCreator(fakeStackDeployer, new ConsoleAlarmLogger(true)); var config = ConfigHelper.CreateBasicConfiguration( "test", "group-suffix", new AlertingGroupServices() { Elb = new AwsServiceAlarms <ResourceConfig>() { Resources = new List <ResourceThresholds <ResourceConfig> >() { new ResourceThresholds <ResourceConfig>() { Name = "elb-1", Values = new Dictionary <string, AlarmValues>() { { "LatencyHigh", new AlarmValues(null, null, "p97") } } }, new ResourceThresholds <ResourceConfig>() { Name = "elb-2" } }, // set default for whole group Values = new Dictionary <string, AlarmValues>() { { "LatencyHigh", new AlarmValues(null, null, "p99") } } } } ); var sutBuilder = new Builder(ConfigHelper.ConfigLoaderFor(config), creator); sutBuilder.AddService( new ElbSource(elbClient), new ElbAlarmDataProvider(), new ElbAlarmDataProvider(), WatchmanServiceConfigurationMapper.MapElb ); var sut = sutBuilder.Build(); // act await sut.LoadAndGenerateAlarms(RunMode.GenerateAlarms); // assert var alarmsByElb = fakeStackDeployer .Stack("Watchman-test") .AlarmsByDimension("LoadBalancerName"); // should take override var alarm = alarmsByElb["elb-1"].FirstOrDefault(a => a.Properties["AlarmName"].ToString().Contains("LatencyHigh")); Assert.That(alarm, Is.Not.Null); Assert.That(alarm.Properties["ExtendedStatistic"].ToString(), Is.EqualTo("p97")); // should take default of p99 var alarm2 = alarmsByElb["elb-2"].FirstOrDefault(a => a.Properties["AlarmName"].ToString().Contains("LatencyHigh")); Assert.That(alarm2, Is.Not.Null); Assert.That(alarm2.Properties["ExtendedStatistic"].ToString(), Is.EqualTo("p99")); }