1
1
package software .amazon .lambda .powertools .metrics .internal ;
2
2
3
+ import java .util .Optional ;
4
+
5
+ import com .amazonaws .services .lambda .runtime .Context ;
3
6
import org .aspectj .lang .ProceedingJoinPoint ;
4
7
import org .aspectj .lang .annotation .Around ;
5
8
import org .aspectj .lang .annotation .Aspect ;
6
9
import org .aspectj .lang .annotation .Pointcut ;
7
10
import software .amazon .cloudwatchlogs .emf .logger .MetricsLogger ;
8
11
import software .amazon .cloudwatchlogs .emf .model .DimensionSet ;
12
+ import software .amazon .cloudwatchlogs .emf .model .Unit ;
9
13
import software .amazon .lambda .powertools .metrics .PowertoolsMetrics ;
10
14
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 ;
11
18
import static software .amazon .lambda .powertools .core .internal .LambdaHandlerProcessor .isHandlerMethod ;
12
19
import static software .amazon .lambda .powertools .core .internal .LambdaHandlerProcessor .placedOnRequestHandler ;
13
20
import static software .amazon .lambda .powertools .core .internal .LambdaHandlerProcessor .placedOnStreamHandler ;
@@ -34,16 +41,47 @@ public Object around(ProceedingJoinPoint pjp,
34
41
35
42
MetricsLogger logger = logger ();
36
43
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
+ }
39
65
40
66
Object proceed = pjp .proceed (proceedArgs );
41
67
42
- logger .flush ();
68
+ if (null != coldStartLogger ) {
69
+ coldStartLogger .flush ();
70
+ }
43
71
72
+ coldStartDone ();
73
+ logger .flush ();
44
74
return proceed ;
45
75
}
46
76
47
77
return pjp .proceed (proceedArgs );
48
78
}
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
+ }
49
87
}
0 commit comments