-
Notifications
You must be signed in to change notification settings - Fork 45
/
Copy pathspan_pointers.py
91 lines (72 loc) · 2.43 KB
/
span_pointers.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
from itertools import chain
import logging
from typing import List
from ddtrace._trace.utils_botocore.span_pointers import (
_aws_s3_object_span_pointer_description,
)
from ddtrace._trace._span_pointer import _SpanPointerDirection
from ddtrace._trace._span_pointer import _SpanPointerDescription
from datadog_lambda.trigger import EventTypes
logger = logging.getLogger(__name__)
def calculate_span_pointers(
event_source,
event,
) -> List[_SpanPointerDescription]:
try:
if event_source.equals(EventTypes.S3):
return _calculate_s3_span_pointers_for_event(event)
except Exception as e:
logger.warning(
"failed to calculate span pointers for event: %s",
str(e),
)
return []
def _calculate_s3_span_pointers_for_event(event) -> List[_SpanPointerDescription]:
# Example event:
# https://docs.aws.amazon.com/lambda/latest/dg/with-s3.html
return list(
chain.from_iterable(
_calculate_s3_span_pointers_for_event_record(record)
for record in event.get("Records", [])
)
)
def _calculate_s3_span_pointers_for_event_record(
record,
) -> List[_SpanPointerDescription]:
# Event types:
# https://docs.aws.amazon.com/AmazonS3/latest/userguide/notification-how-to-event-types-and-destinations.html
if record.get("eventName").startswith("ObjectCreated:"):
s3_information = record.get("s3", None)
if s3_information is not None:
return _calculate_s3_span_pointers_for_object_created_s3_information(
s3_information
)
return []
def _calculate_s3_span_pointers_for_object_created_s3_information(
s3_information,
) -> List[_SpanPointerDescription]:
try:
bucket = s3_information["bucket"]["name"]
key = s3_information["object"]["key"]
etag = s3_information["object"]["eTag"]
except KeyError as e:
logger.warning(
"missing s3 information required to make a span pointer: %s",
str(e),
)
return []
try:
return [
_aws_s3_object_span_pointer_description(
pointer_direction=_SpanPointerDirection.UPSTREAM,
bucket=bucket,
key=key,
etag=etag,
)
]
except Exception as e:
logger.warning(
"failed to generate S3 span pointer: %s",
str(e),
)
return []