AWS Cloudwatch 在一段时间内没有日志时如何获取警报?

问题描述 投票:0回答:4

我有一个在 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;
    }
}
java amazon-web-services amazon-ecs amazon-cloudwatchlogs cloudwatch-alarms
4个回答
10
投票

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

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

5
投票

参考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,
    });

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


0
投票

就我而言,我需要使用DimensionsMap{}而不仅仅是尺寸:{}

const metric = new cloudwatch.Metric({
  namespace: 'AWS/Logs',
  metricName: 'IncomingLogEvents',
  dimensionsMap: {
    "LogGroupName": "logGroupNamehere.."
  },
  statistic: "Sum",
  period: cdk.Duration.days(1),
});

闹钟看起来像:

new cloudwatch.Alarm(this, 'no-incoming-logs-alarm', {
  metric,
  alarmName: `incoming-logs-alarm-${props?.stage}`,
  threshold: 1,
  comparisonOperator: cloudwatch.ComparisonOperator.LESS_THAN_THRESHOLD,
  evaluationPeriods: 1,
  datapointsToAlarm: 1,
  treatMissingData: cloudwatch.TreatMissingData.MISSING,
  alarmDescription: 'Some meaningful description',
});

0
投票

我设置了一个 CloudWatch 警报,当 5 分钟内特定日志组中没有新日志条目时触发。尽管在 4 小时内观察到日志组中没有新的日志条目,警报状态仍保持“正常”而不是触发警报。我遵循了相同的操作,但从未被触发,任何帮助将不胜感激

© www.soinside.com 2019 - 2024. All rights reserved.