5
5
import numbers
6
6
import time
7
7
import warnings
8
- from typing import Dict , List
8
+ from typing import Dict , List , Optional
9
9
10
10
from aws_lambda_powertools .metrics .exceptions import MetricValueError
11
11
from aws_lambda_powertools .metrics .provider import MetricsBase , MetricsProviderBase
12
12
13
13
logger = logging .getLogger (__name__ )
14
14
15
- # Check if using layer
15
+ # Check if using datadog layer
16
16
try :
17
17
from datadog_lambda .metric import lambda_metric # type: ignore
18
18
except ImportError :
19
19
lambda_metric = None
20
20
21
21
22
22
class DataDogProvider (MetricsProviderBase ):
23
- """Class for datadog provider."""
23
+ """Class for datadog provider.
24
+ all datadog metric data will be stored as
25
+ see https://github.com/DataDog/datadog-lambda-python/blob/main/datadog_lambda/metric.py#L77
26
+ {
27
+ "m": metric_name,
28
+ "v": value,
29
+ "e": timestamp
30
+ "t": List["tag:value","tag2:value2"]
31
+ }
32
+ """
24
33
25
34
def __init__ (self , namespace ):
26
35
self .metrics = []
27
36
self .namespace = namespace
28
37
super ().__init__ ()
29
38
30
- # adding timestamp, tags. unit, resolution, name will not be used
31
- def add_metric (self , name : str , value : float , timestamp : float , tag : List ):
39
+ # adding name,value,timestamp,tags
40
+ # consider directly calling lambda_metric function here
41
+ def add_metric (self , name : str , value : float , timestamp : Optional [int ] = None , tags : Optional [List ] = None ):
32
42
if not isinstance (value , numbers .Real ):
33
43
raise MetricValueError (f"{ value } is not a valid number" )
34
44
if not timestamp :
35
45
timestamp = time .time ()
36
- self .metrics .append ({"m" : name , "v" : float (value ), "e" : timestamp , "t" : [] })
46
+ self .metrics .append ({"m" : name , "v" : int (value ), "e" : timestamp , "t" : tags })
37
47
38
48
# serialize for flushing
39
49
def serialize (self ) -> Dict :
@@ -57,16 +67,17 @@ def serialize(self) -> Dict:
57
67
def flush (self , metrics ):
58
68
# submit through datadog extension
59
69
if lambda_metric :
70
+ # use lambda_metric function from datadog package, submit metrics to datadog
60
71
for metric_item in metrics .get ("List" ):
61
72
lambda_metric (
62
73
metric_name = metric_item ["m" ],
63
74
value = metric_item ["v" ],
64
75
timestamp = metric_item ["e" ],
65
76
tags = metric_item ["t" ],
66
77
)
67
- # flush to log with datadog format
68
- # https://github.com/DataDog/datadog-lambda-python/blob/main/datadog_lambda/metric.py#L77
69
78
else :
79
+ # flush to log with datadog format
80
+ # https://github.com/DataDog/datadog-lambda-python/blob/main/datadog_lambda/metric.py#L77
70
81
for metric_item in metrics .get ("List" ):
71
82
print (json .dumps (metric_item , separators = ("," , ":" )))
72
83
@@ -75,14 +86,25 @@ def clear(self):
75
86
76
87
77
88
class DataDogMetrics (MetricsBase ):
78
- """Class for datadog metrics."""
89
+ """Class for datadog metrics standalone class.
79
90
91
+ Example
92
+ -------
93
+ dd_provider = DataDogProvider(namespace="default")
94
+ metrics = DataDogMetrics(provider=dd_provider)
95
+
96
+ @metrics.log_metrics(capture_cold_start_metric: bool = True, raise_on_empty_metrics: bool = False)
97
+ def lambda_handler(event, context)
98
+ metrics.add_metric(name="item_sold",value=1,tags)
99
+ """
100
+
101
+ # `log_metrics` and `_add_cold_start_metric` are directly inherited from `MetricsBase`
80
102
def __init__ (self , provider ):
81
103
self .provider = provider
82
104
super ().__init__ ()
83
105
84
- def add_metric (self , name : str , value : float , timestamp : float , tags : List ):
85
- self .provider .add_metric (name , value , timestamp , tags )
106
+ def add_metric (self , name : str , value : float , timestamp : Optional [ int ] = None , tags : Optional [ List ] = None ):
107
+ self .provider .add_metric (name = name , value = value , timestamp = timestamp , tags = tags )
86
108
87
109
def flush_metrics (self , raise_on_empty_metrics : bool = False ) -> None :
88
110
metrics = self .provider .serialize ()
0 commit comments