提取异常日志是个大难题
面对海量的日志(TB乃至PB级别),如何从日志中挖掘出异常信息对于大部分的开发者而言是一个大难题。例如,判断机器的延时是否正常,部分request是否正常。通常,我们对于异常的数据,要及时的报警,以尽快的处理。
通常我们是怎么搞得呢? 在以前,依赖于开发者的经验,来根据某些特定的特征,判断是否达到了阈值,例如根据延时是否达到了某个特定的值,或者http 响应码5xx的比例达到了某个阈值。这个阈值,依赖于资深的开发者的丰富的经验。
AI dev/ops
AI算法的迅猛发展,给异常日志挖掘提供了新的方向。大名鼎鼎的AI领域专家吴恩达(Andrew NG),在他所教授的Machine Learning课程中提供了一种Abnormal Detection算法。算法通过训练数据集,获得一个正态分布。然后检测目标数据是否落在了正态分布的边缘位置,如果落在了边缘位置,则认为是一个异常数据。
算法步骤:
- 确定要训练的feature,可以是单个指标,比如latency,也可以是复合指标,例如CPU/NetFlow
- 在训练数据集上,求得均值μ和方差σ^2
- 对新数据求方程P(x)=
接下来,我们介绍如何在SQL中使用该算法来检测异常。
日志服务提供的异常检测算法
以延时为例,我们来看哪些延时是异常的。 延时的分布一般是这样的:
不满足正太的需求,要把上述图形转化成正太分布,对latency 求对数:log(latency)
- 值μ和方差σ^2:
* | select numeric_histogram(10,latency), stddev_pop(ln(latency)) as stddev,var_pop(ln(latency)) as variance ,avg(ln(latency)) as avg_ln, avg(latency) as avglatency
stddev即标准差
variance即方差
avg_ln即ln(latency)的均值
avglatency即latency的均值
- 提取异常数据
| select latency where pow(e(), - pow((ln(latency) - 8.223) ,2)/2/0.3975) /sqrt(2*pi()) / 0.53 < 0.01 order by latency desc
把方差标准差和均值带入公式,使用where筛选出来小于0.01的结果,即异常值。可以看到,获得的结果,明显大于军latency的均值。