Skip to content

Commit 6569c61

Browse files
authored
Issue 297: Add AwsRequestId to each EMF log. (#301)
1 parent 0f61739 commit 6569c61

File tree

2 files changed

+22
-15
lines changed

2 files changed

+22
-15
lines changed

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

+13-15
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package software.amazon.lambda.powertools.metrics.internal;
22

33
import java.lang.reflect.Field;
4-
import java.util.Optional;
54

6-
import com.amazonaws.services.lambda.runtime.Context;
75
import org.aspectj.lang.ProceedingJoinPoint;
86
import org.aspectj.lang.annotation.Around;
97
import org.aspectj.lang.annotation.Aspect;
@@ -25,7 +23,6 @@
2523
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.placedOnStreamHandler;
2624
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.serviceName;
2725
import static software.amazon.lambda.powertools.metrics.MetricsUtils.metricsLogger;
28-
import static software.amazon.lambda.powertools.metrics.MetricsUtils.withSingleMetric;
2926

3027
@Aspect
3128
public class LambdaMetricsAspect {
@@ -50,7 +47,10 @@ public Object around(ProceedingJoinPoint pjp,
5047
logger.setNamespace(namespace(metrics))
5148
.putDimensions(DimensionSet.of("Service", service(metrics)));
5249

53-
coldStartSingleMetricIfApplicable(pjp, metrics);
50+
extractContext(pjp).ifPresent((context) -> {
51+
coldStartSingleMetricIfApplicable(context.getAwsRequestId(), context.getFunctionName(), metrics);
52+
logger.putProperty("AwsRequestId", context.getAwsRequestId());
53+
});
5454

5555
try {
5656
return pjp.proceed(proceedArgs);
@@ -66,20 +66,19 @@ public Object around(ProceedingJoinPoint pjp,
6666
return pjp.proceed(proceedArgs);
6767
}
6868

69-
private void coldStartSingleMetricIfApplicable(final ProceedingJoinPoint pjp,
69+
private void coldStartSingleMetricIfApplicable(final String awsRequestId,
70+
final String functionName,
7071
final Metrics metrics) {
7172
if (metrics.captureColdStart()
7273
&& isColdStart()) {
73-
74-
Optional<Context> contextOptional = extractContext(pjp);
75-
76-
if (contextOptional.isPresent()) {
77-
Context context = contextOptional.orElseThrow(() -> new IllegalStateException("Context not found"));
78-
79-
withSingleMetric("ColdStart", 1, Unit.COUNT, namespace(metrics), (logger) ->
80-
logger.setDimensions(DimensionSet.of("Service", service(metrics), "FunctionName", context.getFunctionName())));
81-
}
74+
MetricsLogger metricsLogger = new MetricsLogger();
75+
metricsLogger.setNamespace(namespace(metrics));
76+
metricsLogger.putMetric("ColdStart", 1, Unit.COUNT);
77+
metricsLogger.setDimensions(DimensionSet.of("Service", service(metrics), "FunctionName", functionName));
78+
metricsLogger.putProperty("AwsRequestId", awsRequestId);
79+
metricsLogger.flush();
8280
}
81+
8382
}
8483

8584
private void validateBeforeFlushingMetrics(Metrics metrics) {
@@ -103,7 +102,6 @@ private String service(Metrics metrics) {
103102

104103
private void validateMetricsAndRefreshOnFailure(Metrics metrics) {
105104
try {
106-
107105
validateBeforeFlushingMetrics(metrics);
108106
} catch (ValidationException e){
109107
refreshMetricsContext();

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

+9
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ public void metricsWithoutColdStart() {
8282
assertThat(logAsJson)
8383
.containsEntry("Metric1", 1.0)
8484
.containsEntry("Service", "booking")
85+
.containsEntry("AwsRequestId", "123ABC")
8586
.containsKey("_aws");
8687
});
8788
}
@@ -105,6 +106,7 @@ public void metricsWithColdStart() {
105106
.doesNotContainKey("Metric1")
106107
.containsEntry("ColdStart", 1.0)
107108
.containsEntry("Service", "booking")
109+
.containsEntry("AwsRequestId", "123ABC")
108110
.containsKey("_aws");
109111

110112
logAsJson = readAsJson(s[1]);
@@ -113,6 +115,7 @@ public void metricsWithColdStart() {
113115
.doesNotContainKey("ColdStart")
114116
.containsEntry("Metric1", 1.0)
115117
.containsEntry("Service", "booking")
118+
.containsEntry("AwsRequestId", "123ABC")
116119
.containsKey("_aws");
117120
});
118121
}
@@ -136,6 +139,7 @@ public void noColdStartMetricsWhenColdStartDone() {
136139
.doesNotContainKey("Metric1")
137140
.containsEntry("ColdStart", 1.0)
138141
.containsEntry("Service", "booking")
142+
.containsEntry("AwsRequestId", "123ABC")
139143
.containsKey("_aws");
140144

141145
logAsJson = readAsJson(s[1]);
@@ -144,6 +148,7 @@ public void noColdStartMetricsWhenColdStartDone() {
144148
.doesNotContainKey("ColdStart")
145149
.containsEntry("Metric1", 1.0)
146150
.containsEntry("Service", "booking")
151+
.containsEntry("AwsRequestId", "123ABC")
147152
.containsKey("_aws");
148153

149154
logAsJson = readAsJson(s[2]);
@@ -152,6 +157,7 @@ public void noColdStartMetricsWhenColdStartDone() {
152157
.doesNotContainKey("ColdStart")
153158
.containsEntry("Metric1", 1.0)
154159
.containsEntry("Service", "booking")
160+
.containsEntry("AwsRequestId", "123ABC")
155161
.containsKey("_aws");
156162
});
157163
}
@@ -173,6 +179,7 @@ public void metricsWithStreamHandler() throws IOException {
173179
assertThat(logAsJson)
174180
.containsEntry("Metric1", 1.0)
175181
.containsEntry("Service", "booking")
182+
.containsEntry("AwsRequestId", "123ABC")
176183
.containsKey("_aws");
177184
});
178185
}
@@ -249,6 +256,7 @@ public void metricsPublishedEvenHandlerThrowsException() {
249256
assertThat(logAsJson)
250257
.containsEntry("CoolMetric", 1.0)
251258
.containsEntry("Service", "booking")
259+
.containsEntry("AwsRequestId", "123ABC")
252260
.containsKey("_aws");
253261
});
254262
}
@@ -259,6 +267,7 @@ private void setupContext() {
259267
when(context.getInvokedFunctionArn()).thenReturn("testArn");
260268
when(context.getFunctionVersion()).thenReturn("1");
261269
when(context.getMemoryLimitInMB()).thenReturn(10);
270+
when(context.getAwsRequestId()).thenReturn("123ABC");
262271
}
263272

264273
private Map<String, Object> readAsJson(String s) {

0 commit comments

Comments
 (0)