在Terraform中编写Datadog日志告警时如何实现除法运算?
解决Datadog日志错误百分比监控的Terraform语法问题
错误原因
你当前使用log alert类型,但直接对两个logs()查询做除法的语法只适用于Metric Alert。Log Alert的查询语法不支持这种直接的算术运算组合,因此返回invalid operator specified错误。
解决方案
方案1:改用Metric Alert(推荐)
利用Datadog自动生成的logs.count指标,这类指标会自动统计日志数量,支持直接做除法运算,和你之前熟悉的指标告警写法一致:
resource "datadog_monitor" "log_errors_percentage" { count = local.logged_errors_threshold.critical > 0 ? 1 : 0 name = "[${module.label.id}] ${length(var.description) > 0 ? var.description : "Log Errors Percentage"}" type = "metric alert" # 计算错误日志占比(乘以100转为百分比) query = "100 * (sum(last_${var.period}:logs.count{service:api-member,status:error} by {service}) / sum(last_${var.period}:logs.count{service:api-member} by {service})) > ${local.logged_errors_threshold.critical}" monitor_thresholds { ok = local.logged_errors_threshold.ok warning = local.logged_errors_threshold.warning critical = local.logged_errors_threshold.critical } }
注意:确保var.period的格式符合Datadog指标查询要求(如1m、5m、1h),否则last_${var.period}会失效。
方案2:使用Log Alert的公式查询语法
如果坚持使用log alert类型,需要通过定义查询变量+公式计算的方式实现,这是Log Alert支持的计算语法:
resource "datadog_monitor" "log_errors_count" { count = local.logged_errors_threshold.critical > 0 ? 1 : 0 name = "[${module.label.id}] ${length(var.description) > 0 ? var.description : "Log Errors Percentage"}" type = "log alert" query = <<EOT A = logs("service:api-member status:error").index("*").rollup("count").by("service").last("${var.period}") B = logs("service:api-member").index("*").rollup("count").by("service").last("${var.period}") formula(100 * (A / B)) > ${local.logged_errors_threshold.critical} EOT monitor_thresholds { ok = local.logged_errors_threshold.ok warning = local.logged_errors_threshold.warning critical = local.logged_errors_threshold.critical } }
这种写法先定义两个日志查询变量A(错误日志数)和B(总日志数),再通过formula()函数完成百分比计算和阈值判断,符合Log Alert的语法规范。
内容的提问来源于stack exchange,提问作者Makom123
相关产品推荐
相关产品推荐

