From 34ea256af00d584673b47682745e190040de5665 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Wed, 10 Apr 2024 11:01:05 -0700 Subject: [PATCH 1/3] Replace builtin json with faster ujson package. --- datadog_lambda/metric.py | 2 +- datadog_lambda/patch.py | 2 +- datadog_lambda/tag_object.py | 2 +- datadog_lambda/tracing.py | 2 +- datadog_lambda/trigger.py | 2 +- datadog_lambda/wrapper.py | 2 +- datadog_lambda/xray.py | 2 +- pyproject.toml | 1 + 8 files changed, 8 insertions(+), 7 deletions(-) diff --git a/datadog_lambda/metric.py b/datadog_lambda/metric.py index a49c6c14..1589293e 100644 --- a/datadog_lambda/metric.py +++ b/datadog_lambda/metric.py @@ -4,9 +4,9 @@ # Copyright 2019 Datadog, Inc. import os -import json import time import logging +import ujson as json from datadog_lambda.extension import should_use_extension from datadog_lambda.tags import get_enhanced_metrics_tags, dd_lambda_layer_tag diff --git a/datadog_lambda/patch.py b/datadog_lambda/patch.py index 0f6d28e9..bef73f7e 100644 --- a/datadog_lambda/patch.py +++ b/datadog_lambda/patch.py @@ -3,11 +3,11 @@ # This product includes software developed at Datadog (https://www.datadoghq.com/). # Copyright 2019 Datadog, Inc. -import json import os import sys import logging import zlib +import ujson as json from wrapt import wrap_function_wrapper as wrap from wrapt.importer import when_imported diff --git a/datadog_lambda/tag_object.py b/datadog_lambda/tag_object.py index 5571bf53..6d82f83b 100644 --- a/datadog_lambda/tag_object.py +++ b/datadog_lambda/tag_object.py @@ -4,8 +4,8 @@ # Copyright 2021 Datadog, Inc. from decimal import Decimal -import json import logging +import ujson as json redactable_keys = ["authorization", "x-authorization", "password", "token"] max_depth = 10 diff --git a/datadog_lambda/tracing.py b/datadog_lambda/tracing.py index 58a45af3..85c63bba 100644 --- a/datadog_lambda/tracing.py +++ b/datadog_lambda/tracing.py @@ -5,8 +5,8 @@ import hashlib import logging import os -import json import base64 +import ujson as json from datetime import datetime, timezone from typing import Optional, Dict diff --git a/datadog_lambda/trigger.py b/datadog_lambda/trigger.py index 0bb26d59..1c661e37 100644 --- a/datadog_lambda/trigger.py +++ b/datadog_lambda/trigger.py @@ -5,7 +5,7 @@ import base64 import gzip -import json +import ujson as json from io import BytesIO, BufferedReader from enum import Enum from typing import Any diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index 3f6e044b..27ec33a9 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -6,8 +6,8 @@ import os import logging import traceback +import ujson as json from importlib import import_module -import json from time import time_ns from datadog_lambda.extension import should_use_extension, flush_extension diff --git a/datadog_lambda/xray.py b/datadog_lambda/xray.py index c4fa1643..d9eebc6e 100644 --- a/datadog_lambda/xray.py +++ b/datadog_lambda/xray.py @@ -1,9 +1,9 @@ import os import logging -import json import binascii import time import socket +import ujson as json from datadog_lambda.constants import XrayDaemon, XraySubsegment, TraceContextSource diff --git a/pyproject.toml b/pyproject.toml index 7d77a952..1d15753e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,7 @@ python = ">=3.8.0,<4" datadog = ">=0.41.0,<1.0.0" wrapt = "^1.11.2" ddtrace = ">=2.7.2" +ujson = ">=5.9.0" urllib3 = [ {version = "<2.0.0", python = "<3.11", optional = true}, {version = "<2.1.0", python = ">=3.11", optional = true}, From f15ca01c6e635e2fea3e3b67399fed7a9376483e Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Wed, 10 Apr 2024 13:20:30 -0700 Subject: [PATCH 2/3] Do not escape forward slashes. --- datadog_lambda/metric.py | 3 ++- datadog_lambda/patch.py | 4 ++-- datadog_lambda/wrapper.py | 4 +++- datadog_lambda/xray.py | 3 ++- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/datadog_lambda/metric.py b/datadog_lambda/metric.py index 1589293e..e3b01a90 100644 --- a/datadog_lambda/metric.py +++ b/datadog_lambda/metric.py @@ -85,7 +85,8 @@ def write_metric_point_to_stdout(metric_name, value, timestamp=None, tags=[]): "v": value, "e": timestamp or int(time.time()), "t": tags, - } + }, + escape_forward_slashes=False, ) ) diff --git a/datadog_lambda/patch.py b/datadog_lambda/patch.py index bef73f7e..5b8a92c5 100644 --- a/datadog_lambda/patch.py +++ b/datadog_lambda/patch.py @@ -144,14 +144,14 @@ def _print_request_string(request): data = zlib.decompress(data) data_dict = json.loads(data) data_dict.get("series", []).sort(key=lambda series: series.get("metric")) - sorted_data = json.dumps(data_dict) + sorted_data = json.dumps(data_dict, escape_forward_slashes=False) # Sort headers to prevent any differences in ordering headers = request.headers or {} sorted_headers = sorted( "{}:{}".format(key, value) for key, value in headers.items() ) - sorted_header_str = json.dumps(sorted_headers) + sorted_header_str = json.dumps(sorted_headers, escape_forward_slashes=False) print( "HTTP {} {} Headers: {} Data: {}".format( method, url, sorted_header_str, sorted_data diff --git a/datadog_lambda/wrapper.py b/datadog_lambda/wrapper.py index 27ec33a9..ba31f2be 100644 --- a/datadog_lambda/wrapper.py +++ b/datadog_lambda/wrapper.py @@ -258,7 +258,9 @@ def _inject_authorizer_span_headers(self, request_id): injected_headers[Headers.Parent_Span_Finish_Time] = finish_time_ns if request_id is not None: injected_headers[Headers.Authorizing_Request_Id] = request_id - datadog_data = base64.b64encode(json.dumps(injected_headers).encode()).decode() + datadog_data = base64.b64encode( + json.dumps(injected_headers, escape_forward_slashes=False).encode() + ).decode() self.response.setdefault("context", {}) self.response["context"]["_datadog"] = datadog_data diff --git a/datadog_lambda/xray.py b/datadog_lambda/xray.py index d9eebc6e..002d13b1 100644 --- a/datadog_lambda/xray.py +++ b/datadog_lambda/xray.py @@ -102,7 +102,8 @@ def build_segment(context, key, metadata): key: metadata, } }, - } + }, + escape_forward_slashes=False, ) return segment From e3cfe07d42409d01827a3d324cb20afe87874ca3 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Thu, 11 Apr 2024 09:56:54 -0700 Subject: [PATCH 3/3] Update 3rd party licenses. --- LICENSE-3rdparty.csv | 2 ++ 1 file changed, 2 insertions(+) diff --git a/LICENSE-3rdparty.csv b/LICENSE-3rdparty.csv index 71ac83fb..1cfacb70 100644 --- a/LICENSE-3rdparty.csv +++ b/LICENSE-3rdparty.csv @@ -3,9 +3,11 @@ datadog,github.com/DataDog/datadogpy,BSD-3-Clause,"Copyright (c) 2015-Present Da wrapt,github.com/GrahamDumpleton/wrapt,BSD-2-Clause,"Copyright (c) 2013-2019, Graham Dumpleton" ddtrace,github.com/DataDog/dd-trace-py,BSD-3-Clause,"Copyright (c) 2016, Datadog " urllib3,github.com/urllib3/urllib3,MIT,Copyright (c) 2008-2020 Andrey Petrov and contributors. +ujson,github.com/ultrajson/ultrajson,BSD-3-Clause,"Copyright (c) 2014, Electronic Arts Inc" importlib_metadata,github.com/python/importlib_metadata,Apache-2.0,Copyright © Jason R. Coombs boto3,github.com/boto/boto3,Apache-2.0,"Copyright 2013-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved." typing_extensions,github.com/python/typing_extensions,PSF-2.0,"Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, The Netherlands. All rights reserved" requests,github.com/psf/requests,Apache-2.0,"Copyright 2018 Kenneth Reitz" pytest,github.com/pytest-dev/pytest,MIT,Copyright (c) 2004 Holger Krekel and others +pytest-benchmark,github.com/ionelmc/pytest-benchmark,BSD-2-Clause,"Copyright (c) 2014-2023, Ionel Cristian Mărieș. All rights reserved." flake8,gitlab.com/pycqa/flake8,MIT,"Copyright (C) 2011-2013 Tarek Ziade . Copyright (C) 2012-2016 Ian Cordasco ."