From 15072991e69b216fc33047d19a1886c01493c2db Mon Sep 17 00:00:00 2001 From: Dhruv Paranjape Date: Fri, 17 Jul 2026 18:07:22 +0200 Subject: [PATCH 1/2] feat(aws-lambda): add logger provider support with force flush for Lambda freeze handling --- .../instrumentation/aws_lambda/__init__.py | 16 ++++++++++++++++ .../test_aws_lambda_instrumentation_manual.py | 10 ++++++++++ 2 files changed, 26 insertions(+) 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 e33818fda4..edb11ca9fe 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 @@ -110,6 +110,8 @@ def custom_event_context_extractor(lambda_event): get_tracer_provider, ) from opentelemetry.trace.status import Status, StatusCode +from opentelemetry._logs import get_logger_provider, set_logger_provider +from opentelemetry.sdk._logs import LoggerProvider logger = logging.getLogger(__name__) @@ -333,6 +335,7 @@ def _instrument( event_context_extractor: Callable[[Any], Context], tracer_provider: TracerProvider = None, meter_provider: MeterProvider = None, + logger_provider: LoggerProvider = None, ): # pylint: disable=too-many-locals # pylint: disable=too-many-statements @@ -437,6 +440,18 @@ def _instrumented_lambda_handler_call( # noqa pylint: disable=too-many-branches "MeterProvider was missing `force_flush` method. This is necessary in case of a Lambda freeze and would exist in the OTel SDK implementation." ) + _logger_provider = logger_provider or get_logger_provider() + if hasattr(_logger_provider, "force_flush"): + try: + # NOTE: `force_flush` before function quit in case of Lambda freeze. + _logger_provider.force_flush(flush_timeout) + except Exception: # pylint: disable=broad-except + logger.exception("LoggerProvider failed to flush logs") + else: + logger.warning( + "LoggerProvider was missing `force_flush` method. This is necessary in case of a Lambda freeze and would exist in the OTel SDK implementation." + ) + if exception is not None: raise exception.with_traceback(exception.__traceback__) @@ -513,6 +528,7 @@ def _instrument(self, **kwargs): ), tracer_provider=kwargs.get("tracer_provider"), meter_provider=kwargs.get("meter_provider"), + logger_provider=kwargs.get("logger_provider"), ) def _uninstrument(self, **kwargs): 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 9c1c232c4a..4bc40a2aa9 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,7 @@ from unittest import mock from opentelemetry import propagate +from opentelemetry._logs import NoOpLoggerProvider from opentelemetry.baggage.propagation import W3CBaggagePropagator from opentelemetry.environment_variables import OTEL_PROPAGATORS from opentelemetry.instrumentation.aws_lambda import ( @@ -658,6 +659,15 @@ def test_no_op_tracer_provider(self): assert spans is not None self.assertEqual(len(spans), 0) + def test_no_op_logger_provider(self): + logger_provider = NoOpLoggerProvider() + AwsLambdaInstrumentor().instrument(logger_provider=logger_provider) + + mock_execute_lambda() + spans = self.memory_exporter.get_finished_spans() + assert spans is not None + self.assertEqual(len(spans), 1) + def test_load_entry_point(self): self.assertIs( next( From 25146a1fed768f729ef9a7294ea8a3ef3452dc1b Mon Sep 17 00:00:00 2001 From: Dhruv Paranjape Date: Fri, 17 Jul 2026 22:45:52 +0200 Subject: [PATCH 2/2] add changelog --- .changelog/4832.added | 1 + 1 file changed, 1 insertion(+) create mode 100644 .changelog/4832.added diff --git a/.changelog/4832.added b/.changelog/4832.added new file mode 100644 index 0000000000..bae3b92c05 --- /dev/null +++ b/.changelog/4832.added @@ -0,0 +1 @@ +`opentelemetry-instrumentation-aws-lambda`: add logger provider support with force flush for Lambda freeze handling \ No newline at end of file