From 59d95f6431524d9d3578707263aad559e410f1b5 Mon Sep 17 00:00:00 2001 From: Connor Kirkpatrick Date: Mon, 1 Dec 2025 17:37:45 +0000 Subject: [PATCH] Support Durable Function Context in logger and metric decorators This commit updates the Logger and Metric decorators to handle DurableContexts. If a DurableContext is present, it is unwrapped to access the Lambda Context --- aws_lambda_powertools/logging/logger.py | 11 ++++++++--- aws_lambda_powertools/metrics/base.py | 5 +++-- aws_lambda_powertools/metrics/provider/base.py | 3 ++- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/aws_lambda_powertools/logging/logger.py b/aws_lambda_powertools/logging/logger.py index 154d8ee6353..b5015734e96 100644 --- a/aws_lambda_powertools/logging/logger.py +++ b/aws_lambda_powertools/logging/logger.py @@ -520,13 +520,18 @@ def handler(event, context): @functools.wraps(lambda_handler) def decorate(event, context, *args, **kwargs): - lambda_context = build_lambda_context_model(context) + unwrapped_context = ( + build_lambda_context_model(context.lambda_context) + if hasattr(context, "step") + else build_lambda_context_model(context) + ) + cold_start = _is_cold_start() if clear_state: - self.structure_logs(cold_start=cold_start, **lambda_context.__dict__) + self.structure_logs(cold_start=cold_start, **unwrapped_context.__dict__) else: - self.append_keys(cold_start=cold_start, **lambda_context.__dict__) + self.append_keys(cold_start=cold_start, **unwrapped_context.__dict__) if correlation_id_path: self.set_correlation_id( diff --git a/aws_lambda_powertools/metrics/base.py b/aws_lambda_powertools/metrics/base.py index ee7553148b1..ab8d62d1b7a 100644 --- a/aws_lambda_powertools/metrics/base.py +++ b/aws_lambda_powertools/metrics/base.py @@ -430,12 +430,13 @@ def handler(event, context): @functools.wraps(lambda_handler) def decorate(event, context, *args, **kwargs): + unwrapped_context = context.lambda_context if hasattr(context, "step") else context try: if default_dimensions: self.set_default_dimensions(**default_dimensions) - response = lambda_handler(event, context, *args, **kwargs) + response = lambda_handler(event, unwrapped_context, *args, **kwargs) if capture_cold_start_metric: - self._add_cold_start_metric(context=context) + self._add_cold_start_metric(context=unwrapped_context) finally: self.flush_metrics(raise_on_empty_metrics=raise_on_empty_metrics) diff --git a/aws_lambda_powertools/metrics/provider/base.py b/aws_lambda_powertools/metrics/provider/base.py index 3aab6e7561e..73fa54fe62e 100644 --- a/aws_lambda_powertools/metrics/provider/base.py +++ b/aws_lambda_powertools/metrics/provider/base.py @@ -206,7 +206,8 @@ def decorate(event, context, *args, **kwargs): try: response = lambda_handler(event, context, *args, **kwargs) if capture_cold_start_metric: - self._add_cold_start_metric(context=context) + unwrapped_context = context.lambda_context if hasattr(context, "step") else context + self._add_cold_start_metric(context=unwrapped_context) finally: self.flush_metrics(raise_on_empty_metrics=raise_on_empty_metrics)