Skip to content

Commit 47bf736

Browse files
markkuhnMark Kuhn
and
Mark Kuhn
authored
add function to strip nonascii and stringify numbers (#84)
* Add function to strip non-ascii characters and stringify numbers Co-authored-by: Mark Kuhn <[email protected]>
1 parent bc46f91 commit 47bf736

File tree

3 files changed

+64
-10
lines changed

3 files changed

+64
-10
lines changed

aws_embedded_metrics/logger/metrics_context.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,30 +58,30 @@ def put_metric(self, key: str, value: float, unit: str = None) -> None:
5858
self.metrics[key] = Metric(value, unit)
5959

6060
@staticmethod
61-
def validate_dimension_set(dimensions: Dict[str, str]) -> None:
61+
def validate_dimension_set(dimension_set: Dict[str, str]) -> None:
6262
"""
6363
Validates dimension set length is not more than MAX_DIMENSION_SET_SIZE
6464
"""
65-
if len(dimensions) > MAX_DIMENSION_SET_SIZE:
65+
if len(dimension_set) > MAX_DIMENSION_SET_SIZE:
6666
raise DimensionSetExceededError(
6767
f"Maximum number of dimensions per dimension set allowed are {MAX_DIMENSION_SET_SIZE}")
6868

69-
def put_dimensions(self, dimensions: Dict[str, str]) -> None:
69+
def put_dimensions(self, dimension_set: Dict[str, str]) -> None:
7070
"""
7171
Adds dimensions to the context.
7272
```
7373
context.put_dimensions({ "k1": "v1", "k2": "v2" })
7474
```
7575
"""
76-
if dimensions is None:
76+
if dimension_set is None:
7777
# TODO add ability to define failure strategy
7878
return
7979

80-
self.validate_dimension_set(dimensions)
80+
self.validate_dimension_set(dimension_set)
8181

82-
self.dimensions.append(dimensions)
82+
self.dimensions.append(dimension_set)
8383

84-
def set_dimensions(self, dimensionSets: List[Dict[str, str]]) -> None:
84+
def set_dimensions(self, dimension_sets: List[Dict[str, str]]) -> None:
8585
"""
8686
Overwrite all dimensions.
8787
```
@@ -92,10 +92,10 @@ def set_dimensions(self, dimensionSets: List[Dict[str, str]]) -> None:
9292
"""
9393
self.should_use_default_dimensions = False
9494

95-
for dimensionSet in dimensionSets:
96-
self.validate_dimension_set(dimensionSet)
95+
for dimension_set in dimension_sets:
96+
self.validate_dimension_set(dimension_set)
9797

98-
self.dimensions = dimensionSets
98+
self.dimensions = dimension_sets
9999

100100
def set_default_dimensions(self, default_dimensions: Dict) -> None:
101101
"""

aws_embedded_metrics/serializers/log_serializer.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ def serialize(context: MetricsContext) -> List[str]:
3131
dimensions_properties: Dict[str, str] = {}
3232

3333
for dimension_set in context.get_dimensions():
34+
35+
# Stringify numerical values and strip non-ascii characters from dimension set values
36+
dimension_set = {k: str(v).encode('ascii', 'ignore').decode('ascii') for k, v in dimension_set.items()}
37+
3438
keys = list(dimension_set.keys())
3539
if len(keys) > MAX_DIMENSION_SET_SIZE:
3640
err_msg = (f"Maximum number of dimensions per dimension set allowed are {MAX_DIMENSION_SET_SIZE}. "

tests/serializer/test_log_serializer.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,56 @@ def test_serialize_dimensions():
3232
assert_json_equality(result_json, expected)
3333

3434

35+
def test_serialize_dimensions_with_numeric_value():
36+
# arrange
37+
expected_key = fake.word()
38+
value = fake.random.randrange(0, 100)
39+
expected_value = str(value)
40+
41+
dimension = {}
42+
dimension[expected_key] = value
43+
44+
expected_dimension = {}
45+
expected_dimension[expected_key] = expected_value
46+
47+
expected = {**get_empty_payload(), **expected_dimension}
48+
expected["_aws"]["CloudWatchMetrics"][0]["Dimensions"].append([expected_key])
49+
50+
context = get_context()
51+
context.put_dimensions(dimension)
52+
53+
# act
54+
result_json = serializer.serialize(context)[0]
55+
56+
# assert
57+
assert_json_equality(result_json, expected)
58+
59+
60+
def test_serialize_dimenions_with_non_ascii_values():
61+
# arrange
62+
expected_key = fake.word()
63+
value = "asciié🤔"
64+
expected_value = "ascii"
65+
66+
dimension = {}
67+
dimension[expected_key] = value
68+
69+
expected_dimension = {}
70+
expected_dimension[expected_key] = expected_value
71+
72+
expected = {**get_empty_payload(), **expected_dimension}
73+
expected["_aws"]["CloudWatchMetrics"][0]["Dimensions"].append([expected_key])
74+
75+
context = get_context()
76+
context.put_dimensions(dimension)
77+
78+
# act
79+
result_json = serializer.serialize(context)[0]
80+
81+
# assert
82+
assert_json_equality(result_json, expected)
83+
84+
3585
def test_serialize_properties():
3686
# arrange
3787
expected_key = fake.word()

0 commit comments

Comments
 (0)