提取异常日志是个大难题
面对海量的日志 (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 的均值.
来源: https://yq.aliyun.com/articles/581594