Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 22629ea

Browse files
authoredMar 27, 2024
Switch inferred spans tests to pytest parametrized. (#455)
* Switch inferred spans tests to pytest parametrized. * Remove global span caching. * Replace namedtuple with regular class object. * Linting. * Leave comments about parent name.
1 parent 33b7bfc commit 22629ea

File tree

1 file changed

+583
-750
lines changed

1 file changed

+583
-750
lines changed
 

‎tests/test_tracing.py

Lines changed: 583 additions & 750 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import unittest
1+
import copy
22
import functools
33
import json
4+
import pytest
45
import os
5-
import copy
6+
import unittest
67

78
from unittest.mock import MagicMock, Mock, patch, call
89

@@ -48,32 +49,6 @@
4849

4950
event_samples = "tests/event_samples/"
5051

51-
span_to_finish = None
52-
53-
54-
def _clean_up_span():
55-
global span_to_finish
56-
if span_to_finish is not None:
57-
span_to_finish.finish()
58-
span_to_finish = None
59-
60-
61-
def register_span(span):
62-
global span_to_finish
63-
_clean_up_span()
64-
span_to_finish = span
65-
return span
66-
67-
68-
def wrapped_span_creator(span_creator_func):
69-
def result_func(*args, **kwargs):
70-
return register_span(span_creator_func(*args, **kwargs))
71-
72-
return result_func
73-
74-
75-
create_inferred_span = wrapped_span_creator(create_inferred_span)
76-
7752

7853
class ClientContext(object):
7954
def __init__(self, custom=None):
@@ -712,160 +687,6 @@ def test_set_dd_trace_py_root_no_span_id(self):
712687
self.mock_activate.assert_has_calls([call(expected_context)])
713688

714689

715-
class TestAuthorizerInferredSpans(unittest.TestCase):
716-
def setUp(self):
717-
patcher = patch("ddtrace.Span.finish", autospec=True)
718-
self.mock_span_stop = patcher.start()
719-
self.addCleanup(patcher.stop)
720-
721-
def tearDown(self):
722-
_clean_up_span()
723-
724-
def test_create_inferred_span_from_authorizer_request_api_gateway_v1_event(self):
725-
event_sample_source = "authorizer-request-api-gateway-v1"
726-
finish_time = (
727-
1663295021.832 # request_time_epoch + integrationLatency for api-gateway-v1
728-
)
729-
span = self._authorizer_span_testing_items(event_sample_source, finish_time)
730-
self._basic_common_checks(span, "aws.apigateway.rest")
731-
732-
def test_create_inferred_span_from_authorizer_request_api_gateway_v1_cached_event(
733-
self,
734-
):
735-
event_sample_source = "authorizer-request-api-gateway-v1-cached"
736-
test_file = event_samples + event_sample_source + ".json"
737-
with open(test_file, "r") as event:
738-
event = json.load(event)
739-
ctx = get_mock_context()
740-
ctx.aws_request_id = "abc123" # injected data's requestId is abc321
741-
span = create_inferred_span(event, ctx)
742-
self.mock_span_stop.assert_not_called() # NO authorizer span is injected
743-
self._basic_common_checks(span, "aws.apigateway.rest")
744-
745-
def test_create_inferred_span_from_authorizer_token_api_gateway_v1_event(self):
746-
event_sample_source = "authorizer-token-api-gateway-v1"
747-
finish_time = (
748-
1663295021.832 # request_time_epoch + integrationLatency for api-gateway-v1
749-
)
750-
span = self._authorizer_span_testing_items(event_sample_source, finish_time)
751-
self._basic_common_checks(span, "aws.apigateway.rest")
752-
753-
def test_create_inferred_span_from_authorizer_token_api_gateway_v2_cached_event(
754-
self,
755-
):
756-
event_sample_source = "authorizer-token-api-gateway-v1-cached"
757-
test_file = event_samples + event_sample_source + ".json"
758-
with open(test_file, "r") as event:
759-
event = json.load(event)
760-
ctx = get_mock_context()
761-
ctx.aws_request_id = "abc123" # injected data's requestId is abc321
762-
span = create_inferred_span(event, ctx)
763-
self.mock_span_stop.assert_not_called() # NO authorizer span is injected
764-
self._basic_common_checks(span, "aws.apigateway.rest")
765-
766-
def test_create_inferred_span_from_authorizer_request_api_gateway_v2_event(self):
767-
event_sample_source = "authorizer-request-api-gateway-v2"
768-
finish_time = 1664228639533775400 # use the injected parent span finish time as an approximation
769-
test_file = event_samples + event_sample_source + ".json"
770-
with open(test_file, "r") as event:
771-
event = json.load(event)
772-
ctx = get_mock_context()
773-
ctx.aws_request_id = "abc123"
774-
span = create_inferred_span(event, ctx)
775-
self.assertEqual(span.get_tag(InferredSpanInfo.TAG_SOURCE), "self")
776-
self.assertEqual(span.get_tag(InferredSpanInfo.SYNCHRONICITY), "sync")
777-
self.mock_span_stop.assert_not_called()
778-
self.assertEqual(span.start_ns, finish_time)
779-
self._basic_common_checks(span, "aws.httpapi")
780-
781-
def test_create_inferred_span_from_authorizer_request_api_gateway_v2_cached_event(
782-
self,
783-
):
784-
event_sample_source = "authorizer-request-api-gateway-v2-cached"
785-
test_file = event_samples + event_sample_source + ".json"
786-
with open(test_file, "r") as event:
787-
event = json.load(event)
788-
ctx = get_mock_context()
789-
ctx.aws_request_id = "abc123" # injected data's requestId is abc321
790-
span = create_inferred_span(event, ctx)
791-
self.mock_span_stop.assert_not_called() # NO authorizer span is injected
792-
self._basic_common_checks(span, "aws.httpapi")
793-
794-
def test_create_inferred_span_from_authorizer_request_api_gateway_websocket_connect_event(
795-
self,
796-
):
797-
event_sample_source = "authorizer-request-api-gateway-websocket-connect"
798-
finish_time = (
799-
1664388386.892 # request_time_epoch + integrationLatency in websocket case
800-
)
801-
span = self._authorizer_span_testing_items(event_sample_source, finish_time)
802-
self._basic_common_checks(
803-
span, "aws.apigateway.websocket", "web", "$connect", None
804-
)
805-
806-
def test_create_inferred_span_from_authorizer_request_api_gateway_websocket_message_event(
807-
self,
808-
):
809-
event_sample_source = "authorizer-request-api-gateway-websocket-message"
810-
test_file = event_samples + event_sample_source + ".json"
811-
with open(test_file, "r") as event:
812-
event = json.load(event)
813-
ctx = get_mock_context()
814-
ctx.aws_request_id = "abc123" # injected data's requestId is abc321
815-
span = create_inferred_span(event, ctx)
816-
self.mock_span_stop.assert_not_called() # NO authorizer span is injected
817-
self._basic_common_checks(span, "aws.apigateway.websocket", "web", "main", None)
818-
819-
def _authorizer_span_testing_items(self, event_sample_source, finish_time):
820-
test_file = event_samples + event_sample_source + ".json"
821-
with open(test_file, "r") as event:
822-
event = json.load(event)
823-
ctx = get_mock_context()
824-
ctx.aws_request_id = "abc123"
825-
span = create_inferred_span(event, ctx)
826-
self.assertEqual(span.get_tag(InferredSpanInfo.TAG_SOURCE), "self")
827-
self.assertEqual(span.get_tag(InferredSpanInfo.SYNCHRONICITY), "sync")
828-
829-
# checking the upstream_authorizer_span
830-
self.mock_span_stop.assert_called_once()
831-
args, kwargs = self.mock_span_stop.call_args_list[0]
832-
self.assertEqual(kwargs.get("finish_time", args[1]), finish_time)
833-
self.assertEqual(span.start, finish_time)
834-
authorizer_span = args[0]
835-
self.assertEqual(authorizer_span.name, "aws.apigateway.authorizer")
836-
self.assertEqual(span.parent_id, authorizer_span.span_id)
837-
return span
838-
839-
def _basic_common_checks(
840-
self,
841-
span,
842-
operation_name,
843-
span_type="http",
844-
route_key="/hello",
845-
http_method="GET",
846-
):
847-
self.assertEqual(span.get_tag("apiid"), "amddr1rix9")
848-
self.assertEqual(span.get_tag("apiname"), "amddr1rix9")
849-
self.assertEqual(span.get_tag("stage"), "dev")
850-
self.assertEqual(span.get_tag("operation_name"), operation_name)
851-
self.assertEqual(span.span_type, span_type)
852-
self.assertEqual(
853-
span.service,
854-
"amddr1rix9.execute-api.eu-west-1.amazonaws.com",
855-
)
856-
self.assertEqual(
857-
span.get_tag("http.url"),
858-
"amddr1rix9.execute-api.eu-west-1.amazonaws.com" + route_key,
859-
)
860-
self.assertEqual(span.get_tag("endpoint"), route_key)
861-
self.assertEqual(span.get_tag("http.method"), http_method)
862-
self.assertEqual(
863-
span.get_tag("resource_names"),
864-
f"{http_method} {route_key}" if http_method else route_key,
865-
)
866-
self.assertEqual(span.get_tag("request_id"), "abc123")
867-
868-
869690
class TestServiceMapping(unittest.TestCase):
870691
def setUp(self):
871692
self.service_mapping = {}
@@ -1369,545 +1190,589 @@ def test_remaps_specific_inferred_span_service_names_from_eventbridge_event(
13691190
self.assertEqual(span2.service, "eventbridge")
13701191

13711192

1372-
class TestInferredSpans(unittest.TestCase):
1373-
def tearDown(self):
1374-
_clean_up_span()
1193+
class _Span(object):
1194+
def __init__(self, service, start, span_type, parent_name=None, tags=None):
1195+
self.service = service
1196+
self.start = start
1197+
self.span_type = span_type
1198+
self.parent_name = parent_name
1199+
self.tags = tags or {}
1200+
1201+
1202+
_test_create_inferred_span = (
1203+
(
1204+
"api-gateway",
1205+
_Span(
1206+
service="70ixmpl4fl.execute-api.us-east-2.amazonaws.com",
1207+
start=1428582896.0,
1208+
span_type="http",
1209+
tags={
1210+
"_dd.origin": "lambda",
1211+
"_inferred_span.synchronicity": "sync",
1212+
"_inferred_span.tag_source": "self",
1213+
"apiid": "1234567890",
1214+
"apiname": "1234567890",
1215+
"endpoint": "/path/to/resource",
1216+
"http.method": "POST",
1217+
"http.url": "70ixmpl4fl.execute-api.us-east-2.amazonaws.com/path/to/resource",
1218+
"operation_name": "aws.apigateway.rest",
1219+
"request_id": "123",
1220+
"resource_names": "POST /path/to/resource",
1221+
"stage": "prod",
1222+
},
1223+
),
1224+
),
1225+
(
1226+
"api-gateway-non-proxy-async",
1227+
_Span(
1228+
service="lgxbo6a518.execute-api.eu-west-1.amazonaws.com",
1229+
start=1631210915.2510002,
1230+
span_type="http",
1231+
tags={
1232+
"_dd.origin": "lambda",
1233+
"_inferred_span.synchronicity": "async",
1234+
"_inferred_span.tag_source": "self",
1235+
"apiid": "lgxbo6a518",
1236+
"apiname": "lgxbo6a518",
1237+
"endpoint": "/http/get",
1238+
"http.method": "GET",
1239+
"http.url": "lgxbo6a518.execute-api.eu-west-1.amazonaws.com/http/get",
1240+
"operation_name": "aws.apigateway.rest",
1241+
"request_id": "123",
1242+
"resource_names": "GET /http/get",
1243+
"stage": "dev",
1244+
},
1245+
),
1246+
),
1247+
(
1248+
"api-gateway-non-proxy",
1249+
_Span(
1250+
service="lgxbo6a518.execute-api.eu-west-1.amazonaws.com",
1251+
start=1631210915.2510002,
1252+
span_type="http",
1253+
tags={
1254+
"_dd.origin": "lambda",
1255+
"_inferred_span.synchronicity": "sync",
1256+
"_inferred_span.tag_source": "self",
1257+
"apiid": "lgxbo6a518",
1258+
"apiname": "lgxbo6a518",
1259+
"endpoint": "/http/get",
1260+
"http.method": "GET",
1261+
"http.url": "lgxbo6a518.execute-api.eu-west-1.amazonaws.com/http/get",
1262+
"operation_name": "aws.apigateway.rest",
1263+
"request_id": "123",
1264+
"resource_names": "GET /http/get",
1265+
"stage": "dev",
1266+
},
1267+
),
1268+
),
1269+
(
1270+
"http-api",
1271+
_Span(
1272+
service="x02yirxc7a.execute-api.eu-west-1.amazonaws.com",
1273+
start=1631212283.738,
1274+
span_type="http",
1275+
tags={
1276+
"_dd.origin": "lambda",
1277+
"_inferred_span.synchronicity": "sync",
1278+
"_inferred_span.tag_source": "self",
1279+
"apiid": "x02yirxc7a",
1280+
"apiname": "x02yirxc7a",
1281+
"endpoint": "/httpapi/get",
1282+
"http.method": "GET",
1283+
"http.protocol": "HTTP/1.1",
1284+
"http.source_ip": "38.122.226.210",
1285+
"http.url": "x02yirxc7a.execute-api.eu-west-1.amazonaws.com/httpapi/get",
1286+
"http.user_agent": "curl/7.64.1",
1287+
"operation_name": "aws.httpapi",
1288+
"request_id": "123",
1289+
"resource_names": "GET /httpapi/get",
1290+
"stage": "$default",
1291+
},
1292+
),
1293+
),
1294+
(
1295+
"api-gateway-websocket-default",
1296+
_Span(
1297+
service="p62c47itsb.execute-api.eu-west-1.amazonaws.com",
1298+
start=1631285061.365,
1299+
span_type="web",
1300+
tags={
1301+
"_dd.origin": "lambda",
1302+
"_inferred_span.synchronicity": "sync",
1303+
"_inferred_span.tag_source": "self",
1304+
"apiid": "p62c47itsb",
1305+
"apiname": "p62c47itsb",
1306+
"connection_id": "Fc5SzcoYGjQCJlg=",
1307+
"endpoint": "$default",
1308+
"event_type": "MESSAGE",
1309+
"http.url": "p62c47itsb.execute-api.eu-west-1.amazonaws.com$default",
1310+
"message_direction": "IN",
1311+
"operation_name": "aws.apigateway.websocket",
1312+
"request_id": "123",
1313+
"resource_names": "$default",
1314+
"stage": "dev",
1315+
},
1316+
),
1317+
),
1318+
(
1319+
"api-gateway-websocket-connect",
1320+
_Span(
1321+
service="p62c47itsb.execute-api.eu-west-1.amazonaws.com",
1322+
start=1631284003.071,
1323+
span_type="web",
1324+
tags={
1325+
"_dd.origin": "lambda",
1326+
"_inferred_span.synchronicity": "sync",
1327+
"_inferred_span.tag_source": "self",
1328+
"apiid": "p62c47itsb",
1329+
"apiname": "p62c47itsb",
1330+
"connection_id": "Fc2tgfl3mjQCJfA=",
1331+
"endpoint": "$connect",
1332+
"event_type": "CONNECT",
1333+
"http.url": "p62c47itsb.execute-api.eu-west-1.amazonaws.com$connect",
1334+
"message_direction": "IN",
1335+
"operation_name": "aws.apigateway.websocket",
1336+
"request_id": "123",
1337+
"resource_names": "$connect",
1338+
"stage": "dev",
1339+
},
1340+
),
1341+
),
1342+
(
1343+
"api-gateway-websocket-disconnect",
1344+
_Span(
1345+
service="p62c47itsb.execute-api.eu-west-1.amazonaws.com",
1346+
start=1631284034.737,
1347+
span_type="web",
1348+
tags={
1349+
"_dd.origin": "lambda",
1350+
"_inferred_span.synchronicity": "sync",
1351+
"_inferred_span.tag_source": "self",
1352+
"apiid": "p62c47itsb",
1353+
"apiname": "p62c47itsb",
1354+
"connection_id": "Fc2tgfl3mjQCJfA=",
1355+
"endpoint": "$disconnect",
1356+
"event_type": "DISCONNECT",
1357+
"http.url": "p62c47itsb.execute-api.eu-west-1.amazonaws.com$disconnect",
1358+
"message_direction": "IN",
1359+
"operation_name": "aws.apigateway.websocket",
1360+
"request_id": "123",
1361+
"resource_names": "$disconnect",
1362+
"stage": "dev",
1363+
},
1364+
),
1365+
),
1366+
(
1367+
"sqs-string-msg-attribute",
1368+
_Span(
1369+
service="sqs",
1370+
start=1634662094.538,
1371+
span_type="web",
1372+
tags={
1373+
"_dd.origin": "lambda",
1374+
"_inferred_span.synchronicity": "async",
1375+
"_inferred_span.tag_source": "self",
1376+
"event_source_arn": "arn:aws:sqs:eu-west-1:601427279990:InferredSpansQueueNode",
1377+
"operation_name": "aws.sqs",
1378+
"queuename": "InferredSpansQueueNode",
1379+
"resource_names": "InferredSpansQueueNode",
1380+
"sender_id": "AROAYYB64AB3LSVUYFP5T:harv-inferred-spans-dev-initSender",
1381+
},
1382+
),
1383+
),
1384+
(
1385+
"sns-string-msg-attribute",
1386+
_Span(
1387+
service="sns",
1388+
start=1643638421.637,
1389+
span_type="web",
1390+
tags={
1391+
"_dd.origin": "lambda",
1392+
"_inferred_span.synchronicity": "async",
1393+
"_inferred_span.tag_source": "self",
1394+
"message_id": "87056a47-f506-5d77-908b-303605d3b197",
1395+
"operation_name": "aws.sns",
1396+
"resource_names": "serverlessTracingTopicPy",
1397+
"topic_arn": "arn:aws:sns:eu-west-1:601427279990:serverlessTracingTopicPy",
1398+
"topicname": "serverlessTracingTopicPy",
1399+
"type": "Notification",
1400+
},
1401+
),
1402+
),
1403+
(
1404+
"sns-b64-msg-attribute",
1405+
_Span(
1406+
service="sns",
1407+
start=1643638421.637,
1408+
span_type="web",
1409+
tags={
1410+
"_dd.origin": "lambda",
1411+
"_inferred_span.synchronicity": "async",
1412+
"_inferred_span.tag_source": "self",
1413+
"message_id": "87056a47-f506-5d77-908b-303605d3b197",
1414+
"operation_name": "aws.sns",
1415+
"resource_names": "serverlessTracingTopicPy",
1416+
"topic_arn": "arn:aws:sns:eu-west-1:601427279990:serverlessTracingTopicPy",
1417+
"topicname": "serverlessTracingTopicPy",
1418+
"type": "Notification",
1419+
},
1420+
),
1421+
),
1422+
(
1423+
"kinesis",
1424+
_Span(
1425+
service="kinesis",
1426+
start=1643638425.163,
1427+
span_type="web",
1428+
tags={
1429+
"_dd.origin": "lambda",
1430+
"_inferred_span.synchronicity": "async",
1431+
"_inferred_span.tag_source": "self",
1432+
"endpoint": None,
1433+
"event_id": "shardId-000000000002:49624230154685806402418173680709770494154422022871973922",
1434+
"event_name": "aws:kinesis:record",
1435+
"event_source_arn": "arn:aws:kinesis:eu-west-1:601427279990:stream/kinesisStream",
1436+
"event_version": "1.0",
1437+
"http.method": None,
1438+
"http.url": None,
1439+
"operation_name": "aws.kinesis",
1440+
"partition_key": "partitionkey",
1441+
"request_id": None,
1442+
"resource_names": "stream/kinesisStream",
1443+
"shardid": "shardId-000000000002",
1444+
"streamname": "stream/kinesisStream",
1445+
},
1446+
),
1447+
),
1448+
(
1449+
"dynamodb",
1450+
_Span(
1451+
service="dynamodb",
1452+
start=1428537600.0,
1453+
span_type="web",
1454+
tags={
1455+
"_dd.origin": "lambda",
1456+
"_inferred_span.synchronicity": "async",
1457+
"_inferred_span.tag_source": "self",
1458+
"endpoint": None,
1459+
"event_id": "c4ca4238a0b923820dcc509a6f75849b",
1460+
"event_name": "INSERT",
1461+
"event_source_arn": "arn:aws:dynamodb:us-east-1:123456789012:table/ExampleTableWithStream/stream/2015-06-27T00:48:05.899",
1462+
"event_version": "1.1",
1463+
"http.method": None,
1464+
"http.url": None,
1465+
"operation_name": "aws.dynamodb",
1466+
"request_id": None,
1467+
"resource_names": "ExampleTableWithStream",
1468+
"size_bytes": "26",
1469+
"stream_view_type": "NEW_AND_OLD_IMAGES",
1470+
"tablename": "ExampleTableWithStream",
1471+
},
1472+
),
1473+
),
1474+
(
1475+
"s3",
1476+
_Span(
1477+
service="s3",
1478+
start=0.0,
1479+
span_type="web",
1480+
tags={
1481+
"_dd.origin": "lambda",
1482+
"_inferred_span.synchronicity": "async",
1483+
"_inferred_span.tag_source": "self",
1484+
"bucket_arn": "arn:aws:s3:::example-bucket",
1485+
"bucketname": "example-bucket",
1486+
"endpoint": None,
1487+
"event_name": "ObjectCreated:Put",
1488+
"http.method": None,
1489+
"http.url": None,
1490+
"object_etag": "0123456789abcdef0123456789abcdef",
1491+
"object_key": "test/key",
1492+
"object_size": "1024",
1493+
"operation_name": "aws.s3",
1494+
"request_id": None,
1495+
"resource_names": "example-bucket",
1496+
},
1497+
),
1498+
),
1499+
(
1500+
"eventbridge-custom",
1501+
_Span(
1502+
service="eventbridge",
1503+
start=1635989865.0,
1504+
span_type="web",
1505+
tags={
1506+
"_dd.origin": "lambda",
1507+
"_inferred_span.synchronicity": "async",
1508+
"_inferred_span.tag_source": "self",
1509+
"endpoint": None,
1510+
"http.method": None,
1511+
"http.url": None,
1512+
"operation_name": "aws.eventbridge",
1513+
"request_id": None,
1514+
"resource_names": "eventbridge.custom.event.sender",
1515+
},
1516+
),
1517+
),
1518+
(
1519+
"eventbridge-sqs",
1520+
_Span(
1521+
service="sqs",
1522+
start=1691102943.638,
1523+
span_type="web",
1524+
parent_name="aws.eventbridge",
1525+
tags={
1526+
"_dd.origin": "lambda",
1527+
"_inferred_span.synchronicity": "async",
1528+
"_inferred_span.tag_source": "self",
1529+
"endpoint": None,
1530+
"event_source_arn": "arn:aws:sqs:us-east-1:425362996713:eventbridge-sqs-queue",
1531+
"http.method": None,
1532+
"http.url": None,
1533+
"operation_name": "aws.sqs",
1534+
"queuename": "eventbridge-sqs-queue",
1535+
"request_id": None,
1536+
"resource_names": "eventbridge-sqs-queue",
1537+
"sender_id": "AIDAJXNJGGKNS7OSV23OI",
1538+
},
1539+
),
1540+
),
1541+
(
1542+
"api-gateway-no-apiid",
1543+
_Span(
1544+
service="70ixmpl4fl.execute-api.us-east-2.amazonaws.com",
1545+
start=1428582896.0,
1546+
span_type="http",
1547+
tags={
1548+
"_dd.origin": "lambda",
1549+
"_inferred_span.synchronicity": "sync",
1550+
"_inferred_span.tag_source": "self",
1551+
"apiid": "None",
1552+
"apiname": "None",
1553+
"endpoint": "/path/to/resource",
1554+
"http.method": "POST",
1555+
"http.url": "70ixmpl4fl.execute-api.us-east-2.amazonaws.com/path/to/resource",
1556+
"operation_name": "aws.apigateway.rest",
1557+
"request_id": "123",
1558+
"resource_names": "POST /path/to/resource",
1559+
"stage": "prod",
1560+
},
1561+
),
1562+
),
1563+
(
1564+
"authorizer-request-api-gateway-v1",
1565+
_Span(
1566+
service="amddr1rix9.execute-api.eu-west-1.amazonaws.com",
1567+
start=1663295021.832,
1568+
span_type="http",
1569+
parent_name="aws.apigateway.authorizer",
1570+
tags={
1571+
"_dd.origin": "lambda",
1572+
"_inferred_span.synchronicity": "sync",
1573+
"_inferred_span.tag_source": "self",
1574+
"apiid": "amddr1rix9",
1575+
"apiname": "amddr1rix9",
1576+
"endpoint": "/hello",
1577+
"http.method": "GET",
1578+
"http.url": "amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello",
1579+
"operation_name": "aws.apigateway.rest",
1580+
"request_id": "123",
1581+
"resource_names": "GET /hello",
1582+
"stage": "dev",
1583+
},
1584+
),
1585+
),
1586+
(
1587+
"authorizer-request-api-gateway-v1-cached",
1588+
_Span(
1589+
service="amddr1rix9.execute-api.eu-west-1.amazonaws.com",
1590+
start=1666714653.636,
1591+
span_type="http",
1592+
tags={
1593+
"_dd.origin": "lambda",
1594+
"_inferred_span.synchronicity": "sync",
1595+
"_inferred_span.tag_source": "self",
1596+
"apiid": "amddr1rix9",
1597+
"apiname": "amddr1rix9",
1598+
"endpoint": "/hello",
1599+
"http.method": "GET",
1600+
"http.url": "amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello",
1601+
"operation_name": "aws.apigateway.rest",
1602+
"request_id": "123",
1603+
"resource_names": "GET /hello",
1604+
"stage": "dev",
1605+
},
1606+
),
1607+
),
1608+
(
1609+
"authorizer-token-api-gateway-v1",
1610+
_Span(
1611+
service="amddr1rix9.execute-api.eu-west-1.amazonaws.com",
1612+
start=1663295021.832,
1613+
span_type="http",
1614+
parent_name="aws.apigateway.authorizer",
1615+
tags={
1616+
"_dd.origin": "lambda",
1617+
"_inferred_span.synchronicity": "sync",
1618+
"_inferred_span.tag_source": "self",
1619+
"apiid": "amddr1rix9",
1620+
"apiname": "amddr1rix9",
1621+
"endpoint": "/hello",
1622+
"http.method": "GET",
1623+
"http.url": "amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello",
1624+
"operation_name": "aws.apigateway.rest",
1625+
"request_id": "123",
1626+
"resource_names": "GET /hello",
1627+
"stage": "dev",
1628+
},
1629+
),
1630+
),
1631+
(
1632+
"authorizer-token-api-gateway-v1-cached",
1633+
_Span(
1634+
service="amddr1rix9.execute-api.eu-west-1.amazonaws.com",
1635+
start=1666803622.99,
1636+
span_type="http",
1637+
tags={
1638+
"_dd.origin": "lambda",
1639+
"_inferred_span.synchronicity": "sync",
1640+
"_inferred_span.tag_source": "self",
1641+
"apiid": "amddr1rix9",
1642+
"apiname": "amddr1rix9",
1643+
"endpoint": "/hello",
1644+
"http.method": "GET",
1645+
"http.url": "amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello",
1646+
"operation_name": "aws.apigateway.rest",
1647+
"request_id": "123",
1648+
"resource_names": "GET /hello",
1649+
"stage": "dev",
1650+
},
1651+
),
1652+
),
1653+
(
1654+
"authorizer-request-api-gateway-v2",
1655+
_Span(
1656+
service="amddr1rix9.execute-api.eu-west-1.amazonaws.com",
1657+
start=1664228639.5337753,
1658+
span_type="http",
1659+
tags={
1660+
"_dd.origin": "lambda",
1661+
"_inferred_span.synchronicity": "sync",
1662+
"_inferred_span.tag_source": "self",
1663+
"apiid": "amddr1rix9",
1664+
"apiname": "amddr1rix9",
1665+
"endpoint": "/hello",
1666+
"http.method": "GET",
1667+
"http.url": "amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello",
1668+
"operation_name": "aws.httpapi",
1669+
"request_id": "123",
1670+
"resource_names": "GET /hello",
1671+
"stage": "dev",
1672+
},
1673+
),
1674+
),
1675+
(
1676+
"authorizer-request-api-gateway-v2-cached",
1677+
_Span(
1678+
service="amddr1rix9.execute-api.eu-west-1.amazonaws.com",
1679+
start=1666715429.349,
1680+
span_type="http",
1681+
tags={
1682+
"_dd.origin": "lambda",
1683+
"_inferred_span.synchronicity": "sync",
1684+
"_inferred_span.tag_source": "self",
1685+
"apiid": "amddr1rix9",
1686+
"apiname": "amddr1rix9",
1687+
"endpoint": "/hello",
1688+
"http.method": "GET",
1689+
"http.url": "amddr1rix9.execute-api.eu-west-1.amazonaws.com/hello",
1690+
"operation_name": "aws.httpapi",
1691+
"request_id": "123",
1692+
"resource_names": "GET /hello",
1693+
"stage": "dev",
1694+
},
1695+
),
1696+
),
1697+
(
1698+
"authorizer-request-api-gateway-websocket-connect",
1699+
_Span(
1700+
service="amddr1rix9.execute-api.eu-west-1.amazonaws.com",
1701+
start=1664388386.892,
1702+
span_type="web",
1703+
parent_name="aws.apigateway.authorizer",
1704+
tags={
1705+
"_dd.origin": "lambda",
1706+
"_inferred_span.synchronicity": "sync",
1707+
"_inferred_span.tag_source": "self",
1708+
"apiid": "amddr1rix9",
1709+
"apiname": "amddr1rix9",
1710+
"connection_id": "ZLr9QeNLmjQCIZA=",
1711+
"endpoint": "$connect",
1712+
"event_type": "CONNECT",
1713+
"http.url": "amddr1rix9.execute-api.eu-west-1.amazonaws.com$connect",
1714+
"message_direction": "IN",
1715+
"operation_name": "aws.apigateway.websocket",
1716+
"request_id": "123",
1717+
"resource_names": "$connect",
1718+
"stage": "dev",
1719+
},
1720+
),
1721+
),
1722+
(
1723+
"authorizer-request-api-gateway-websocket-message",
1724+
_Span(
1725+
service="amddr1rix9.execute-api.eu-west-1.amazonaws.com",
1726+
start=1664390397.1169999,
1727+
span_type="web",
1728+
tags={
1729+
"_dd.origin": "lambda",
1730+
"_inferred_span.synchronicity": "sync",
1731+
"_inferred_span.tag_source": "self",
1732+
"apiid": "amddr1rix9",
1733+
"apiname": "amddr1rix9",
1734+
"connection_id": "ZLwtceO1mjQCI8Q=",
1735+
"endpoint": "main",
1736+
"event_type": "MESSAGE",
1737+
"http.url": "amddr1rix9.execute-api.eu-west-1.amazonaws.commain",
1738+
"message_direction": "IN",
1739+
"operation_name": "aws.apigateway.websocket",
1740+
"request_id": "123",
1741+
"resource_names": "main",
1742+
"stage": "dev",
1743+
},
1744+
),
1745+
),
1746+
)
13751747

1376-
def test_create_inferred_span_from_api_gateway_event(self):
1377-
event_sample_source = "api-gateway"
1378-
test_file = event_samples + event_sample_source + ".json"
1379-
with open(test_file, "r") as event:
1380-
event = json.load(event)
1381-
ctx = get_mock_context()
1382-
ctx.aws_request_id = "123"
1383-
span = create_inferred_span(event, ctx)
1384-
self.assertEqual(span.get_tag("operation_name"), "aws.apigateway.rest")
1385-
self.assertEqual(
1386-
span.service,
1387-
"70ixmpl4fl.execute-api.us-east-2.amazonaws.com",
1388-
)
1389-
self.assertEqual(
1390-
span.get_tag("http.url"),
1391-
"70ixmpl4fl.execute-api.us-east-2.amazonaws.com/path/to/resource",
1392-
)
1393-
self.assertEqual(span.get_tag("endpoint"), "/path/to/resource")
1394-
self.assertEqual(span.get_tag("http.method"), "POST")
1395-
self.assertEqual(
1396-
span.get_tag("resource_names"),
1397-
"POST /path/to/resource",
1398-
)
1399-
self.assertEqual(span.get_tag("request_id"), "123")
1400-
self.assertEqual(span.get_tag("apiid"), "1234567890")
1401-
self.assertEqual(span.get_tag("apiname"), "1234567890")
1402-
self.assertEqual(span.get_tag("stage"), "prod")
1403-
self.assertEqual(span.start, 1428582896.0)
1404-
self.assertEqual(span.span_type, "http")
1405-
self.assertEqual(span.get_tag(InferredSpanInfo.TAG_SOURCE), "self")
1406-
self.assertEqual(span.get_tag(InferredSpanInfo.SYNCHRONICITY), "sync")
1407-
1408-
def test_create_inferred_span_from_api_gateway_non_proxy_event_async(self):
1409-
event_sample_source = "api-gateway-non-proxy-async"
1410-
test_file = event_samples + event_sample_source + ".json"
1411-
with open(test_file, "r") as event:
1412-
event = json.load(event)
1413-
ctx = get_mock_context()
1414-
ctx.aws_request_id = "123"
1415-
span = create_inferred_span(event, ctx)
1416-
self.assertEqual(span.get_tag("operation_name"), "aws.apigateway.rest")
1417-
self.assertEqual(
1418-
span.service,
1419-
"lgxbo6a518.execute-api.eu-west-1.amazonaws.com",
1420-
)
1421-
self.assertEqual(
1422-
span.get_tag("http.url"),
1423-
"lgxbo6a518.execute-api.eu-west-1.amazonaws.com/http/get",
1424-
)
1425-
self.assertEqual(span.get_tag("endpoint"), "/http/get")
1426-
self.assertEqual(span.get_tag("http.method"), "GET")
1427-
self.assertEqual(
1428-
span.get_tag("resource_names"),
1429-
"GET /http/get",
1430-
)
1431-
self.assertEqual(span.get_tag("request_id"), "123")
1432-
self.assertEqual(span.get_tag("apiid"), "lgxbo6a518")
1433-
self.assertEqual(span.get_tag("apiname"), "lgxbo6a518")
1434-
self.assertEqual(span.get_tag("stage"), "dev")
1435-
self.assertEqual(span.start, 1631210915.2510002)
1436-
self.assertEqual(span.span_type, "http")
1437-
self.assertEqual(span.get_tag(InferredSpanInfo.TAG_SOURCE), "self")
1438-
self.assertEqual(span.get_tag(InferredSpanInfo.SYNCHRONICITY), "async")
1439-
1440-
def test_create_inferred_span_from_api_gateway_non_proxy_event_sync(self):
1441-
event_sample_source = "api-gateway-non-proxy"
1442-
test_file = event_samples + event_sample_source + ".json"
1443-
with open(test_file, "r") as event:
1444-
event = json.load(event)
1445-
ctx = get_mock_context()
1446-
ctx.aws_request_id = "123"
1447-
span = create_inferred_span(event, ctx)
1448-
self.assertEqual(span.get_tag("operation_name"), "aws.apigateway.rest")
1449-
self.assertEqual(
1450-
span.service,
1451-
"lgxbo6a518.execute-api.eu-west-1.amazonaws.com",
1452-
)
1453-
self.assertEqual(
1454-
span.get_tag("http.url"),
1455-
"lgxbo6a518.execute-api.eu-west-1.amazonaws.com/http/get",
1456-
)
1457-
self.assertEqual(span.get_tag("endpoint"), "/http/get")
1458-
self.assertEqual(span.get_tag("http.method"), "GET")
1459-
self.assertEqual(
1460-
span.get_tag("resource_names"),
1461-
"GET /http/get",
1462-
)
1463-
self.assertEqual(span.get_tag("request_id"), "123")
1464-
self.assertEqual(span.get_tag("apiid"), "lgxbo6a518")
1465-
self.assertEqual(span.get_tag("apiname"), "lgxbo6a518")
1466-
self.assertEqual(span.get_tag("stage"), "dev")
1467-
self.assertEqual(span.start, 1631210915.2510002)
1468-
self.assertEqual(span.span_type, "http")
1469-
self.assertEqual(span.get_tag(InferredSpanInfo.TAG_SOURCE), "self")
1470-
self.assertEqual(span.get_tag(InferredSpanInfo.SYNCHRONICITY), "sync")
1471-
1472-
def test_create_inferred_span_from_http_api_event(self):
1473-
event_sample_source = "http-api"
1474-
test_file = event_samples + event_sample_source + ".json"
1475-
with open(test_file, "r") as event:
1476-
event = json.load(event)
1477-
ctx = get_mock_context()
1478-
ctx.aws_request_id = "123"
1479-
span = create_inferred_span(event, ctx)
1480-
self.assertEqual(span.get_tag("operation_name"), "aws.httpapi")
1481-
self.assertEqual(
1482-
span.service,
1483-
"x02yirxc7a.execute-api.eu-west-1.amazonaws.com",
1484-
)
1485-
self.assertEqual(
1486-
span.get_tag("http.url"),
1487-
"x02yirxc7a.execute-api.eu-west-1.amazonaws.com/httpapi/get",
1488-
)
1489-
self.assertEqual(span.get_tag("endpoint"), "/httpapi/get")
1490-
self.assertEqual(span.get_tag("http.method"), "GET")
1491-
self.assertEqual(
1492-
span.get_tag("resource_names"),
1493-
"GET /httpapi/get",
1494-
)
1495-
self.assertEqual(span.get_tag("request_id"), "123")
1496-
self.assertEqual(span.get_tag("apiid"), "x02yirxc7a")
1497-
self.assertEqual(span.get_tag("apiname"), "x02yirxc7a")
1498-
self.assertEqual(span.get_tag("stage"), "$default")
1499-
self.assertEqual(span.get_tag("http.protocol"), "HTTP/1.1")
1500-
self.assertEqual(span.get_tag("http.source_ip"), "38.122.226.210")
1501-
self.assertEqual(span.get_tag("http.user_agent"), "curl/7.64.1")
1502-
self.assertEqual(span.start, 1631212283.738)
1503-
self.assertEqual(span.span_type, "http")
1504-
self.assertEqual(span.get_tag(InferredSpanInfo.TAG_SOURCE), "self")
1505-
self.assertEqual(span.get_tag(InferredSpanInfo.SYNCHRONICITY), "sync")
1506-
1507-
def test_create_inferred_span_from_api_gateway_websocket_default_event(self):
1508-
event_sample_source = "api-gateway-websocket-default"
1509-
test_file = event_samples + event_sample_source + ".json"
1510-
with open(test_file, "r") as event:
1511-
event = json.load(event)
1512-
ctx = get_mock_context()
1513-
ctx.aws_request_id = "123"
1514-
span = create_inferred_span(event, ctx)
1515-
self.assertEqual(span.get_tag("operation_name"), "aws.apigateway.websocket")
1516-
self.assertEqual(
1517-
span.service,
1518-
"p62c47itsb.execute-api.eu-west-1.amazonaws.com",
1519-
)
1520-
self.assertEqual(
1521-
span.get_tag("http.url"),
1522-
"p62c47itsb.execute-api.eu-west-1.amazonaws.com$default",
1523-
)
1524-
self.assertEqual(span.get_tag("endpoint"), "$default")
1525-
self.assertEqual(span.get_tag("http.method"), None)
1526-
self.assertEqual(
1527-
span.get_tag("resource_names"),
1528-
"$default",
1529-
)
1530-
self.assertEqual(span.get_tag("request_id"), "123")
1531-
self.assertEqual(span.get_tag("apiid"), "p62c47itsb")
1532-
self.assertEqual(span.get_tag("apiname"), "p62c47itsb")
1533-
self.assertEqual(span.get_tag("stage"), "dev")
1534-
self.assertEqual(span.get_tag("connection_id"), "Fc5SzcoYGjQCJlg=")
1535-
self.assertEqual(span.get_tag("event_type"), "MESSAGE")
1536-
self.assertEqual(span.get_tag("message_direction"), "IN")
1537-
self.assertEqual(span.start, 1631285061.365)
1538-
self.assertEqual(span.span_type, "web")
1539-
self.assertEqual(span.get_tag(InferredSpanInfo.TAG_SOURCE), "self")
1540-
self.assertEqual(span.get_tag(InferredSpanInfo.SYNCHRONICITY), "sync")
1541-
1542-
def test_create_inferred_span_from_api_gateway_websocket_connect_event(self):
1543-
event_sample_source = "api-gateway-websocket-connect"
1544-
test_file = event_samples + event_sample_source + ".json"
1545-
with open(test_file, "r") as event:
1546-
event = json.load(event)
1547-
ctx = get_mock_context()
1548-
ctx.aws_request_id = "123"
1549-
span = create_inferred_span(event, ctx)
1550-
self.assertEqual(span.get_tag("operation_name"), "aws.apigateway.websocket")
1551-
self.assertEqual(
1552-
span.service,
1553-
"p62c47itsb.execute-api.eu-west-1.amazonaws.com",
1554-
)
1555-
self.assertEqual(
1556-
span.get_tag("http.url"),
1557-
"p62c47itsb.execute-api.eu-west-1.amazonaws.com$connect",
1558-
)
1559-
self.assertEqual(span.get_tag("endpoint"), "$connect")
1560-
self.assertEqual(span.get_tag("http.method"), None)
1561-
self.assertEqual(
1562-
span.get_tag("resource_names"),
1563-
"$connect",
1564-
)
1565-
self.assertEqual(span.get_tag("request_id"), "123")
1566-
self.assertEqual(span.get_tag("apiid"), "p62c47itsb")
1567-
self.assertEqual(span.get_tag("apiname"), "p62c47itsb")
1568-
self.assertEqual(span.get_tag("stage"), "dev")
1569-
self.assertEqual(span.get_tag("connection_id"), "Fc2tgfl3mjQCJfA=")
1570-
self.assertEqual(span.get_tag("event_type"), "CONNECT")
1571-
self.assertEqual(span.get_tag("message_direction"), "IN")
1572-
self.assertEqual(span.start, 1631284003.071)
1573-
self.assertEqual(span.span_type, "web")
1574-
self.assertEqual(span.get_tag(InferredSpanInfo.TAG_SOURCE), "self")
1575-
self.assertEqual(span.get_tag(InferredSpanInfo.SYNCHRONICITY), "sync")
1576-
1577-
def test_create_inferred_span_from_api_gateway_websocket_disconnect_event(self):
1578-
event_sample_source = "api-gateway-websocket-disconnect"
1579-
test_file = event_samples + event_sample_source + ".json"
1580-
with open(test_file, "r") as event:
1581-
event = json.load(event)
1582-
ctx = get_mock_context()
1583-
ctx.aws_request_id = "123"
1584-
span = create_inferred_span(event, ctx)
1585-
self.assertEqual(span.get_tag("operation_name"), "aws.apigateway.websocket")
1586-
self.assertEqual(
1587-
span.service,
1588-
"p62c47itsb.execute-api.eu-west-1.amazonaws.com",
1589-
)
1590-
self.assertEqual(
1591-
span.get_tag("http.url"),
1592-
"p62c47itsb.execute-api.eu-west-1.amazonaws.com$disconnect",
1593-
)
1594-
self.assertEqual(span.get_tag("endpoint"), "$disconnect")
1595-
self.assertEqual(span.get_tag("http.method"), None)
1596-
self.assertEqual(
1597-
span.get_tag("resource_names"),
1598-
"$disconnect",
1599-
)
1600-
self.assertEqual(span.get_tag("request_id"), "123")
1601-
self.assertEqual(span.get_tag("apiid"), "p62c47itsb")
1602-
self.assertEqual(span.get_tag("apiname"), "p62c47itsb")
1603-
self.assertEqual(span.get_tag("stage"), "dev")
1604-
self.assertEqual(span.get_tag("connection_id"), "Fc2tgfl3mjQCJfA=")
1605-
self.assertEqual(span.get_tag("event_type"), "DISCONNECT")
1606-
self.assertEqual(span.get_tag("message_direction"), "IN")
1607-
self.assertEqual(span.start, 1631284034.737)
1608-
self.assertEqual(span.span_type, "web")
1609-
self.assertEqual(span.get_tag(InferredSpanInfo.TAG_SOURCE), "self")
1610-
self.assertEqual(span.get_tag(InferredSpanInfo.SYNCHRONICITY), "sync")
1611-
1612-
def test_create_inferred_span_from_sqs_event_string_msg_attr(self):
1613-
event_sample_name = "sqs-string-msg-attribute"
1614-
test_file = event_samples + event_sample_name + ".json"
1615-
with open(test_file, "r") as event:
1616-
event = json.load(event)
1617-
ctx = get_mock_context()
1618-
ctx.aws_request_id = "123"
1619-
span = create_inferred_span(event, ctx)
1620-
self.assertEqual(span.get_tag("operation_name"), "aws.sqs")
1621-
self.assertEqual(
1622-
span.service,
1623-
"sqs",
1624-
)
1625-
self.assertEqual(
1626-
span.get_tag("http.url"),
1627-
None,
1628-
)
1629-
self.assertEqual(span.get_tag("endpoint"), None)
1630-
self.assertEqual(span.get_tag("http.method"), None)
1631-
self.assertEqual(
1632-
span.get_tag("resource_names"),
1633-
"InferredSpansQueueNode",
1634-
)
1635-
self.assertEqual(span.get_tag("request_id"), None)
1636-
self.assertEqual(span.get_tag("queuename"), "InferredSpansQueueNode")
1637-
self.assertEqual(
1638-
span.get_tag("event_source_arn"),
1639-
"arn:aws:sqs:eu-west-1:601427279990:InferredSpansQueueNode",
1640-
)
1641-
self.assertEqual(
1642-
span.get_tag("sender_id"),
1643-
"AROAYYB64AB3LSVUYFP5T:harv-inferred-spans-dev-initSender",
1644-
)
1645-
self.assertEqual(span.start, 1634662094.538)
1646-
self.assertEqual(span.span_type, "web")
1647-
self.assertEqual(span.get_tag(InferredSpanInfo.TAG_SOURCE), "self")
1648-
self.assertEqual(span.get_tag(InferredSpanInfo.SYNCHRONICITY), "async")
1649-
1650-
def test_create_inferred_span_from_sns_event_string_msg_attr(self):
1651-
event_sample_name = "sns-string-msg-attribute"
1652-
test_file = event_samples + event_sample_name + ".json"
1653-
with open(test_file, "r") as event:
1654-
event = json.load(event)
1655-
ctx = get_mock_context()
1656-
ctx.aws_request_id = "123"
1657-
span = create_inferred_span(event, ctx)
1658-
self.assertEqual(span.get_tag("operation_name"), "aws.sns")
1659-
self.assertEqual(
1660-
span.service,
1661-
"sns",
1662-
)
1663-
self.assertEqual(
1664-
span.get_tag("http.url"),
1665-
None,
1666-
)
1667-
self.assertEqual(span.get_tag("endpoint"), None)
1668-
self.assertEqual(span.get_tag("http.method"), None)
1669-
self.assertEqual(
1670-
span.get_tag("resource_names"),
1671-
"serverlessTracingTopicPy",
1672-
)
1673-
self.assertEqual(span.get_tag("topicname"), "serverlessTracingTopicPy")
1674-
self.assertEqual(
1675-
span.get_tag("topic_arn"),
1676-
"arn:aws:sns:eu-west-1:601427279990:serverlessTracingTopicPy",
1677-
)
1678-
self.assertEqual(
1679-
span.get_tag("message_id"), "87056a47-f506-5d77-908b-303605d3b197"
1680-
)
1681-
self.assertEqual(span.get_tag("type"), "Notification")
1682-
self.assertEqual(span.get_tag("subject"), None)
1683-
self.assertEqual(span.start, 1643638421.637)
1684-
self.assertEqual(span.span_type, "web")
1685-
self.assertEqual(span.get_tag(InferredSpanInfo.TAG_SOURCE), "self")
1686-
self.assertEqual(span.get_tag(InferredSpanInfo.SYNCHRONICITY), "async")
1687-
1688-
def test_create_inferred_span_from_sns_event_b64_msg_attr(self):
1689-
event_sample_name = "sns-b64-msg-attribute"
1690-
test_file = event_samples + event_sample_name + ".json"
1691-
with open(test_file, "r") as event:
1692-
event = json.load(event)
1693-
ctx = get_mock_context()
1694-
ctx.aws_request_id = "123"
1695-
span = create_inferred_span(event, ctx)
1696-
self.assertEqual(span.get_tag("operation_name"), "aws.sns")
1697-
self.assertEqual(
1698-
span.service,
1699-
"sns",
1700-
)
1701-
self.assertEqual(
1702-
span.get_tag("http.url"),
1703-
None,
1704-
)
1705-
self.assertEqual(span.get_tag("endpoint"), None)
1706-
self.assertEqual(span.get_tag("http.method"), None)
1707-
self.assertEqual(
1708-
span.get_tag("resource_names"),
1709-
"serverlessTracingTopicPy",
1710-
)
1711-
self.assertEqual(span.get_tag("topicname"), "serverlessTracingTopicPy")
1712-
self.assertEqual(
1713-
span.get_tag("topic_arn"),
1714-
"arn:aws:sns:eu-west-1:601427279990:serverlessTracingTopicPy",
1715-
)
1716-
self.assertEqual(
1717-
span.get_tag("message_id"), "87056a47-f506-5d77-908b-303605d3b197"
1718-
)
1719-
self.assertEqual(span.get_tag("type"), "Notification")
1720-
self.assertEqual(span.get_tag("subject"), None)
1721-
self.assertEqual(span.start, 1643638421.637)
1722-
self.assertEqual(span.span_type, "web")
1723-
self.assertEqual(span.get_tag(InferredSpanInfo.TAG_SOURCE), "self")
1724-
self.assertEqual(span.get_tag(InferredSpanInfo.SYNCHRONICITY), "async")
1725-
1726-
def test_create_inferred_span_from_kinesis_event(self):
1727-
event_sample_source = "kinesis"
1728-
test_file = event_samples + event_sample_source + ".json"
1729-
with open(test_file, "r") as event:
1730-
event = json.load(event)
1731-
ctx = get_mock_context()
1732-
ctx.aws_request_id = "123"
1733-
span = create_inferred_span(event, ctx)
1734-
self.assertEqual(span.get_tag("operation_name"), "aws.kinesis")
1735-
self.assertEqual(
1736-
span.service,
1737-
"kinesis",
1738-
)
1739-
self.assertEqual(
1740-
span.get_tag("http.url"),
1741-
None,
1742-
)
1743-
self.assertEqual(span.get_tag("endpoint"), None)
1744-
self.assertEqual(span.get_tag("http.method"), None)
1745-
self.assertEqual(
1746-
span.get_tag("resource_names"),
1747-
"stream/kinesisStream",
1748-
)
1749-
self.assertEqual(span.get_tag("request_id"), None)
1750-
self.assertEqual(span.get_tag("streamname"), "stream/kinesisStream")
1751-
self.assertEqual(span.get_tag("shardid"), "shardId-000000000002")
1752-
self.assertEqual(
1753-
span.get_tag("event_source_arn"),
1754-
"arn:aws:kinesis:eu-west-1:601427279990:stream/kinesisStream",
1755-
)
1756-
self.assertEqual(
1757-
span.get_tag("event_id"),
1758-
"shardId-000000000002:49624230154685806402418173680709770494154422022871973922",
1759-
)
1760-
self.assertEqual(span.get_tag("event_name"), "aws:kinesis:record")
1761-
self.assertEqual(span.get_tag("event_version"), "1.0")
1762-
self.assertEqual(span.get_tag("partition_key"), "partitionkey")
1763-
self.assertEqual(span.start, 1643638425.163)
1764-
self.assertEqual(span.span_type, "web")
1765-
self.assertEqual(span.get_tag(InferredSpanInfo.TAG_SOURCE), "self")
1766-
self.assertEqual(span.get_tag(InferredSpanInfo.SYNCHRONICITY), "async")
1767-
1768-
def test_create_inferred_span_from_dynamodb_event(self):
1769-
event_sample_source = "dynamodb"
1770-
test_file = event_samples + event_sample_source + ".json"
1771-
with open(test_file, "r") as event:
1772-
event = json.load(event)
1773-
ctx = get_mock_context()
1774-
ctx.aws_request_id = "123"
1775-
span = create_inferred_span(event, ctx)
1776-
self.assertEqual(span.get_tag("operation_name"), "aws.dynamodb")
1777-
self.assertEqual(
1778-
span.service,
1779-
"dynamodb",
1780-
)
1781-
self.assertEqual(
1782-
span.get_tag("http.url"),
1783-
None,
1784-
)
1785-
self.assertEqual(span.get_tag("endpoint"), None)
1786-
self.assertEqual(span.get_tag("http.method"), None)
1787-
self.assertEqual(
1788-
span.get_tag("resource_names"),
1789-
"ExampleTableWithStream",
1790-
)
1791-
self.assertEqual(span.get_tag("request_id"), None)
1792-
self.assertEqual(span.get_tag("tablename"), "ExampleTableWithStream")
1793-
self.assertEqual(
1794-
span.get_tag("event_source_arn"),
1795-
"arn:aws:dynamodb:us-east-1:123456789012:table/ExampleTableWithStream/stream/2015-06-27T00:48:05.899",
1796-
)
1797-
self.assertEqual(span.get_tag("event_id"), "c4ca4238a0b923820dcc509a6f75849b")
1798-
self.assertEqual(span.get_tag("event_name"), "INSERT")
1799-
self.assertEqual(span.get_tag("event_version"), "1.1")
1800-
self.assertEqual(span.get_tag("stream_view_type"), "NEW_AND_OLD_IMAGES")
1801-
self.assertEqual(span.get_tag("size_bytes"), "26")
1802-
self.assertEqual(span.start, 1428537600.0)
1803-
self.assertEqual(span.span_type, "web")
1804-
self.assertEqual(span.get_tag(InferredSpanInfo.TAG_SOURCE), "self")
1805-
self.assertEqual(span.get_tag(InferredSpanInfo.SYNCHRONICITY), "async")
1806-
1807-
def test_create_inferred_span_from_s3_event(self):
1808-
event_sample_source = "s3"
1809-
test_file = event_samples + event_sample_source + ".json"
1810-
with open(test_file, "r") as event:
1811-
event = json.load(event)
1812-
ctx = get_mock_context()
1813-
ctx.aws_request_id = "123"
1814-
span = create_inferred_span(event, ctx)
1815-
self.assertEqual(span.get_tag("operation_name"), "aws.s3")
1816-
self.assertEqual(
1817-
span.service,
1818-
"s3",
1819-
)
1820-
self.assertEqual(
1821-
span.get_tag("http.url"),
1822-
None,
1823-
)
1824-
self.assertEqual(span.get_tag("endpoint"), None)
1825-
self.assertEqual(span.get_tag("http.method"), None)
1826-
self.assertEqual(
1827-
span.get_tag("resource_names"),
1828-
"example-bucket",
1829-
)
1830-
self.assertEqual(span.get_tag("request_id"), None)
1831-
self.assertEqual(span.get_tag("event_name"), "ObjectCreated:Put")
1832-
self.assertEqual(span.get_tag("bucketname"), "example-bucket")
1833-
self.assertEqual(span.get_tag("bucket_arn"), "arn:aws:s3:::example-bucket")
1834-
self.assertEqual(span.get_tag("object_key"), "test/key")
1835-
self.assertEqual(span.get_tag("object_size"), "1024")
1836-
self.assertEqual(
1837-
span.get_tag("object_etag"), "0123456789abcdef0123456789abcdef"
1838-
)
1839-
self.assertEqual(span.start, 0.0)
1840-
self.assertEqual(span.span_type, "web")
1841-
self.assertEqual(span.get_tag(InferredSpanInfo.TAG_SOURCE), "self")
1842-
self.assertEqual(span.get_tag(InferredSpanInfo.SYNCHRONICITY), "async")
18431748

1844-
def test_create_inferred_span_from_eventbridge_event(self):
1845-
event_sample_source = "eventbridge-custom"
1846-
test_file = event_samples + event_sample_source + ".json"
1847-
with open(test_file, "r") as event:
1848-
event = json.load(event)
1849-
ctx = get_mock_context()
1850-
ctx.aws_request_id = "123"
1851-
span = create_inferred_span(event, ctx)
1852-
self.assertEqual(span.get_tag("operation_name"), "aws.eventbridge")
1853-
self.assertEqual(
1854-
span.service,
1855-
"eventbridge",
1856-
)
1857-
self.assertEqual(
1858-
span.get_tag("http.url"),
1859-
None,
1860-
)
1861-
self.assertEqual(span.get_tag("endpoint"), None)
1862-
self.assertEqual(span.get_tag("http.method"), None)
1863-
self.assertEqual(
1864-
span.get_tag("resource_names"),
1865-
"eventbridge.custom.event.sender",
1866-
)
1867-
self.assertEqual(span.get_tag("request_id"), None)
1868-
self.assertEqual(span.start, 1635989865.0)
1869-
self.assertEqual(span.span_type, "web")
1870-
self.assertEqual(span.get_tag(InferredSpanInfo.TAG_SOURCE), "self")
1871-
self.assertEqual(span.get_tag(InferredSpanInfo.SYNCHRONICITY), "async")
1872-
1873-
def test_create_inferred_span_from_eventbridge_sqs_event(self):
1874-
event_sample_name = "eventbridge-sqs"
1875-
test_file = event_samples + event_sample_name + ".json"
1876-
with open(test_file, "r") as event:
1877-
event = json.load(event)
1878-
ctx = get_mock_context()
1879-
ctx.aws_request_id = "123"
1880-
span = create_inferred_span(event, ctx)
1881-
self.assertEqual(span.get_tag("operation_name"), "aws.sqs")
1882-
self.assertEqual(
1883-
span.service,
1884-
"sqs",
1885-
)
1886-
self.assertEqual(
1887-
span.get_tag("http.url"),
1888-
None,
1889-
)
1890-
self.assertEqual(span.get_tag("endpoint"), None)
1891-
self.assertEqual(span.get_tag("http.method"), None)
1892-
self.assertEqual(
1893-
span.get_tag("resource_names"),
1894-
"eventbridge-sqs-queue",
1895-
)
1896-
self.assertEqual(span.get_tag("request_id"), None)
1897-
self.assertEqual(span.get_tag("queuename"), "eventbridge-sqs-queue")
1898-
self.assertEqual(
1899-
span.get_tag("event_source_arn"),
1900-
"arn:aws:sqs:us-east-1:425362996713:eventbridge-sqs-queue",
1901-
)
1902-
self.assertEqual(
1903-
span.get_tag("sender_id"),
1904-
"AIDAJXNJGGKNS7OSV23OI",
1905-
)
1906-
self.assertEqual(span.start, 1691102943.638)
1907-
self.assertEqual(span.span_type, "web")
1908-
self.assertEqual(span.get_tag(InferredSpanInfo.TAG_SOURCE), "self")
1909-
self.assertEqual(span.get_tag(InferredSpanInfo.SYNCHRONICITY), "async")
1749+
@pytest.mark.parametrize("source,expect", _test_create_inferred_span)
1750+
@patch("ddtrace.Span.finish", autospec=True)
1751+
def test_create_inferred_span(mock_span_finish, source, expect):
1752+
with open(f"{event_samples}{source}.json") as f:
1753+
event = json.load(f)
1754+
ctx = get_mock_context(aws_request_id="123")
1755+
1756+
actual = create_inferred_span(event, ctx)
1757+
assert actual.service == expect.service
1758+
assert actual.start == expect.start
1759+
assert actual.span_type == expect.span_type
1760+
for tag, value in expect.tags.items():
1761+
assert actual.get_tag(tag) == value, f"wrong value for tag {tag}"
1762+
1763+
if expect.parent_name is not None: # there are two inferred spans
1764+
assert mock_span_finish.call_count == 1
1765+
args, kwargs = mock_span_finish.call_args_list[0]
1766+
parent = args[0]
1767+
finish_time = kwargs.get("finish_time") or args[1]
1768+
assert parent.name == expect.parent_name
1769+
assert actual.parent_id == parent.span_id
1770+
assert finish_time == expect.start
1771+
else: # there is only one inferred span
1772+
assert mock_span_finish.call_count == 0
19101773

1774+
1775+
class TestInferredSpans(unittest.TestCase):
19111776
def test_extract_context_from_eventbridge_event(self):
19121777
event_sample_source = "eventbridge-custom"
19131778
test_file = event_samples + event_sample_source + ".json"
@@ -2029,38 +1894,6 @@ def test_extract_context_from_kinesis_batch_event(self):
20291894
self.assertEqual(context.span_id, 2876253380018681026)
20301895
self.assertEqual(context.sampling_priority, 1)
20311896

2032-
def test_create_inferred_span_from_api_gateway_event_no_apiid(self):
2033-
event_sample_source = "api-gateway-no-apiid"
2034-
test_file = event_samples + event_sample_source + ".json"
2035-
with open(test_file, "r") as event:
2036-
event = json.load(event)
2037-
ctx = get_mock_context()
2038-
ctx.aws_request_id = "123"
2039-
span = create_inferred_span(event, ctx)
2040-
self.assertEqual(span.get_tag("operation_name"), "aws.apigateway.rest")
2041-
self.assertEqual(
2042-
span.service,
2043-
"70ixmpl4fl.execute-api.us-east-2.amazonaws.com",
2044-
)
2045-
self.assertEqual(
2046-
span.get_tag("http.url"),
2047-
"70ixmpl4fl.execute-api.us-east-2.amazonaws.com/path/to/resource",
2048-
)
2049-
self.assertEqual(span.get_tag("endpoint"), "/path/to/resource")
2050-
self.assertEqual(span.get_tag("http.method"), "POST")
2051-
self.assertEqual(
2052-
span.get_tag("resource_names"),
2053-
"POST /path/to/resource",
2054-
)
2055-
self.assertEqual(span.get_tag("request_id"), "123")
2056-
self.assertEqual(span.get_tag("apiid"), "None")
2057-
self.assertEqual(span.get_tag("apiname"), "None")
2058-
self.assertEqual(span.get_tag("stage"), "prod")
2059-
self.assertEqual(span.start, 1428582896.0)
2060-
self.assertEqual(span.span_type, "http")
2061-
self.assertEqual(span.get_tag(InferredSpanInfo.TAG_SOURCE), "self")
2062-
self.assertEqual(span.get_tag(InferredSpanInfo.SYNCHRONICITY), "sync")
2063-
20641897
@patch("datadog_lambda.tracing.submit_errors_metric")
20651898
def test_mark_trace_as_error_for_5xx_responses_getting_400_response_code(
20661899
self, mock_submit_errors_metric

0 commit comments

Comments
 (0)
Please sign in to comment.