Skip to content

Commit feeefdc

Browse files
committed
Overload void addDimension(DimensionSet dimensionSet) to be able to add multi-dimensional dimensions also for non default dimensions.
1 parent ac56a5b commit feeefdc

File tree

4 files changed

+82
-21
lines changed

4 files changed

+82
-21
lines changed

powertools-metrics/src/main/java/software/amazon/lambda/powertools/metrics/MetricsLogger.java

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,22 @@ default void addMetric(String key, double value) {
5858
}
5959

6060
/**
61-
* Add a dimension to the metrics logger
61+
* Add a dimension to the metrics logger.
62+
* This is equivalent to calling {@code addDimension(DimensionSet.of(key, value))}
6263
*
6364
* @param key the name of the dimension
6465
* @param value the value of the dimension
6566
*/
66-
void addDimension(String key, String value);
67+
default void addDimension(String key, String value) {
68+
addDimension(DimensionSet.of(key, value));
69+
}
70+
71+
/**
72+
* Add a dimension set to the metrics logger
73+
*
74+
* @param dimensionSet the dimension set to add
75+
*/
76+
void addDimension(DimensionSet dimensionSet);
6777

6878
/**
6979
* Add metadata to the metrics logger
@@ -79,7 +89,7 @@ default void addMetric(String key, double value) {
7989
* @param defaultDimensions map of default dimensions
8090
*/
8191
void setDefaultDimensions(Map<String, String> defaultDimensions);
82-
92+
8393
/**
8494
* Get the default dimensions for the metrics logger
8595
*
@@ -118,7 +128,7 @@ default void addMetric(String key, double value) {
118128
* @param dimensions custom dimensions for this metric (optional)
119129
*/
120130
void captureColdStartMetric(Context context, DimensionSet dimensions);
121-
131+
122132
/**
123133
* Capture cold start metric and flush immediately
124134
*
@@ -127,19 +137,19 @@ default void addMetric(String key, double value) {
127137
default void captureColdStartMetric(Context context) {
128138
captureColdStartMetric(context, null);
129139
}
130-
140+
131141
/**
132142
* Capture cold start metric without Lambda context and flush immediately
133143
*
134144
* @param dimensions custom dimensions for this metric (optional)
135145
*/
136146
void captureColdStartMetric(DimensionSet dimensions);
137-
147+
138148
/**
139149
* Capture cold start metric without Lambda context and flush immediately
140150
*/
141151
default void captureColdStartMetric() {
142-
captureColdStartMetric((DimensionSet)null);
152+
captureColdStartMetric((DimensionSet) null);
143153
}
144154

145155
/**
@@ -152,9 +162,9 @@ default void captureColdStartMetric() {
152162
* @param namespace the namespace for the metric
153163
* @param dimensions custom dimensions for this metric (optional)
154164
*/
155-
void pushSingleMetric(String name, double value, MetricUnit unit, String namespace,
156-
DimensionSet dimensions);
157-
165+
void pushSingleMetric(String name, double value, MetricUnit unit, String namespace,
166+
DimensionSet dimensions);
167+
158168
/**
159169
* Push a single metric with custom dimensions. This creates a separate metrics context
160170
* that doesn't affect the default metrics context.
@@ -167,4 +177,4 @@ void pushSingleMetric(String name, double value, MetricUnit unit, String namespa
167177
default void pushSingleMetric(String name, double value, MetricUnit unit, String namespace) {
168178
pushSingleMetric(name, value, unit, namespace, null);
169179
}
170-
}
180+
}

powertools-metrics/src/main/java/software/amazon/lambda/powertools/metrics/internal/EmfMetricsLogger.java

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,16 +64,23 @@ public void addMetric(String key, double value, MetricUnit unit, MetricResolutio
6464
}
6565

6666
@Override
67-
public void addDimension(String key, String value) {
68-
DimensionSet dimensionSet = new DimensionSet();
69-
try {
70-
dimensionSet.addDimension(key, value);
71-
emfLogger.putDimensions(dimensionSet);
72-
// Update our local copy of default dimensions
73-
defaultDimensions.put(key, value);
74-
} catch (Exception e) {
75-
// Ignore dimension errors
67+
public void addDimension(software.amazon.lambda.powertools.metrics.model.DimensionSet dimensionSet) {
68+
if (dimensionSet == null) {
69+
throw new IllegalArgumentException("DimensionSet cannot be null");
7670
}
71+
72+
DimensionSet emfDimensionSet = new DimensionSet();
73+
dimensionSet.getDimensions().forEach((key, val) -> {
74+
try {
75+
emfDimensionSet.addDimension(key, val);
76+
// Update our local copy of default dimensions
77+
defaultDimensions.put(key, val);
78+
} catch (Exception e) {
79+
// Ignore dimension errors
80+
}
81+
});
82+
83+
emfLogger.putDimensions(emfDimensionSet);
7784
}
7885

7986
@Override

powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/internal/EmfMetricsLoggerTest.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,50 @@ void shouldAddDimension() throws Exception {
182182
}
183183
assertThat(hasDimension).isTrue();
184184
}
185+
186+
@Test
187+
void shouldAddDimensionSet() throws Exception {
188+
// Given
189+
DimensionSet dimensionSet = DimensionSet.of("Dim1", "Value1", "Dim2", "Value2");
190+
191+
// When
192+
metricsLogger.clearDefaultDimensions(); // Clear default Service dimension first for easier assertions
193+
metricsLogger.addDimension(dimensionSet);
194+
metricsLogger.addMetric("test-metric", 100);
195+
metricsLogger.flush();
196+
197+
// Then
198+
String emfOutput = outputStreamCaptor.toString().trim();
199+
JsonNode rootNode = objectMapper.readTree(emfOutput);
200+
201+
assertThat(rootNode.has("Dim1")).isTrue();
202+
assertThat(rootNode.get("Dim1").asText()).isEqualTo("Value1");
203+
assertThat(rootNode.has("Dim2")).isTrue();
204+
assertThat(rootNode.get("Dim2").asText()).isEqualTo("Value2");
205+
206+
// Check that the dimensions are in the CloudWatchMetrics section
207+
JsonNode dimensions = rootNode.get("_aws").get("CloudWatchMetrics").get(0).get("Dimensions").get(0);
208+
boolean hasDim1 = false;
209+
boolean hasDim2 = false;
210+
for (JsonNode dimension : dimensions) {
211+
String dimName = dimension.asText();
212+
if (dimName.equals("Dim1")) {
213+
hasDim1 = true;
214+
} else if (dimName.equals("Dim2")) {
215+
hasDim2 = true;
216+
}
217+
}
218+
assertThat(hasDim1).isTrue();
219+
assertThat(hasDim2).isTrue();
220+
}
221+
222+
@Test
223+
void shouldThrowExceptionWhenDimensionSetIsNull() {
224+
// When/Then
225+
assertThatThrownBy(() -> metricsLogger.addDimension((DimensionSet) null))
226+
.isInstanceOf(IllegalArgumentException.class)
227+
.hasMessage("DimensionSet cannot be null");
228+
}
185229

186230
@Test
187231
void shouldAddMetadata() throws Exception {

powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/testutils/TestMetricsLogger.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public void addMetric(String key, double value, MetricUnit unit, MetricResolutio
2727
}
2828

2929
@Override
30-
public void addDimension(String key, String value) {
30+
public void addDimension(DimensionSet dimensionSet) {
3131
// Test placeholder
3232
}
3333

0 commit comments

Comments
 (0)