def ecs_info(self) -> GaugeMetricFamily: req = DescribeECS.DescribeInstancesRequest() nested_handler = { 'InnerIpAddress': lambda obj: try_or_else(lambda: obj['IpAddress'][0], ''), 'PublicIpAddress': lambda obj: try_or_else(lambda: obj['IpAddress'][0], ''), 'VpcAttributes': lambda obj: try_or_else(lambda: obj['PrivateIpAddress']['IpAddress'][0], ''), } return self.info_template(req, 'aliyun_meta_ecs_info', nested_handler=nested_handler)
def label_values(self, instance, label_keys, nested_handler=None): if nested_handler is None: nested_handler = {} return map( lambda k: str(nested_handler[k](instance[k])) if k in nested_handler else try_or_else(lambda: str(instance[k]), ''), label_keys)
def metric_generator(self, project, metric): if 'name' not in metric: raise Exception('name must be set in metric item.') name = metric['name'] metric_name = metric['name'] period = 60 measure = 'Average' if 'rename' in metric: name = metric['rename'] if 'period' in metric: period = metric['period'] if 'measure' in metric: measure = metric['measure'] try: points = self.query_metric(project, metric_name, period) except Exception as e: logging.error('Error query metrics for {}_{}'.format(project, metric_name), exc_info=e) yield metric_up_gauge(self.format_metric_name(project, name), False) return if len(points) < 1: yield metric_up_gauge(self.format_metric_name(project, name), False) return label_keys = self.parse_label_keys(points[0]) gauge = GaugeMetricFamily(self.format_metric_name(project, name), '', labels=label_keys) for point in points: gauge.add_metric([try_or_else(lambda: str(point[k]), '') for k in label_keys], point[measure]) yield gauge yield metric_up_gauge(self.format_metric_name(project, name), True)
def cdn_info(self) -> GaugeMetricFamily: req = DescribeCDN.DescribeUserDomainsRequest() req.set_DomainStatus('online') nested_handler = { 'DomainName': lambda obj: try_or_else(lambda: obj['DomainName'], ''), } return self.info_template( req, 'aliyun_meta_cdn_info', to_list=lambda data: data['Domains']['PageData'])