@@ -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