|
32 | 32 | CONS_TIME_SERIES = "timeseries" |
33 | 33 | EPOCH_DATETIME = datetime(1970, 1, 1) |
34 | 34 | EPOCH_PATTERN = "%Y-%m-%dT%H:%M:%S.%fZ" |
| 35 | +GLOBAL_RESOURCE_TYPE = 'global' |
35 | 36 |
|
36 | 37 |
|
37 | 38 | class Options(object): |
@@ -188,26 +189,14 @@ def make_request(self, view_data, limit): |
188 | 189 | time_series = [] |
189 | 190 | return requests |
190 | 191 |
|
191 | | - def create_time_series_list(self, v_data, resource_type, metric_prefix): |
| 192 | + def create_time_series_list(self, v_data, option_resource_type, |
| 193 | + metric_prefix): |
192 | 194 | """ Create the TimeSeries object based on the view data |
193 | 195 | """ |
194 | 196 | series = monitoring_v3.types.TimeSeries() |
195 | 197 | series.metric.type = namespaced_view_name(v_data.view.name, |
196 | 198 | metric_prefix) |
197 | | - |
198 | | - if resource_type == "": |
199 | | - monitor_resource = MonitoredResourceUtil.get_instance() |
200 | | - if monitor_resource is not None: |
201 | | - series.resource.type = monitor_resource.resource_type |
202 | | - labels = monitor_resource.get_resource_labels() |
203 | | - for attribute_key, attribute_value in labels.items(): |
204 | | - attribute_value = 'aws:' + attribute_value if \ |
205 | | - attribute_key == 'region' else attribute_value |
206 | | - series.resource.labels[attribute_key] = attribute_value |
207 | | - else: |
208 | | - series.resource.type = 'global' |
209 | | - else: |
210 | | - series.resource.type = resource_type |
| 199 | + set_monitored_resource(series, option_resource_type) |
211 | 200 |
|
212 | 201 | tag_agg = v_data.tag_value_aggregation_data_map |
213 | 202 | for tag_value, agg in tag_agg.items(): |
@@ -330,6 +319,65 @@ def create_metric_descriptor(self, view): |
330 | 319 | return descriptor |
331 | 320 |
|
332 | 321 |
|
| 322 | +def set_monitored_resource(series, option_resource_type): |
| 323 | + """Set a resource(type and labels) that can be used for monitoring. |
| 324 | + :param series: TimeSeries object based on view data |
| 325 | + :param option_resource_type: Resource is an optional field that |
| 326 | + represents the Stackdriver MonitoredResource type. |
| 327 | + """ |
| 328 | + resource_type = GLOBAL_RESOURCE_TYPE |
| 329 | + |
| 330 | + if option_resource_type == "": |
| 331 | + monitored_resource = MonitoredResourceUtil.get_instance() |
| 332 | + if monitored_resource is not None: |
| 333 | + resource_labels = monitored_resource.get_resource_labels() |
| 334 | + |
| 335 | + if monitored_resource.resource_type == 'gke_container': |
| 336 | + resource_type = 'k8s_container' |
| 337 | + set_attribute_label(series, resource_labels, 'project_id') |
| 338 | + set_attribute_label(series, resource_labels, 'cluster_name') |
| 339 | + set_attribute_label(series, resource_labels, 'container_name') |
| 340 | + set_attribute_label(series, resource_labels, 'namespace_id', |
| 341 | + 'namespace_name') |
| 342 | + set_attribute_label(series, resource_labels, 'pod_id', |
| 343 | + 'pod_name') |
| 344 | + set_attribute_label(series, resource_labels, 'zone', |
| 345 | + 'location') |
| 346 | + |
| 347 | + elif monitored_resource.resource_type == 'gce_instance': |
| 348 | + resource_type = monitored_resource.resource_type |
| 349 | + set_attribute_label(series, resource_labels, 'project_id') |
| 350 | + set_attribute_label(series, resource_labels, 'instance_id') |
| 351 | + set_attribute_label(series, resource_labels, 'zone') |
| 352 | + |
| 353 | + elif monitored_resource.resource_type == 'aws_ec2_instance': |
| 354 | + resource_type = monitored_resource.resource_type |
| 355 | + set_attribute_label(series, resource_labels, 'aws_account') |
| 356 | + set_attribute_label(series, resource_labels, 'instance_id') |
| 357 | + set_attribute_label(series, resource_labels, 'region', |
| 358 | + label_value_prefix='aws:') |
| 359 | + else: |
| 360 | + resource_type = option_resource_type |
| 361 | + series.resource.type = resource_type |
| 362 | + |
| 363 | + |
| 364 | +def set_attribute_label(series, resource_labels, attribute_key, |
| 365 | + canonical_key=None, label_value_prefix=''): |
| 366 | + """Set a label to timeseries that can be used for monitoring |
| 367 | + :param series: TimeSeries object based on view data |
| 368 | + :param resource_labels: collection of labels |
| 369 | + :param attribute_key: actual label key |
| 370 | + :param canonical_key: exporter specific label key, Optional |
| 371 | + :param label_value_prefix: exporter specific label value prefix, Optional |
| 372 | + """ |
| 373 | + if attribute_key in resource_labels: |
| 374 | + if canonical_key is None: |
| 375 | + canonical_key = attribute_key |
| 376 | + |
| 377 | + series.resource.labels[canonical_key] = \ |
| 378 | + label_value_prefix + resource_labels[attribute_key] |
| 379 | + |
| 380 | + |
333 | 381 | def new_stats_exporter(options): |
334 | 382 | """ new_stats_exporter returns an exporter that |
335 | 383 | uploads stats data to Stackdriver Monitoring. |
|
0 commit comments