From 35024b56fe51c640675646fdd11ac70ee789778b Mon Sep 17 00:00:00 2001 From: wan Date: Thu, 2 Jan 2025 14:45:49 -0500 Subject: [PATCH 1/5] Swap out utcnow for now due to deprecation. --- ddtrace/internal/debug.py | 2 +- tests/appsec/iast_packages/packages/pkg_pyjwt.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ddtrace/internal/debug.py b/ddtrace/internal/debug.py index 4d533b604b6..2c70422e9c8 100644 --- a/ddtrace/internal/debug.py +++ b/ddtrace/internal/debug.py @@ -118,7 +118,7 @@ def collect(tracer): return dict( # Timestamp UTC ISO 8601 - date=datetime.datetime.utcnow().isoformat(), + date=datetime.datetime.now(datetime.timezone.utc).isoformat(), # eg. "Linux", "Darwin" os_name=platform.system(), # eg. 12.5.0 diff --git a/tests/appsec/iast_packages/packages/pkg_pyjwt.py b/tests/appsec/iast_packages/packages/pkg_pyjwt.py index 4712f6cee0f..773d868c4ae 100644 --- a/tests/appsec/iast_packages/packages/pkg_pyjwt.py +++ b/tests/appsec/iast_packages/packages/pkg_pyjwt.py @@ -25,7 +25,7 @@ def pkg_pyjwt_view(): secret_key = "your-256-bit-secret" user_payload = request.args.get("package_param", "default-user") - payload = {"user": user_payload, "exp": datetime.datetime.utcnow() + datetime.timedelta(seconds=30)} + payload = {"user": user_payload, "exp": datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(seconds=30)} try: # Encode the payload to create a JWT From bf2776b1b4f7621c7fe5734008f781392ed40b46 Mon Sep 17 00:00:00 2001 From: wan Date: Thu, 2 Jan 2025 15:17:42 -0500 Subject: [PATCH 2/5] Replace utcfromtimestamp with fromtimestamp --- ddtrace/profiling/exporter/http.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ddtrace/profiling/exporter/http.py b/ddtrace/profiling/exporter/http.py index 6700e584ade..1c0f9fd11ca 100644 --- a/ddtrace/profiling/exporter/http.py +++ b/ddtrace/profiling/exporter/http.py @@ -220,8 +220,8 @@ def export( "family": "python", "attachments": [item["filename"].decode("utf-8") for item in data], "tags_profiler": self._get_tags(service), - "start": (datetime.datetime.utcfromtimestamp(start_time_ns / 1e9).replace(microsecond=0).isoformat() + "Z"), - "end": (datetime.datetime.utcfromtimestamp(end_time_ns / 1e9).replace(microsecond=0).isoformat() + "Z"), + "start": (datetime.datetime.fromtimestamp(start_time_ns / 1e9, tz=datetime.timezone.utc).replace(microsecond=0).isoformat() + "Z"), + "end": (datetime.datetime.fromtimestamp(end_time_ns / 1e9, tz=datetime.timezone.utc).replace(microsecond=0).isoformat() + "Z"), } # type: Dict[str, Any] if self.endpoint_call_counter_span_processor is not None: From 9f12157d4ae372c8af12cdf5104c7b40792605be Mon Sep 17 00:00:00 2001 From: wan Date: Thu, 2 Jan 2025 15:28:49 -0500 Subject: [PATCH 3/5] Fix formatting. --- ddtrace/profiling/exporter/http.py | 20 ++++++++++++++----- .../iast_packages/packages/pkg_pyjwt.py | 6 +++++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/ddtrace/profiling/exporter/http.py b/ddtrace/profiling/exporter/http.py index 1c0f9fd11ca..32dbd35bfcf 100644 --- a/ddtrace/profiling/exporter/http.py +++ b/ddtrace/profiling/exporter/http.py @@ -66,9 +66,9 @@ def __init__( self.version: typing.Optional[str] = version self.tags: typing.Dict[str, str] = tags if tags is not None else {} self.max_retry_delay: typing.Optional[float] = max_retry_delay - self.endpoint_call_counter_span_processor: typing.Optional[ - EndpointCallCounterProcessor - ] = endpoint_call_counter_span_processor + self.endpoint_call_counter_span_processor: typing.Optional[EndpointCallCounterProcessor] = ( + endpoint_call_counter_span_processor + ) self.__post_init__() @@ -220,8 +220,18 @@ def export( "family": "python", "attachments": [item["filename"].decode("utf-8") for item in data], "tags_profiler": self._get_tags(service), - "start": (datetime.datetime.fromtimestamp(start_time_ns / 1e9, tz=datetime.timezone.utc).replace(microsecond=0).isoformat() + "Z"), - "end": (datetime.datetime.fromtimestamp(end_time_ns / 1e9, tz=datetime.timezone.utc).replace(microsecond=0).isoformat() + "Z"), + "start": ( + datetime.datetime.fromtimestamp(start_time_ns / 1e9, tz=datetime.timezone.utc) + .replace(microsecond=0) + .isoformat() + + "Z" + ), + "end": ( + datetime.datetime.fromtimestamp(end_time_ns / 1e9, tz=datetime.timezone.utc) + .replace(microsecond=0) + .isoformat() + + "Z" + ), } # type: Dict[str, Any] if self.endpoint_call_counter_span_processor is not None: diff --git a/tests/appsec/iast_packages/packages/pkg_pyjwt.py b/tests/appsec/iast_packages/packages/pkg_pyjwt.py index 773d868c4ae..ec43d8a17d2 100644 --- a/tests/appsec/iast_packages/packages/pkg_pyjwt.py +++ b/tests/appsec/iast_packages/packages/pkg_pyjwt.py @@ -3,6 +3,7 @@ https://pypi.org/project/PyJWT/ """ + import datetime from flask import Blueprint @@ -25,7 +26,10 @@ def pkg_pyjwt_view(): secret_key = "your-256-bit-secret" user_payload = request.args.get("package_param", "default-user") - payload = {"user": user_payload, "exp": datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(seconds=30)} + payload = { + "user": user_payload, + "exp": datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(seconds=30), + } try: # Encode the payload to create a JWT From eb0a15fba30edf350643e9fb1b800cd9bf19564e Mon Sep 17 00:00:00 2001 From: wan Date: Thu, 2 Jan 2025 15:36:21 -0500 Subject: [PATCH 4/5] Formatting via black. --- ddtrace/profiling/exporter/http.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ddtrace/profiling/exporter/http.py b/ddtrace/profiling/exporter/http.py index 32dbd35bfcf..ff0780d5990 100644 --- a/ddtrace/profiling/exporter/http.py +++ b/ddtrace/profiling/exporter/http.py @@ -66,9 +66,9 @@ def __init__( self.version: typing.Optional[str] = version self.tags: typing.Dict[str, str] = tags if tags is not None else {} self.max_retry_delay: typing.Optional[float] = max_retry_delay - self.endpoint_call_counter_span_processor: typing.Optional[EndpointCallCounterProcessor] = ( - endpoint_call_counter_span_processor - ) + self.endpoint_call_counter_span_processor: typing.Optional[ + EndpointCallCounterProcessor + ] = endpoint_call_counter_span_processor self.__post_init__() From f91a5a356d981c8e4991bffa1d0a63058961e815 Mon Sep 17 00:00:00 2001 From: wan Date: Thu, 2 Jan 2025 16:32:12 -0500 Subject: [PATCH 5/5] Keep it consistent with the old time format for exporting purposes. --- ddtrace/internal/debug.py | 4 ++-- ddtrace/profiling/exporter/http.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ddtrace/internal/debug.py b/ddtrace/internal/debug.py index 2c70422e9c8..c33ff5ad46d 100644 --- a/ddtrace/internal/debug.py +++ b/ddtrace/internal/debug.py @@ -117,8 +117,8 @@ def collect(tracer): from ddtrace._trace.tracer import log return dict( - # Timestamp UTC ISO 8601 - date=datetime.datetime.now(datetime.timezone.utc).isoformat(), + # Timestamp UTC ISO 8601 with the trailing +00:00 removed + date=datetime.datetime.now(datetime.timezone.utc).isoformat()[0:-6], # eg. "Linux", "Darwin" os_name=platform.system(), # eg. 12.5.0 diff --git a/ddtrace/profiling/exporter/http.py b/ddtrace/profiling/exporter/http.py index ff0780d5990..b4ec6994d72 100644 --- a/ddtrace/profiling/exporter/http.py +++ b/ddtrace/profiling/exporter/http.py @@ -223,13 +223,13 @@ def export( "start": ( datetime.datetime.fromtimestamp(start_time_ns / 1e9, tz=datetime.timezone.utc) .replace(microsecond=0) - .isoformat() + .isoformat()[0:-6] # removes the trailing +00:00 portion of the time + "Z" ), "end": ( datetime.datetime.fromtimestamp(end_time_ns / 1e9, tz=datetime.timezone.utc) .replace(microsecond=0) - .isoformat() + .isoformat()[0:-6] # removes the trailing +00:00 portion of the time + "Z" ), } # type: Dict[str, Any]