Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use RecentlyActive feature to only list metrics older than 3 hours when necessary #296

Merged
merged 5 commits into from
Aug 14, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -46,17 +46,17 @@
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-cloudwatch</artifactId>
<version>1.11.708</version>
<version>1.11.839</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-sts</artifactId>
<version>1.11.708</version>
<version>1.11.839</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-resourcegroupstaggingapi</artifactId>
<version>1.11.708</version>
<version>1.11.839</version>
</dependency>
<!--
Older versions of jackson-databind have remote code execution vulnerabilities
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,6 @@ private void loadConfig(Map<String, Object> config, AmazonCloudWatch cloudWatchC
if (config.containsKey("set_timestamp")) {
defaultCloudwatchTimestamp = (Boolean)config.get("set_timestamp");
}


String region = (String) config.get("region");

Expand Down Expand Up @@ -374,6 +373,12 @@ private List<List<Dimension>> listDimensions(MetricRule rule, List<String> tagBa
ListMetricsRequest request = new ListMetricsRequest();
request.setNamespace(rule.awsNamespace);
request.setMetricName(rule.awsMetricName);

// 10800 seconds is 3 hours, this setting causes metrics older than 3 hours to not be listed
if (rule.rangeSeconds < 10800) {
request.setRecentlyActive("PT3H");
}

List<DimensionFilter> dimensionFilters = new ArrayList<DimensionFilter>();
for (String dimension: rule.awsDimensions) {
dimensionFilters.add(new DimensionFilter().withName(dimension));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ class ListMetricsRequestMatcher extends ArgumentMatcher {
String namespace;
String metricName;
String nextToken;
String recentlyActive;
List<DimensionFilter> dimensions = new ArrayList<DimensionFilter>();

public ListMetricsRequestMatcher Namespace(String namespace) {
Expand All @@ -77,6 +78,10 @@ public ListMetricsRequestMatcher Dimensions(String... dimensions) {
}
return this;
}
public ListMetricsRequestMatcher RecentlyActive(String recentlyActive) {
this.recentlyActive = recentlyActive;
return this;
}

public boolean matches(Object o) {
ListMetricsRequest request = (ListMetricsRequest) o;
Expand All @@ -96,6 +101,9 @@ public boolean matches(Object o) {
if (!dimensions.equals(request.getDimensions())) {
return false;
}
if (recentlyActive != null && !recentlyActive.equals(request.getRecentlyActive())) {
return false;
}
return true;
}
}
Expand Down Expand Up @@ -688,4 +696,37 @@ public void testOptionalTagSelection() throws Exception {
assertEquals(1.0, registry.getSampleValue("aws_resource_info", new String[]{"job", "instance", "arn", "instance_id", "tag_Monitoring"}, new String[]{"aws_ec2", "", "arn:aws:ec2:us-east-1:121212121212:instance/i-2", "i-2", "enabled"}), .01);
assertNull(registry.getSampleValue("aws_resource_info", new String[]{"job", "instance", "arn", "instance_id", "tag_Monitoring"}, new String[]{"aws_ec2", "", "arn:aws:ec2:us-east-1:121212121212:instance/i-no-tag", "i-no-tag", "enabled"}));
}

@Test
public void testNotRecentlyActive() throws Exception {
new CloudWatchCollector(
"---\nregion: reg\nmetrics:\n- aws_namespace: AWS/ELB\n aws_metric_name: RequestCount\n aws_dimensions:\n - AvailabilityZone\n - LoadBalancerName\n range_seconds: 12000", cloudWatchClient, taggingClient).register(registry);

Mockito.when(cloudWatchClient.listMetrics((ListMetricsRequest)argThat(
new ListMetricsRequestMatcher().Namespace("AWS/ELB").MetricName("RequestCount").Dimensions("AvailabilityZone", "LoadBalancerName").RecentlyActive(null))))
.thenReturn(new ListMetricsResult().withMetrics(
new Metric().withDimensions(new Dimension().withName("AvailabilityZone").withValue("a"), new Dimension().withName("LoadBalancerName").withValue("myLB")),
new Metric().withDimensions(new Dimension().withName("AvailabilityZone").withValue("a"), new Dimension().withName("LoadBalancerName").withValue("myLB"), new Dimension().withName("ThisExtraDimensionIsIgnored").withValue("dummy")),
new Metric().withDimensions(new Dimension().withName("AvailabilityZone").withValue("b"), new Dimension().withName("LoadBalancerName").withValue("myOtherLB"))));

Mockito.when(cloudWatchClient.getMetricStatistics((GetMetricStatisticsRequest)argThat(
new GetMetricStatisticsRequestMatcher().Namespace("AWS/ELB").MetricName("RequestCount").Dimension("AvailabilityZone", "a").Dimension("LoadBalancerName", "myLB"))))
.thenReturn(new GetMetricStatisticsResult().withDatapoints(
new Datapoint().withTimestamp(new Date()).withAverage(2.0)));
Mockito.when(cloudWatchClient.getMetricStatistics((GetMetricStatisticsRequest)argThat(
new GetMetricStatisticsRequestMatcher().Namespace("AWS/ELB").MetricName("RequestCount").Dimension("AvailabilityZone", "b").Dimension("LoadBalancerName", "myOtherLB"))))
.thenReturn(new GetMetricStatisticsResult().withDatapoints(
new Datapoint().withTimestamp(new Date()).withAverage(3.0)));

registry.getSampleValue("aws_elb_request_count_average", new String[]{"job", "instance"}, new String[]{"aws_elb", ""});


Mockito.verify(cloudWatchClient).listMetrics((ListMetricsRequest) argThat(
new ListMetricsRequestMatcher()
.RecentlyActive(null).
Namespace("AWS/ELB").
MetricName("RequestCount").
Dimensions("AvailabilityZone", "LoadBalancerName")
));
}
}