Skip to content

Commit 2320c0a

Browse files
authored
chore: lazy load some imports (#581)
* lazy load metrics also hashlib right away * black * update invocation metric to be error metric * lazyload `base64` * patch right call
1 parent 95f9aed commit 2320c0a

File tree

5 files changed

+28
-13
lines changed

5 files changed

+28
-13
lines changed

Diff for: datadog_lambda/api.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import os
22
import logging
3-
import base64
43

54
logger = logging.getLogger(__name__)
65
KMS_ENCRYPTION_CONTEXT_KEY = "LambdaFunctionName"
@@ -9,6 +8,7 @@
98

109
def decrypt_kms_api_key(kms_client, ciphertext):
1110
from botocore.exceptions import ClientError
11+
import base64
1212

1313
"""
1414
Decodes and deciphers the base64-encoded ciphertext given as a parameter using KMS.

Diff for: datadog_lambda/tracing.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@
22
# under the Apache License Version 2.0.
33
# This product includes software developed at Datadog (https://www.datadoghq.com/).
44
# Copyright 2019 Datadog, Inc.
5-
import hashlib
65
import logging
76
import os
8-
import base64
97
import traceback
108
import ujson as json
119
from datetime import datetime, timezone
@@ -259,6 +257,8 @@ def extract_context_from_sqs_or_sns_event_or_context(event, lambda_context):
259257
dd_json_data = None
260258
dd_json_data_type = dd_payload.get("Type") or dd_payload.get("dataType")
261259
if dd_json_data_type == "Binary":
260+
import base64
261+
262262
dd_json_data = dd_payload.get("binaryValue") or dd_payload.get("Value")
263263
if dd_json_data:
264264
dd_json_data = base64.b64decode(dd_json_data)
@@ -373,6 +373,8 @@ def extract_context_from_kinesis_event(event, lambda_context):
373373
return extract_context_from_lambda_context(lambda_context)
374374
data = kinesis.get("data")
375375
if data:
376+
import base64
377+
376378
b64_bytes = data.encode("ascii")
377379
str_bytes = base64.b64decode(b64_bytes)
378380
data_str = str_bytes.decode("ascii")
@@ -387,6 +389,8 @@ def extract_context_from_kinesis_event(event, lambda_context):
387389

388390

389391
def _deterministic_sha256_hash(s: str, part: str) -> int:
392+
import hashlib
393+
390394
sha256_hash = hashlib.sha256(s.encode()).hexdigest()
391395
# First two chars is '0b'. zfill to ensure 256 bits, but we only care about the first 128 bits
392396
binary_hash = bin(int(sha256_hash, 16))[2:].zfill(256)
@@ -551,6 +555,8 @@ def get_injected_authorizer_data(event, is_http_api) -> dict:
551555
if not dd_data_raw:
552556
return None
553557

558+
import base64
559+
554560
injected_data = json.loads(base64.b64decode(dd_data_raw))
555561

556562
# Lambda authorizer's results can be cached. But the payload will still have the injected

Diff for: datadog_lambda/trigger.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
# This product includes software developed at Datadog (https://www.datadoghq.com/).
44
# Copyright 2019 Datadog, Inc.
55

6-
import base64
76
import gzip
87
import ujson as json
98
from io import BytesIO, BufferedReader
@@ -242,6 +241,8 @@ def parse_event_source_arn(source: _EventSource, event: dict, context: Any) -> s
242241

243242
# e.g. arn:aws:logs:us-west-1:123456789012:log-group:/my-log-group-xyz
244243
if source.event_type == EventTypes.CLOUDWATCH_LOGS:
244+
import base64
245+
245246
with gzip.GzipFile(
246247
fileobj=BytesIO(base64.b64decode(event.get("awslogs", {}).get("data")))
247248
) as decompress_stream:

Diff for: datadog_lambda/wrapper.py

+16-8
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
# under the Apache License Version 2.0.
33
# This product includes software developed at Datadog (https://www.datadoghq.com/).
44
# Copyright 2019 Datadog, Inc.
5-
import base64
65
import os
76
import logging
87
import traceback
@@ -23,11 +22,6 @@
2322
XraySubsegment,
2423
Headers,
2524
)
26-
from datadog_lambda.metric import (
27-
flush_stats,
28-
submit_invocations_metric,
29-
submit_errors_metric,
30-
)
3125
from datadog_lambda.module_name import modify_module_name
3226
from datadog_lambda.patch import patch_all
3327
from datadog_lambda.span_pointers import calculate_span_pointers
@@ -248,7 +242,11 @@ def __call__(self, event, context, **kwargs):
248242
self.response = self.func(event, context, **kwargs)
249243
return self.response
250244
except Exception:
251-
submit_errors_metric(context)
245+
if not should_use_extension:
246+
from datadog_lambda.metric import submit_errors_metric
247+
248+
submit_errors_metric(context)
249+
252250
if self.span:
253251
self.span.set_traceback()
254252
raise
@@ -274,6 +272,9 @@ def _inject_authorizer_span_headers(self, request_id):
274272
injected_headers[Headers.Parent_Span_Finish_Time] = finish_time_ns
275273
if request_id is not None:
276274
injected_headers[Headers.Authorizing_Request_Id] = request_id
275+
276+
import base64
277+
277278
datadog_data = base64.b64encode(
278279
json.dumps(injected_headers, escape_forward_slashes=False).encode()
279280
).decode()
@@ -284,7 +285,12 @@ def _before(self, event, context):
284285
try:
285286
self.response = None
286287
set_cold_start(init_timestamp_ns)
287-
submit_invocations_metric(context)
288+
289+
if not should_use_extension:
290+
from datadog_lambda.metric import submit_invocations_metric
291+
292+
submit_invocations_metric(context)
293+
288294
self.trigger_tags = extract_trigger_tags(event, context)
289295
# Extract Datadog trace context and source from incoming requests
290296
dd_context, trace_context_source, event_source = extract_dd_trace_context(
@@ -383,6 +389,8 @@ def _after(self, event, context):
383389
logger.debug("Failed to create cold start spans. %s", e)
384390

385391
if not self.flush_to_log or should_use_extension:
392+
from datadog_lambda.metric import flush_stats
393+
386394
flush_stats(context)
387395
if should_use_extension and self.local_testing_mode:
388396
# when testing locally, the extension does not know when an

Diff for: tests/test_wrapper.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,7 @@ def lambda_handler(event, context):
470470
self.mock_write_metric_point_to_stdout.assert_not_called()
471471

472472
def test_only_one_wrapper_in_use(self):
473-
patcher = patch("datadog_lambda.wrapper.submit_invocations_metric")
473+
patcher = patch("datadog_lambda.metric.submit_invocations_metric")
474474
self.mock_submit_invocations_metric = patcher.start()
475475
self.addCleanup(patcher.stop)
476476

0 commit comments

Comments
 (0)