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

fix(aws_lambda): fix cold start detection in provisioned concurrency functions #357

Merged
merged 2 commits into from
Jun 3, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions epsagon/wrappers/aws_lambda.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
"""

from __future__ import absolute_import
import os
import traceback
import time
import copy
Expand Down Expand Up @@ -58,6 +59,11 @@ def _lambda_wrapper(*args, **kwargs):
# parameters / sends kwargs. In such case we ignore this trace.
return func(*args, **kwargs)

if os.environ.get(
'AWS_LAMBDA_INITIALIZATION_TYPE'
) == 'provisioned-concurrency':
constants.COLD_START = False

try:
runner = epsagon.runners.aws_lambda.LambdaRunner(
time.time(),
Expand Down
45 changes: 45 additions & 0 deletions tests/wrappers/test_lambda_wrapper.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import os
import json
import mock
import pytest
Expand Down Expand Up @@ -81,9 +82,53 @@ def wrapped_lambda(event, context):
trace_mock.add_exception.assert_not_called()

assert not epsagon.constants.COLD_START
assert runner.resource['metadata']['cold_start'] == True
assert runner.resource['metadata']['return_value'] == retval


@mock.patch.object(LambdaRunner, 'set_exception')
@mock.patch(
'epsagon.trace.trace_factory.get_trace',
side_effect=lambda: trace_mock
)
@mock.patch(
'epsagon.trace.trace_factory.get_or_create_trace',
side_effect=lambda: trace_mock
)
@mock.patch(
'epsagon.triggers.aws_lambda.LambdaTriggerFactory.factory',
side_effect=['trigger']
)
def test_lambda_wrapper_provisioned_concurrency_sanity(
trigger_factory_mock,
_,
__,
set_exception_mock
):
retval = 'success'

@epsagon.wrappers.aws_lambda.lambda_wrapper
def wrapped_lambda(event, context):
return 'success'

os.environ['AWS_LAMBDA_INITIALIZATION_TYPE'] = 'provisioned-concurrency'
assert wrapped_lambda('a', CONTEXT_STUB) == 'success'
trace_mock.prepare.assert_called()
runner = _get_runner_event(trace_mock)

trigger_factory_mock.assert_called()
set_exception_mock.assert_not_called()

trace_mock.set_timeout_handler.assert_called()

trace_mock.send_traces.assert_called()
trace_mock.add_exception.assert_not_called()

assert not epsagon.constants.COLD_START
assert runner.resource['metadata']['cold_start'] == False
os.environ.pop('AWS_LAMBDA_INITIALIZATION_TYPE')


@mock.patch(
'epsagon.trace.trace_factory.get_trace',
side_effect=lambda: trace_mock
Expand Down