使用 AWS-SDK 将数据发送到 CloudWatch

Sending data to CloudWatch using the AWS-SDK

我想使用 AWS-SDK(或任何可行的方法)将数据写入 CloudWatch。

我看到了这个:

唯一看起来像是将数据发布到 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 }

您收到此错误是因为您没有指定任何指标数据。您只设置指标名称和时间戳。您还需要为指标发送一些值。

假设您的应用程序正在测量请求的延迟,您观察到 5 个请求,延迟分别为 100 毫秒、500 毫秒、200 毫秒、200 毫秒和 400 毫秒。将此数据导入 CloudWatch 的选项很少(因此出现 At least one of the parameters must be specified. 错误)。

  1. 您可以通过在指标数据对象中设置 Value 一次发布这 5 个值。这是最简单的方法。 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. 您可以计算观察结果并发布 ValuesCounts。这有点两全其美。您这边有些复杂,但可以说计数比汇总到 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