def get_single_domain_metric_values()

in CWMetricsToOpenSearch/handler.py [0:0]


def get_single_domain_metric_values(domain_name, region, metric_descriptions):
    # TODO: Make this multi-domain?
    ret = list()
    cw = boto3.client('cloudwatch', region)
    queries = build_metric_data_queries(domain_name, region, metric_descriptions)

    # The CW query runs from now to the last time this retrieved data. It could miss
    # data points on edge case boundaries.
    time_now = datetime.utcfromtimestamp(time.time())
    last_timestamp = get_last_timestamp_ddb(domain_name, region)
    if not last_timestamp:
        last_timestamp = time_now - timedelta(minutes=15)

    for group in grouper(queries, 100):
        try:
            paginator = cw.get_paginator('get_metric_data')
            iter = paginator.paginate(MetricDataQueries=group,
                                      StartTime=last_timestamp,
                                      EndTime=time_now)
            for page in iter:
                for result in page['MetricDataResults']:
                    # TODO: Error handling
                    (result_domain, result_region, metric_name, stat) = result['Label'].split(' ')
                    for val in zip(result['Timestamps'], result['Values']):
                        ts = val[0].replace(microsecond=0, tzinfo=tz.tzutc())
                        ret.append(SingleMetricValue(
                            domain_name=result_domain,
                            region=result_region,
                            metric_name=metric_name,
                            stat=stat,
                            timestamp=ts.isoformat(),
                            value=val[1]
                        ))
            update_metric_timestamp_ddb(domain_name, region, time_now)
        except Exception as e:
            # Handle me better
            print('Exception', domain_name, region)
            print(e)
            print()
    return ret