Skip to content

Commit e5cab1e

Browse files
authored
fix(metrics): support additional arguments in functions wrapped with log_metrics decorator (#3120)
1 parent 1009729 commit e5cab1e

File tree

5 files changed

+52
-4
lines changed

5 files changed

+52
-4
lines changed

aws_lambda_powertools/metrics/base.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -378,11 +378,11 @@ def handler(event, context):
378378
)
379379

380380
@functools.wraps(lambda_handler)
381-
def decorate(event, context):
381+
def decorate(event, context, *args, **kwargs):
382382
try:
383383
if default_dimensions:
384384
self.set_default_dimensions(**default_dimensions)
385-
response = lambda_handler(event, context)
385+
response = lambda_handler(event, context, *args, **kwargs)
386386
if capture_cold_start_metric:
387387
self._add_cold_start_metric(context=context)
388388
finally:

aws_lambda_powertools/metrics/provider/base.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -199,9 +199,9 @@ def handler(event, context):
199199
)
200200

201201
@functools.wraps(lambda_handler)
202-
def decorate(event, context):
202+
def decorate(event, context, *args, **kwargs):
203203
try:
204-
response = lambda_handler(event, context)
204+
response = lambda_handler(event, context, *args, **kwargs)
205205
if capture_cold_start_metric:
206206
self._add_cold_start_metric(context=context)
207207
finally:

tests/functional/metrics/test_metrics_cloudwatch_emf.py

+16
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,22 @@ def lambda_handler(evt, context):
355355
assert lambda_handler({}, {}) is True
356356

357357

358+
def test_log_metrics_decorator_with_additional_handler_args(namespace, service):
359+
# GIVEN Metrics is initialized
360+
my_metrics = Metrics(service=service, namespace=namespace)
361+
362+
# WHEN log_metrics is used to serialize metrics
363+
# AND the wrapped function uses additional parameters
364+
@my_metrics.log_metrics
365+
def lambda_handler(evt, context, additional_arg, additional_kw_arg="default_value"):
366+
return additional_arg, additional_kw_arg
367+
368+
# THEN the decorator should not raise any errors when
369+
# the wrapped function is passed additional arguments
370+
assert lambda_handler({}, {}, "arg_value", additional_kw_arg="kw_arg_value") == ("arg_value", "kw_arg_value")
371+
assert lambda_handler({}, {}, "arg_value") == ("arg_value", "default_value")
372+
373+
358374
def test_schema_validation_incorrect_metric_resolution(metric, dimension):
359375
# GIVEN we pass a metric resolution that is not supported by CloudWatch
360376
metric["resolution"] = 10 # metric resolution must be 1 (High) or 60 (Standard)

tests/functional/metrics/test_metrics_datadog.py

+16
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,22 @@ def lambda_handler(evt, context):
136136
)
137137

138138

139+
def test_datadog_log_metrics_decorator_with_additional_handler_args():
140+
# GIVEN DatadogMetrics is initialized
141+
my_metrics = DatadogMetrics(flush_to_log=True)
142+
143+
# WHEN log_metrics is used to serialize metrics
144+
# AND the wrapped function uses additional parameters
145+
@my_metrics.log_metrics
146+
def lambda_handler(evt, context, additional_arg, additional_kw_arg="default_value"):
147+
return additional_arg, additional_kw_arg
148+
149+
# THEN the decorator should not raise any errors when
150+
# the wrapped function is passed additional arguments
151+
assert lambda_handler({}, {}, "arg_value", additional_kw_arg="kw_arg_value") == ("arg_value", "kw_arg_value")
152+
assert lambda_handler({}, {}, "arg_value") == ("arg_value", "default_value")
153+
154+
139155
def test_metrics_with_default_namespace(capsys, namespace):
140156
# GIVEN DatadogMetrics is initialized with default namespace
141157
metrics = DatadogMetrics(flush_to_log=True)

tests/functional/metrics/test_metrics_provider.py

+16
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,19 @@ def lambda_handler(evt, context):
6060
# THEN log_metrics should invoke the function it decorates
6161
# and return no error if we have a namespace and dimension
6262
assert lambda_handler({}, {}) is True
63+
64+
65+
def test_metrics_provider_class_decorator_with_additional_handler_args():
66+
# GIVEN Metrics is initialized
67+
my_metrics = Metrics()
68+
69+
# WHEN log_metrics is used to serialize metrics
70+
# AND the wrapped function uses additional parameters
71+
@my_metrics.log_metrics
72+
def lambda_handler(evt, context, additional_arg, additional_kw_arg="default_value"):
73+
return additional_arg, additional_kw_arg
74+
75+
# THEN the decorator should not raise any errors when
76+
# the wrapped function is passed additional arguments
77+
assert lambda_handler({}, {}, "arg_value", additional_kw_arg="kw_arg_value") == ("arg_value", "kw_arg_value")
78+
assert lambda_handler({}, {}, "arg_value") == ("arg_value", "default_value")

0 commit comments

Comments
 (0)