为了有效的分析 JavaScript 异常,我们从宏观的统计数据中做了大量的分析,初步结果如下:
全站每日异常统计
首先我们从每天的全站总体数据进行分析,得到下面这些报表。其中:
- all_pv: 全站所有有效异常次数 (PV)
- all_uv: 全站所有有效异常人数 (UV)
- all_pv_rate: 全站所有异常率 (按 PV 统计)
- all_uv_rate: 全站所有异常率 (按 UV 统计)
- valid_rate_pv: 有效异常率(按 PV 统计)
- valid_rate_uv: 有效异常率(按 UV 统计)
从趋势图中我们可以明显的看到第 2天和最后一天,异常 PV 有较大波动,这是由于用户 攻击爆发大量异常造成的。
我们在 异常评分算法 的讨论中有提到,即使是少量用户进行攻击,异常 UV 也不应该有波动的(除非页面 UV 本身有较大波动),但是实际上我们看到最后一天的异常 UV 也有明显波动,因此粗略 分析这个异常 PV 的上升是由于页面访问人数增多造成的。
事后我们查了当天的页面访问 PV 和 UV,可惜并没有明显波动。
实际经过细致的异常日志分析,我们看到攻击用户同时没过一段时间就更换 IP 地址或清理 Cookie,因此全天的综合数据中异常 PV 和异常 UV 有了一些明显波动。
而且实际上,每天都有攻击造成的异常波动。
- 每天都有攻击造成的异常,累加在一起好像每天都没什么问题。
- 由于攻击造成异常总数相对一天的异常总数太小,从全天异常总数的层面来看, 无法发现,甚至排除攻击造成的异常。
- T+1 的统计数据,对于异常监控来说,太迟钝了。
全站每分钟异常统计
从上面每日异常总和的分析我们可以看出,一天的总和数据能发现的问题还是比较有限的。 于是我从分钟的粒度来统计异常。
图有点大,点击可以看大图。
从图中我们可以看到,凌晨 2点多到 3点多期间,有少量用户发起了猛烈的攻击; 凌晨 4点多到凌晨7点多期间也有少量温和的攻击。攻击时全站异常 PV (绿色) 和全站有效异常(深红色)明显飙升,但是异常 UV 和有效异常 UV 都没有太大波动, 而且与前后的时间切片有较好的连贯性,没有大起大落。
而如果异常 UV 出现较大波动,在很可能是由于我们正在发布的新代码影响大面积用户。
合适的时间粒度对于及时发现真正有效的异常有非常重要的意义。