Максимальное количество операций ввода-вывода в секунду в объеме EBS за последние 2 недели - PullRequest
0 голосов
/ 23 октября 2019

Я хочу получить максимальное количество операций ввода-вывода в секунду, использованное объемом EBS за последние 2 недели. Я использую функцию get_metric_data cloudwatch для получения данных о метрике VolumeReadOps и VolumeWriteOps. Я использую следующий код для получения VolumeReadOps и VolumeWriteOps, а затем пытаюсь вычислить MaxIOPS:

Это функция для получения значений метрики:

def cloudwatch_metric_value(CWsession,NameSpace,ResourceIdentifier,vStat,vUnit,vMetricName,vPeriod):
    """
    Function that returns metric value of cloudwatch for a given resource and metric Name

    """

    if NameSpace=='EBS':
        responseCW = CWsession.get_metric_data(
            MetricDataQueries=[
                {
                    'Id': 'string',
                    'MetricStat': {
                        'Metric': {
                            'Namespace': 'AWS/EBS',
                            'MetricName': vMetricName,
                            'Dimensions': [
                                {
                                    'Name': 'VolumeId',
                                    'Value': ResourceIdentifier
                                },
                            ]
                        },
                        'Period': vPeriod,
                        'Stat': vStat,
                        'Unit': vUnit
                    },
                    'ReturnData': True
                },
            ],
            StartTime=vStartTime,
            EndTime=vEndTime,
        )
    vValue=responseCW['MetricDataResults'][0]['Values']
    vTimeStamps=responseCW['MetricDataResults'][0]['Timestamps']
    index, value = max(enumerate(vValue), key=operator.itemgetter(1))
    metric_value=value
    metric_time=vTimeStamps[index]
    return metric_time,metric_value

Из main она вызывается следующим образом:

                    metric_time,metric_value = cloudwatch_metric_value(cloudwatch,'EBS',v['VolumeId'],'Sum','Count','VolumeReadOps',300)
                    vReadIOPS=metric_value
                    metric_time,metric_value = cloudwatch_metric_value(cloudwatch,'EBS',v['VolumeId'],'Sum','Count','VolumeWriteOps',300)
                    vWriteIOPS=metric_value

                    vTotalIOPS=round((vReadIOPS+vWriteIOPS)/300)    

Я понимаю, что IOPS рассчитывается путем погружения операций ReadOps / Write с продолжительностью. Значения, которые я получаю из этого кода для MaxIOPS для данного тома, не совпадают со значениями, которые я вижу в консоли cloudwatch. Посоветуйте, пожалуйста, правильно ли я это делаю?

Спасибо.

1 Ответ

0 голосов
/ 23 октября 2019

Хорошо, я смог исправить, и вот рабочая функция:

def cloudwatch_metric_value(CWsession,NameSpace,ResourceIdentifier,vStat,vUnit,vPeriod):
    """
    Function that returns metric value of cloudwatch for a given resource and metric Name

    """

    if NameSpace=='EBS':
        responseCW = CWsession.get_metric_data(
            MetricDataQueries=[
                {
                    'Id': 'string1',
                    'MetricStat': {
                        'Metric': {
                            'Namespace': 'AWS/EBS',
                            'MetricName': 'VolumeReadOps',
                            'Dimensions': [
                                {
                                    'Name': 'VolumeId',
                                    'Value': ResourceIdentifier
                                },
                            ]
                        },
                        'Period': vPeriod,
                        'Stat': vStat,
                        'Unit': vUnit
                    },
                    'ReturnData': True
                },
                {
                    'Id': 'string2',
                    'MetricStat': {
                        'Metric': {
                            'Namespace': 'AWS/EBS',
                            'MetricName': 'VolumeWriteOps',
                            'Dimensions': [
                                {
                                    'Name': 'VolumeId',
                                    'Value': ResourceIdentifier
                                },
                            ]
                        },
                        'Period': vPeriod,
                        'Stat': vStat,
                        'Unit': vUnit
                    },
                    'ReturnData': True
                },                
            ],
            StartTime=vStartTime,
            EndTime=vEndTime,
        )

    vReadValue=responseCW['MetricDataResults'][0]['Values']
    vReadTimeStamps=responseCW['MetricDataResults'][0]['Timestamps']
    vWriteValue=responseCW['MetricDataResults'][1]['Values']
    vWriteTimeStamps=responseCW['MetricDataResults'][1]['Timestamps']
    vReadWriteValue = [vReadValue[i]+vWriteValue[i] for i in range(len(vWriteValue))]
    if vReadWriteValue:
        metric_value = max(vReadWriteValue)
        metric_time = vReadTimeStamps[vReadWriteValue.index(metric_value)]
        metric_value = metric_value / 300
    else:
        metric_value=1
        metric_time=date_t        
    return metric_time,metric_value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...