Отправка данных в CloudWatch с помощью AWS-SDK - PullRequest
0 голосов
/ 08 июля 2019

Я хочу записать данные в CloudWatch, используя AWS-SDK (или что-то еще, что может работать).

Я вижу это:

enter image description here

Единственный метод, который удаленно похож на публикацию данных в CloudWatch, - это метод putMetricData, но пример его использования трудно найти.

Кто-нибудь знает, как публиковать данные в CloudWatch?

Когда я называю это:

cw.putMetricData({
  Namespace: 'ec2-memory-usage',
  MetricData: [{
    MetricName:'first',
    Timestamp: new Date()
  }]
}, (err, result) => {
  console.log({err, result});
});

Я получаю эту ошибку:

{ err:
   { InvalidParameterCombination: At least one of the parameters must be specified.
       at Request.extractError (/Users/alex/codes/interos/jenkins-jobs/jobs/check-memory-ec2-instances/node_modules/aws-sdk/lib/protocol/query.js:50:29)
       at Request.callListeners (/Users/alex/codes/interos/jenkins-jobs/jobs/check-memory-ec2-instances/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
       at Request.emit (/Users/alex/codes/interos/jenkins-jobs/jobs/check-memory-ec2-instances/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
       at Request.emit (/Users/alex/codes/interos/jenkins-jobs/jobs/check-memory-ec2-instances/node_modules/aws-sdk/lib/request.js:683:14)
       at Request.transition (/Users/alex/codes/interos/jenkins-jobs/jobs/check-memory-ec2-instances/node_modules/aws-sdk/lib/request.js:22:10)
       at AcceptorStateMachine.runTo (/Users/alex/codes/interos/jenkins-jobs/jobs/check-memory-ec2-instances/node_modules/aws-sdk/lib/state_machine.js:14:12)
       at /Users/alex/codes/interos/jenkins-jobs/jobs/check-memory-ec2-instances/node_modules/aws-sdk/lib/state_machine.js:26:10
       at Request.<anonymous> (/Users/alex/codes/interos/jenkins-jobs/jobs/check-memory-ec2-instances/node_modules/aws-sdk/lib/request.js:38:9)
       at Request.<anonymous> (/Users/alex/codes/interos/jenkins-jobs/jobs/check-memory-ec2-instances/node_modules/aws-sdk/lib/request.js:685:12)
       at Request.callListeners (/Users/alex/codes/interos/jenkins-jobs/jobs/check-memory-ec2-instances/node_modules/aws-sdk/lib/sequential_executor.js:116:18)
     message: 'At least one of the parameters must be specified.',
     code: 'InvalidParameterCombination',
     time: 2019-07-08T19:41:41.191Z,
     requestId: '688a4ff3-a1b8-11e9-967e-431915ff0070',
     statusCode: 400,
     retryable: false,
     retryDelay: 7.89360948163893 },
  result: null }

1 Ответ

2 голосов
/ 09 июля 2019

Вы получаете эту ошибку, потому что вы не указываете какие-либо метрические данные. Вы только устанавливаете имя метрики и метку времени. Вам также необходимо отправить некоторые значения для метрики.

Допустим, ваше приложение измеряет задержку запросов, и вы наблюдали 5 запросов с задержками 100 мс, 500 мс, 200 мс, 200 мс и 400 мс. У вас есть несколько вариантов получения этих данных в CloudWatch (отсюда и ошибка At least one of the parameters must be specified.).

  1. Вы можете публиковать эти 5 значений по одному, установив Value в метрическом объекте данных. Это самый простой способ сделать это. CloudWatch выполняет всю агрегацию за вас, и вы получаете процентили по своим показателям. Я бы не рекомендовал такой подход, если вам нужно опубликовать много замечаний. Эта опция приведет к тому, что большинство запросов к CloudWatch будет выполнено, что может привести к большому счету или ограничению со стороны CloudWatch, если вы начнете публиковать слишком много наблюдений.

Например:

MetricData: [{
    MetricName:'first',
    Timestamp: new Date(),
    Value: 100
 }]
  1. Вы можете объединять данные самостоятельно, создавать и публиковать StatisticValues. Это сложнее с вашей стороны, но приводит к наименьшему количеству запросов к CloudWatch. Например, вы можете агрегировать за минуту и ​​выполнять 1 ставку на метрику каждую минуту. Это не даст вам процентили (поскольку вы собираете данные на своей стороне, CloudWatch не знает точных значений, которые вы наблюдали). Я бы порекомендовал это, если вам не нужны процентили.

Например:

MetricData: [{
    MetricName:'first',
    Timestamp: new Date(),
    StatisticValues: {
        Maximum: 500,
        Minimum: 100,
        SampleCount: 5,
        Sum: 1400
      }
 }]
  1. Вы можете сосчитать наблюдения и опубликовать Values и Counts. Это своего рода лучшее из обоих миров. С вашей стороны есть некоторая сложность, но подсчет, возможно, проще, чем агрегирование в StatisticValues. Вы по-прежнему отправляете каждое наблюдение, поэтому CloudWatch выполнит агрегацию за вас, и вы получите процентили. Формат также позволяет отправлять больше данных, чем в варианте 1. Я бы порекомендовал это, если вам нужны процентили.

Например:

MetricData: [{
    MetricName:'first',
    Timestamp: new Date(),
    Values: [100, 200, 400, 500],
    Counts: [1, 2, 1, 1]
 }]

Смотрите здесь для более подробной информации для каждого варианта: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CloudWatch.html#putMetricData-property

...