Skip to content

Commit dce2010

Browse files
author
Michael Brewer
committed
feat(logging): Add correlation_id_path option
1 parent 00c0842 commit dce2010

File tree

2 files changed

+32
-3
lines changed

2 files changed

+32
-3
lines changed

aws_lambda_powertools/logging/logger.py

+13-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import sys
77
from typing import Any, Callable, Dict, Union
88

9+
import jmespath
10+
911
from ..shared import constants
1012
from ..shared.functions import resolve_env_var_choice, resolve_truthy_env_var_choice
1113
from .exceptions import InvalidLoggerSamplingRateError
@@ -204,7 +206,9 @@ def _configure_sampling(self):
204206
f"Please review POWERTOOLS_LOGGER_SAMPLE_RATE environment variable."
205207
)
206208

207-
def inject_lambda_context(self, lambda_handler: Callable[[Dict, Any], Any] = None, log_event: bool = None):
209+
def inject_lambda_context(
210+
self, lambda_handler: Callable[[Dict, Any], Any] = None, log_event: bool = None, correlation_id_path: str = None
211+
):
208212
"""Decorator to capture Lambda contextual info and inject into logger
209213
210214
Parameters
@@ -213,6 +217,8 @@ def inject_lambda_context(self, lambda_handler: Callable[[Dict, Any], Any] = Non
213217
Method to inject the lambda context
214218
log_event : bool, optional
215219
Instructs logger to log Lambda Event, by default False
220+
correlation_id_path: str, optional
221+
Optional JMESPath for the correlation_id
216222
217223
Environment variables
218224
---------------------
@@ -251,7 +257,9 @@ def handler(event, context):
251257
# Return a partial function with args filled
252258
if lambda_handler is None:
253259
logger.debug("Decorator called with parameters")
254-
return functools.partial(self.inject_lambda_context, log_event=log_event)
260+
return functools.partial(
261+
self.inject_lambda_context, log_event=log_event, correlation_id_path=correlation_id_path
262+
)
255263

256264
log_event = resolve_truthy_env_var_choice(
257265
choice=log_event, env=os.getenv(constants.LOGGER_LOG_EVENT_ENV, "false")
@@ -263,6 +271,9 @@ def decorate(event, context):
263271
cold_start = _is_cold_start()
264272
self.structure_logs(append=True, cold_start=cold_start, **lambda_context.__dict__)
265273

274+
if correlation_id_path:
275+
self.set_correlation_id(jmespath.search(correlation_id_path, event))
276+
266277
if log_event:
267278
logger.debug("Event received")
268279
self.info(event)

tests/functional/test_logger.py

+19-1
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ def test_logger_exception_extract_exception_name(stdout, service_name):
439439
assert "ValueError" == log["exception_name"]
440440

441441

442-
def test_logger_correlation_id(lambda_context, stdout, service_name):
442+
def test_logger_set_correlation_id(lambda_context, stdout, service_name):
443443
# GIVEN
444444
logger = Logger(service=service_name, stream=stdout)
445445
request_id = "xxx-111-222"
@@ -455,3 +455,21 @@ def handler(event, _):
455455
# THEN
456456
log = capture_logging_output(stdout)
457457
assert request_id == log["correlation_id"]
458+
459+
460+
def test_logger_set_correlation_id_path(lambda_context, stdout, service_name):
461+
# GIVEN
462+
logger = Logger(service=service_name, stream=stdout)
463+
request_id = "xxx-111-222"
464+
mock_event = {"requestContext": {"requestId": request_id}}
465+
466+
@logger.inject_lambda_context(correlation_id_path="requestContext.requestId")
467+
def handler(event, context):
468+
logger.info("Foo")
469+
470+
# WHEN
471+
handler(mock_event, lambda_context)
472+
473+
# THEN
474+
log = capture_logging_output(stdout)
475+
assert request_id == log["correlation_id"]

0 commit comments

Comments
 (0)