如何设置Elasticsearch告警规则仅在指定时段生效?
实现Elasticsearch告警规则仅在指定时段触发的方法
你使用Elasticsearch的「Rules and connectors」功能时,遇到规则仅支持全天启用/禁用,但需要让告警仅在白天(如8:00-17:00)触发的需求,当前的脚本查询过滤@timestamp小时段后,夜间仍会触发告警,问题根源需要结合你的规则类型分析:
当前查询代码
{ "query" : { "bool":{ "must":[ {"match":{"fields.Operation":"EndPaymentActivity"}}, {"match":{"level":"Information"}} ], "filter": [ { "script": { "script": { "source": "doc['@timestamp'].value.hourOfDay >= params.startHour && doc['@timestamp'].value.hourOfDay <= params.endHour", "params": { "startHour": 7, "endHour": 9 } } } } ] } } }
问题分析
如果夜间仍触发告警,大概率你的规则是监控「缺失匹配文档」(比如预期白天有支付操作,未出现则告警)。此时仅靠查询过滤时段无效:因为规则全天运行,夜间查询返回0条匹配结果时,会触发缺失告警。
解决方案
方案1:调整查询逻辑,夜间返回占位结果(适配缺失告警场景)
修改查询,让夜间时段强制返回至少1条结果,避免规则判定为“缺失”:
{ "query": { "bool": { "should": [ // 白天的正常监控条件:匹配支付操作且在目标时段内 { "bool": { "must": [ {"match": {"fields.Operation": "EndPaymentActivity"}}, {"match": {"level": "Information"}} ], "filter": [ { "script": { "script": { // 注意:若需指定时区,替换为带时区转换的脚本(示例为东八区) "source": "ZonedDateTime.ofInstant(doc['@timestamp'].value.toInstant(), ZoneId.of('Asia/Shanghai')).getHour() >= params.startHour && ZonedDateTime.ofInstant(doc['@timestamp'].value.toInstant(), ZoneId.of('Asia/Shanghai')).getHour() <= params.endHour", "params": { "startHour": 8, "endHour": 17 } } } } ] } }, // 夜间时段:匹配任意文档,确保查询有结果,避免缺失告警 { "bool": { "filter": [ { "script": { "script": { "source": "ZonedDateTime.ofInstant(doc['@timestamp'].value.toInstant(), ZoneId.of('Asia/Shanghai')).getHour() < params.startHour || ZonedDateTime.ofInstant(doc['@timestamp'].value.toInstant(), ZoneId.of('Asia/Shanghai')).getHour() > params.endHour", "params": { "startHour": 8, "endHour": 17 } } } }, {"match_all": {}} ] } } ], "minimum_should_match": 1 } } }
方案2:调整规则触发条件(适配存在匹配文档时告警的场景)
如果你的规则是监控「存在匹配文档时告警」(比如异常支付操作),只需确保规则的触发条件设置为**「匹配文档数 > 0」**,当前的时段过滤查询即可生效:夜间无符合时段的支付操作文档,规则不会触发。
方案3:利用Cron调度(若版本支持)
若你的Elasticsearch版本允许为规则设置Cron调度(而非仅全天运行),直接配置规则仅在目标时段执行,比如Cron表达式0 * 8-17 * * ?(每天8:00-17:00,每小时执行一次),从根源避免夜间触发。
内容的提问来源于stack exchange,提问作者Irmantas Karkauskas
相关产品推荐
相关产品推荐

