@@ -34,18 +34,13 @@ class Metrics(MetricManager):
34
34
from aws_lambda_powertools import Metrics
35
35
36
36
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
- ...
41
37
42
- @metrics.log_metrics()
38
+ @metrics.log_metrics(capture_cold_start_metric=True )
43
39
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")
46
42
47
- def do_something():
48
- metrics.add_metric(name="Something", unit="Count", value=1)
43
+ return True
49
44
50
45
Environment variables
51
46
---------------------
@@ -74,13 +69,15 @@ def do_something():
74
69
_metrics : Dict [str , Any ] = {}
75
70
_dimensions : Dict [str , str ] = {}
76
71
_metadata : Dict [str , Any ] = {}
72
+ _default_dimensions : Dict [str , Any ] = {}
77
73
78
74
def __init__ (self , service : str = None , namespace : str = None ):
79
75
self .metric_set = self ._metrics
80
- self .dimension_set = self ._dimensions
81
76
self .service = service
82
77
self .namespace : Optional [str ] = namespace
83
78
self .metadata_set = self ._metadata
79
+ self .default_dimensions = self ._default_dimensions
80
+ self .dimension_set = {** self ._default_dimensions , ** self ._dimensions }
84
81
85
82
super ().__init__ (
86
83
metric_set = self .metric_set ,
@@ -90,17 +87,48 @@ def __init__(self, service: str = None, namespace: str = None):
90
87
service = self .service ,
91
88
)
92
89
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
+
93
119
def clear_metrics (self ):
94
120
logger .debug ("Clearing out existing metric set from memory" )
95
121
self .metric_set .clear ()
96
122
self .dimension_set .clear ()
97
123
self .metadata_set .clear ()
124
+ self .set_default_dimensions (** self .default_dimensions ) # re-add default dimensions
98
125
99
126
def log_metrics (
100
127
self ,
101
128
lambda_handler : Callable [[Any , Any ], Any ] = None ,
102
129
capture_cold_start_metric : bool = False ,
103
130
raise_on_empty_metrics : bool = False ,
131
+ default_dimensions : Dict [str , str ] = None ,
104
132
):
105
133
"""Decorator to serialize and publish metrics at the end of a function execution.
106
134
@@ -123,11 +151,13 @@ def handler(event, context):
123
151
Parameters
124
152
----------
125
153
lambda_handler : Callable[[Any, Any], Any], optional
126
- Lambda function handler, by default None
154
+ lambda function handler, by default None
127
155
capture_cold_start_metric : bool, optional
128
- Captures cold start metric, by default False
156
+ captures cold start metric, by default False
129
157
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
131
161
132
162
Raises
133
163
------
@@ -143,11 +173,14 @@ def handler(event, context):
143
173
self .log_metrics ,
144
174
capture_cold_start_metric = capture_cold_start_metric ,
145
175
raise_on_empty_metrics = raise_on_empty_metrics ,
176
+ default_dimensions = default_dimensions ,
146
177
)
147
178
148
179
@functools .wraps (lambda_handler )
149
180
def decorate (event , context ):
150
181
try :
182
+ if default_dimensions :
183
+ self .set_default_dimensions (** default_dimensions )
151
184
response = lambda_handler (event , context )
152
185
if capture_cold_start_metric :
153
186
self .__add_cold_start_metric (context = context )
0 commit comments