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()