Skip to content

Commit 06a7652

Browse files
committed
chore: refactor metric serialization
1 parent 8daf20c commit 06a7652

File tree

1 file changed

+22
-17
lines changed
  • aws_lambda_powertools/metrics

1 file changed

+22
-17
lines changed

aws_lambda_powertools/metrics/base.py

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -179,35 +179,40 @@ def serialize_metric_set(self, metrics: Dict = None, dimensions: Dict = None, me
179179

180180
logger.debug("Serializing...", {"metrics": metrics, "dimensions": dimensions})
181181

182-
dimension_keys: List[str] = list(dimensions.keys())
183-
metric_names_unit: List[Dict[str, str]] = []
184-
metric_set: Dict[str, str] = {}
182+
metric_names_and_units: List[Dict[str, str]] = [] # [ { "Name": "metric_name", "Unit": "Count" } ]
183+
metric_names_and_values: Dict[str, str] = {} # { "metric_name": 1.0 }
185184

186185
for metric_name in metrics:
187186
metric: str = metrics[metric_name]
188187
metric_value: int = metric.get("Value", 0)
189188
metric_unit: str = metric.get("Unit", "")
190189

191-
metric_names_unit.append({"Name": metric_name, "Unit": metric_unit})
192-
metric_set.update({metric_name: metric_value})
193-
194-
metrics_definition = {
195-
"CloudWatchMetrics": [
196-
{"Namespace": self.namespace, "Dimensions": [dimension_keys], "Metrics": metric_names_unit}
197-
]
190+
metric_names_and_units.append({"Name": metric_name, "Unit": metric_unit})
191+
metric_names_and_values.update({metric_name: metric_value})
192+
193+
embedded_metrics_object = {
194+
"_aws": {
195+
"Timestamp": int(datetime.datetime.now().timestamp() * 1000), # epoch
196+
"CloudWatchMetrics": [
197+
{
198+
"Namespace": self.namespace, # "test_namespace"
199+
"Dimensions": [list(dimensions.keys())], # [ "service" ]
200+
"Metrics": metric_names_and_units,
201+
}
202+
],
203+
},
204+
**dimensions, # "service": "test_service"
205+
**metadata, # "username": "test"
206+
**metric_names_and_values, # "single_metric": 1.0
198207
}
199-
metrics_timestamp = {"Timestamp": int(datetime.datetime.now().timestamp() * 1000)}
200-
metric_set["_aws"] = {**metrics_timestamp, **metrics_definition}
201-
metric_set.update(**dimensions)
202-
metric_set.update(**metadata)
203208

204209
try:
205-
logger.debug("Validating serialized metrics against CloudWatch EMF schema", metric_set)
206-
fastjsonschema.validate(definition=CLOUDWATCH_EMF_SCHEMA, data=metric_set)
210+
logger.debug("Validating serialized metrics against CloudWatch EMF schema", embedded_metrics_object)
211+
fastjsonschema.validate(definition=CLOUDWATCH_EMF_SCHEMA, data=embedded_metrics_object)
207212
except fastjsonschema.JsonSchemaException as e:
208213
message = f"Invalid format. Error: {e.message}, Invalid item: {e.name}" # noqa: B306, E501
209214
raise SchemaValidationError(message)
210-
return metric_set
215+
return embedded_metrics_object
211216

212217
def add_dimension(self, name: str, value: str):
213218
"""Adds given dimension to all metrics

0 commit comments

Comments
 (0)