Skip to content

Commit 27b089e

Browse files
authored
Update methods in Metrics class to accept timestamp (#2470)
1 parent a64774c commit 27b089e

File tree

2 files changed

+65
-13
lines changed

2 files changed

+65
-13
lines changed

samtranslator/metrics/metrics.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ def __init__(self, name, value, unit, dimensions=None, timestamp=None):
9393
:param value: value of metric
9494
:param unit: unit of metric (try using values from Unit class)
9595
:param dimensions: array of dimensions applied to the metric
96+
:param timestamp: timestamp of metric (datetime.datetime object)
9697
"""
9798
self.name = name
9899
self.value = value
@@ -130,38 +131,41 @@ def __del__(self):
130131
)
131132
self.publish()
132133

133-
def _record_metric(self, name, value, unit, dimensions=None):
134+
def _record_metric(self, name, value, unit, dimensions=None, timestamp=None):
134135
"""
135136
Create and save metric object in internal cache.
136137
137138
:param name: metric name
138139
:param value: value of metric
139140
:param unit: unit of metric (try using values from Unit class)
140141
:param dimensions: array of dimensions applied to the metric
142+
:param timestamp: timestamp of metric (datetime.datetime object)
141143
"""
142-
self.metrics_cache.setdefault(name, []).append(MetricDatum(name, value, unit, dimensions))
144+
self.metrics_cache.setdefault(name, []).append(MetricDatum(name, value, unit, dimensions, timestamp))
143145

144-
def record_count(self, name, value, dimensions=None):
146+
def record_count(self, name, value, dimensions=None, timestamp=None):
145147
"""
146148
Create metric with unit Count.
147149
148150
:param name: metric name
149151
:param value: value of metric
150152
:param unit: unit of metric (try using values from Unit class)
151153
:param dimensions: array of dimensions applied to the metric
154+
:param timestamp: timestamp of metric (datetime.datetime object)
152155
"""
153-
self._record_metric(name, value, Unit.Count, dimensions)
156+
self._record_metric(name, value, Unit.Count, dimensions, timestamp)
154157

155-
def record_latency(self, name, value, dimensions=None):
158+
def record_latency(self, name, value, dimensions=None, timestamp=None):
156159
"""
157160
Create metric with unit Milliseconds.
158161
159162
:param name: metric name
160163
:param value: value of metric
161164
:param unit: unit of metric (try using values from Unit class)
162165
:param dimensions: array of dimensions applied to the metric
166+
:param timestamp: timestamp of metric (datetime.datetime object)
163167
"""
164-
self._record_metric(name, value, Unit.Milliseconds, dimensions)
168+
self._record_metric(name, value, Unit.Milliseconds, dimensions, timestamp)
165169

166170
def publish(self):
167171
"""Calls publish method from the configured metrics publisher to publish metrics"""

tests/metrics/test_metrics.py

Lines changed: 55 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from parameterized import parameterized, param
2+
from datetime import datetime
23
from unittest import TestCase
34
from unittest.mock import MagicMock, call, ANY
45
from samtranslator.metrics.metrics import (
@@ -30,25 +31,43 @@ class TestMetrics(TestCase):
3031
"CountMetric",
3132
12,
3233
[{"Name": "SAM", "Value": "Dim1"}, {"Name": "SAM", "Value": "Dim2"}],
34+
None,
3335
),
3436
param(
3537
"DummyNamespace",
3638
"IAMError",
3739
59,
3840
[{"Name": "SAM", "Value": "Dim1"}, {"Name": "SAM", "Value": "Dim2"}],
41+
None,
42+
),
43+
param(
44+
"DummyNamespace",
45+
"MyCount",
46+
77,
47+
[{"Name": "SAM", "Value": "Dim1"}, {"Name": "SAM", "Value": "Dim2"}],
48+
datetime(2022, 8, 11, 0, 0, 0),
3949
),
4050
]
4151
)
42-
def test_publishing_count_metric(self, namespace, name, value, dimensions):
52+
def test_publishing_count_metric(self, namespace, name, value, dimensions, timestamp):
4353
mock_metrics_publisher = MetricPublisherTestHelper()
4454
metrics = Metrics(namespace, mock_metrics_publisher)
45-
metrics.record_count(name, value, dimensions)
55+
kwargs = {
56+
"name": name,
57+
"value": value,
58+
"dimensions": dimensions,
59+
}
60+
if timestamp is not None:
61+
kwargs["timestamp"] = timestamp
62+
metrics.record_count(**kwargs)
4663
metrics.publish()
4764
self.assertEqual(len(mock_metrics_publisher.metrics_cache), 1)
4865
published_metric = mock_metrics_publisher.metrics_cache[0].get_metric_data()
4966
self.assertEqual(published_metric["MetricName"], name)
5067
self.assertEqual(published_metric["Dimensions"], dimensions)
5168
self.assertEqual(published_metric["Value"], value)
69+
if timestamp is not None:
70+
self.assertEqual(published_metric["Timestamp"], timestamp)
5271

5372
@parameterized.expand(
5473
[
@@ -57,25 +76,43 @@ def test_publishing_count_metric(self, namespace, name, value, dimensions):
5776
"SARLatency",
5877
1200,
5978
[{"Name": "SAM", "Value": "Dim1"}, {"Name": "SAM", "Value": "Dim2"}],
79+
None,
6080
),
6181
param(
6282
"DummyNamespace",
6383
"IAMLatency",
6484
400,
6585
[{"Name": "SAM", "Value": "Dim1"}, {"Name": "SAM", "Value": "Dim2"}],
86+
None,
87+
),
88+
param(
89+
"DummyNamespace",
90+
"OtherLatency",
91+
400000,
92+
[{"Name": "SAM", "Value": "Dim1"}, {"Name": "SAM", "Value": "Dim2"}],
93+
datetime(2021, 9, 20, 12, 0, 0),
6694
),
6795
]
6896
)
69-
def test_publishing_latency_metric(self, namespace, name, value, dimensions):
97+
def test_publishing_latency_metric(self, namespace, name, value, dimensions, timestamp):
7098
mock_metrics_publisher = MetricPublisherTestHelper()
7199
metrics = Metrics(namespace, mock_metrics_publisher)
72-
metrics.record_latency(name, value, dimensions)
100+
kwargs = {
101+
"name": name,
102+
"value": value,
103+
"dimensions": dimensions,
104+
}
105+
if timestamp is not None:
106+
kwargs["timestamp"] = timestamp
107+
metrics.record_latency(**kwargs)
73108
metrics.publish()
74109
self.assertEqual(len(mock_metrics_publisher.metrics_cache), 1)
75110
published_metric = mock_metrics_publisher.metrics_cache[0].get_metric_data()
76111
self.assertEqual(published_metric["MetricName"], name)
77112
self.assertEqual(published_metric["Dimensions"], dimensions)
78113
self.assertEqual(published_metric["Value"], value)
114+
if timestamp is not None:
115+
self.assertEqual(published_metric["Timestamp"], timestamp)
79116

80117
@parameterized.expand(
81118
[
@@ -153,41 +190,52 @@ class TestCWMetricPublisher(TestCase):
153190
12,
154191
Unit.Count,
155192
[{"Name": "SAM", "Value": "Dim1"}, {"Name": "SAM", "Value": "Dim2"}],
193+
None,
156194
),
157195
param(
158196
"DummyNamespace",
159197
"IAMError",
160198
59,
161199
Unit.Count,
162200
[{"Name": "SAM", "Value": "Dim1"}, {"Name": "SAM", "Value": "Dim2"}],
201+
datetime(2022, 8, 8, 8, 8, 8),
163202
),
164203
param(
165204
"DummyNamespace",
166205
"SARLatency",
167206
1200,
168207
Unit.Milliseconds,
169208
[{"Name": "SAM", "Value": "Dim1"}, {"Name": "SAM", "Value": "Dim2"}],
209+
None,
170210
),
171211
param(
172212
"DummyNamespace",
173213
"IAMLatency",
174214
400,
175215
Unit.Milliseconds,
176216
[{"Name": "SAM", "Value": "Dim1"}, {"Name": "SAM", "Value": "Dim2"}],
217+
datetime(2021, 9, 10, 10, 10, 10),
177218
),
178219
]
179220
)
180-
def test_publish_metric(self, namespace, name, value, unit, dimensions):
221+
def test_publish_metric(self, namespace, name, value, unit, dimensions, timestamp):
181222
mock_cw_client = MagicMock()
182223
metric_publisher = CWMetricsPublisher(mock_cw_client)
183-
metric_datum = MetricDatum(name, value, unit, dimensions)
224+
metric_datum = MetricDatum(name, value, unit, dimensions, timestamp)
184225
metrics = [metric_datum]
185226
metric_publisher.publish(namespace, metrics)
227+
expected_timestamp = timestamp if timestamp is not None else ANY
186228
mock_cw_client.put_metric_data.assert_has_calls(
187229
[
188230
call(
189231
MetricData=[
190-
{"Dimensions": dimensions, "Unit": unit, "Value": value, "MetricName": name, "Timestamp": ANY}
232+
{
233+
"Dimensions": dimensions,
234+
"Unit": unit,
235+
"Value": value,
236+
"MetricName": name,
237+
"Timestamp": expected_timestamp,
238+
}
191239
],
192240
Namespace=namespace,
193241
)

0 commit comments

Comments
 (0)