use of com.amazonaws.services.cloudwatch.model.AmazonCloudWatchException in project cloudbreak by hortonworks.
the class AwsCloudWatchService method getExistingCloudWatchAlarms.
private Stream<List<String>> getExistingCloudWatchAlarms(String regionName, AwsCredentialView credentialView, List<String> alarmNames) {
Stream<List<String>> filteredAlarmNamesStream;
AmazonCloudWatchClient amazonCloudWatchClient = awsClient.createCloudWatchClient(credentialView, regionName);
LOGGER.info("Searching for cloudwatch alarms [{}]", alarmNames);
try {
DescribeAlarmsRequest request = new DescribeAlarmsRequest().withAlarmNames(alarmNames).withMaxRecords(maxBatchsize);
List<String> filteredAlarmNames = amazonCloudWatchClient.describeAlarms(request).getMetricAlarms().stream().map(MetricAlarm::getAlarmName).collect(Collectors.toList());
filteredAlarmNamesStream = Stream.of(filteredAlarmNames);
LOGGER.debug("Checking cloudwatch alarms [{}] for existence and found [{}]", alarmNames, filteredAlarmNames);
} catch (AmazonCloudWatchException acwe) {
LOGGER.error("Unable to describe cloudwatch alarms falling back to delete all alarms individually [{}]: {}", alarmNames, acwe.getLocalizedMessage());
filteredAlarmNamesStream = alarmNames.stream().map(alarmName -> List.of(alarmName));
}
return filteredAlarmNamesStream;
}
use of com.amazonaws.services.cloudwatch.model.AmazonCloudWatchException in project cloudbreak by hortonworks.
the class AwsCloudWatchService method addCloudWatchAlarmsForSystemFailures.
public void addCloudWatchAlarmsForSystemFailures(List<CloudResource> instances, String regionName, AwsCredentialView credentialView) {
AmazonCloudWatchClient amazonCloudWatchClient = awsClient.createCloudWatchClient(credentialView, regionName);
instances.stream().filter(instance -> {
String instanceType = instance.getStringParameter(INSTANCE_TYPE);
if (instanceType == null) {
LOGGER.debug("Cannot determine if recovery is supported by instance type, attempting to set it up.");
return true;
}
String family = instanceType.contains(".") ? instanceType.split("\\.")[0] : instanceType;
return RECOVERABLE_INSTANCE_TYPES.contains(family);
}).forEach(instance -> {
try {
PutMetricAlarmRequest metricAlarmRequest = new PutMetricAlarmRequest();
String segment = credentialView.isGovernmentCloudEnabled() ? "aws-us-gov" : "aws";
metricAlarmRequest.setAlarmActions(Arrays.asList("arn:" + segment + ":automate:" + regionName + ":ec2:recover"));
metricAlarmRequest.setAlarmName(instance.getInstanceId() + alarmSuffix);
metricAlarmRequest.setMetricName("StatusCheckFailed_System");
metricAlarmRequest.setStatistic("Maximum");
metricAlarmRequest.setNamespace("AWS/EC2");
metricAlarmRequest.setDimensions(Arrays.asList(new Dimension().withName("InstanceId").withValue(instance.getInstanceId())));
metricAlarmRequest.setPeriod(cloudwatchPeriod);
metricAlarmRequest.setEvaluationPeriods(cloudwatchEvaluationPeriods);
metricAlarmRequest.setThreshold(cloudwatchThreshhold);
metricAlarmRequest.setComparisonOperator("GreaterThanOrEqualToThreshold");
amazonCloudWatchClient.putMetricAlarm(metricAlarmRequest);
LOGGER.debug("Created cloudwatch alarm for instanceId {}.", instance.getInstanceId());
} catch (AmazonCloudWatchException acwe) {
LOGGER.info("Unable to create cloudwatch alarm for instanceId {} (instance type: {}): {}", instance.getInstanceId(), instance.getStringParameter(INSTANCE_TYPE), acwe.getLocalizedMessage());
}
});
}
use of com.amazonaws.services.cloudwatch.model.AmazonCloudWatchException in project cloudbreak by hortonworks.
the class AwsNativeCloudWatchServiceTest method testDeleteCloudWatchAlarmsForSystemFailuresDoesNotBatchDeletionWhenDescribeAlarmPermissionIsMissing.
@Test
void testDeleteCloudWatchAlarmsForSystemFailuresDoesNotBatchDeletionWhenDescribeAlarmPermissionIsMissing() {
List<CloudInstance> cloudInstances = new LinkedList<>();
List<List<String>> deleteAlarmNames = new LinkedList<>();
List<String> alarmNames1 = new LinkedList<>();
List<String> alarmNames2 = new LinkedList<>();
List<String> alarmNames3 = new LinkedList<>();
for (int i = 1; i <= 100; i++) {
String alarmName = "i-" + i + "-Status-Check-Failed-System";
alarmNames1.add(alarmName);
deleteAlarmNames.add(List.of(alarmName));
}
for (int i = 101; i <= 200; i++) {
String alarmName = "i-" + i + "-Status-Check-Failed-System";
alarmNames2.add(alarmName);
deleteAlarmNames.add(List.of(alarmName));
}
for (int i = 201; i <= 210; i++) {
String alarmName = "i-" + i + "-Status-Check-Failed-System";
alarmNames3.add(alarmName);
deleteAlarmNames.add(List.of(alarmName));
}
for (int i = 1; i <= 210; i++) {
String instanceId = "i-" + i;
CloudInstance cloudInstance = mock(CloudInstance.class);
when(cloudInstance.getInstanceId()).thenReturn(instanceId);
cloudInstances.add(cloudInstance);
}
AwsCredentialView credentialView = mock(AwsCredentialView.class);
CloudStack stack = mock(CloudStack.class);
Group group = mock(Group.class);
List<Group> groups = List.of(group);
when(stack.getGroups()).thenReturn(groups);
when(group.getInstances()).thenReturn(cloudInstances);
when(commonAwsClient.createCloudWatchClient(credentialView, REGION)).thenReturn(mockAmazonCloudWatchClient);
AmazonCloudWatchException exception = new AmazonCloudWatchException("No permissions to describe cloudwatch alarms");
when(mockAmazonCloudWatchClient.describeAlarms(any())).thenThrow(exception);
underTest.deleteAllCloudWatchAlarmsForSystemFailures(stack, REGION, credentialView);
ArgumentCaptor<DescribeAlarmsRequest> captorDescribe = ArgumentCaptor.forClass(DescribeAlarmsRequest.class);
ArgumentCaptor<DeleteAlarmsRequest> captorDelete = ArgumentCaptor.forClass(DeleteAlarmsRequest.class);
verify(mockAmazonCloudWatchClient, times(3)).describeAlarms(captorDescribe.capture());
verify(mockAmazonCloudWatchClient, times(210)).deleteAlarms(captorDelete.capture());
assertEquals(List.of(alarmNames1, alarmNames2, alarmNames3), captorDescribe.getAllValues().stream().map(DescribeAlarmsRequest::getAlarmNames).collect(Collectors.toList()));
assertEquals(deleteAlarmNames, captorDelete.getAllValues().stream().map(DeleteAlarmsRequest::getAlarmNames).collect(Collectors.toList()));
}
Aggregations