Skip to content

Commit 63588ff

Browse files
committed
upgraded embedded metrics library and associated tests
1 parent fb14bcf commit 63588ff

File tree

8 files changed

+76
-14
lines changed

8 files changed

+76
-14
lines changed

examples/powertools-examples-core-utilities/sam/src/main/java/helloworld/App.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.slf4j.Logger;
3333
import org.slf4j.LoggerFactory;
3434
import software.amazon.cloudwatchlogs.emf.model.DimensionSet;
35+
import software.amazon.cloudwatchlogs.emf.model.StorageResolution;
3536
import software.amazon.cloudwatchlogs.emf.model.Unit;
3637
import software.amazon.lambda.powertools.logging.Logging;
3738
import software.amazon.lambda.powertools.logging.LoggingUtils;
@@ -63,6 +64,8 @@ public APIGatewayProxyResponseEvent handleRequest(final APIGatewayProxyRequestEv
6364
metric.setDimensions(DimensionSet.of("AnotherService1", "CustomService1"));
6465
});
6566

67+
metricsLogger().putMetric("CustomMetric3", 1, Unit.COUNT, StorageResolution.HIGH);
68+
6669
LoggingUtils.appendKey("test", "willBeLogged");
6770

6871
APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent()

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@
107107
<maven-source-plugin.version>3.3.0</maven-source-plugin.version>
108108
<maven-gpg-plugin.version>3.1.0</maven-gpg-plugin.version>
109109
<junit.version>5.10.0</junit.version>
110-
<aws-embedded-metrics.version>1.0.6</aws-embedded-metrics.version>
110+
<aws-embedded-metrics.version>4.1.2</aws-embedded-metrics.version>
111111
<jmespath.version>0.6.0</jmespath.version>
112112
<elastic.version>1.5.0</elastic.version>
113113

powertools-e2e-tests/handlers/metrics/src/main/java/software/amazon/lambda/powertools/e2e/Function.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,15 @@
1818
import com.amazonaws.services.lambda.runtime.RequestHandler;
1919
import software.amazon.cloudwatchlogs.emf.logger.MetricsLogger;
2020
import software.amazon.cloudwatchlogs.emf.model.DimensionSet;
21+
import software.amazon.cloudwatchlogs.emf.model.StorageResolution;
2122
import software.amazon.cloudwatchlogs.emf.model.Unit;
2223
import software.amazon.lambda.powertools.metrics.Metrics;
2324
import software.amazon.lambda.powertools.metrics.MetricsUtils;
25+
import java.time.LocalDateTime;
26+
import java.time.ZoneOffset;
27+
import java.time.temporal.ChronoUnit;
28+
import java.time.Instant;
29+
2430

2531
public class Function implements RequestHandler<Input, String> {
2632

@@ -29,11 +35,14 @@ public class Function implements RequestHandler<Input, String> {
2935
@Metrics(captureColdStart = true)
3036
public String handleRequest(Input input, Context context) {
3137

38+
Instant currentTimeTruncatedPlusThirty = LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES).toInstant(ZoneOffset.UTC).plusSeconds(30);
39+
metricsLogger.setTimestamp(currentTimeTruncatedPlusThirty);
40+
3241
DimensionSet dimensionSet = new DimensionSet();
3342
input.getDimensions().forEach((key, value) -> dimensionSet.addDimension(key, value));
3443
metricsLogger.putDimensions(dimensionSet);
3544

36-
input.getMetrics().forEach((key, value) -> metricsLogger.putMetric(key, value, Unit.COUNT));
45+
input.getMetrics().forEach((key, value) -> metricsLogger.putMetric(key, value, Unit.COUNT,input.getHighResolution().equalsIgnoreCase("true") ? StorageResolution.HIGH : StorageResolution.STANDARD ));
3746

3847
return "OK";
3948
}

powertools-e2e-tests/handlers/metrics/src/main/java/software/amazon/lambda/powertools/e2e/Input.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ public class Input {
2121

2222
private Map<String, String> dimensions;
2323

24+
private String highResolution;
25+
2426
public Input() {
2527
}
2628

@@ -32,6 +34,14 @@ public void setMetrics(Map<String, Double> metrics) {
3234
this.metrics = metrics;
3335
}
3436

37+
public String getHighResolution() {
38+
return highResolution;
39+
}
40+
41+
public void setHighResolution(String highResolution) {
42+
this.highResolution = highResolution;
43+
}
44+
3545
public Map<String, String> getDimensions() {
3646
return dimensions;
3747
}

powertools-e2e-tests/src/test/java/software/amazon/lambda/powertools/MetricsE2ET.java

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818
import static software.amazon.lambda.powertools.testutils.Infrastructure.FUNCTION_NAME_OUTPUT;
1919
import static software.amazon.lambda.powertools.testutils.lambda.LambdaInvoker.invokeFunction;
2020

21+
import java.time.Instant;
22+
import java.time.LocalDateTime;
23+
import java.time.ZoneOffset;
24+
import java.time.temporal.ChronoUnit;
2125
import java.util.Collections;
2226
import java.util.List;
2327
import java.util.Map;
@@ -66,12 +70,19 @@ public static void tearDown() {
6670
@Test
6771
public void test_recordMetrics() {
6872
// GIVEN
73+
74+
Instant currentTimeTruncatedToMinutes = LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES).toInstant(ZoneOffset.UTC);
75+
6976
String event1 =
70-
"{ \"metrics\": {\"orders\": 1, \"products\": 4}, \"dimensions\": { \"Environment\": \"test\"} }";
77+
"{ \"metrics\": {\"orders\": 1, \"products\": 4}, \"dimensions\": { \"Environment\": \"test\"}, \"highResolution\": \"false\"}";
7178

79+
String event2 =
80+
"{ \"metrics\": {\"orders\": 1, \"products\": 8}, \"dimensions\": { \"Environment\": \"test\"}, \"highResolution\": \"true\"}";
7281
// WHEN
7382
InvocationResult invocationResult = invokeFunction(functionName, event1);
7483

84+
invokeFunction(functionName, event2);
85+
7586
// THEN
7687
MetricsFetcher metricsFetcher = new MetricsFetcher();
7788
List<Double> coldStart =
@@ -84,18 +95,35 @@ public void test_recordMetrics() {
8495
List<Double> orderMetrics =
8596
metricsFetcher.fetchMetrics(invocationResult.getStart(), invocationResult.getEnd(), 60, namespace,
8697
"orders", Collections.singletonMap("Environment", "test"));
87-
assertThat(orderMetrics.get(0)).isEqualTo(1);
98+
assertThat(orderMetrics.get(0)).isEqualTo(2);
8899
List<Double> productMetrics =
89100
metricsFetcher.fetchMetrics(invocationResult.getStart(), invocationResult.getEnd(), 60, namespace,
90101
"products", Collections.singletonMap("Environment", "test"));
91-
assertThat(productMetrics.get(0)).isEqualTo(4);
102+
103+
// When searching across a 1 minute time period with a period of 60 we find both metrics and the sum is 12
104+
105+
assertThat(productMetrics.get(0)).isEqualTo(12);
106+
92107
orderMetrics =
93108
metricsFetcher.fetchMetrics(invocationResult.getStart(), invocationResult.getEnd(), 60, namespace,
94109
"orders", Collections.singletonMap("Service", service));
95-
assertThat(orderMetrics.get(0)).isEqualTo(1);
110+
assertThat(orderMetrics.get(0)).isEqualTo(2);
96111
productMetrics =
97112
metricsFetcher.fetchMetrics(invocationResult.getStart(), invocationResult.getEnd(), 60, namespace,
98113
"products", Collections.singletonMap("Service", service));
99-
assertThat(productMetrics.get(0)).isEqualTo(4);
114+
assertThat(productMetrics.get(0)).isEqualTo(12);
115+
116+
Instant searchStartTime = currentTimeTruncatedToMinutes.plusSeconds(15);
117+
Instant searchEndTime = currentTimeTruncatedToMinutes.plusSeconds(45);
118+
119+
List<Double> productMetricDataResult =
120+
metricsFetcher.fetchMetrics(searchStartTime, searchEndTime, 1, namespace,
121+
"products", Collections.singletonMap("Environment", "test"));
122+
123+
// We are searching across the time period the metric was created but with a period of 1 second. Only the high resolution metric will be available at this point
124+
125+
assertThat(productMetricDataResult.get(0)).isEqualTo(8);
126+
127+
100128
}
101129
}

powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/MetricsLoggerTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import com.fasterxml.jackson.databind.ObjectMapper;
2626
import java.io.ByteArrayOutputStream;
2727
import java.io.PrintStream;
28+
import java.util.ArrayList;
29+
import java.util.LinkedHashMap;
2830
import java.util.Map;
2931
import java.util.function.Consumer;
3032
import org.junit.jupiter.api.AfterEach;
@@ -35,6 +37,7 @@
3537
import software.amazon.cloudwatchlogs.emf.config.SystemWrapper;
3638
import software.amazon.cloudwatchlogs.emf.logger.MetricsLogger;
3739
import software.amazon.cloudwatchlogs.emf.model.DimensionSet;
40+
import software.amazon.cloudwatchlogs.emf.model.StorageResolution;
3841
import software.amazon.cloudwatchlogs.emf.model.Unit;
3942

4043
class MetricsLoggerTest {
@@ -245,6 +248,7 @@ private void testLogger(Consumer<Consumer<MetricsLogger>> methodToTest) {
245248
{
246249
metricsLogger.setDimensions(DimensionSet.of("Dimension1", "Value1"));
247250
metricsLogger.putMetric("Metric1", 1, Unit.COUNT);
251+
metricsLogger.putMetric("Metric2", 1, Unit.COUNT, StorageResolution.HIGH);
248252
});
249253

250254
assertThat(out.toString())
@@ -263,6 +267,12 @@ private void testLogger(Consumer<Consumer<MetricsLogger>> methodToTest) {
263267
assertThat(aws.get("CloudWatchMetrics"))
264268
.asString()
265269
.contains("Namespace=GlobalName");
270+
271+
ArrayList cloudWatchMetrics = (ArrayList) aws.get("CloudWatchMetrics");
272+
LinkedHashMap<String,Object> values = (java.util.LinkedHashMap<String, Object>) cloudWatchMetrics.get(0);
273+
ArrayList metricArray = (ArrayList) values.get("Metrics");
274+
LinkedHashMap<String,Object> metricValues = (LinkedHashMap<String, Object>) metricArray.get(1);
275+
assertThat(metricValues.get("StorageResolution")).isEqualTo(1);
266276
});
267277
}
268278
}

powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsTooManyDimensionsHandler.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,14 @@
2626
public class PowertoolsMetricsTooManyDimensionsHandler implements RequestHandler<Object, Object> {
2727

2828
@Override
29-
@Metrics
29+
@Metrics(namespace = "ExampleApplication",service = "booking")
3030
public Object handleRequest(Object input, Context context) {
3131
MetricsLogger metricsLogger = metricsLogger();
32-
33-
metricsLogger.setDimensions(IntStream.range(1, 15)
34-
.mapToObj(value -> DimensionSet.of("Dimension" + value, "DimensionValue" + value))
35-
.toArray(DimensionSet[]::new));
32+
DimensionSet dimensionSet = new DimensionSet();
33+
for (int i = 0; i < 35; i++) {
34+
dimensionSet.addDimension("Dimension" + i, "value" + i);
35+
}
36+
metricsLogger.setDimensions(dimensionSet);
3637

3738
return null;
3839
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.mockito.Mock;
4141
import org.mockito.MockedStatic;
4242
import software.amazon.cloudwatchlogs.emf.config.SystemWrapper;
43+
import software.amazon.cloudwatchlogs.emf.exception.DimensionSetExceededException;
4344
import software.amazon.lambda.powertools.common.internal.LambdaHandlerProcessor;
4445
import software.amazon.lambda.powertools.metrics.MetricsUtils;
4546
import software.amazon.lambda.powertools.metrics.ValidationException;
@@ -389,9 +390,9 @@ public void exceptionWhenTooManyDimensionsSet() {
389390

390391
requestHandler = new PowertoolsMetricsTooManyDimensionsHandler();
391392

392-
assertThatExceptionOfType(ValidationException.class)
393+
assertThatExceptionOfType(DimensionSetExceededException.class)
393394
.isThrownBy(() -> requestHandler.handleRequest("input", context))
394-
.withMessage("Number of Dimensions must be in range of 0-9. Actual size: 14.");
395+
.withMessage("Maximum number of dimensions allowed are 30. Account for default dimensions if not using setDimensions.");
395396
}
396397
}
397398

0 commit comments

Comments
 (0)