Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion sentry_sdk/serializer.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import contextlib

from datetime import datetime

from sentry_sdk.utils import (
Expand Down Expand Up @@ -285,7 +286,7 @@ def _serialize_node_impl(self, obj, max_depth, max_breadth):
return obj

if isinstance(obj, datetime):
return text_type(obj.strftime("%Y-%m-%dT%H:%M:%SZ"))
return text_type(obj.strftime("%Y-%m-%dT%H:%M:%S.%fZ"))

if isinstance(obj, bytes):
obj = obj.decode("utf-8", "replace")
Expand Down
1 change: 1 addition & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ def inner(event):
)
_no_errors_in_semaphore_response(output)
output.pop("_meta", None)
return output

return inner

Expand Down
22 changes: 22 additions & 0 deletions tests/test_serializer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from datetime import datetime

from hypothesis import given, assume, example
import hypothesis.strategies as st

from sentry_sdk.serializer import Serializer


@given(dt=st.datetimes(timezones=st.just(None)))
@example(dt=datetime(2001, 1, 1, 0, 0, 0, 999500))
def test_datetime_precision(dt, assert_semaphore_acceptance):
assume(dt.year > 2000)
serializer = Serializer()

event = serializer.serialize_event({"timestamp": dt})
normalized = assert_semaphore_acceptance(event)

dt2 = datetime.utcfromtimestamp(normalized["timestamp"])

# Float glitches can happen, and more glitches can happen
# because we try to work around some float glitches in semaphore
assert (dt - dt2).total_seconds() < 1.0