AWS Cloudwatch 一段时间内没有日志,如何报警?
How to get an alarm when there are no logs for a time period in AWS Cloudwatch?
我有一个在 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;
}
}
您可以使用 CloudWatch 警报执行此操作。我为此设置了一个测试 Lambda 函数,它每分钟运行一次并记录到 CloudWatch。
- 转到 CloudWatch 并单击左侧菜单中的警报
- 单击橙色 创建警报 按钮
- 单击 Select 指标
- 然后选择 Logs,然后选择 Log Group Metrics 并为相关日志组选择
IncomingLogEvents
指标(日志您的应用程序记录到的组)。在我的例子中是 /aws/lambda/test-log-silence
- 单击 Select 指标
- 现在您可以指定衡量指标的方式。我选择了超过 5 分钟的平均日志条目,所以 5 分钟后如果没有日志条目,该值将为零。
- 向下滚动,将检查设置为“小于或等于”零。当 5 分钟(或您决定将其设置为任何时间)没有日志条目时,这将触发警报。
- 现在点击下一步,您可以指定一个 SNS 主题来推送通知。您可以设置 SNS 主题以通过电子邮件、短信、AWS Lambda 和其他方式通知您。
参考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,
});
这应该也解决了忽略缺失数据的问题。
我有一个在 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;
}
}
您可以使用 CloudWatch 警报执行此操作。我为此设置了一个测试 Lambda 函数,它每分钟运行一次并记录到 CloudWatch。
- 转到 CloudWatch 并单击左侧菜单中的警报
- 单击橙色 创建警报 按钮
- 单击 Select 指标
- 然后选择 Logs,然后选择 Log Group Metrics 并为相关日志组选择
IncomingLogEvents
指标(日志您的应用程序记录到的组)。在我的例子中是/aws/lambda/test-log-silence
- 单击 Select 指标
- 现在您可以指定衡量指标的方式。我选择了超过 5 分钟的平均日志条目,所以 5 分钟后如果没有日志条目,该值将为零。
- 向下滚动,将检查设置为“小于或等于”零。当 5 分钟(或您决定将其设置为任何时间)没有日志条目时,这将触发警报。
- 现在点击下一步,您可以指定一个 SNS 主题来推送通知。您可以设置 SNS 主题以通过电子邮件、短信、AWS Lambda 和其他方式通知您。
参考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,
});
这应该也解决了忽略缺失数据的问题。