Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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
1 change: 1 addition & 0 deletions .changelog/4832.added
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
`opentelemetry-instrumentation-aws-lambda`: add logger provider support with force flush for Lambda freeze handling
Original file line number Diff line number Diff line change
Expand Up @@ -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__)

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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__)

Expand Down Expand Up @@ -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):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand Down Expand Up @@ -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(
Expand Down