11import datetime
22import logging
3- from typing import Any , List , Mapping
4-
5- # boto3 doesn't have stub files
6- from boto3 .session import Session # type: ignore
3+ from typing import Any , List , Mapping , Optional
74
85from botocore .exceptions import ClientError # type: ignore
96
7+ from .boto3_proxy import SessionProxy
108from .interface import Action , MetricTypes , StandardUnit
119
1210LOG = logging .getLogger (__name__ )
@@ -19,11 +17,9 @@ def format_dimensions(dimensions: Mapping[str, str]) -> List[Mapping[str, str]]:
1917
2018
2119class MetricPublisher :
22- def __init__ (self , account_id : str , resource_type : str , session : Session ) -> None :
23- suffix = resource_type .replace ("::" , "/" )
24- self .namespace = f"{ METRIC_NAMESPACE_ROOT } /{ account_id } /{ suffix } "
25- self .resource_type = resource_type
20+ def __init__ (self , session : SessionProxy , namespace : str ) -> None :
2621 self .client = session .client ("cloudwatch" )
22+ self .namespace = namespace
2723
2824 def publish_metric ( # pylint: disable-msg=too-many-arguments
2925 self ,
@@ -52,21 +48,29 @@ def publish_metric( # pylint: disable-msg=too-many-arguments
5248
5349
5450class MetricsPublisherProxy :
55- def __init__ (self ) -> None :
51+ @staticmethod
52+ def _make_namespace (account_id : str , resource_type : str ) -> str :
53+ suffix = resource_type .replace ("::" , "/" )
54+ return f"{ METRIC_NAMESPACE_ROOT } /{ account_id } /{ suffix } "
55+
56+ def __init__ (self , account_id : str , resource_type : str ) -> None :
57+ self .namespace = self ._make_namespace (account_id , resource_type )
58+ self .resource_type = resource_type
5659 self ._publishers : List [MetricPublisher ] = []
5760
58- def add_metrics_publisher (self , publisher : MetricPublisher ) -> None :
59- self ._publishers .append (publisher )
61+ def add_metrics_publisher (self , session : Optional [SessionProxy ]) -> None :
62+ if session :
63+ self ._publishers .append (MetricPublisher (session , self .namespace ))
6064
6165 def publish_exception_metric (
6266 self , timestamp : datetime .datetime , action : Action , error : Any
6367 ) -> None :
68+ dimensions : Mapping [str , str ] = {
69+ "DimensionKeyActionType" : action .name ,
70+ "DimensionKeyExceptionType" : str (type (error )),
71+ "DimensionKeyResourceType" : self .resource_type ,
72+ }
6473 for publisher in self ._publishers :
65- dimensions : Mapping [str , str ] = {
66- "DimensionKeyActionType" : action .name ,
67- "DimensionKeyExceptionType" : str (type (error )),
68- "DimensionKeyResourceType" : publisher .resource_type ,
69- }
7074 publisher .publish_metric (
7175 metric_name = MetricTypes .HandlerException ,
7276 dimensions = dimensions ,
@@ -78,11 +82,11 @@ def publish_exception_metric(
7882 def publish_invocation_metric (
7983 self , timestamp : datetime .datetime , action : Action
8084 ) -> None :
85+ dimensions = {
86+ "DimensionKeyActionType" : action .name ,
87+ "DimensionKeyResourceType" : self .resource_type ,
88+ }
8189 for publisher in self ._publishers :
82- dimensions = {
83- "DimensionKeyActionType" : action .name ,
84- "DimensionKeyResourceType" : publisher .resource_type ,
85- }
8690 publisher .publish_metric (
8791 metric_name = MetricTypes .HandlerInvocationCount ,
8892 dimensions = dimensions ,
@@ -94,11 +98,11 @@ def publish_invocation_metric(
9498 def publish_duration_metric (
9599 self , timestamp : datetime .datetime , action : Action , milliseconds : float
96100 ) -> None :
101+ dimensions = {
102+ "DimensionKeyActionType" : action .name ,
103+ "DimensionKeyResourceType" : self .resource_type ,
104+ }
97105 for publisher in self ._publishers :
98- dimensions = {
99- "DimensionKeyActionType" : action .name ,
100- "DimensionKeyResourceType" : publisher .resource_type ,
101- }
102106 publisher .publish_metric (
103107 metric_name = MetricTypes .HandlerInvocationDuration ,
104108 dimensions = dimensions ,
@@ -110,12 +114,12 @@ def publish_duration_metric(
110114 def publish_log_delivery_exception_metric (
111115 self , timestamp : datetime .datetime , error : Any
112116 ) -> None :
117+ dimensions = {
118+ "DimensionKeyActionType" : "ProviderLogDelivery" ,
119+ "DimensionKeyExceptionType" : str (type (error )),
120+ "DimensionKeyResourceType" : self .resource_type ,
121+ }
113122 for publisher in self ._publishers :
114- dimensions : Mapping [str , str ] = {
115- "DimensionKeyActionType" : "ProviderLogDelivery" ,
116- "DimensionKeyExceptionType" : str (type (error )),
117- "DimensionKeyResourceType" : publisher .resource_type ,
118- }
119123 publisher .publish_metric (
120124 metric_name = MetricTypes .HandlerException ,
121125 dimensions = dimensions ,
0 commit comments