如何使用Elastic Search在文档datetime字段值距当前2天时获取告警
基于Elasticsearch Percolator实现工单到期前2天告警方案
1. 提前创建Percolate索引
首先保证Percolate索引的字段映射和业务工单索引完全对齐,核心需包含两个必填字段:
status:关键词类型,存储工单状态,未结工单统一取值为openexpected_close_time:日期类型,存储工单的预期关闭时间
示例创建索引DSL:
PUT /ticket-alert-percolate { "mappings": { "properties": { "query": { "type": "percolator" }, "status": { "type": "keyword" }, "expected_close_time": { "type": "date" } } } }
2. 注册到期告警匹配规则
往Percolate索引中插入告警触发规则,规则需同时满足两个条件:
- 工单状态为未结
- 预期关闭时间落在「当前时间+2天」的1天窗口期内,避免重复告警
示例规则写入DSL:
PUT /ticket-alert-percolate/_doc/2-day-close-alert { "query": { "bool": { "filter": [ { "term": { "status": "open" } }, { "range": { "expected_close_time": { "gte": "now+2d/d", "lte": "now+3d/d", "format": "strict_date_optional_time" } } } ] } } }
注意:range查询的时间范围要和业务工单的
expected_close_time时区保持一致,避免时区差导致的规则匹配偏差。
3. 全场景触发规则匹配
Percolate默认仅在文档更新时触发匹配,而到期时间随系统时间动态变化,需要两种场景覆盖所有未结工单:
- 工单新增/更新时实时触发:每次工单写入或更新到业务索引后,直接调用Percolate查询匹配规则,如果匹配到
2-day-close-alert规则就直接触发告警。
示例Percolate查询语句:GET /ticket-alert-percolate/_search { "query": { "percolate": { "field": "query", "document": { "status": "open", "expected_close_time": "2024-10-10T12:00:00Z" } } } } - 定时批量扫描触发:每天固定时间(比如凌晨1点)调用Percolate批量匹配全量未结工单,匹配到规则的工单统一触发告警,覆盖长时间没有更新的静态未结工单。
4. 重复告警优化
给工单索引新增alert_2d_sent布尔类型字段,默认值为false,匹配到规则后先判断该字段状态,发完告警后更新为true,避免同一个工单重复触发通知。
内容的提问来源于stack exchange,提问作者Pratyush Dhanuka
相关产品推荐
相关产品推荐

