一、问题描述
在最近工作过程中本人遇到客户反馈一个问题:在某SOC平台关联分析规则新建的规则语句能查询到相关日志,但无法触发规则告警。
规则语句大致为:
数据源 = "IPS" and not 目的地址 belong 白名单
客户需求是对于IPS告警日志里目的地址不为白名单(即便目的地址为空)的日志产生规则告警,大致一看没有问题,但是深入分析发现这涉及到了一个Esper引擎底层的逻辑问题。
下面先来介绍一下所使用的Esper引擎:
Esper简介
Esper是一个高性能的复杂事件处理(CEP)和事件流处理(ESP)引擎,它允许用户从广泛的数据源实时处理和分析高频率的事件流。Esper使用一种声明式的查询语言,非常类似于SQL,但针对实时数据流进行了优化。这使得Esper成为在金融服务、网络监控、智能传感器分析、电信以及其他需要快速、实时数据分析的领域的一个理想选择。
Esper的优点
实时性:Esper能够在事件发生的同时进行处理和分析,支持低延迟的实时数据处理需求。
高性能:针对处理大量并发事件流进行了优化,能够支持高吞吐量的事件处理。
灵活性:提供了类SQL的Esper查询语言(EQL),让用户能以声明式的方式定义复杂的事件模式和规则。
可扩展性:能够处理从数十到数百万事件/秒的数据流,适用于不同规模的应用场景。
易于集成:提供了对多种编程语言(如Java、.NET)的支持,可以轻松地集成到现有的应用程序中。
Esper的缺点
学习曲线:尽管EQL类似于SQL,但要充分利用Esper的高级特性,用户仍需花时间学习其语法和概念。
资源消耗:对于非常大的数据集或极其复杂的事件处理逻辑,Esper可能会消耗大量内存和CPU资源。
调试和维护:复杂事件处理逻辑可能使得调试和维护变得困难,尤其是在没有足够日志和监控工具的情况下。
二、问题分析
经过深入分析发现,规则未告警问题在于Esper对于空值的处理上。观察日志发现,日志中的目的地址均为空值,而规则语句里并未考虑到空值的影响,导致无法实现对预期日志产生告警。
逻辑分析
首先看下Esper底层逻辑图
规则语句:
数据源 = "IPS" and not 目的地址 belong 白名单
客户预期只要目的地址不为白名单就产生告警,空值显然不包含在白名单里,所以也要产生告警
1.当目的地址存在时:
前面为ture,后面为ture 或者false,可以正常产生告警
2.当目的地址不存在时:
前面为ture是没有问题的,但后面由于目的地址为空,在Esper里是unknown,此时语句变成了
ture and not unknown
也就是
ture and unknown
此时结果是unknown,也就不会产生告警。
结论
通过对此事件进行引申发现,凡是在Esper引擎中使用否定逻辑如not belong 、!= 等都要考虑空值所带来的影响,需要根据实际需求来增加字段值不存在的判定来满足对空值也产生告警的需求。
三、解决方案
后续通过优化规则为:
数据源 = "IPS" and ( not 目的地址 belong 白名单 or 目的地址 not_exist)
满足客户对于目的地址为空产生告警的需求。
参考链接
https://blog.csdn.net/rlnLo2pNEfx9c/article/details/137190513
http://www.espertech.com/