Skip to content

Commit 77d2457

Browse files
author
Pankaj Agrawal
committed
Cold start EMF capture feature parity
1 parent df1e3bf commit 77d2457

File tree

2 files changed

+42
-3
lines changed

2 files changed

+42
-3
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@
1010
public @interface PowertoolsMetrics {
1111
String namespace() default "";
1212
String service() default "";
13+
boolean captureColdStart() default false;
1314
}

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

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
package software.amazon.lambda.powertools.metrics.internal;
22

3+
import java.util.Optional;
4+
5+
import com.amazonaws.services.lambda.runtime.Context;
36
import org.aspectj.lang.ProceedingJoinPoint;
47
import org.aspectj.lang.annotation.Around;
58
import org.aspectj.lang.annotation.Aspect;
69
import org.aspectj.lang.annotation.Pointcut;
710
import software.amazon.cloudwatchlogs.emf.logger.MetricsLogger;
811
import software.amazon.cloudwatchlogs.emf.model.DimensionSet;
12+
import software.amazon.cloudwatchlogs.emf.model.Unit;
913
import software.amazon.lambda.powertools.metrics.PowertoolsMetrics;
1014

15+
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.coldStartDone;
16+
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.extractContext;
17+
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.isColdStart;
1118
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.isHandlerMethod;
1219
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.placedOnRequestHandler;
1320
import static software.amazon.lambda.powertools.core.internal.LambdaHandlerProcessor.placedOnStreamHandler;
@@ -34,16 +41,47 @@ public Object around(ProceedingJoinPoint pjp,
3441

3542
MetricsLogger logger = logger();
3643

37-
logger.setNamespace(!"".equals(powertoolsMetrics.namespace()) ? powertoolsMetrics.namespace() : NAMESPACE);
38-
logger.setDimensions(DimensionSet.of("service", !"".equals(powertoolsMetrics.service()) ? powertoolsMetrics.service() : serviceName()));
44+
logger.setNamespace(namespace(powertoolsMetrics))
45+
.setDimensions(DimensionSet.of("service", service(powertoolsMetrics)));
46+
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+
.putDimensions(DimensionSet.of("service", service(powertoolsMetrics)))
61+
.setNamespace(namespace(powertoolsMetrics))
62+
.putMetric("ColdStart", 1, Unit.COUNT);
63+
}
64+
}
3965

4066
Object proceed = pjp.proceed(proceedArgs);
4167

42-
logger.flush();
68+
if (null != coldStartLogger) {
69+
coldStartLogger.flush();
70+
}
4371

72+
coldStartDone();
73+
logger.flush();
4474
return proceed;
4575
}
4676

4777
return pjp.proceed(proceedArgs);
4878
}
79+
80+
private String namespace(PowertoolsMetrics powertoolsMetrics) {
81+
return !"".equals(powertoolsMetrics.namespace()) ? powertoolsMetrics.namespace() : NAMESPACE;
82+
}
83+
84+
private String service(PowertoolsMetrics powertoolsMetrics) {
85+
return !"".equals(powertoolsMetrics.service()) ? powertoolsMetrics.service() : serviceName();
86+
}
4987
}

0 commit comments

Comments
 (0)