Skip to content

Commit e47aa69

Browse files
author
Aaron Michael Lamb
committed
fix: change putDimensions to update latest key-value for duplicates
This change ensures new dimension key-values are used for the EMF root node by moving duplicates 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 e47aa69

File tree

2 files changed

+37
-6
lines changed

2 files changed

+37
-6
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: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,14 @@ public void testPutMultipleDimensionSets() throws JsonProcessingException {
117117
@Test
118118
public void testPutMultipleDuplicateDimensionSets() 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,32 @@ 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 testPutMultipleDimensionsWillOrderCorrectly() throws JsonProcessingException {
144+
MetricDirective metricDirective = new MetricDirective();
145+
metricDirective.putDimensionSet(new DimensionSet());
146+
metricDirective.putDimensionSet(DimensionSet.of("Region", "us-east-1"));
147+
metricDirective.putDimensionSet(
148+
DimensionSet.of("Region", "us-east-1", "Instance", "inst-1"));
149+
metricDirective.putDimensionSet(
150+
DimensionSet.of("Instance", "inst-1", "Region", "us-east-1"));
151+
metricDirective.putDimensionSet(DimensionSet.of("Instance", "inst-1"));
152+
metricDirective.putDimensionSet(
153+
DimensionSet.of("Region", "us-east-1", "Instance", "inst-1"));
154+
metricDirective.putDimensionSet(
155+
DimensionSet.of("Instance", "inst-1", "Region", "us-east-1"));
156+
metricDirective.putDimensionSet(DimensionSet.of("Instance", "inst-1"));
157+
metricDirective.putDimensionSet(DimensionSet.of("Region", "us-east-1"));
158+
metricDirective.putDimensionSet(new DimensionSet());
159+
160+
String serializedMetricDirective = objectMapper.writeValueAsString(metricDirective);
161+
162+
assertEquals(
163+
serializedMetricDirective,
164+
"{\"Dimensions\":[[\"Instance\",\"Region\"],[\"Instance\"],[\"Region\"],[]],\"Metrics\":[],\"Namespace\":\"aws-embedded-metrics\"}");
138165
}
139166

140167
@Test

0 commit comments

Comments
 (0)