我有一个在 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。
IncomingLogEvents
指标。就我而言,它是/aws/lambda/test-log-silence
参考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,
});
这应该也能解决忽略缺失数据的问题。
就我而言,我需要使用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',
});
我设置了一个 CloudWatch 警报,当 5 分钟内特定日志组中没有新日志条目时触发。尽管在 4 小时内观察到日志组中没有新的日志条目,警报状态仍保持“正常”而不是触发警报。我遵循了相同的操作,但从未被触发,任何帮助将不胜感激