Skip to content

Commit bfa3b82

Browse files
authored
chore: swap out deprecated datetime's utcnow and utcfromtimestamp (#11850)
See #11608 and #11497. Starting with [Python 3.12](https://docs.python.org/3/whatsnew/3.12.html), there were changes to datetime: > [datetime](https://docs.python.org/3/library/datetime.html#module-datetime): [datetime.datetime](https://docs.python.org/3/library/datetime.html#datetime.datetime)’s [utcnow()](https://docs.python.org/3/library/datetime.html#datetime.datetime.utcnow) and [utcfromtimestamp()](https://docs.python.org/3/library/datetime.html#datetime.datetime.utcfromtimestamp) are deprecated and will be removed in a future version. Instead, use timezone-aware objects to represent datetimes in UTC: respectively, call [now()](https://docs.python.org/3/library/datetime.html#datetime.datetime.now) and [fromtimestamp()](https://docs.python.org/3/library/datetime.html#datetime.datetime.fromtimestamp) with the tz parameter set to [datetime.UTC](https://docs.python.org/3/library/datetime.html#datetime.UTC). (Contributed by Paul Ganssle in [gh-103857](python/cpython#103857).) The result is that the usage of **utcnow** and **utcfromtimestamp** now throw deprecation warnings when used, ie: > DeprecationWarning: datetime.datetime.utcfromtimestamp() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.fromtimestamp(timestamp, datetime.UTC). There's a difference of `+00:00` between the old version and the new format. **For utcnow -> now** - `datetime.datetime.utcnow().isoformat()` | `'2025-01-02T19:51:32.579733'` - `datetime.datetime.now(datetime.timezone.utc).isoformat()` | `'2025-01-02T19:51:02.275232+00:00'` **For utcfromtimestamp -> fromtimestamp** Assume that `end_time_ns=1735848645000000000`: - `(datetime.datetime.fromtimestamp(end_time_ns / 1e9, tz=datetime.timezone.utc).replace(microsecond=0).isoformat() + "Z")` - returns `'2025-01-02T20:10:45+00:00Z'` - `(datetime.datetime.utcfromtimestamp(end_time_ns / 1e9).replace(microsecond=0).isoformat() + "Z")` - returns `'2025-01-02T20:10:45Z'` As a result, I attempted remove the trailing ones to be consistent with the old format, but can bring it back. ## Checklist - [x] PR author has checked that all the criteria below are met - The PR description includes an overview of the change - The PR description articulates the motivation for the change - The change includes tests OR the PR description describes a testing strategy - The PR description notes risks associated with the change, if any - Newly-added code is easy to change - The change follows the [library release note guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html) - The change includes or references documentation updates if necessary - Backport labels are set (if [applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)) ## Reviewer Checklist - [x] Reviewer has checked that all the criteria below are met - Title is accurate - All changes are related to the pull request's stated goal - Avoids breaking [API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces) changes - Testing strategy adequately addresses listed risks - Newly-added code is easy to change - Release note makes sense to a user of the library - If necessary, author has acknowledged and discussed the performance implications of this PR as reported in the benchmarks PR comment - Backport labels are set in a manner that is consistent with the [release branch maintenance policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)
1 parent 35fe7b5 commit bfa3b82

File tree

3 files changed

+19
-5
lines changed

3 files changed

+19
-5
lines changed

ddtrace/internal/debug.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,8 @@ def collect(tracer):
117117
from ddtrace._trace.tracer import log
118118

119119
return dict(
120-
# Timestamp UTC ISO 8601
121-
date=datetime.datetime.utcnow().isoformat(),
120+
# Timestamp UTC ISO 8601 with the trailing +00:00 removed
121+
date=datetime.datetime.now(datetime.timezone.utc).isoformat()[0:-6],
122122
# eg. "Linux", "Darwin"
123123
os_name=platform.system(),
124124
# eg. 12.5.0

ddtrace/profiling/exporter/http.py

+12-2
Original file line numberDiff line numberDiff line change
@@ -220,8 +220,18 @@ def export(
220220
"family": "python",
221221
"attachments": [item["filename"].decode("utf-8") for item in data],
222222
"tags_profiler": self._get_tags(service),
223-
"start": (datetime.datetime.utcfromtimestamp(start_time_ns / 1e9).replace(microsecond=0).isoformat() + "Z"),
224-
"end": (datetime.datetime.utcfromtimestamp(end_time_ns / 1e9).replace(microsecond=0).isoformat() + "Z"),
223+
"start": (
224+
datetime.datetime.fromtimestamp(start_time_ns / 1e9, tz=datetime.timezone.utc)
225+
.replace(microsecond=0)
226+
.isoformat()[0:-6] # removes the trailing +00:00 portion of the time
227+
+ "Z"
228+
),
229+
"end": (
230+
datetime.datetime.fromtimestamp(end_time_ns / 1e9, tz=datetime.timezone.utc)
231+
.replace(microsecond=0)
232+
.isoformat()[0:-6] # removes the trailing +00:00 portion of the time
233+
+ "Z"
234+
),
225235
} # type: Dict[str, Any]
226236

227237
if self.endpoint_call_counter_span_processor is not None:

tests/appsec/iast_packages/packages/pkg_pyjwt.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
44
https://pypi.org/project/PyJWT/
55
"""
6+
67
import datetime
78

89
from flask import Blueprint
@@ -25,7 +26,10 @@ def pkg_pyjwt_view():
2526
secret_key = "your-256-bit-secret"
2627
user_payload = request.args.get("package_param", "default-user")
2728

28-
payload = {"user": user_payload, "exp": datetime.datetime.utcnow() + datetime.timedelta(seconds=30)}
29+
payload = {
30+
"user": user_payload,
31+
"exp": datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(seconds=30),
32+
}
2933

3034
try:
3135
# Encode the payload to create a JWT

0 commit comments

Comments
 (0)