Description
I am using the metrics functionality of the Lambda Powertools for generating custom Cloudwatch metrics (via writing EMF records into Cloudwatch logs).
The overall execution time of our Lambda functions has significantly increased since we are using the Powertools.
With "significantly" I mean approx. 50 to 100ms per metric on a 128 MB lambda function.
Expected Behavior
Adding metrics should only increase the execution time of a Lambda function by < 1ms per metric.
Current Behavior
Each metric added increases execution time by approx. 50 to 100ms on a Lambda function running with 128MB of RAM.
Possible Solution
I drilled down the code and guess that the schema validation is causing the performance issue. See [code] (https://github.com/awslabs/aws-lambda-powertools-python/blob/develop/aws_lambda_powertools/metrics/base.py#L214).
Possible solutions:
- Offer option to disable/skip validation
- Precompile the schema and keep validation object in a global variable/scope so it can be reused - see https://horejsek.github.io/python-fastjsonschema/
Steps to Reproduce (for bugs)
from aws_lambda_powertools import Metrics
from aws_lambda_powertools.metrics import MetricUnit
metrics = Metrics(namespace="Company/Product", service="some-service")
@metrics.log_metrics(capture_cold_start_metric=True)
def lambda_handler(event, context):
metrics.add_metric(name="Ok", unit=MetricUnit.Count, value=1)
metrics.add_metric(name="Errors", unit=MetricUnit.Count, value=1)
Environment
- Powertools version used: 1.10.5
- Packaging format (Layers, PyPi): PyPi
- AWS Lambda function runtime: Python 3.6 and also Python 3.8 with 128 MB RAM
- Debugging logs
2021-03-03T11:28:05.105+01:00 START RequestId: 20607f86-e159-4f0e-a89b-7298f2ddbbed Version: $LATEST
[INFO] 2021-03-03T10:28:05.105Z Found credentials in environment variables.
2021-03-03 10:28:05,229 aws_lambda_powertools.metrics.metrics [DEBUG] Decorator called with parameters
2021-03-03 10:28:05,275 aws_lambda_powertools.metrics.base [DEBUG] Adding metric: RecordsInserted with defaultdict(<class 'list'>, {'Unit': 'Count', 'Value': [1.0]})
2021-03-03 10:28:05,278 aws_lambda_powertools.metrics.metrics [DEBUG] Adding cold start metric and function_name dimension
2021-03-03 10:28:05,279 aws_lambda_powertools.metrics.base [DEBUG] Adding metric: ColdStart with defaultdict(<class 'list'>, {'Unit': 'Count', 'Value': [1.0]})
2021-03-03 10:28:05,279 aws_lambda_powertools.metrics.base [DEBUG] Adding dimension: function_name:my-function
2021-03-03 10:28:05,279 aws_lambda_powertools.metrics.base [DEBUG] Adding dimension: service:my-service
2021-03-03 10:28:05,279 aws_lambda_powertools.metrics.base [DEBUG] {'details': 'Serializing metrics', 'metrics': {'ColdStart': defaultdict(<class 'list'>, {'Unit': 'Count', 'Value': [1.0]})}, 'dimensions': {'function_name': 'my-function', 'service': 'my-service'}}
2021-03-03 10:28:05,279 aws_lambda_powertools.metrics.base [DEBUG] Validating serialized metrics against CloudWatch EMF schema
2021-03-03T11:28:05.398+01:00
{
"_aws": {
"Timestamp": 1614767285279,
"CloudWatchMetrics": [
{
"Namespace": "Company/Product",
"Dimensions": [
[
"function_name",
"service"
]
],
"Metrics": [
{
"Name": "ColdStart",
"Unit": "Count"
}
]
}
]
},
"function_name": "my-function",
"service": "my-service",
"ColdStart": [
1
]
}
2021-03-03 10:28:05,398 aws_lambda_powertools.metrics.base [DEBUG] {'details': 'Serializing metrics', 'metrics': {'RecordsInserted': defaultdict(<class 'list'>, {'Unit': 'Count', 'Value': [1.0]})}, 'dimensions': {'service': 'my-service'}}
2021-03-03 10:28:05,398 aws_lambda_powertools.metrics.base [DEBUG] Validating serialized metrics against CloudWatch EMF schema
2021-03-03 10:28:05,498 aws_lambda_powertools.metrics.metrics [DEBUG] Clearing out existing metric set from memory
2021-03-03T11:28:05.498+01:00
{
"_aws": {
"Timestamp": 1614767285398,
"CloudWatchMetrics": [
{
"Namespace": "Company/Product",
"Dimensions": [
[
"service"
]
],
"Metrics": [
{
"Name": "RecordsInserted",
"Unit": "Count"
}
]
}
]
},
"service": "my-service",
"RecordsInserted": [
1
]
}
END RequestId: 20607f86-e159-4f0e-a89b-7298f2ddbbed
Metadata
Metadata
Assignees
Labels
Type
Projects
Status