
本文介绍如何在 datadog 中创建基于日志关键词的瞬时告警,避免默认的“告警+恢复”双通知机制,实现首次匹配日志即发送单次通知、后续不重复提醒的效果。
本文介绍如何在 datadog 中创建基于日志关键词的瞬时告警,避免默认的“告警+恢复”双通知机制,实现首次匹配日志即发送单次通知、后续不重复提醒的效果。
在 Datadog 中,日志监控默认以时间窗口(如过去 5 分钟、10 分钟)为单位执行查询,并在状态变化时触发两类通知:告警(Alert) 和 恢复(Recovered)。当你希望仅在某条关键日志(例如 "ERROR: failed to connect to database")首次出现时收到一条通知,而不希望系统在后续窗口未命中时再发一条“已恢复”的通知——这种“单次告警、无恢复反馈”的需求,无法通过调整时间范围解决,而需借助 Datadog 的条件化通知变量(Conditional Notification Variables)。
✅ 正确做法:禁用恢复通知,保留告警通知
Datadog 提供了内置的模板变量 {{#is_alert}}...{{/is_alert}},它仅在监控状态进入 ALERT 时渲染其内部内容;而 {{#is_recovery}}...{{/is_recovery}} 则仅在 RECOVERED 时生效。因此,你只需在通知消息体(如 Slack、Email 或 Webhook 模板)中仅包裹告警逻辑,即可彻底屏蔽恢复通知:
{{#is_alert}}
? [DATADOG ALERT] Log phrase detected!
• Monitor: {{monitor.name}}
• Log message: {{log.message}}
• Service: {{log.service}}
• Timestamp: {{log.timestamp}}
{{/is_alert}}
⚠️ 注意:此变量仅影响通知内容的渲染,不会改变监控本身的恢复逻辑。但只要通知模板中不包含 {{#is_recovery}} 块,就不会发送任何恢复消息。
? 配置步骤(简明版)
- 创建日志监控(Log Monitor),查询语句示例:
status:error "Connection timeout" | count() > 0
- 在 Notify your team 步骤中,点击右上角 Advanced options → Edit message template;
- 将默认消息全部替换为上述带 {{#is_alert}} 包裹的模板;
- 保存监控 —— 此后仅当查询首次匹配成功时发送通知,即使后续窗口未匹配,也不会触发额外通知。
? 补充说明
- 若使用 Webhook,确保请求体(如 JSON payload)中同样只在 {{#is_alert}} 内定义字段,避免因空值引发解析错误;
- 此方案不影响告警静默(Muting)、通知延时(Escalation delays)等其他策略;
- 如需完全禁用恢复状态(即让监控永不自动恢复),可将 Recovery threshold 设置为 Never(部分监控类型支持),但日志监控暂不提供该选项,因此条件变量是当前最可靠、官方推荐的实践。
通过合理运用条件变量,你既能保持监控的实时性与准确性,又能精准控制通知节奏,真正实现“发现即告警,告警即止”的运维响应目标。










