Skip to content

Commit 704583f

Browse files
Merge branch 'develop' into data_classes_duplicated_code
2 parents 45a8308 + a157671 commit 704583f

File tree

9 files changed

+713
-396
lines changed

9 files changed

+713
-396
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ dev-gitpod:
2323

2424
# Running licensecheck with zero to break the pipeline if there is an invalid license
2525
check-licenses:
26-
poetry run licensecheck -u poetry:dev --zero
26+
poetry run licensecheck -u poetry:dev
2727

2828
format:
2929
poetry run black aws_lambda_powertools tests examples

aws_lambda_powertools/metrics/provider/datadog/datadog.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from aws_lambda_powertools.metrics.provider import BaseProvider
1515
from aws_lambda_powertools.metrics.provider.datadog.warnings import DatadogDataValidationWarning
1616
from aws_lambda_powertools.shared import constants
17-
from aws_lambda_powertools.shared.functions import resolve_env_var_choice
17+
from aws_lambda_powertools.shared.functions import resolve_env_var_choice, strtobool
1818

1919
if TYPE_CHECKING:
2020
from aws_lambda_powertools.shared.types import AnyCallableT
@@ -66,6 +66,9 @@ def __init__(
6666
)
6767
self.default_tags = default_tags or {}
6868
self.flush_to_log = resolve_env_var_choice(choice=flush_to_log, env=os.getenv(constants.DATADOG_FLUSH_TO_LOG))
69+
# When set as env var, the value is a string
70+
if isinstance(self.flush_to_log, str):
71+
self.flush_to_log = strtobool(self.flush_to_log)
6972

7073
# adding name,value,timestamp,tags
7174
def add_metric(

aws_lambda_powertools/utilities/data_classes/__init__.py

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

55
from .alb_event import ALBEvent
66
from .api_gateway_proxy_event import APIGatewayProxyEvent, APIGatewayProxyEventV2
7+
from .api_gateway_websocket_event import APIGatewayWebSocketEvent
78
from .appsync_resolver_event import AppSyncResolverEvent
89
from .aws_config_rule_event import AWSConfigRuleEvent
910
from .bedrock_agent_event import BedrockAgentEvent
@@ -51,6 +52,7 @@
5152
__all__ = [
5253
"APIGatewayProxyEvent",
5354
"APIGatewayProxyEventV2",
55+
"APIGatewayWebSocketEvent",
5456
"SecretsManagerEvent",
5557
"AppSyncResolverEvent",
5658
"ALBEvent",
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
from __future__ import annotations
2+
3+
import base64
4+
from functools import cached_property
5+
from typing import Any
6+
7+
from aws_lambda_powertools.utilities.data_classes.common import (
8+
CaseInsensitiveDict,
9+
DictWrapper,
10+
)
11+
12+
13+
class APIGatewayWebSocketEventIdentity(DictWrapper):
14+
@property
15+
def source_ip(self) -> str:
16+
return self["sourceIp"]
17+
18+
@property
19+
def user_agent(self) -> str | None:
20+
return self.get("userAgent")
21+
22+
23+
class APIGatewayWebSocketEventRequestContext(DictWrapper):
24+
@property
25+
def route_key(self) -> str:
26+
return self["routeKey"]
27+
28+
@property
29+
def disconnect_status_code(self) -> int | None:
30+
return self.get("disconnectStatusCode")
31+
32+
@property
33+
def message_id(self) -> str | None:
34+
return self.get("messageId")
35+
36+
@property
37+
def event_type(self) -> str:
38+
return self["eventType"]
39+
40+
@property
41+
def extended_request_id(self) -> str:
42+
return self["extendedRequestId"]
43+
44+
@property
45+
def request_time(self) -> str:
46+
return self["requestTime"]
47+
48+
@property
49+
def message_direction(self) -> str:
50+
return self["messageDirection"]
51+
52+
@property
53+
def disconnect_reason(self) -> str | None:
54+
return self.get("disconnectReason")
55+
56+
@property
57+
def stage(self) -> str:
58+
return self["stage"]
59+
60+
@property
61+
def connected_at(self) -> int:
62+
return self["connectedAt"]
63+
64+
@property
65+
def request_time_epoch(self) -> int:
66+
return self["requestTimeEpoch"]
67+
68+
@property
69+
def identity(self) -> APIGatewayWebSocketEventIdentity:
70+
return APIGatewayWebSocketEventIdentity(self["identity"])
71+
72+
@property
73+
def request_id(self) -> str:
74+
return self["requestId"]
75+
76+
@property
77+
def domain_name(self) -> str:
78+
return self["domainName"]
79+
80+
@property
81+
def connection_id(self) -> str:
82+
return self["connectionId"]
83+
84+
@property
85+
def api_id(self) -> str:
86+
return self["apiId"]
87+
88+
89+
class APIGatewayWebSocketEvent(DictWrapper):
90+
"""AWS proxy integration event for WebSocket API
91+
92+
Documentation:
93+
--------------
94+
- https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-integration-requests.html
95+
"""
96+
97+
@property
98+
def is_base64_encoded(self) -> bool:
99+
return self["isBase64Encoded"]
100+
101+
@property
102+
def body(self) -> str | None:
103+
return self.get("body")
104+
105+
@cached_property
106+
def decoded_body(self) -> str | None:
107+
body = self.body
108+
if self.is_base64_encoded and body:
109+
return base64.b64decode(body.encode()).decode()
110+
return body
111+
112+
@cached_property
113+
def json_body(self) -> Any:
114+
if self.decoded_body:
115+
return self._json_deserializer(self.decoded_body)
116+
return None
117+
118+
@property
119+
def headers(self) -> dict[str, str]:
120+
return CaseInsensitiveDict(self.get("headers"))
121+
122+
@property
123+
def multi_value_headers(self) -> dict[str, list[str]]:
124+
return CaseInsensitiveDict(self.get("multiValueHeaders"))
125+
126+
@property
127+
def request_context(self) -> APIGatewayWebSocketEventRequestContext:
128+
return APIGatewayWebSocketEventRequestContext(self["requestContext"])

noxfile.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ def test_with_datadog_as_required_package(session: nox.Session):
8080
folders=[
8181
f"{PREFIX_TESTS_FUNCTIONAL}/metrics/datadog/",
8282
],
83+
extras="datadog,aws-sdk", # Datadog library requires boto3
8384
)
8485

8586

0 commit comments

Comments
 (0)