Skip to content

Commit d8c2d09

Browse files
author
Aaron Michael Lamb
committed
fix: change putDimensions to update/sort existing dimension sets when duplicate
This change ensures new dimension key-values are used for the EMF root node by removing duplicate dimension sets and adding input dimension set to the end of the collection. Example: ``` [ { "keyA": "value1" }, { "keyA": "value2" }, ] // expected target member: { "keyA": "value2" } ``` [TESTING] Updated unit tests to check for this case wherein putDimensions may be triggered using various dimension set lengths, values, and order.
1 parent 49bc5c5 commit d8c2d09

File tree

2 files changed

+40
-8
lines changed

2 files changed

+40
-8
lines changed

src/main/java/software/amazon/cloudwatchlogs/emf/model/MetricDirective.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,16 @@ class MetricDirective {
5151
shouldUseDefaultDimension = true;
5252
}
5353

54+
/**
55+
* Adds a dimension set to the end of the collection.
56+
*
57+
* @param dimensionSet
58+
*/
5459
void putDimensionSet(DimensionSet dimensionSet) {
55-
if (dimensions.stream()
56-
.anyMatch(dim -> dim.getDimensionKeys().equals(dimensionSet.getDimensionKeys()))) {
57-
return;
58-
}
59-
60+
// Duplicate dimensions sets are removed before being added to the end of the collection.
61+
// This ensures only latest dimension value is used as a target member on the root EMF node.
62+
// This operation is O(n^2), but acceptable given sets are capped at 10 dimensions
63+
dimensions.removeIf(dim -> dim.getDimensionKeys().equals(dimensionSet.getDimensionKeys()));
6064
dimensions.add(dimensionSet);
6165
}
6266

src/test/java/software/amazon/cloudwatchlogs/emf/model/MetricDirectiveTest.java

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public void testPutDimensions() throws JsonProcessingException {
102102
}
103103

104104
@Test
105-
public void testPutMultipleDimensionSets() throws JsonProcessingException {
105+
public void testPutDimensionSetWhenMultipleDimensionSets() throws JsonProcessingException {
106106
MetricDirective metricDirective = new MetricDirective();
107107
metricDirective.putDimensionSet(DimensionSet.of("Region", "us-east-1"));
108108
metricDirective.putDimensionSet(DimensionSet.of("Instance", "inst-1"));
@@ -115,14 +115,16 @@ public void testPutMultipleDimensionSets() throws JsonProcessingException {
115115
}
116116

117117
@Test
118-
public void testPutMultipleDuplicateDimensionSets() throws JsonProcessingException {
118+
public void testPutDimensionSetWhenDuplicateDimensionSets() throws JsonProcessingException {
119119
MetricDirective metricDirective = new MetricDirective();
120+
metricDirective.putDimensionSet(new DimensionSet());
120121
metricDirective.putDimensionSet(DimensionSet.of("Region", "us-east-1"));
121122
metricDirective.putDimensionSet(
122123
DimensionSet.of("Region", "us-east-1", "Instance", "inst-1"));
123124
metricDirective.putDimensionSet(
124125
DimensionSet.of("Instance", "inst-1", "Region", "us-east-1"));
125126
metricDirective.putDimensionSet(DimensionSet.of("Instance", "inst-1"));
127+
metricDirective.putDimensionSet(new DimensionSet());
126128
metricDirective.putDimensionSet(DimensionSet.of("Region", "us-east-1"));
127129
metricDirective.putDimensionSet(
128130
DimensionSet.of("Region", "us-east-1", "Instance", "inst-1"));
@@ -134,7 +136,33 @@ public void testPutMultipleDuplicateDimensionSets() throws JsonProcessingExcepti
134136

135137
assertEquals(
136138
serializedMetricDirective,
137-
"{\"Dimensions\":[[\"Region\"],[\"Region\",\"Instance\"],[\"Instance\"]],\"Metrics\":[],\"Namespace\":\"aws-embedded-metrics\"}");
139+
"{\"Dimensions\":[[],[\"Region\"],[\"Instance\",\"Region\"],[\"Instance\"]],\"Metrics\":[],\"Namespace\":\"aws-embedded-metrics\"}");
140+
}
141+
142+
@Test
143+
public void testPutDimensionSetWhenDuplicateDimensionSetsWillSortCorrectly()
144+
throws JsonProcessingException {
145+
MetricDirective metricDirective = new MetricDirective();
146+
metricDirective.putDimensionSet(new DimensionSet());
147+
metricDirective.putDimensionSet(DimensionSet.of("Region", "us-east-1"));
148+
metricDirective.putDimensionSet(
149+
DimensionSet.of("Region", "us-east-1", "Instance", "inst-1"));
150+
metricDirective.putDimensionSet(
151+
DimensionSet.of("Instance", "inst-1", "Region", "us-east-1"));
152+
metricDirective.putDimensionSet(DimensionSet.of("Instance", "inst-1"));
153+
metricDirective.putDimensionSet(
154+
DimensionSet.of("Region", "us-east-1", "Instance", "inst-1"));
155+
metricDirective.putDimensionSet(
156+
DimensionSet.of("Instance", "inst-1", "Region", "us-east-1"));
157+
metricDirective.putDimensionSet(DimensionSet.of("Instance", "inst-1"));
158+
metricDirective.putDimensionSet(DimensionSet.of("Region", "us-east-1"));
159+
metricDirective.putDimensionSet(new DimensionSet());
160+
161+
String serializedMetricDirective = objectMapper.writeValueAsString(metricDirective);
162+
163+
assertEquals(
164+
serializedMetricDirective,
165+
"{\"Dimensions\":[[\"Instance\",\"Region\"],[\"Instance\"],[\"Region\"],[]],\"Metrics\":[],\"Namespace\":\"aws-embedded-metrics\"}");
138166
}
139167

140168
@Test

0 commit comments

Comments
 (0)