Skip to content

Commit 9fc360d

Browse files
parse apigw data as chained trigger (#270)
* parse apigw data as chained trigger * use the event_id as session hash
1 parent 77c9aca commit 9fc360d

File tree

6 files changed

+70
-7
lines changed

6 files changed

+70
-7
lines changed

.secrets.baseline

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,14 +168,14 @@
168168
"filename": "src/test/unit/event/test_event_trigger.py",
169169
"hashed_secret": "885bb9903f72e004ff2974807b70e7c970d3e6d5",
170170
"is_verified": false,
171-
"line_number": 612
171+
"line_number": 613
172172
},
173173
{
174174
"type": "Hex High Entropy String",
175175
"filename": "src/test/unit/event/test_event_trigger.py",
176176
"hashed_secret": "3fae06dc55a618caed1d794dcd512bfe7e76c9f1",
177177
"is_verified": false,
178-
"line_number": 657
178+
"line_number": 658
179179
}
180180
],
181181
"src/test/unit/test_lumigo_utils.py": [
@@ -220,5 +220,5 @@
220220
}
221221
]
222222
},
223-
"generated_at": "2023-01-22T10:15:06Z"
223+
"generated_at": "2023-01-29T12:29:33Z"
224224
}

src/lumigo_tracer/event/event_trigger.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def recursive_parse_trigger(
1919
triggers.append(new_trigger)
2020
current_trigger_id: str = new_trigger["id"] # type: ignore
2121

22-
inner_messages = parser.extract_inner(event=message)
22+
inner_messages = parser.extract_inner_message(event=message)
2323
if len(inner_messages) >= Configuration.chained_services_max_width:
2424
get_logger().info("Chained services parsing has stopped due to width")
2525
inner_messages = inner_messages[: Configuration.chained_services_max_width]
@@ -31,6 +31,9 @@ def recursive_parse_trigger(
3131
json.loads(sub_message), parent_id=current_trigger_id, level=level + 1
3232
)
3333
)
34+
inner_triggers = parser.extract_inner_triggers(message, current_trigger_id)
35+
for inner_trigger in inner_triggers:
36+
triggers.append(inner_trigger)
3437
break
3538
return triggers
3639

src/lumigo_tracer/event/trigger_parsing/apigw_parser.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
from typing import Optional, Dict, Any
1+
from typing import Optional, Dict, Any, List
22

33
from lumigo_tracer.event.trigger_parsing.event_trigger_base import (
44
EventTriggerParser,
55
ExtraKeys,
66
TriggerType,
77
)
8+
from lumigo_tracer.lumigo_utils import get_current_ms_time
89

910

1011
class ApiGatewayEventTriggerParser(EventTriggerParser):
@@ -56,3 +57,26 @@ def _parse_http_method_v2(event: Dict[Any, Any], target_id: Optional[str]) -> Tr
5657
from_message_ids=[event.get("requestContext", {}).get("requestId", "")],
5758
extra=extra,
5859
)
60+
61+
@staticmethod
62+
def extract_inner_triggers(event: Dict[Any, Any], target_id: str) -> List[TriggerType]:
63+
"""
64+
In this function we extract the browser's session using the authorization ID:
65+
https://openid.net/specs/openid-connect-core-1_0.html#CodeIDToken
66+
"""
67+
user_agent = event.get("headers", {}).get("User-Agent")
68+
claims = event.get("requestContext", {}).get("authorizer", {}).get("claims", {})
69+
auth_hash = claims.get("at_hash") or claims.get("event_id")
70+
if user_agent and auth_hash:
71+
return [
72+
EventTriggerParser.build_trigger(
73+
target_id=target_id,
74+
resource_type="browser",
75+
from_message_ids=[auth_hash],
76+
extra={
77+
ExtraKeys.USER_AGENT: user_agent,
78+
ExtraKeys.TRIGGER_CREATION_TIME: get_current_ms_time(),
79+
},
80+
)
81+
]
82+
return []

src/lumigo_tracer/event/trigger_parsing/event_trigger_base.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class ExtraKeys(str, Enum):
1616
TRIGGER_CREATION_TIME = "approxEventCreationTime"
1717
TOTAL_SIZE = "totalSizeBytes"
1818
SHARD_ID = "shardId"
19+
USER_AGENT = "userAgent"
1920

2021

2122
ExtraType = Dict[ExtraKeys, Union[str, int, None]]
@@ -63,5 +64,9 @@ def handle(event: Dict[Any, Any], target_id: Optional[str]) -> TriggerType:
6364
raise NotImplementedError()
6465

6566
@staticmethod
66-
def extract_inner(event: Dict[Any, Any]) -> List[str]:
67+
def extract_inner_triggers(event: Dict[Any, Any], target_id: str) -> List[TriggerType]:
68+
return []
69+
70+
@staticmethod
71+
def extract_inner_message(event: Dict[Any, Any]) -> List[str]:
6772
return []

src/lumigo_tracer/event/trigger_parsing/sqs_parser.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def handle(event: Dict[Any, Any], target_id: Optional[str]) -> TriggerType:
4040
)
4141

4242
@staticmethod
43-
def extract_inner(event: Dict[Any, Any]) -> List[str]:
43+
def extract_inner_message(event: Dict[Any, Any]) -> List[str]:
4444
inner_messages = []
4545
for record in SqsEventTriggerParser._get_messages(event):
4646
body = record.get("body") or record.get("Body")

src/test/unit/event/test_event_trigger.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from lumigo_tracer.event.event_trigger import parse_triggers
66
from lumigo_tracer.event.trigger_parsing import INNER_MESSAGES_MAGIC_PATTERN
7+
from lumigo_tracer.event.trigger_parsing.event_trigger_base import ExtraKeys
78
from lumigo_tracer.lumigo_utils import Configuration
89

910

@@ -884,3 +885,33 @@ def test_recursive_triggers_too_wide(caplog):
884885
assert any(
885886
"Chained services parsing has stopped due to width" in log.message for log in caplog.records
886887
)
888+
889+
890+
def test_apigw_session():
891+
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
892+
apigw_event = {
893+
"resource": "/projects/resource",
894+
"path": "/projects/path",
895+
"httpMethod": "POST",
896+
"pathParameters": {},
897+
"body": "",
898+
"requestContext": {
899+
"stage": "dev",
900+
"authorizer": {
901+
"claims": {
902+
"at_hash": "at_hash",
903+
}
904+
},
905+
"requestId": "aaaa-bbbb-cccc-ddddd",
906+
},
907+
"headers": {"User-Agent": user_agent},
908+
"version": "2.0",
909+
}
910+
triggers = parse_triggers(apigw_event)
911+
assert len(triggers) == 2
912+
apigw = [t for t in triggers if t["triggeredBy"] == "apigw"][0]
913+
browser = [t for t in triggers if t["triggeredBy"] == "browser"][0]
914+
assert apigw["id"] == browser["targetId"]
915+
assert browser["fromMessageIds"] == ["at_hash"]
916+
assert browser["extra"][ExtraKeys.USER_AGENT] == user_agent
917+
assert browser["extra"][ExtraKeys.TRIGGER_CREATION_TIME]

0 commit comments

Comments
 (0)