Skip to content

Commit a746ddc

Browse files
author
Michael Brewer
committed
feat(trigger): Some attribte caching
1 parent 35358ed commit a746ddc

File tree

2 files changed

+25
-12
lines changed

2 files changed

+25
-12
lines changed

aws_lambda_powertools/utilities/trigger/cloud_watch_logs_event.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import base64
22
import json
33
import zlib
4-
from typing import Dict, List, Optional
4+
from typing import Any, Dict, List, Optional
55

66
from aws_lambda_powertools.utilities.trigger.common import DictWrapper
77

@@ -78,17 +78,26 @@ class CloudWatchLogsEvent(dict):
7878
- https://docs.aws.amazon.com/lambda/latest/dg/services-cloudwatchlogs.html
7979
"""
8080

81+
def __init__(self, event: Dict[str, Any]):
82+
super().__init__(event)
83+
self._decompressed_logs_data = None
84+
self._json_logs_data = None
85+
8186
@property
82-
def aws_logs_data(self) -> str:
87+
def raw_logs_data(self) -> str:
8388
"""The value of the `data` field is a Base64 encoded ZIP archive."""
8489
return self["awslogs"]["data"]
8590

8691
@property
8792
def decompress_logs_data(self) -> bytes:
8893
"""Decode and decompress log data"""
89-
payload = base64.b64decode(self.aws_logs_data)
90-
return zlib.decompress(payload, zlib.MAX_WBITS | 32)
94+
if self._decompressed_logs_data is None:
95+
payload = base64.b64decode(self.raw_logs_data)
96+
self._decompressed_logs_data = zlib.decompress(payload, zlib.MAX_WBITS | 32)
97+
return self._decompressed_logs_data
9198

9299
def parse_logs_data(self) -> CloudWatchLogsDecodedData:
93100
"""Decode, decompress and parse json data as CloudWatchLogsDecodedData"""
94-
return CloudWatchLogsDecodedData(json.loads(self.decompress_logs_data.decode("UTF-8")))
101+
if self._json_logs_data is None:
102+
self._json_logs_data = json.loads(self.decompress_logs_data.decode("UTF-8"))
103+
return CloudWatchLogsDecodedData(self._json_logs_data)

tests/functional/test_lambda_trigger_events.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,19 @@ def load_event(file_name: str) -> dict:
4242
def test_cloud_watch_trigger_event():
4343
event = CloudWatchLogsEvent(load_event("cloudWatchLogEvent.json"))
4444

45-
decoded_data = event.parse_logs_data()
46-
log_events = decoded_data.log_events
45+
decompressed_logs_data = event.decompress_logs_data
46+
assert event.decompress_logs_data == decompressed_logs_data
47+
48+
json_logs_data = event.parse_logs_data()
49+
assert event.parse_logs_data() == json_logs_data
50+
log_events = json_logs_data.log_events
4751
log_event = log_events[0]
4852

49-
assert decoded_data.owner == "123456789123"
50-
assert decoded_data.log_group == "testLogGroup"
51-
assert decoded_data.log_stream == "testLogStream"
52-
assert decoded_data.subscription_filters == ["testFilter"]
53-
assert decoded_data.message_type == "DATA_MESSAGE"
53+
assert json_logs_data.owner == "123456789123"
54+
assert json_logs_data.log_group == "testLogGroup"
55+
assert json_logs_data.log_stream == "testLogStream"
56+
assert json_logs_data.subscription_filters == ["testFilter"]
57+
assert json_logs_data.message_type == "DATA_MESSAGE"
5458

5559
assert log_event.get_id == "eventId1"
5660
assert log_event.timestamp == 1440442987000

0 commit comments

Comments
 (0)