Cloudwatch 指标过滤器看到事件,但没有触发警报

Posted

技术标签:

【中文标题】Cloudwatch 指标过滤器看到事件,但没有触发警报【英文标题】:Cloudwatch metric filter sees event, but alarm doesn't fire 【发布时间】:2021-10-22 01:42:48 【问题描述】:

我已设置 Cloudwatch Metric 来监视日志文件:


resource "aws_cloudwatch_log_metric_filter" "log_errors" 
  name = "$local.fullname-log-errors"
  log_group_name = "/aws/lambda/$local.fullname"
  pattern = " $._logLevel = \"error\" "
  metric_transformation 
    name = "$local.fullname-error-count"
    namespace = "MyApp"
    value     = "1"
  

我可以看到该指标正在运行 - 请注意下面 13:15 的点(我手动创建了一个日志条目进行测试):

如果指标在一分钟内报告 1 个或多个事件,则会触发警报:


resource "aws_cloudwatch_metric_alarm" "log_errors_alarm" 
  alarm_name        = "$local.fullname-log-errors"
  alarm_description = "log.error() count for MyApp lambda $local.fullname"
  metric_name         = "$local.fullname-error-count"
  threshold           = "0"
  statistic           = "Sum"
  unit                = "Count"
  comparison_operator = "GreaterThanThreshold"
  datapoints_to_alarm = "1"
  evaluation_periods  = "1"
  period    = "60"
  namespace = "MyApp"
  treat_missing_data = "notBreaching"
  alarm_actions      = [data.aws_ssm_parameter.sns_topic_arn.value]
  ok_actions         = [data.aws_ssm_parameter.sns_topic_arn.value]

但尽管指标有一个事件(如上所述),但警报永远不会触发:

我不确定如何调试它,因为所有 AWS 资源都已成功创建,我手动创建的错误将传递给指标,并且我在其他 lambdas 中成功使用了非常相似的警报配置,它会抛出警报。

为什么我的指标有效但我的警报没有警报?

【问题讨论】:

【参考方案1】:

我会把钱放在 metric_alarmmetric_filter 之间不一致的单元上。

您将metric_alarm 上的unit 设置为Count,但您没有在metric_filtermetric_transformation 上设置unit,因此metric_transformation 将默认到None

尝试将警报中的unit 设置为None 或完全删除unit

【讨论】:

谢谢@Dejan,这正是问题的原因——删除unit(所以值是一致的)会使警报触发。抱歉等待 - 我正在度假,无法测试它。我已经稍微编辑了您的答案以使其更清楚,希望没问题。【参考方案2】:

我有一些非常相似的设置正在运行并且会尝试这个。更新:仔细观察,我相信你应该使用comparison_operator = "GreaterThanOrEqualToThreshold" 而不是comparison_operator = "GreaterThanThreshold"

metric_transformation 
    name = "$local.fullname-error-count"
    namespace = "MyApp"
    value     = "1"
    default_value = "0"
  

resource "aws_cloudwatch_metric_alarm" "log_errors_alarm" 
  alarm_name        = "$local.fullname-log-errors"
  alarm_description = "log.error() count for MyApp lambda $local.fullname"
  metric_name         = "$local.fullname-error-count"
  threshold           = "1"
  statistic           = "Sum"
  #unit                = "Count"
  comparison_operator = "GreaterThanOrEqualToThreshold"
  #datapoints_to_alarm = "1"
  evaluation_periods  = "1"
  period    = "60"
  namespace = "MyApp"
  treat_missing_data = "notBreaching"
  alarm_actions      = [data.aws_ssm_parameter.sns_topic_arn.value]
  ok_actions         = [data.aws_ssm_parameter.sns_topic_arn.value]

unitdatapoint_to_alarm 都是可选参数。尝试排除那些。我假设cloudwatch_log_metric_filteraws_cloudwatch_metric_alarm 两种资源都使用相同的局部变量。由于您没有发布所有 cloudwatch_log_metric_filter 参数,我想您的 pattern = "" 应该是这样的。

【讨论】:

但是threshold 在我的配置中是0 - GreaterThanThreshold 应该意味着任何高于 0 的值都会触发警报。 有效点。在这种情况下尝试将阈值设置为 1,仅用于比较目的(如果有的话)。我在示例中更新了阈值以正确反映这一点。

以上是关于Cloudwatch 指标过滤器看到事件,但没有触发警报的主要内容,如果未能解决你的问题,请参考以下文章

json cloudwatch记录指标过滤器

AWS CloudWatch 中的指标、日志和事件之间有啥区别? [关闭]

用于检查 JSON 密钥的 CloudWatch 指标筛选器是不是存在

如何将 AWS Cloudwatch 资源指标数据点保存在其他数据库中

在 CloudWatch 仪表板中查看 CloudFront 指标

如何禁用AWS Cloudwatch指标