Skip to content

Commit 0ccaad3

Browse files
committed
fix Timestamp issue caused by creating the metric context too early
1 parent b873620 commit 0ccaad3

File tree

3 files changed

+25
-16
lines changed

3 files changed

+25
-16
lines changed

aws_embedded_metrics/metric_scope/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@
1818

1919

2020
def metric_scope(fn): # type: ignore
21-
logger = create_metrics_logger()
2221

2322
if asyncio.iscoroutinefunction(fn):
2423

2524
@wraps(fn)
2625
async def wrapper(*args, **kwargs): # type: ignore
26+
logger = create_metrics_logger()
2727
if "metrics" in inspect.signature(fn).parameters:
2828
kwargs["metrics"] = logger
2929
try:
@@ -38,6 +38,7 @@ async def wrapper(*args, **kwargs): # type: ignore
3838

3939
@wraps(fn)
4040
def wrapper(*args, **kwargs): # type: ignore
41+
logger = create_metrics_logger()
4142
if "metrics" in inspect.signature(fn).parameters:
4243
kwargs["metrics"] = logger
4344
try:

tests/logger/test_metrics_context.py

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,13 @@
11
from aws_embedded_metrics import config
22
from aws_embedded_metrics.logger.metrics_context import MetricsContext
3-
from aws_embedded_metrics import utils
43
from aws_embedded_metrics.constants import DEFAULT_NAMESPACE
5-
from _pytest.monkeypatch import MonkeyPatch
6-
import pytest
74
from importlib import reload
85
from faker import Faker
96

107
fake = Faker()
118

129

13-
@pytest.fixture
14-
def mock_time():
15-
expected_time = fake.random.randrange(0, 1000)
16-
monkeypatch = MonkeyPatch()
17-
monkeypatch.setattr(utils, "now", lambda: expected_time)
18-
return expected_time
19-
20-
21-
def test_can_create_context_with_no_arguments(mock_time):
10+
def test_can_create_context_with_no_arguments():
2211
# reload the configuration module since it is loaded on
2312
# startup and cached
2413
reload(config)
@@ -29,13 +18,13 @@ def test_can_create_context_with_no_arguments(mock_time):
2918

3019
# assert
3120
assert context.namespace == DEFAULT_NAMESPACE
32-
assert context.meta == {"Timestamp": mock_time}
21+
assert context.meta["Timestamp"] > 0
3322
assert context.properties == {}
3423
assert context.dimensions == []
3524
assert context.default_dimensions == {}
3625

3726

38-
def test_can_set_property(mock_time):
27+
def test_can_set_property():
3928
# arrange
4029
context = MetricsContext()
4130

@@ -49,7 +38,7 @@ def test_can_set_property(mock_time):
4938
assert context.properties == {property_key: property_value}
5039

5140

52-
def test_put_dimension_adds_to_dimensions(mock_time):
41+
def test_put_dimension_adds_to_dimensions():
5342
# arrange
5443
context = MetricsContext()
5544

tests/metric_scope/test_metric_scope.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from aws_embedded_metrics.metric_scope import metric_scope
22
from aws_embedded_metrics.logger.metrics_logger import MetricsLogger
33
import asyncio
4+
import time
45
import pytest
56

67
flush_invocations = []
@@ -149,6 +150,24 @@ def my_handler(metrics):
149150
assert InvocationTracker.invocations == 1
150151

151152

153+
def test_sync_scope_sets_time_based_on_when_wrapped_fcn_is_called(mock_logger):
154+
# arrange
155+
sleep_duration_sec = 3
156+
157+
@metric_scope
158+
def my_handler(metrics):
159+
return metrics
160+
161+
time.sleep(sleep_duration_sec)
162+
163+
# act
164+
expected_timestamp_second = int(round(time.time()))
165+
logger = my_handler()
166+
167+
# assert
168+
actual_timestamp_second = int(round(logger.context.meta["Timestamp"] / 1000))
169+
assert expected_timestamp_second == actual_timestamp_second
170+
152171
# Test helpers
153172

154173

0 commit comments

Comments
 (0)