【问题标题】:Terraform AWS Cloudwatch Metric Filter with Dimensions带维度的 Terraform AWS Cloudwatch 指标过滤器
【发布时间】:2023-02-15 20:52:27
【问题描述】:

我正在尝试配置 Terraforms 来为过滤器创建一个 Metric_filter 和一个 Metric_alarm。当触发警报时,它会通过 SNS 主题发送电子邮件。

我可以在不使用 Dimensions 的情况下通过手动配置 AWS 来让它工作。但是,一旦我在 metric_filter 上添加 Dimensions,它就不起作用了——无论是在 AWS 中手动还是在 terraforms 代码中。

我的理解是维度将为它指定的 json 中的每个变量创建一个单独的计数。这意味着如果由于 5 个不同的表中的错误而抛出 5 个日志,我应该为每个表收到一封单独的电子邮件。

例如,我可以通过过滤 metric_filter 模式“{$.LogTitle = MyDataLog }”来找到我的日志。

这与 json 中的 "LogTitle": "MyDataLog" 匹配。它成功地找到了日志。

我想要一个维度来为我在 API 中监控的每个表创建单独的电子邮件。 在日志消息中,TableName 可以更改。

这在尺寸部分不起作用:

dimensions = {
  TableName = "$.TableName"
}

或者手动在 AWS 控制台中:

在这两种情况下,都不会生成任何数据,就像它看不到日志或没有重新编码它们一样。如果我删除这一行然后一切正常,但它是所有表的通用计数,而不是每个表的单独计数。

任何帮助表示赞赏? 我需要使用 lambda 还是什么?

这是我的日志之一:

{
 "@t": "2022-09-07T03:54:45",
 "@mt": "{LogTitle} - Table {TableName} is out of date.",
 "@l": "Warning",
 "LogTitle": "MyDataLog",
 "TableName": "TableOne",
 "SourceContext": "MyApp.HomeController.Data.handler",
 "ActionId": "be41erg7-066y-4f8d-abc1-085drsgat4",
 "ActionName": "MyApp.HomeController.Data",
 "RequestId": "12tgfr54sfsrt",
 "RequestPath": "/myapi",
 "ConnectionId": "12tgfr54sfsrt",
 "User-Agent": [
    "Mozilla/5.0 blah"
 ],
 "Referer": [
    "https://mywebsite.com/myapp"
 ],
 "RequestPort": 12345,
 "RequestIpAddress": "blah",
 "User": "myemail@email.com",
 "ThreadId": 123,
 "ApplicationName": "My App"
}

这是我的 terraform metric_filter:

resource "aws_cloudwatch_log_metric_filter" "this" {
  name           = "TableErrorLog"
  pattern        = "{$.LogTitle = MyDataLog }"
  log_group_name = aws_cloudwatch_log_group.this.name

  metric_transformation {
    name      = "TableErrorLog"
    namespace = var.app
    value     = "1"
    dimensions = {
      TableName = "$.TableName"
    }
  }
}

这是我的 metric_alarm。 SNS 主题创建良好且有效。我只是将其中的一些隐藏在一个变量文件中:

    resource "aws_cloudwatch_metric_alarm" "table_error_log_alarm" {
  alarm_name                = "TableErrorLogAlam"
  comparison_operator       = "GreaterThanOrEqualToThreshold"
  evaluation_periods        = "1"
  metric_name               = "EventCount"
  namespace                 = var.app
  period                    = "43200"
  statistic                 = "Sum"
  threshold                 = "1"
  datapoints_to_alarm       = "1"
  dimensions = {
      TableName = "$.TableName"
    }
  alarm_description         = "This metric monitors Table Error Logs"
  alarm_actions             = ["${module.sns.topic_arn}"]
}

因此,我正在寻找一个可行的解决方案,让过滤器触发警报,并让该警报的维度成为日志错误指定的单个 TableName。不确定我做的尺寸是否正确......我是否需要将 lambda 作为尺寸或其他东西?

【问题讨论】:

    标签: amazon-web-services terraform amazon-cloudwatch terraform-provider-aws cloudwatch-alarms


    【解决方案1】:

    不确定,但它应该在维度对象中没有点的情况下工作

    dimensions = { TableName = "$TableName" }
    

    至少,它适用于我测试过的模式过滤器:

    样本事件数据:

    [Worker-0b042c8366d822852] [2023-02-14 18:22:04,401] 错误 [debezium-connector|task-0] WorkerSourceTask{id=debezium-connector-0} 任务引发了未捕获且不可恢复的异常。任务正在被杀死并且在手动重新启动之前不会恢复(org.apache.kafka.connect.runtime.WorkerTask:191)

    图案:

    pattern = "[worker, timestamp, status, connector, message = "*Task threw an uncaught and unrecoverable exception*"]"
    

    方面:

    dimensions = {
        "Consumer Group" = "$connector"
    }
    

    希望这对您的挖掘有所帮助;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      相关资源
      最近更新 更多