Skip to content

Commit 3b7c97c

Browse files
author
Pankaj Agrawal
committed
Test cases for metric util
1 parent aebcc04 commit 3b7c97c

File tree

7 files changed

+300
-39
lines changed

7 files changed

+300
-39
lines changed

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,12 @@
182182
<version>3.5.10</version>
183183
<scope>test</scope>
184184
</dependency>
185+
<dependency>
186+
<groupId>org.mockito</groupId>
187+
<artifactId>mockito-inline</artifactId>
188+
<version>3.5.10</version>
189+
<scope>test</scope>
190+
</dependency>
185191
<dependency>
186192
<groupId>org.aspectj</groupId>
187193
<artifactId>aspectjweaver</artifactId>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import software.amazon.cloudwatchlogs.emf.model.Unit;
77

88
public final class PowertoolsMetricsLogger {
9-
private static MetricsLogger metricsLogger = new MetricsLogger();
9+
private static final MetricsLogger metricsLogger = new MetricsLogger();
1010

1111
public static MetricsLogger metricsLogger() {
1212
return metricsLogger;

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

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -44,24 +44,7 @@ public Object around(ProceedingJoinPoint pjp,
4444
logger.setNamespace(namespace(powertoolsMetrics))
4545
.setDimensions(DimensionSet.of("service", service(powertoolsMetrics)));
4646

47-
MetricsLogger coldStartLogger = null;
48-
49-
if (powertoolsMetrics.captureColdStart()
50-
&& isColdStart()) {
51-
52-
Optional<Context> contextOptional = extractContext(pjp);
53-
54-
if (contextOptional.isPresent()) {
55-
Context context = contextOptional.orElseThrow(() -> new IllegalStateException("Context not found"));
56-
57-
coldStartLogger = new MetricsLogger();
58-
59-
coldStartLogger.putDimensions(DimensionSet.of("function_name", context.getFunctionName()))
60-
.setDimensions(DimensionSet.of("service", service(powertoolsMetrics)))
61-
.setNamespace(namespace(powertoolsMetrics))
62-
.putMetric("ColdStart", 1, Unit.COUNT);
63-
}
64-
}
47+
MetricsLogger coldStartLogger = coldStartSingleMetricIfApplicable(pjp, powertoolsMetrics);
6548

6649
Object proceed = pjp.proceed(proceedArgs);
6750

@@ -77,6 +60,28 @@ && isColdStart()) {
7760
return pjp.proceed(proceedArgs);
7861
}
7962

63+
private MetricsLogger coldStartSingleMetricIfApplicable(final ProceedingJoinPoint pjp,
64+
final PowertoolsMetrics powertoolsMetrics) {
65+
if (powertoolsMetrics.captureColdStart()
66+
&& isColdStart()) {
67+
68+
Optional<Context> contextOptional = extractContext(pjp);
69+
70+
if (contextOptional.isPresent()) {
71+
Context context = contextOptional.orElseThrow(() -> new IllegalStateException("Context not found"));
72+
73+
MetricsLogger coldStartLogger = new MetricsLogger();
74+
75+
return coldStartLogger.putDimensions(DimensionSet.of("function_name", context.getFunctionName()))
76+
.setDimensions(DimensionSet.of("service", service(powertoolsMetrics)))
77+
.setNamespace(namespace(powertoolsMetrics))
78+
.putMetric("ColdStart", 1, Unit.COUNT);
79+
}
80+
}
81+
82+
return null;
83+
}
84+
8085
private String namespace(PowertoolsMetrics powertoolsMetrics) {
8186
return !"".equals(powertoolsMetrics.namespace()) ? powertoolsMetrics.namespace() : NAMESPACE;
8287
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package software.amazon.lambda.powertools.metrics;
2+
3+
import java.io.ByteArrayOutputStream;
4+
import java.io.PrintStream;
5+
import java.util.Collections;
6+
import java.util.Map;
7+
8+
import com.fasterxml.jackson.core.JsonProcessingException;
9+
import com.fasterxml.jackson.databind.ObjectMapper;
10+
import org.junit.jupiter.api.AfterEach;
11+
import org.junit.jupiter.api.BeforeAll;
12+
import org.junit.jupiter.api.BeforeEach;
13+
import org.junit.jupiter.api.Test;
14+
import org.mockito.MockedStatic;
15+
import software.amazon.cloudwatchlogs.emf.config.SystemWrapper;
16+
import software.amazon.cloudwatchlogs.emf.model.DimensionSet;
17+
import software.amazon.cloudwatchlogs.emf.model.Unit;
18+
19+
import static java.util.Collections.*;
20+
import static org.assertj.core.api.Assertions.assertThat;
21+
import static org.mockito.Mockito.mockStatic;
22+
23+
class PowertoolsMetricsLoggerTest {
24+
25+
private final ByteArrayOutputStream out = new ByteArrayOutputStream();
26+
private final PrintStream originalOut = System.out;
27+
private final ObjectMapper mapper = new ObjectMapper();
28+
29+
@BeforeEach
30+
void setUp() {
31+
System.setOut(new PrintStream(out));
32+
}
33+
34+
@AfterEach
35+
void tearDown() {
36+
System.setOut(originalOut);
37+
}
38+
39+
@BeforeAll
40+
static void beforeAll() {
41+
try (MockedStatic<SystemWrapper> mocked = mockStatic(SystemWrapper.class)) {
42+
mocked.when(() -> SystemWrapper.getenv("AWS_EMF_ENVIRONMENT")).thenReturn("Lambda");
43+
}
44+
}
45+
46+
@Test
47+
void singleMetricsCaptureUtility() {
48+
try (MockedStatic<SystemWrapper> mocked = mockStatic(SystemWrapper.class)) {
49+
mocked.when(() -> SystemWrapper.getenv("AWS_EMF_ENVIRONMENT")).thenReturn("Lambda");
50+
51+
PowertoolsMetricsLogger.withSingleMetric("Metric1", 1, Unit.COUNT, "test",
52+
metricsLogger -> metricsLogger.setDimensions(DimensionSet.of("Dimension1", "Value1")));
53+
54+
assertThat(out.toString())
55+
.satisfies(s -> {
56+
Map<String, Object> logAsJson = readAsJson(s);
57+
58+
assertThat(logAsJson)
59+
.containsEntry("Metric1", 1.0)
60+
.containsEntry("Dimension1", "Value1")
61+
.containsKey("_aws");
62+
});
63+
}
64+
}
65+
66+
private Map<String, Object> readAsJson(String s) {
67+
try {
68+
return mapper.readValue(s, Map.class);
69+
} catch (JsonProcessingException e) {
70+
e.printStackTrace();
71+
}
72+
return emptyMap();
73+
}
74+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package software.amazon.lambda.powertools.metrics.handlers;
2+
3+
import com.amazonaws.services.lambda.runtime.Context;
4+
import com.amazonaws.services.lambda.runtime.RequestHandler;
5+
import software.amazon.cloudwatchlogs.emf.logger.MetricsLogger;
6+
import software.amazon.cloudwatchlogs.emf.model.Unit;
7+
import software.amazon.lambda.powertools.metrics.PowertoolsMetrics;
8+
9+
import static software.amazon.lambda.powertools.metrics.PowertoolsMetricsLogger.metricsLogger;
10+
11+
public class PowertoolsMetricsColdStartEnabledHandler implements RequestHandler<Object, Object> {
12+
13+
@Override
14+
@PowertoolsMetrics(namespace = "ExampleApplication", service = "booking", captureColdStart = true)
15+
public Object handleRequest(Object input, Context context) {
16+
MetricsLogger metricsLogger = metricsLogger();
17+
metricsLogger.putMetric("Metric1", 1, Unit.BYTES);
18+
19+
return null;
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package software.amazon.lambda.powertools.metrics.handlers;
2+
3+
import java.io.IOException;
4+
import java.io.InputStream;
5+
import java.io.OutputStream;
6+
7+
import com.amazonaws.services.lambda.runtime.Context;
8+
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
9+
import software.amazon.cloudwatchlogs.emf.logger.MetricsLogger;
10+
import software.amazon.cloudwatchlogs.emf.model.Unit;
11+
import software.amazon.lambda.powertools.metrics.PowertoolsMetrics;
12+
13+
import static software.amazon.lambda.powertools.metrics.PowertoolsMetricsLogger.metricsLogger;
14+
15+
public class PowertoolsMetricsEnabledStreamHandler implements RequestStreamHandler {
16+
17+
@Override
18+
@PowertoolsMetrics(namespace = "ExampleApplication", service = "booking")
19+
public void handleRequest(InputStream input, OutputStream output, Context context) {
20+
MetricsLogger metricsLogger = metricsLogger();
21+
metricsLogger.putMetric("Metric1", 1, Unit.BYTES);
22+
}
23+
}

0 commit comments

Comments
 (0)