Browse Source

ref: avoid utcnow, use monotonic time to record span durations (#65265)

this avoids issues with clock skew and timezones as well as utcnow which
is removed in 3.14

<!-- Describe your PR here. -->
anthony sottile 1 year ago
parent
commit
67f530c251
1 changed files with 5 additions and 4 deletions
  1. 5 4
      src/sentry/services/hybrid_cloud/rpcmetrics.py

+ 5 - 4
src/sentry/services/hybrid_cloud/rpcmetrics.py

@@ -1,11 +1,12 @@
 from __future__ import annotations
 from __future__ import annotations
 
 
 import threading
 import threading
+import time
 from collections import deque
 from collections import deque
 from collections.abc import Generator
 from collections.abc import Generator
 from contextlib import contextmanager
 from contextlib import contextmanager
 from dataclasses import dataclass
 from dataclasses import dataclass
-from datetime import datetime, timedelta
+from datetime import timedelta
 from types import TracebackType
 from types import TracebackType
 
 
 from sentry_sdk.tracing import Span
 from sentry_sdk.tracing import Span
@@ -23,10 +24,10 @@ class RpcMetricRecord:
     @contextmanager
     @contextmanager
     def measure(cls, service_name: str, method_name: str) -> Generator[None, None, None]:
     def measure(cls, service_name: str, method_name: str) -> Generator[None, None, None]:
         """Measure an RPC and capture the result in any open spans."""
         """Measure an RPC and capture the result in any open spans."""
-        start = datetime.utcnow()
+        start = time.monotonic()
         yield
         yield
-        end = datetime.utcnow()
-        record = cls(service_name, method_name, duration=end - start)
+        end = time.monotonic()
+        record = cls(service_name, method_name, duration=timedelta(seconds=end - start))
         RpcMetricTracker.get_local().save_record(record)
         RpcMetricTracker.get_local().save_record(record)