AWS Cloudwatch在一段时间内没有日志时,如何发出警报?

时间:2020-09-18 14:31:23

标签: java amazon-web-services amazon-ecs amazon-cloudwatchlogs cloudwatch-alarms

我有一个在AWS Elastic Container Service中运行的Java应用程序。应用程序定期轮询队列。有时,队列没有响应,并且应用程序永远挂起。 我已经用try-catch块将这些方法包含在日志记录异常中了。即使之后,Cloudwatch中也没有日志。没有例外或错误。 有没有一种方法可以识别这种情况。 ? (在Cloudwatch中没有日志)。就像过滤错误日志模式一样。 因此,我可以重新启动服务。任何技巧或解决方案将不胜感激。

public void handleProcess() {
    try {
        while(true) {
            Response response = QueueUitils.pollQueue(); // poll the queue
            QueueUitils.processMessage(response);
            TimeUnit.SECONDS.sleep(WAIT_TIME); // WAIT_TIME = 20
        }
    } catch (Exception e) {
        LOGGER.error("Data Queue operation failed" + e.getMessage());
        throw e;
    }
}

2 个答案:

答案 0 :(得分:2)

您可以使用CloudWatch Alarms执行此操作。我为此设置了一个测试Lambda函数,该函数每分钟运行一次并登录到CloudWatch。

  1. 转到CloudWatch并单击左侧菜单中的警报
  2. 点击橙色的创建警报按钮 Create Alarm
  3. 点击选择指标 Select Metric
  4. 然后选择 Logs ,然后选择 Log Group Metrics ,然后为相关日志组(应用程序要记录到的日志组)选择IncomingLogEvents度量标准。就我而言,它是/aws/lambda/test-log-silence Select Log Group Metric
  5. 点击选择指标
  6. 现在,您可以指定度量的度量方式。我选择了5分钟内的平均日志条目,因此5分钟后如果没有日志条目,则该值为零。 Specify Metric Measurements
  7. 向下滚动,并将检查设置为“小于或等于”零。 5分钟内没有日志条目(或您决定将其设置为任何值)时,将触发警报。 Specify Conditions
  8. 现在单击下一步,您可以指定将通知推送到的SNS主题。您可以设置一个SNS主题,以通过电子邮件,SMS,AWS Lambda等通知您。

答案 1 :(得分:2)

参考 brads3290 的回答,如果您使用的是 AWS CDK:

import * as cloudwatch from '@aws-cdk/aws-cloudwatch'; 
// ...
const metric = new cloudwatch.Metric({
      namespace: 'AWS/Logs',
      metricName: 'IncomingLogEvents',
      dimensions: { LogGroupName: '/aws/lambda/test-log-silence' },
      statistic: "Average",
      period: cdk.Duration.minutes(5),
    });

const alarm = new cloudwatch.Alarm(this, 'Alarm', {
      metric,
      threshold: 0,
      comparisonOperator: cloudwatch.ComparisonOperator.LESS_THAN_OR_EQUAL_TO_THRESHOLD,
      evaluationPeriods: 1,
      datapointsToAlarm: 1,
      treatMissingData: cloudwatch.TreatMissingData.BREACHING,
    });

这也应该可以解决忽略缺失数据的问题。