in cloudwatch-controller/src/main/java/com/amazonwebservices/blogs/containers/kubernetes/K8sMetricAlarmReconciler.java [182:271]
private void createCloudWatchAlarm (JsonObject config) throws Exception {
if (config == null) return;
List<Tag> tags = new ArrayList<Tag> ();
if (config.containsKey("Tags")) {
JsonArray tagsArray = config.getJsonArray("Tags");
for (int i = 0; i < tagsArray.size(); i++) {
JsonObject tagObject = tagsArray.getJsonObject(i);
tags.add(new Tag()
.withKey(tagObject.getString("Key"))
.withValue(tagObject.getString("Value")));
}
}
else {
throw new Exception ("Cannot create CloudWatch Alarm without specifying tags");
}
if (config.containsKey("Metrics")) {
List<MetricDataQuery> metricsDataQueryCollection = new ArrayList<MetricDataQuery>();
JsonArray metricsArray = config.getJsonArray("Metrics");
for (int i = 0; i < metricsArray.size(); i++) {
JsonObject metricsDataQueryObject = metricsArray.getJsonObject(i);
if (metricsDataQueryObject.containsKey("MetricStat")) {
JsonObject metricStatObject = metricsDataQueryObject.getJsonObject("MetricStat");
JsonObject metricObject = metricStatObject.getJsonObject("Metric");
JsonArray dimensionsArray = metricObject.getJsonArray("Dimensions");
List<Dimension> dimensions = new ArrayList<Dimension> ();
for (int d = 0; d < dimensionsArray.size(); d++) {
JsonObject dimensionObject = dimensionsArray.getJsonObject(d);
dimensions.add(new Dimension()
.withName(dimensionObject.getString("Name"))
.withValue(dimensionObject.getString("Value")));
}
Metric metric = new Metric()
.withMetricName(metricObject.getString("MetricName"))
.withNamespace(metricObject.getString("Namespace"))
.withDimensions(dimensions);
MetricStat metricStat = new MetricStat()
.withMetric(metric)
.withPeriod(metricStatObject.getInteger("Period"))
.withStat(metricStatObject.getString("Stat"));
MetricDataQuery metricDataQuery = new MetricDataQuery()
.withId(metricsDataQueryObject.getString("Id"))
.withLabel(metricsDataQueryObject.getString("Label"))
.withMetricStat(metricStat)
.withReturnData(metricsDataQueryObject.getBoolean("ReturnData"));
metricsDataQueryCollection.add(metricDataQuery);
}
else if (metricsDataQueryObject.containsKey("Expression")) {
MetricDataQuery metricDataQuery = new MetricDataQuery()
.withId(metricsDataQueryObject.getString("Id"))
.withLabel(metricsDataQueryObject.getString("Label"))
.withPeriod(metricsDataQueryObject.getInteger("Period"))
.withExpression(metricsDataQueryObject.getString("Expression"))
.withReturnData(metricsDataQueryObject.getBoolean("ReturnData"));
metricsDataQueryCollection.add(metricDataQuery);
}
}
JsonArray alarmActionsArray = config.getJsonArray("AlarmActions");
List<String> alarmActions = new ArrayList<String>();
for (int j = 0; j < alarmActionsArray.size(); j++) {
alarmActions.add(alarmActionsArray.getString(j));
}
PutMetricAlarmRequest request = new PutMetricAlarmRequest()
.withAlarmName(config.getString("AlarmName"))
.withAlarmDescription(config.getString("AlarmDescription"))
.withActionsEnabled(config.getBoolean("ActionsEnabled"))
.withAlarmActions(alarmActions)
.withEvaluationPeriods(config.getInteger("EvaluationPeriods"))
.withDatapointsToAlarm(config.getInteger("DatapointsToAlarm"))
.withThreshold(config.getDouble("Threshold"))
.withComparisonOperator(config.getString("ComparisonOperator"))
.withMetrics(metricsDataQueryCollection)
.withTags(tags);
PutMetricAlarmResult response = cloudWatchClient.putMetricAlarm(request);
logger.info(String.format("Successfully created CloudWatch Metric Alarm '%s'", config.getString("AlarmName")));
}
}