From 4ca0727bea83b717bf0835f211e7760af4a74ca2 Mon Sep 17 00:00:00 2001 From: Riccardo Magliocchetti Date: Mon, 13 Jan 2025 10:07:07 +0100 Subject: [PATCH] instrumentation/aws-lambda: don't print warnings outside of AWS Lambda If we are not running inside AWS Lambda don't print warnings on missing OTel lambda extension layer. The instrumentation is installed by the OTel k8s operator and so this warning may confuse users. --- .../instrumentation/aws_lambda/__init__.py | 5 +++ .../test_aws_lambda_instrumentation_manual.py | 38 +++++++++++++++++-- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda/__init__.py b/instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda/__init__.py index b1f61b9ce8..a0d381e7f5 100644 --- a/instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-aws-lambda/src/opentelemetry/instrumentation/aws_lambda/__init__.py @@ -431,6 +431,11 @@ def _instrument(self, **kwargs): the context is extracted from the HTTP headers of an API Gateway request. """ + + # Don't try if we are not running on AWS Lambda + if "AWS_LAMBDA_FUNCTION_NAME" not in os.environ: + return + lambda_handler = os.environ.get(ORIG_HANDLER, os.environ.get(_HANDLER)) if not lambda_handler: logger.warning( diff --git a/instrumentation/opentelemetry-instrumentation-aws-lambda/tests/test_aws_lambda_instrumentation_manual.py b/instrumentation/opentelemetry-instrumentation-aws-lambda/tests/test_aws_lambda_instrumentation_manual.py index 4ac1e9c873..1e8f9f0575 100644 --- a/instrumentation/opentelemetry-instrumentation-aws-lambda/tests/test_aws_lambda_instrumentation_manual.py +++ b/instrumentation/opentelemetry-instrumentation-aws-lambda/tests/test_aws_lambda_instrumentation_manual.py @@ -11,6 +11,8 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + +import logging import os from dataclasses import dataclass from importlib import import_module, reload @@ -124,7 +126,10 @@ def setUp(self): super().setUp() self.common_env_patch = mock.patch.dict( "os.environ", - {_HANDLER: "tests.mocks.lambda_function.handler"}, + { + _HANDLER: "tests.mocks.lambda_function.handler", + "AWS_LAMBDA_FUNCTION_NAME": "mylambda", + }, ) self.common_env_patch.start() @@ -466,12 +471,14 @@ def test_lambda_handles_handler_exception(self): exc_env_patch.stop() - def test_lambda_handles_should_do_nothing_when_environment_variables_not_present( - self, + @mock.patch("opentelemetry.instrumentation.aws_lambda.logger") + def test_lambda_handles_should_do_nothing_when_aws_lambda_environment_variables_not_present( + self, logger_mock ): exc_env_patch = mock.patch.dict( "os.environ", - {_HANDLER: ""}, + {_HANDLER: "tests.mocks.lambda_function.handler"}, + clear=True, ) exc_env_patch.start() AwsLambdaInstrumentor().instrument() @@ -480,6 +487,29 @@ def test_lambda_handles_should_do_nothing_when_environment_variables_not_present self.assertEqual(len(spans), 0) exc_env_patch.stop() + logger_mock.warnings.assert_not_called() + + def test_lambda_handles_should_warn_when_handler_environment_variable_not_present( + self, + ): + exc_env_patch = mock.patch.dict( + "os.environ", + {"AWS_LAMBDA_FUNCTION_NAME": "mylambda"}, + clear=True, + ) + exc_env_patch.start() + with self.assertLogs(level=logging.WARNING) as warning: + AwsLambdaInstrumentor().instrument() + self.assertEqual(len(warning.records), 1) + self.assertIn( + "This instrumentation requires the OpenTelemetry Lambda extension installed", + warning.records[0].message, + ) + + spans = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans), 0) + exc_env_patch.stop() + def test_uninstrument(self): AwsLambdaInstrumentor().instrument()