From 5d7aba6ec92b04c119ba249aa63a84c5a7bdcca8 Mon Sep 17 00:00:00 2001 From: Leo10Gama Date: Wed, 22 Jun 2022 11:41:07 -0700 Subject: [PATCH 1/6] Add BuildRuntime Events --- .../AWS_SAM_CLI_README | 1 + samcli/lib/build/app_builder.py | 3 +++ samcli/lib/telemetry/event.py | 3 +++ .../unit/lib/build_module/test_app_builder.py | 19 ++++++++++++++++--- 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 build_dir/MyFunctionbf3066d1DepLayer/AWS_SAM_CLI_README diff --git a/build_dir/MyFunctionbf3066d1DepLayer/AWS_SAM_CLI_README b/build_dir/MyFunctionbf3066d1DepLayer/AWS_SAM_CLI_README new file mode 100644 index 0000000000..f6f5ac40c6 --- /dev/null +++ b/build_dir/MyFunctionbf3066d1DepLayer/AWS_SAM_CLI_README @@ -0,0 +1 @@ +This layer contains dependencies of function MyFunction and automatically added by AWS SAM CLI command 'sam sync' \ No newline at end of file diff --git a/samcli/lib/build/app_builder.py b/samcli/lib/build/app_builder.py index e91fdf9caf..73632a0969 100644 --- a/samcli/lib/build/app_builder.py +++ b/samcli/lib/build/app_builder.py @@ -25,6 +25,7 @@ ParallelBuildStrategy, BuildStrategy, ) +from samcli.lib.telemetry.event import EventTracker from samcli.lib.utils.resources import ( AWS_CLOUDFORMATION_STACK, AWS_LAMBDA_FUNCTION, @@ -756,6 +757,7 @@ def _build_function_in_process( is_building_layer=is_building_layer, experimental_flags=get_enabled_experimental_flags(), ) + EventTracker.track_event("BuildRuntime", runtime) except LambdaBuilderError as ex: raise BuildError(wrapped_from=ex.__class__.__name__, msg=str(ex)) from ex @@ -841,6 +843,7 @@ def _build_function_on_container( finally: self._container_manager.stop(container) + EventTracker.track_event("BuildRuntime", runtime) LOG.debug("Build inside container succeeded") return artifacts_dir diff --git a/samcli/lib/telemetry/event.py b/samcli/lib/telemetry/event.py index 60635172a3..9cdfd99ffc 100644 --- a/samcli/lib/telemetry/event.py +++ b/samcli/lib/telemetry/event.py @@ -5,6 +5,8 @@ from enum import Enum from typing import List +from samcli.local.common.runtime_template import INIT_RUNTIMES + class EventName(Enum): """Enum for the names of available events to track.""" @@ -30,6 +32,7 @@ class EventType: "CreateChangeSetFailed", "CreateChangeSetSuccess", ], + EventName.BUILD_RUNTIME: INIT_RUNTIMES, } @staticmethod diff --git a/tests/unit/lib/build_module/test_app_builder.py b/tests/unit/lib/build_module/test_app_builder.py index 8889741251..09a89832a4 100644 --- a/tests/unit/lib/build_module/test_app_builder.py +++ b/tests/unit/lib/build_module/test_app_builder.py @@ -25,6 +25,7 @@ DockerConnectionError, ) from samcli.commands.local.cli_common.user_exceptions import InvalidFunctionPropertyType +from samcli.lib.telemetry.event import EventName from samcli.lib.utils.architecture import X86_64, ARM64 from samcli.lib.utils.packagetype import IMAGE, ZIP from samcli.lib.utils.stream_writer import StreamWriter @@ -1477,12 +1478,16 @@ def setUp(self): ) @parameterized.expand([([],), (["ExpFlag1", "ExpFlag2"],)]) + @patch("samcli.lib.telemetry.event.EventType.get_accepted_values") @patch("samcli.lib.build.app_builder.LambdaBuilder") @patch("samcli.lib.build.app_builder.get_enabled_experimental_flags") - def test_must_use_lambda_builder(self, experimental_flags, experimental_flags_mock, lambda_builder_mock): + def test_must_use_lambda_builder( + self, experimental_flags, experimental_flags_mock, lambda_builder_mock, event_mock + ): experimental_flags_mock.return_value = experimental_flags config_mock = Mock() builder_instance_mock = lambda_builder_mock.return_value = Mock() + event_mock.return_value = ["runtime"] result = self.builder._build_function_in_process( config_mock, @@ -1545,10 +1550,14 @@ def test_must_raise_on_error(self, lambda_builder_mock): True, ) + @patch("samcli.lib.telemetry.event.EventType.get_accepted_values") @patch("samcli.lib.build.app_builder.LambdaBuilder") @patch("samcli.lib.build.app_builder.get_enabled_experimental_flags") - def test_building_with_experimental_flags(self, get_enabled_experimental_flags_mock, lambda_builder_mock): + def test_building_with_experimental_flags( + self, get_enabled_experimental_flags_mock, lambda_builder_mock, event_mock + ): get_enabled_experimental_flags_mock.return_value = ["A", "B", "C"] + event_mock.return_value = ["runtime"] config_mock = Mock() self.builder._build_function_in_process( config_mock, @@ -1600,11 +1609,15 @@ def setUp(self): ) self.builder._parse_builder_response = Mock() + @patch("samcli.lib.telemetry.event.EventType.get_accepted_values") @patch("samcli.lib.build.app_builder.LambdaBuildContainer") @patch("samcli.lib.build.app_builder.lambda_builders_protocol_version") @patch("samcli.lib.build.app_builder.LOG") @patch("samcli.lib.build.app_builder.osutils") - def test_must_build_in_container(self, osutils_mock, LOGMock, protocol_version_mock, LambdaBuildContainerMock): + def test_must_build_in_container( + self, osutils_mock, LOGMock, protocol_version_mock, LambdaBuildContainerMock, event_mock + ): + event_mock.return_value = "runtime" config = Mock() log_level = LOGMock.getEffectiveLevel.return_value = "foo" stdout_data = "container stdout response data" From 879fe1bffd700af313389f2dd7c2c93e9b4b4f1b Mon Sep 17 00:00:00 2001 From: Leo10Gama Date: Wed, 22 Jun 2022 11:41:29 -0700 Subject: [PATCH 2/6] Remove unnecessary file --- build_dir/MyFunctionbf3066d1DepLayer/AWS_SAM_CLI_README | 1 - 1 file changed, 1 deletion(-) delete mode 100644 build_dir/MyFunctionbf3066d1DepLayer/AWS_SAM_CLI_README diff --git a/build_dir/MyFunctionbf3066d1DepLayer/AWS_SAM_CLI_README b/build_dir/MyFunctionbf3066d1DepLayer/AWS_SAM_CLI_README deleted file mode 100644 index f6f5ac40c6..0000000000 --- a/build_dir/MyFunctionbf3066d1DepLayer/AWS_SAM_CLI_README +++ /dev/null @@ -1 +0,0 @@ -This layer contains dependencies of function MyFunction and automatically added by AWS SAM CLI command 'sam sync' \ No newline at end of file From 5ff36cb01c8ccf63cfef1cd45a304247dc23cf95 Mon Sep 17 00:00:00 2001 From: Leo10Gama Date: Wed, 22 Jun 2022 12:21:06 -0700 Subject: [PATCH 3/6] Prevent tracked Event 'spillage' from previous tests --- tests/unit/lib/build_module/test_app_builder.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/unit/lib/build_module/test_app_builder.py b/tests/unit/lib/build_module/test_app_builder.py index 09a89832a4..e9b348db09 100644 --- a/tests/unit/lib/build_module/test_app_builder.py +++ b/tests/unit/lib/build_module/test_app_builder.py @@ -25,7 +25,7 @@ DockerConnectionError, ) from samcli.commands.local.cli_common.user_exceptions import InvalidFunctionPropertyType -from samcli.lib.telemetry.event import EventName +from samcli.lib.telemetry.event import EventName, EventTracker from samcli.lib.utils.architecture import X86_64, ARM64 from samcli.lib.utils.packagetype import IMAGE, ZIP from samcli.lib.utils.stream_writer import StreamWriter @@ -1477,6 +1477,9 @@ def setUp(self): Mock(), "/build/dir", "/base/dir", "/cache/dir", mode="mode", stream_writer=StreamWriter(sys.stderr) ) + def tearDown(self): + EventTracker.clear_trackers() + @parameterized.expand([([],), (["ExpFlag1", "ExpFlag2"],)]) @patch("samcli.lib.telemetry.event.EventType.get_accepted_values") @patch("samcli.lib.build.app_builder.LambdaBuilder") @@ -1609,6 +1612,9 @@ def setUp(self): ) self.builder._parse_builder_response = Mock() + def tearDown(self): + EventTracker.clear_trackers() + @patch("samcli.lib.telemetry.event.EventType.get_accepted_values") @patch("samcli.lib.build.app_builder.LambdaBuildContainer") @patch("samcli.lib.build.app_builder.lambda_builders_protocol_version") From d6212a88a367c0784e830319a6a7fdff547d1bc8 Mon Sep 17 00:00:00 2001 From: Leo10Gama Date: Wed, 22 Jun 2022 13:21:23 -0700 Subject: [PATCH 4/6] Fix builder logic --- samcli/lib/build/app_builder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samcli/lib/build/app_builder.py b/samcli/lib/build/app_builder.py index 73632a0969..a00442151c 100644 --- a/samcli/lib/build/app_builder.py +++ b/samcli/lib/build/app_builder.py @@ -757,10 +757,10 @@ def _build_function_in_process( is_building_layer=is_building_layer, experimental_flags=get_enabled_experimental_flags(), ) - EventTracker.track_event("BuildRuntime", runtime) except LambdaBuilderError as ex: raise BuildError(wrapped_from=ex.__class__.__name__, msg=str(ex)) from ex + EventTracker.track_event("BuildRuntime", runtime) return artifacts_dir def _build_function_on_container( From 01ef6884207c688321b97d8d0d0439140bd58255 Mon Sep 17 00:00:00 2001 From: Leo10Gama Date: Wed, 22 Jun 2022 17:17:45 -0700 Subject: [PATCH 5/6] Redefine BuildRuntime to focus on function runtimes --- build_dir/MyFunctionbf3066d1DepLayer/AWS_SAM_CLI_README | 1 + samcli/commands/build/build_context.py | 4 ++++ samcli/lib/build/app_builder.py | 3 --- samcli/lib/telemetry/event.py | 4 ++-- tests/unit/commands/buildcmd/test_build_context.py | 4 ++-- 5 files changed, 9 insertions(+), 7 deletions(-) create mode 100644 build_dir/MyFunctionbf3066d1DepLayer/AWS_SAM_CLI_README diff --git a/build_dir/MyFunctionbf3066d1DepLayer/AWS_SAM_CLI_README b/build_dir/MyFunctionbf3066d1DepLayer/AWS_SAM_CLI_README new file mode 100644 index 0000000000..f6f5ac40c6 --- /dev/null +++ b/build_dir/MyFunctionbf3066d1DepLayer/AWS_SAM_CLI_README @@ -0,0 +1 @@ +This layer contains dependencies of function MyFunction and automatically added by AWS SAM CLI command 'sam sync' \ No newline at end of file diff --git a/samcli/commands/build/build_context.py b/samcli/commands/build/build_context.py index 817547402c..59f9e4b25c 100644 --- a/samcli/commands/build/build_context.py +++ b/samcli/commands/build/build_context.py @@ -11,6 +11,7 @@ from samcli.commands._utils.experimental import ExperimentalFlag, prompt_experimental from samcli.lib.providers.sam_api_provider import SamApiProvider +from samcli.lib.telemetry.event import EventTracker from samcli.lib.utils.packagetype import IMAGE from samcli.commands._utils.template import get_template_data @@ -267,6 +268,9 @@ def run(self): modified_template = nested_stack_manager.generate_auto_dependency_layer_stack() move_template(stack.location, output_template_path, modified_template) + for f in self.get_resources_to_build().functions: + EventTracker.track_event("BuildFunctionRuntime", f.runtime) + click.secho("\nBuild Succeeded", fg="green") # try to use relpath so the command is easier to understand, however, diff --git a/samcli/lib/build/app_builder.py b/samcli/lib/build/app_builder.py index a00442151c..e91fdf9caf 100644 --- a/samcli/lib/build/app_builder.py +++ b/samcli/lib/build/app_builder.py @@ -25,7 +25,6 @@ ParallelBuildStrategy, BuildStrategy, ) -from samcli.lib.telemetry.event import EventTracker from samcli.lib.utils.resources import ( AWS_CLOUDFORMATION_STACK, AWS_LAMBDA_FUNCTION, @@ -760,7 +759,6 @@ def _build_function_in_process( except LambdaBuilderError as ex: raise BuildError(wrapped_from=ex.__class__.__name__, msg=str(ex)) from ex - EventTracker.track_event("BuildRuntime", runtime) return artifacts_dir def _build_function_on_container( @@ -843,7 +841,6 @@ def _build_function_on_container( finally: self._container_manager.stop(container) - EventTracker.track_event("BuildRuntime", runtime) LOG.debug("Build inside container succeeded") return artifacts_dir diff --git a/samcli/lib/telemetry/event.py b/samcli/lib/telemetry/event.py index 9cdfd99ffc..c9e8b92d3e 100644 --- a/samcli/lib/telemetry/event.py +++ b/samcli/lib/telemetry/event.py @@ -13,7 +13,7 @@ class EventName(Enum): USED_FEATURE = "UsedFeature" DEPLOY = "Deploy" - BUILD_RUNTIME = "BuildRuntime" + BUILD_FUNCTION_RUNTIME = "BuildFunctionRuntime" class EventType: @@ -32,7 +32,7 @@ class EventType: "CreateChangeSetFailed", "CreateChangeSetSuccess", ], - EventName.BUILD_RUNTIME: INIT_RUNTIMES, + EventName.BUILD_FUNCTION_RUNTIME: INIT_RUNTIMES, } @staticmethod diff --git a/tests/unit/commands/buildcmd/test_build_context.py b/tests/unit/commands/buildcmd/test_build_context.py index ef9f2ce913..5460d59812 100644 --- a/tests/unit/commands/buildcmd/test_build_context.py +++ b/tests/unit/commands/buildcmd/test_build_context.py @@ -1,6 +1,6 @@ import os from unittest import TestCase -from unittest.mock import patch, Mock, ANY, call +from unittest.mock import MagicMock, patch, Mock, ANY, call from parameterized import parameterized @@ -661,7 +661,7 @@ def test_run_sync_build_context( root_stack.stack_path: "./build_dir/template.yaml", child_stack.stack_path: "./build_dir/abcd/template.yaml", } - resources_mock.return_value = Mock() + resources_mock.return_value = MagicMock() builder_mock = ApplicationBuilderMock.return_value = Mock() artifacts = "artifacts" From f19c12b0a9d26f254c6c6d68e6835a546f8a6d9b Mon Sep 17 00:00:00 2001 From: Leo10Gama Date: Thu, 23 Jun 2022 15:51:17 -0700 Subject: [PATCH 6/6] Remove unnecessary file (again) --- build_dir/MyFunctionbf3066d1DepLayer/AWS_SAM_CLI_README | 1 - 1 file changed, 1 deletion(-) delete mode 100644 build_dir/MyFunctionbf3066d1DepLayer/AWS_SAM_CLI_README diff --git a/build_dir/MyFunctionbf3066d1DepLayer/AWS_SAM_CLI_README b/build_dir/MyFunctionbf3066d1DepLayer/AWS_SAM_CLI_README deleted file mode 100644 index f6f5ac40c6..0000000000 --- a/build_dir/MyFunctionbf3066d1DepLayer/AWS_SAM_CLI_README +++ /dev/null @@ -1 +0,0 @@ -This layer contains dependencies of function MyFunction and automatically added by AWS SAM CLI command 'sam sync' \ No newline at end of file