веб-сервисы Amazon — как получить доступ к пользовательским метрикам AWS CloudWatch через PHP SDK

Я могу получить информацию о метриках для включенных метрик, однако для пользовательских метрик, например, CPUUtilization для каждого экземпляра, я не могу получить информацию. Я не уверен, правильно ли я использую NameSpace или, возможно, мне нужно включить дополнительную информацию в поле Dimensions. Кто-нибудь знает, как это сделать?

Вот мой код:

<?php

date_default_timezone_set('America/New_York');

require 'vendor/autoload.php';

use Aws\CloudWatch\CloudWatchClient;
$cloudWatchClient = CloudWatchClient::factory(array(
'profile' => 'my_profile',
'region' => 'us-east-1',
));

$dimensions = array(
array('Name' => 'InstanceId', 'Value' => 'i-0c0f546e4d1ef25e1'),
array('Name' => 'ImageId', 'Value' => 'ami-9cdee48b'),
array('Name' => 'AutoScalingGroupName', 'Value' => 'lc-wordpress-asg'),
);

$cpuResult = $cloudWatchClient->getMetricStatistics(array(
'Namespace'  => 'AWS/EC2',
'MetricName' => 'CPUUtilization',
'Dimensions' => $dimensions,
'StartTime'  => strtotime('-5 minutes'),
'EndTime'    => strtotime('now'),
'Period'     => 300,
'Statistics' => array('Average'),
));

var_dump($cpuResult);

$memoryResult = $cloudWatchClient->getMetricStatistics(array(
'Namespace'  => 'Linux System',
'MetricName' => 'MemoryUtilization',
'Dimensions' => $dimensions,
'StartTime'  => strtotime('-5 hours'),
'EndTime'    => strtotime('now'),
'Period'     => 60,
'Statistics' => array('Average'),
));

var_dump($memoryResult);
?>

Запуск этого кода приводит к следующему выводу. Как вы можете видеть, CPUUtilization возвращает желаемые результаты, однако MemoryUtilization возвращает пустой массив.

[ec2-user@ip-10-0-52-163 php-sdk]$ php get-cloudwatch-metrics.php
object(Guzzle\Service\Resource\Model)#100 (2) {
["structure":protected]=>
NULL
["data":protected]=>
array(3) {
["Datapoints"]=>
array(0) {
}
["Label"]=>
string(14) "CPUUtilization"["ResponseMetadata"]=>
array(1) {
["RequestId"]=>
string(36) "63dc311e-bdaf-11e6-8143-f96eefa160b8"}
}
}
object(Guzzle\Service\Resource\Model)#102 (2) {
["structure":protected]=>
NULL
["data":protected]=>
array(3) {
["Datapoints"]=>
array(0) {
}
["Label"]=>
string(17) "MemoryUtilization"["ResponseMetadata"]=>
array(1) {
["RequestId"]=>
string(36) "63dec890-bdaf-11e6-b04d-0707ed181fab"}
}
}

Обратите внимание, что я использую типичные скрипты Perl для пользовательских метрик AWS для отправки пользовательских метрик в CloudWatch.

* * * * * ~/aws-scripts-mon/mon-put-instance-data.pl --mem-util --mem-used --mem-avail --disk-space-util --disk-path=/ --from-cron --aggregated --auto-scaling

1

Решение

Я понял. Быстрая проверка моих пользовательских сценариев экземпляра метрики, которые помещают метрики в CloudWatch, показывает пространство имен «System / Linux», однако в консоли CloudWatch отображается «Linux System». Переключение кода на System / Linux дает ожидаемые результаты!

$dimensions = array(
array('Name' => 'InstanceId', 'Value' => 'i-0c0f546e4d1ef25e1'),
);

$memoryResult = $cloudWatchClient->getMetricStatistics(array(
'Namespace'  => 'System/Linux',
'MetricName' => 'MemoryUtilization',
'Dimensions' => $dimensions,
'StartTime'  => strtotime('-5 minutes'),
'EndTime'    => strtotime('now'),
'Period'     => 60,
'Statistics' => array('Average'),
));

var_dump($memoryResult);

Выход ниже:

[ec2-user@ip-10-0-52-163 php-sdk]$ php get-cloudwatch-metrics.php
object(Guzzle\Service\Resource\Model)#100 (2) {
["structure":protected]=>
NULL
["data":protected]=>
array(3) {
["Datapoints"]=>
array(5) {
[0]=>
array(3) {
["Average"]=>
string(16) "50.1385233069785"["Unit"]=>
string(7) "Percent"["Timestamp"]=>
string(20) "2016-12-10T23:07:00Z"}
[1]=>
array(3) {
["Average"]=>
string(16) "38.5987663771093"["Unit"]=>
string(7) "Percent"["Timestamp"]=>
string(20) "2016-12-10T23:08:00Z"}
[2]=>
array(3) {
["Average"]=>
string(16) "41.5588687016341"["Unit"]=>
string(7) "Percent"["Timestamp"]=>
string(20) "2016-12-10T23:09:00Z"}
[3]=>
array(3) {
["Average"]=>
string(16) "45.4270517993215"["Unit"]=>
string(7) "Percent"["Timestamp"]=>
string(20) "2016-12-10T23:10:00Z"}
[4]=>
array(3) {
["Average"]=>
string(16) "46.4784461685095"["Unit"]=>
string(7) "Percent"["Timestamp"]=>
string(20) "2016-12-10T23:06:00Z"}
}
["Label"]=>
string(17) "MemoryUtilization"["ResponseMetadata"]=>
array(1) {
["RequestId"]=>
string(36) "07c17abc-bf2e-11e6-a0ce-0f6cd308d7b2"}
}
}
2

Другие решения

Раньше у меня была такая же проблема,
Проблема была в размерах (я должен использовать ClusterName)

 $dimensions = array(array('Name' => 'ClusterName', 'Value' => env('AWS_CLUSTER_NAME')));
$metrics = $cloudWatch->GetMetricStatistics(['Namespace' => 'AWS/ECS',
'MetricName' => "MemoryUtilization",
'Period' => 60,
'Dimensions' => $dimensions,
'StartTime' => strtotime('-24 hours'),
'EndTime' =>  strtotime('now'),
'Statistics' => array('Maximum', 'Minimum', 'Average')]);
0