Skip to content

Commit dee6313

Browse files
Adding timestamp to single_metric
1 parent 45f9a85 commit dee6313

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

aws_lambda_powertools/metrics/base.py

+7
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,7 @@ def single_metric(
557557
resolution: MetricResolution | int = 60,
558558
namespace: str | None = None,
559559
default_dimensions: Dict[str, str] | None = None,
560+
timestamp: int | datetime.datetime | None = None,
560561
) -> Generator[SingleMetric, None, None]:
561562
"""Context manager to simplify creation of a single metric
562563
@@ -594,6 +595,9 @@ def single_metric(
594595
Metric value
595596
namespace: str
596597
Namespace for metrics
598+
default_dimensions: Dict[str, str], optional
599+
Metric dimensions as key=value that will always be present
600+
597601
598602
Yields
599603
-------
@@ -616,6 +620,9 @@ def single_metric(
616620
metric: SingleMetric = SingleMetric(namespace=namespace)
617621
metric.add_metric(name=name, unit=unit, value=value, resolution=resolution)
618622

623+
if timestamp:
624+
metric.set_timestamp(timestamp)
625+
619626
if default_dimensions:
620627
for dim_name, dim_value in default_dimensions.items():
621628
metric.add_dimension(name=dim_name, value=dim_value)

tests/functional/metrics/test_metrics_cloudwatch_emf.py

+26
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ def serialize_single_metric(
5757
dimension: Dict,
5858
namespace: str,
5959
metadata: Dict | None = None,
60+
timestamp: int | datetime.datetime | None = None,
6061
) -> CloudWatchEMFOutput:
6162
"""Helper function to build EMF object from a given metric, dimension and namespace"""
6263
my_metrics = AmazonCloudWatchEMFProvider(namespace=namespace)
@@ -66,6 +67,9 @@ def serialize_single_metric(
6667
if metadata is not None:
6768
my_metrics.add_metadata(**metadata)
6869

70+
if timestamp:
71+
my_metrics.set_timestamp(timestamp)
72+
6973
return my_metrics.serialize_metric_set()
7074

7175

@@ -143,6 +147,28 @@ def test_single_metric_default_dimensions(capsys, metric, dimension, namespace):
143147
assert expected == output
144148

145149

150+
def test_single_metric_with_custom_timestamp(capsys, metric, dimension, namespace):
151+
# GIVEN we provide a custom timestamp
152+
# WHEN using single_metric context manager
153+
154+
default_dimensions = {dimension["name"]: dimension["value"]}
155+
156+
timestamp = int((datetime.datetime.now() - datetime.timedelta(days=2)).timestamp() * 1000)
157+
with single_metric(
158+
namespace=namespace,
159+
default_dimensions=default_dimensions,
160+
**metric,
161+
timestamp=timestamp,
162+
) as my_metric:
163+
my_metric.add_metric(name="second_metric", unit="Count", value=1)
164+
165+
output = capture_metrics_output(capsys)
166+
expected = serialize_single_metric(metric=metric, dimension=dimension, namespace=namespace, timestamp=timestamp)
167+
168+
# THEN we should have custom timestamp added to the metric
169+
assert expected == output
170+
171+
146172
def test_single_metric_default_dimensions_inherit(capsys, metric, dimension, namespace):
147173
# GIVEN we provide Metrics default dimensions
148174
# WHEN using single_metric context manager

0 commit comments

Comments
 (0)