Skip to content
This repository was archived by the owner on Jun 13, 2023. It is now read-only.

Commit 45270fb

Browse files
authored
fix(aws_lambda): fix cold start detection in provisioned concurrency functions (#357)
1 parent 64fd540 commit 45270fb

2 files changed

Lines changed: 52 additions & 0 deletions

File tree

epsagon/wrappers/aws_lambda.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"""
44

55
from __future__ import absolute_import
6+
import os
67
import traceback
78
import time
89
import copy
@@ -35,6 +36,7 @@ def _add_status_code(runner, return_value):
3536
runner.resource['metadata']['status_code'] = status_code
3637

3738

39+
# pylint: disable=too-many-statements
3840
def lambda_wrapper(func):
3941
"""Epsagon's Lambda wrapper."""
4042

@@ -58,6 +60,11 @@ def _lambda_wrapper(*args, **kwargs):
5860
# parameters / sends kwargs. In such case we ignore this trace.
5961
return func(*args, **kwargs)
6062

63+
if os.environ.get(
64+
'AWS_LAMBDA_INITIALIZATION_TYPE'
65+
) == 'provisioned-concurrency':
66+
constants.COLD_START = False
67+
6168
try:
6269
runner = epsagon.runners.aws_lambda.LambdaRunner(
6370
time.time(),

tests/wrappers/test_lambda_wrapper.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import os
12
import json
23
import mock
34
import pytest
@@ -81,9 +82,53 @@ def wrapped_lambda(event, context):
8182
trace_mock.add_exception.assert_not_called()
8283

8384
assert not epsagon.constants.COLD_START
85+
assert runner.resource['metadata']['cold_start'] == True
8486
assert runner.resource['metadata']['return_value'] == retval
8587

8688

89+
@mock.patch.object(LambdaRunner, 'set_exception')
90+
@mock.patch(
91+
'epsagon.trace.trace_factory.get_trace',
92+
side_effect=lambda: trace_mock
93+
)
94+
@mock.patch(
95+
'epsagon.trace.trace_factory.get_or_create_trace',
96+
side_effect=lambda: trace_mock
97+
)
98+
@mock.patch(
99+
'epsagon.triggers.aws_lambda.LambdaTriggerFactory.factory',
100+
side_effect=['trigger']
101+
)
102+
def test_lambda_wrapper_provisioned_concurrency_sanity(
103+
trigger_factory_mock,
104+
_,
105+
__,
106+
set_exception_mock
107+
):
108+
retval = 'success'
109+
110+
@epsagon.wrappers.aws_lambda.lambda_wrapper
111+
def wrapped_lambda(event, context):
112+
return 'success'
113+
114+
os.environ['AWS_LAMBDA_INITIALIZATION_TYPE'] = 'provisioned-concurrency'
115+
assert wrapped_lambda('a', CONTEXT_STUB) == 'success'
116+
trace_mock.prepare.assert_called()
117+
runner = _get_runner_event(trace_mock)
118+
119+
trigger_factory_mock.assert_called()
120+
set_exception_mock.assert_not_called()
121+
122+
trace_mock.set_timeout_handler.assert_called()
123+
124+
trace_mock.send_traces.assert_called()
125+
trace_mock.add_exception.assert_not_called()
126+
127+
assert not epsagon.constants.COLD_START
128+
assert runner.resource['metadata']['cold_start'] == False
129+
os.environ.pop('AWS_LAMBDA_INITIALIZATION_TYPE')
130+
131+
87132
@mock.patch(
88133
'epsagon.trace.trace_factory.get_trace',
89134
side_effect=lambda: trace_mock

0 commit comments

Comments
 (0)