Skip to content

Commit 056abbb

Browse files
author
Mark Kuhn
committed
fix: prevent duplicate dimensions
1 parent 5aacb76 commit 056abbb

File tree

3 files changed

+65
-2
lines changed

3 files changed

+65
-2
lines changed

src/Amazon.CloudWatch.EMF/Model/MetricDirective.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,25 @@ internal List<List<string>> AllDimensionKeys
8080
}
8181
}
8282

83+
internal void PutDimension(DimensionSet dimensionSet)
84+
{
85+
// Duplicate dimensions sets are removed before being added to the end of the collection.
86+
// This ensures the latest dimension key-value is used as a target member on the root EMF node.
87+
// This operation is O(n^2), but acceptable given sets are capped at 10 dimensions
88+
List<string> incomingDimensionSetKeys = dimensionSet.DimensionKeys;
89+
CustomDimensionSets = CustomDimensionSets.Where(existingDimensionSet =>
90+
{
91+
if (existingDimensionSet.DimensionKeys.Count != incomingDimensionSetKeys.Count)
92+
{
93+
return true;
94+
}
95+
96+
return !existingDimensionSet.DimensionKeys.All(existingDimensionSetKey => incomingDimensionSetKeys.Contains(existingDimensionSetKey));
97+
}).ToList();
98+
99+
CustomDimensionSets.Add(dimensionSet);
100+
}
101+
83102
/// <summary>
84103
/// Overrides all existing dimensions, including suppressing any default dimensions.
85104
/// </summary>

src/Amazon.CloudWatch.EMF/Model/MetricsContext.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ public object GetProperty(string name)
151151
/// <param name="dimensionSet">the dimensions set to add.</param>
152152
public void PutDimension(DimensionSet dimensionSet)
153153
{
154-
_metricDirective.CustomDimensionSets.Add(dimensionSet);
154+
_metricDirective.PutDimension(dimensionSet);
155155
}
156156

157157
/// <summary>
@@ -166,7 +166,7 @@ public void PutDimension(string dimension, string value)
166166
{
167167
var dimensionSet = new DimensionSet();
168168
dimensionSet.AddDimension(dimension, value);
169-
_metricDirective.CustomDimensionSets.Add(dimensionSet);
169+
_metricDirective.PutDimension(dimensionSet);
170170
}
171171

172172
/// <summary>

tests/Amazon.CloudWatch.EMF.Tests/Logger/MetricsLoggerTests.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,50 @@ public void TestOverridePreviousDimensions()
9393
Assert.Equal(dimensionValue, _sink.MetricsContext.GetAllDimensionSets()[0].GetDimensionValue(dimensionName));
9494
}
9595

96+
[Fact]
97+
public void TestPutDuplicateDimensions()
98+
{
99+
string dimensionName1 = "dim1";
100+
string dimensionName2 = "dim2";
101+
string dimensionValue1 = "dimValue1";
102+
string dimensionValue2 = "dimValue2";
103+
string dimensionValue3 = "dimValue3";
104+
string dimensionValue4 = "dimValue4";
105+
106+
_metricsLogger.PutDimensions(new DimensionSet(dimensionName1, dimensionValue1));
107+
_metricsLogger.PutDimensions(new DimensionSet(dimensionName2, dimensionValue2));
108+
_metricsLogger.PutDimensions(new DimensionSet(dimensionName1, dimensionValue3));
109+
_metricsLogger.PutDimensions(new DimensionSet(dimensionName2, dimensionValue4));
110+
_metricsLogger.Flush();
111+
112+
Assert.Equal(4, _sink.MetricsContext.GetAllDimensionSets()[0].DimensionKeys.Count);
113+
Assert.Equal(dimensionValue3, _sink.MetricsContext.GetAllDimensionSets()[0].GetDimensionValue(dimensionName1));
114+
Assert.Equal(dimensionValue4, _sink.MetricsContext.GetAllDimensionSets()[0].GetDimensionValue(dimensionName2));
115+
}
116+
117+
[Fact]
118+
public void TestSetPutDuplicateDimensions()
119+
{
120+
string dimensionName1 = "dim1";
121+
string dimensionName2 = "dim2";
122+
string dimensionName3 = "dim3";
123+
string dimensionValue1 = "dimValue1";
124+
string dimensionValue2 = "dimValue2";
125+
string dimensionValue3 = "dimValue3";
126+
string dimensionValue4 = "dimValue4";
127+
128+
_metricsLogger.PutDimensions(new DimensionSet(dimensionName1, dimensionValue1));
129+
_metricsLogger.SetDimensions(new DimensionSet(dimensionName2, dimensionValue1));
130+
_metricsLogger.PutDimensions(new DimensionSet(dimensionName3, dimensionValue2));
131+
_metricsLogger.PutDimensions(new DimensionSet(dimensionName2, dimensionValue3));
132+
_metricsLogger.PutDimensions(new DimensionSet(dimensionName3, dimensionValue4));
133+
_metricsLogger.Flush();
134+
135+
Assert.Equal(2, _sink.MetricsContext.GetAllDimensionSets().Count);
136+
Assert.Equal(dimensionValue3, _sink.MetricsContext.GetAllDimensionSets()[0].GetDimensionValue(dimensionName2));
137+
Assert.Equal(dimensionValue4, _sink.MetricsContext.GetAllDimensionSets()[1].GetDimensionValue(dimensionName3));
138+
}
139+
96140
[Fact]
97141
public void TestSetNameSpace()
98142
{

0 commit comments

Comments
 (0)