Skip to content

Commit 755d9bb

Browse files
committed
Merge branch 'develop' of https://github.com/awslabs/aws-lambda-powertools-python into develop
* 'develop' of https://github.com/awslabs/aws-lambda-powertools-python: feat(logging): Include exception_name (#320) chore: remove gatsby mention as migrated completed refactor(parameters): Consistently reference env (#319) docs(metrics): remove minimum dimensions docs: Correct code examples (#317) docs(metrics): Correct code examples in markdown (#316) fix(idempotency): TypeError when calling is_missing_idempotency_key with an int (#315) docs(metrics): Corrections to the code examples (#314) fix(idempotency): Correctly handle save_inprogress errors (#313)
2 parents 25facef + 0ec47dc commit 755d9bb

File tree

21 files changed

+144
-53
lines changed

21 files changed

+144
-53
lines changed

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ With [pip](https://pip.pypa.io/en/latest/index.html) installed, run: ``pip insta
3737

3838
* Structured logging initial implementation from [aws-lambda-logging](https://gitlab.com/hadrien/aws_lambda_logging)
3939
* Powertools idea [DAZN Powertools](https://github.com/getndazn/dazn-lambda-powertools/)
40-
* [Gatsby Apollo Theme for Docs](https://github.com/apollographql/gatsby-theme-apollo/tree/master/packages/gatsby-theme-apollo-docs)
4140

4241
## License
4342

aws_lambda_powertools/logging/formatter.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,24 @@ def _extract_log_exception(self, log_record: logging.LogRecord) -> Optional[str]
126126

127127
return None
128128

129+
def _extract_log_exception_name(self, log_record: logging.LogRecord) -> Optional[str]:
130+
"""Extract the exception name, if available
131+
132+
Parameters
133+
----------
134+
log_record : logging.LogRecord
135+
Log record to extract exception name from
136+
137+
Returns
138+
-------
139+
log_record: Optional[str]
140+
Log record with exception name
141+
"""
142+
if log_record.exc_info:
143+
return log_record.exc_info[0].__name__
144+
145+
return None
146+
129147
def _extract_log_keys(self, log_record: logging.LogRecord) -> Dict:
130148
"""Extract and parse custom and reserved log keys
131149
@@ -164,6 +182,7 @@ def _extract_log_keys(self, log_record: logging.LogRecord) -> Dict:
164182
def format(self, record): # noqa: A003
165183
formatted_log = self._extract_log_keys(log_record=record)
166184
formatted_log["message"] = self._extract_log_message(log_record=record)
185+
formatted_log["exception_name"] = self._extract_log_exception_name(log_record=record)
167186
formatted_log["exception"] = self._extract_log_exception(log_record=record)
168187
formatted_log.update({"xray_trace_id": self._get_latest_trace_id()}) # fetch latest Trace ID, if any
169188

aws_lambda_powertools/logging/logger.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class Logger(logging.Logger): # lgtm [py/missing-call-to-init]
5353
LOG_LEVEL: str
5454
logging level (e.g. INFO, DEBUG)
5555
POWERTOOLS_LOGGER_SAMPLE_RATE: float
56-
samping rate ranging from 0 to 1, 1 being 100% sampling
56+
sampling rate ranging from 0 to 1, 1 being 100% sampling
5757
5858
Parameters
5959
----------

aws_lambda_powertools/metrics/base.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ def serialize_metric_set(self, metrics: Dict = None, dimensions: Dict = None, me
197197
metric_names_and_units.append({"Name": metric_name, "Unit": metric_unit})
198198
metric_names_and_values.update({metric_name: metric_value})
199199

200-
embedded_metrics_object = {
200+
return {
201201
"_aws": {
202202
"Timestamp": int(datetime.datetime.now().timestamp() * 1000), # epoch
203203
"CloudWatchMetrics": [
@@ -213,8 +213,6 @@ def serialize_metric_set(self, metrics: Dict = None, dimensions: Dict = None, me
213213
**metric_names_and_values, # "single_metric": 1.0
214214
}
215215

216-
return embedded_metrics_object
217-
218216
def add_dimension(self, name: str, value: str):
219217
"""Adds given dimension to all metrics
220218

aws_lambda_powertools/metrics/metric.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ class SingleMetric(MetricManager):
2727
-------
2828
**Creates cold start metric with function_version as dimension**
2929
30-
from aws_lambda_powertools.metrics import SingleMetric, MetricUnit
3130
import json
32-
metric = Single_Metric(namespace="ServerlessAirline")
31+
from aws_lambda_powertools.metrics import single_metric, MetricUnit
32+
metric = single_metric(namespace="ServerlessAirline")
3333
3434
metric.add_metric(name="ColdStart", unit=MetricUnit.Count, value=1)
3535
metric.add_dimension(name="function_version", value=47)
@@ -72,7 +72,7 @@ def single_metric(name: str, unit: MetricUnit, value: float, namespace: str = No
7272
from aws_lambda_powertools.metrics import MetricUnit
7373
7474
with single_metric(name="ColdStart", unit=MetricUnit.Count, value=1, namespace="ServerlessAirline") as metric:
75-
metric.add_dimension(name="function_version", value=47)
75+
metric.add_dimension(name="function_version", value="47")
7676
7777
**Same as above but set namespace using environment variable**
7878
@@ -82,7 +82,7 @@ def single_metric(name: str, unit: MetricUnit, value: float, namespace: str = No
8282
from aws_lambda_powertools.metrics import MetricUnit
8383
8484
with single_metric(name="ColdStart", unit=MetricUnit.Count, value=1) as metric:
85-
metric.add_dimension(name="function_version", value=47)
85+
metric.add_dimension(name="function_version", value="47")
8686
8787
Parameters
8888
----------

aws_lambda_powertools/metrics/metrics.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,13 @@ class Metrics(MetricManager):
3939
metrics.add_dimension(name="function_version", value="$LATEST")
4040
...
4141
42-
@tracer.capture_lambda_handler
4342
@metrics.log_metrics()
4443
def lambda_handler():
45-
do_something()
46-
return True
44+
do_something()
45+
return True
4746
4847
def do_something():
49-
metrics.add_metric(name="Something", unit="Count", value=1)
48+
metrics.add_metric(name="Something", unit="Count", value=1)
5049
5150
Environment variables
5251
---------------------
@@ -111,12 +110,14 @@ def log_metrics(
111110
-------
112111
**Lambda function using tracer and metrics decorators**
113112
113+
from aws_lambda_powertools import Metrics, Tracer
114+
114115
metrics = Metrics(service="payment")
115116
tracer = Tracer(service="payment")
116117
117118
@tracer.capture_lambda_handler
118119
@metrics.log_metrics
119-
def handler(event, context):
120+
def handler(event, context):
120121
...
121122
122123
Parameters
Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,2 @@
11
class MiddlewareInvalidArgumentError(Exception):
22
"""When middleware receives non keyword=arguments"""
3-
4-
pass

aws_lambda_powertools/tracing/tracer.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from typing import Any, Callable, Dict, List, Optional, Tuple, Union
99

1010
from ..shared import constants
11-
from ..shared.functions import resolve_truthy_env_var_choice
11+
from ..shared.functions import resolve_env_var_choice, resolve_truthy_env_var_choice
1212
from ..shared.lazy_import import LazyLoader
1313
from .base import BaseProvider, BaseSegment
1414

@@ -720,7 +720,7 @@ def __build_config(
720720
):
721721
""" Populates Tracer config for new and existing initializations """
722722
is_disabled = disabled if disabled is not None else self._is_tracer_disabled()
723-
is_service = service if service is not None else os.getenv(constants.SERVICE_NAME_ENV)
723+
is_service = resolve_env_var_choice(choice=service, env=os.getenv(constants.SERVICE_NAME_ENV))
724724

725725
self._config["provider"] = provider or self._config["provider"] or aws_xray_sdk.core.xray_recorder
726726
self._config["auto_patch"] = auto_patch if auto_patch is not None else self._config["auto_patch"]

aws_lambda_powertools/utilities/batch/base.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ def batch_processor(
125125
Examples
126126
--------
127127
**Processes Lambda's event with PartialSQSProcessor**
128+
128129
>>> from aws_lambda_powertools.utilities.batch import batch_processor, PartialSQSProcessor
129130
>>>
130131
>>> def record_handler(record):

aws_lambda_powertools/utilities/batch/sqs.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class PartialSQSProcessor(BasePartialProcessor):
5353
>>> # have been deleted from the queue after context's exit.
5454
>>>
5555
>>> return result
56+
5657
"""
5758

5859
def __init__(self, config: Optional[Config] = None, suppress_exception: bool = False):
@@ -163,10 +164,11 @@ def sqs_batch_processor(
163164
Examples
164165
--------
165166
**Processes Lambda's event with PartialSQSProcessor**
167+
166168
>>> from aws_lambda_powertools.utilities.batch import sqs_batch_processor
167169
>>>
168170
>>> def record_handler(record):
169-
>>> return record["body"]
171+
>>> return record["body"]
170172
>>>
171173
>>> @sqs_batch_processor(record_handler=record_handler)
172174
>>> def handler(event, context):

0 commit comments

Comments
 (0)