1- use  crate :: metadata:: ContainerMetadata ; 
1+ use  crate :: metadata:: ContainerMetaClient ; 
22use  crate :: metrics:: exporter:: Exporter ; 
33use  crate :: metrics:: { CollectedMetric ,  MetricValue } ; 
44use  anyhow:: Context ; 
@@ -17,7 +17,7 @@ pub struct Gcp {
1717    monitored_resource_type :  String , 
1818    monitored_resource_labels :  HashMap < String ,  String > , 
1919    metric_names :  HashMap < String ,  String > , 
20-     container_meta :   ContainerMetadata , 
20+     container_meta_client :   Arc < ContainerMetaClient > , 
2121} 
2222
2323#[ derive( Debug ) ]  
@@ -51,15 +51,15 @@ impl Gcp {
5151        monitored_resource_type :  String , 
5252        monitored_resource_labels :  HashMap < String ,  String > , 
5353        metric_names :  HashMap < String ,  String > , 
54-         container_meta :   ContainerMetadata , 
54+         container_meta_client :   ContainerMetaClient , 
5555    )  -> Self  { 
5656        Self  { 
5757            client :  Arc :: new ( LazyMonitoringClient :: new ( ) ) , 
5858            project_id, 
5959            monitored_resource_type, 
6060            monitored_resource_labels, 
6161            metric_names, 
62-             container_meta , 
62+             container_meta_client :   Arc :: new ( container_meta_client ) , 
6363        } 
6464    } 
6565
@@ -82,7 +82,7 @@ impl Gcp {
8282            self . project_id
8383        ) ; 
8484
85-         let  time_series = self . get_metric_data ( metrics) ; 
85+         let  time_series = self . get_metric_data ( metrics) . await ; 
8686
8787        // Send metrics in batches (Google Cloud allows up to 200 time series per request) 
8888        for  batch in  time_series. chunks ( 200 )  { 
@@ -94,12 +94,14 @@ impl Gcp {
9494        Ok ( ( ) ) 
9595    } 
9696
97-     fn  get_metric_data ( & self ,  collected :  Vec < CollectedMetric > )  -> Vec < TimeSeries >  { 
97+     async   fn  get_metric_data ( & self ,  collected :  Vec < CollectedMetric > )  -> Vec < TimeSeries >  { 
9898        let  end_time = SystemTime :: now ( ) ; 
9999        let  ts_end_time:  google_cloud_wkt:: Timestamp  = end_time. try_into ( ) . unwrap_or_default ( ) ; 
100100
101101        let  mut  data:  Vec < TimeSeries >  = Vec :: with_capacity ( collected. len ( ) ) ; 
102102
103+         let  container_meta = self . container_meta_client . collect ( ) . await ; 
104+ 
103105        for  metric in  collected { 
104106            let  cloud_metric_name = match  self . metric_names . get ( metric. key . name ( ) )  { 
105107                Some ( name)  => name, 
@@ -112,11 +114,11 @@ impl Gcp {
112114                } 
113115            } ; 
114116
115-             let  container_labels = self . container_meta . labels ( ) ; 
117+             let  container_labels = container_meta. labels ( ) ; 
116118            let  container_labels_len = container_labels. len ( ) ; 
117119            let  mut  labels =
118120                HashMap :: with_capacity ( container_labels_len + metric. key . labels ( ) . len ( ) ) ; 
119-             labels. extend ( container_labels) ; 
121+             labels. extend ( container_labels. clone ( ) ) ; 
120122            labels. extend ( 
121123                metric
122124                    . key 
@@ -171,6 +173,18 @@ impl Gcp {
171173                ) , 
172174            } ; 
173175
176+             // Add container instance ID to node_id if present 
177+             let  mut  monitored_resource_labels = self . monitored_resource_labels . clone ( ) ; 
178+             if  let  Some ( node_id)  = monitored_resource_labels. get ( "node_id" )  { 
179+                 monitored_resource_labels. insert ( 
180+                     "node_id" . to_string ( ) , 
181+                     format ! ( "{}-{}" ,  node_id,  container_meta. instance_id) , 
182+                 ) ; 
183+             } 
184+ 
185+             let  mut  mr = MonitoredResource :: new ( ) . set_type ( & self . monitored_resource_type ) ; 
186+             mr. labels  = monitored_resource_labels; 
187+ 
174188            data. push ( 
175189                TimeSeries :: new ( ) 
176190                    . set_metric_kind ( kind) 
@@ -179,11 +193,7 @@ impl Gcp {
179193                            . set_type ( format ! ( "custom.googleapis.com/{}" ,  cloud_metric_name) ) 
180194                            . set_labels ( labels) , 
181195                    ) 
182-                     . set_resource ( 
183-                         MonitoredResource :: new ( ) 
184-                             . set_type ( & self . monitored_resource_type ) 
185-                             . set_labels ( & self . monitored_resource_labels ) , 
186-                     ) 
196+                     . set_resource ( mr) 
187197                    . set_value_type ( value_type) 
188198                    . set_points ( vec ! [ Point :: new( ) 
189199                        . set_interval( interval) 
0 commit comments