ElastAlert frequency规则配置后未命中任何匹配数据如何解决
ElastAlert frequency规则无法命中问题排查方案
核心问题排查项
- 过滤器语法&查询逻辑错误
现有配置里的filter存在2个问题:一是"是HTML转义字符,不能直接在YAML配置里当引号使用,末尾的~~属于无效冗余字符;二是term是精确匹配查询,如果你的ES中name字段是text类型,写入数据时会被分词,term查询无法匹配分词后的text字段,需要换成match查询,或者指定name的keyword子字段做精确匹配。 - 时间字段不匹配
ElastAlert默认用@timestamp字段做时间范围过滤,如果你的测试数据里的时间字段不是@timestamp,需要在规则中新增timestamp_field配置指定你实际使用的时间字段名,否则会因为找不到时间字段过滤不到数据。 - 数据时间不在查询范围内
你配置的timeframe是1小时,ElastAlert只会查询当前时间往前推1小时内的符合条件的数据,确认你写入的测试数据的时间戳在这个范围内,太旧的测试数据不会被命中。 - 索引名配置不符
确认你ES中实际存储数据的索引名完全等于test,注意大小写、前后空格等问题,如果索引是按日期分割的,要改成对应的通配符格式比如test-*。
修正后的规则参考
# Elasticsearch host es_host: localhost # Elasticsearch port es_port: 9200 # 规则名称,全局唯一 name: Example frequency rule # 规则类型 type: frequency # 查询的索引名 index: test # 触发告警的事件数量 num_events: 1 # 统计时间窗口 timeframe: hours: 1 # 若你的数据时间字段不是@timestamp,取消注释下面一行并替换为实际字段名 # timestamp_field: create_time # 查询过滤器 # 方案1:如果需要模糊匹配name包含aamir的文档 filter: - match: name: "aamir" # 方案2:如果需要精确匹配name等于aamir的文档,且name字段有keyword子字段 # - term: # name.keyword: "aamir" # 后续告警相关配置此处省略
验证方法
你可以先在Kibana的Dev Tools里执行你规则对应的DSL查询,确认能查到测试数据后再放到ElastAlert规则里,避免因为查询逻辑错误导致匹配失败。
内容的提问来源于stack exchange,提问作者Aamir Sheraz
相关产品推荐
相关产品推荐

