Python utilities for AWS Lambda functions including but not limited to tracing, logging and custom metric
Project description
Lambda Powertools
A suite of utilities for AWS Lambda Functions that makes tracing with AWS X-Ray, structured logging and creating custom metrics asynchronously easier - Currently available for Python only and compatible with Python >=3.6.
Status: Beta
Features
Tracing
- Decorators that capture cold start as annotation, and response and exceptions as metadata
- Run functions locally without code change to disable tracing
- Explicitly disable tracing via env var POWERTOOLS_TRACE_DISABLED="true"
Logging
- Decorators that capture key fields from Lambda context, cold start and structures logging output as JSON
- Optionally log Lambda request when instructed (disabled by default)
- Enable via POWERTOOLS_LOGGER_LOG_EVENT="true" or explicitly via decorator param
- Logs canonical custom metric line to logs that can be consumed asynchronously
Usage
Tracing
Example SAM template using supported environment variables
Globals:
Function:
Environment:
Variables:
POWERTOOLS_SERVICE_NAME: "payment" # service_undefined by default
POWERTOOLS_TRACE_DISABLED: "false" # false by default
Pseudo Python Lambda code
from aws_lambda_powertools.tracing import Tracer
tracer = Tracer()
# tracer = Tracer(service="payment") # can also be explicitly defined
@tracer.capture_method
def collect_payment(charge_id):
# logic
ret = requests.post(PAYMENT_ENDPOINT)
# custom annotation
tracer.put_annotation("PAYMENT_STATUS", "SUCCESS")
return ret
@tracer.capture_lambda_handler
def handler(event, context)
charge_id = event.get('charge_id')
payment = collect_payment(charge_id)
...
Logging
Example SAM template using supported environment variables
Globals:
Function:
Environment:
Variables:
POWERTOOLS_SERVICE_NAME: "payment" # service_undefined by default
POWERTOOLS_LOGGER_LOG_EVENT: "true" # false by default
LOG_LEVEL: "INFO" # INFO by default
Pseudo Python Lambda code
from aws_lambda_powertools.logging import logger_setup, logger_inject_lambda_context
logger = logger_setup()
# logger_setup(service="payment") # also accept explicit service name
# logger_setup(level="INFO") # also accept explicit log level
@logger_inject_lambda_context
def handler(event, context)
logger.info("Collecting payment")
...
logger.info({
"operation": "collect_payment",
"charge_id": event['charge_id']
})
...
Exerpt output in CloudWatch Logs
{
"timestamp":"2019-08-22 18:17:33,774",
"level":"INFO",
"location":"collect.handler:1",
"service":"payment",
"lambda_function_name":"test",
"lambda_function_memory_size":"128",
"lambda_function_arn":"arn:aws:lambda:eu-west-1:12345678910:function:test",
"lambda_request_id":"52fdfc07-2182-154f-163f-5f0f9a621d72",
"cold_start": "true",
"message": "Collecting payment"
}
{
"timestamp":"2019-08-22 18:17:33,774",
"level":"INFO",
"location":"collect.handler:15",
"service":"payment",
"lambda_function_name":"test",
"lambda_function_memory_size":"128",
"lambda_function_arn":"arn:aws:lambda:eu-west-1:12345678910:function:test",
"lambda_request_id":"52fdfc07-2182-154f-163f-5f0f9a621d72",
"cold_start": "true",
"message":{
"operation":"collect_payment",
"charge_id": "ch_AZFlk2345C0"
}
}
Custom Metrics async
This feature requires Custom Metrics SAR App in order to process canonical metric lines in CloudWatch Logs.
If you're starting from scratch, you may want to see a working example, tune to your needs and deploy within your account - Serverless Airline Log Processing Stack
from aws_lambda_powertools.logging import MetricUnit, log_metric
def handler(event, context)
log_metric(name="SuccessfulPayment", unit=MetricUnit.Count, value=10, namespace="MyApplication")
# Optional dimensions
log_metric(name="SuccessfulPayment", unit=MetricUnit.Count, value=10, namespace="MyApplication", customer_id="123-abc", charge_id="abc-123")
# Explicit service name
log_metric(service="payment", name="SuccessfulPayment", namespace="MyApplication".....)
...
Credits
- We use a microlib for structured logging aws-lambda-logging
- Idea of a powertools to provide a handful utilities for AWS Lambda functiones comes from DAZN Powertools
License
This library is licensed under the MIT-0 License. See the LICENSE file.
HISTORY
November 15th, 2019
- Public beta release
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file aws_lambda_powertools-0.1.0.tar.gz.
File metadata
- Download URL: aws_lambda_powertools-0.1.0.tar.gz
- Upload date:
- Size: 13.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.6.0 requests-toolbelt/0.9.1 tqdm/4.38.0 CPython/3.7.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9a131a798653459f7a0f99454338d1e68924e5e400360f0e33c5f6ca6c16501b
|
|
| MD5 |
e78856d379a792c04277eb4a381adcb7
|
|
| BLAKE2b-256 |
cf419e48d652030066af3b36074b3ca321f9305b694db22fee30b5c70019fa1e
|
File details
Details for the file aws_lambda_powertools-0.1.0-py2.py3-none-any.whl.
File metadata
- Download URL: aws_lambda_powertools-0.1.0-py2.py3-none-any.whl
- Upload date:
- Size: 14.3 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.6.0 requests-toolbelt/0.9.1 tqdm/4.38.0 CPython/3.7.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d42c4d1474f72c98e707d0efb7fed09783fc5ffd203e8d670a8946d917daaf6e
|
|
| MD5 |
78e05d2291d5b5382cee6415ddd72b00
|
|
| BLAKE2b-256 |
0be5a01435def69735525ffb3ac876a2a95b16567ca590ce7c8751e1f82782e7
|