Skip to content

Commit 776569a

Browse files
authored
feat: add support to persist default dimensions (#410)
1 parent 0dc5e1b commit 776569a

File tree

3 files changed

+263
-38
lines changed

3 files changed

+263
-38
lines changed

Diff for: aws_lambda_powertools/metrics/metrics.py

+46-13
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,13 @@ class Metrics(MetricManager):
3434
from aws_lambda_powertools import Metrics
3535
3636
metrics = Metrics(namespace="ServerlessAirline", service="payment")
37-
metrics.add_metric(name="ColdStart", unit=MetricUnit.Count, value=1)
38-
metrics.add_metric(name="BookingConfirmation", unit="Count", value=1)
39-
metrics.add_dimension(name="function_version", value="$LATEST")
40-
...
4137
42-
@metrics.log_metrics()
38+
@metrics.log_metrics(capture_cold_start_metric=True)
4339
def lambda_handler():
44-
do_something()
45-
return True
40+
metrics.add_metric(name="BookingConfirmation", unit="Count", value=1)
41+
metrics.add_dimension(name="function_version", value="$LATEST")
4642
47-
def do_something():
48-
metrics.add_metric(name="Something", unit="Count", value=1)
43+
return True
4944
5045
Environment variables
5146
---------------------
@@ -74,13 +69,15 @@ def do_something():
7469
_metrics: Dict[str, Any] = {}
7570
_dimensions: Dict[str, str] = {}
7671
_metadata: Dict[str, Any] = {}
72+
_default_dimensions: Dict[str, Any] = {}
7773

7874
def __init__(self, service: str = None, namespace: str = None):
7975
self.metric_set = self._metrics
80-
self.dimension_set = self._dimensions
8176
self.service = service
8277
self.namespace: Optional[str] = namespace
8378
self.metadata_set = self._metadata
79+
self.default_dimensions = self._default_dimensions
80+
self.dimension_set = {**self._default_dimensions, **self._dimensions}
8481

8582
super().__init__(
8683
metric_set=self.metric_set,
@@ -90,17 +87,48 @@ def __init__(self, service: str = None, namespace: str = None):
9087
service=self.service,
9188
)
9289

90+
def set_default_dimensions(self, **dimensions):
91+
"""Persist dimensions across Lambda invocations
92+
93+
Parameters
94+
----------
95+
dimensions : Dict[str, Any], optional
96+
metric dimensions as key=value
97+
98+
Example
99+
-------
100+
**Sets some default dimensions that will always be present across metrics and invocations**
101+
102+
from aws_lambda_powertools import Metrics
103+
104+
metrics = Metrics(namespace="ServerlessAirline", service="payment")
105+
metrics.set_default_dimensions(environment="demo", another="one")
106+
107+
@metrics.log_metrics()
108+
def lambda_handler():
109+
return True
110+
"""
111+
for name, value in dimensions.items():
112+
self.add_dimension(name, value)
113+
114+
self.default_dimensions.update(**dimensions)
115+
116+
def clear_default_dimensions(self):
117+
self.default_dimensions.clear()
118+
93119
def clear_metrics(self):
94120
logger.debug("Clearing out existing metric set from memory")
95121
self.metric_set.clear()
96122
self.dimension_set.clear()
97123
self.metadata_set.clear()
124+
self.set_default_dimensions(**self.default_dimensions) # re-add default dimensions
98125

99126
def log_metrics(
100127
self,
101128
lambda_handler: Callable[[Any, Any], Any] = None,
102129
capture_cold_start_metric: bool = False,
103130
raise_on_empty_metrics: bool = False,
131+
default_dimensions: Dict[str, str] = None,
104132
):
105133
"""Decorator to serialize and publish metrics at the end of a function execution.
106134
@@ -123,11 +151,13 @@ def handler(event, context):
123151
Parameters
124152
----------
125153
lambda_handler : Callable[[Any, Any], Any], optional
126-
Lambda function handler, by default None
154+
lambda function handler, by default None
127155
capture_cold_start_metric : bool, optional
128-
Captures cold start metric, by default False
156+
captures cold start metric, by default False
129157
raise_on_empty_metrics : bool, optional
130-
Raise exception if no metrics are emitted, by default False
158+
raise exception if no metrics are emitted, by default False
159+
default_dimensions: Dict[str, str], optional
160+
metric dimensions as key=value that will always be present
131161
132162
Raises
133163
------
@@ -143,11 +173,14 @@ def handler(event, context):
143173
self.log_metrics,
144174
capture_cold_start_metric=capture_cold_start_metric,
145175
raise_on_empty_metrics=raise_on_empty_metrics,
176+
default_dimensions=default_dimensions,
146177
)
147178

148179
@functools.wraps(lambda_handler)
149180
def decorate(event, context):
150181
try:
182+
if default_dimensions:
183+
self.set_default_dimensions(**default_dimensions)
151184
response = lambda_handler(event, context)
152185
if capture_cold_start_metric:
153186
self.__add_cold_start_metric(context=context)

0 commit comments

Comments
 (0)