面向用户的在线产品,例如游戏行业,需要实时的关注流量情况,如果流量突然降低,那么我们得立刻检查,是否是宕机了,或者进程异常,避免影响用户体验。那么怎么设置这样的告警呢?接下来通过日志服务来介绍。
完整的报警语句
先贴个完整的告警语句:
* | select time,pvPerSec, lastPvPerSec, diff,diff >1.2 or diff < 0.8 from(
select time,pvPerSec, lastPvPerSec, pvPerSec*1.0/lastPvPerSec as diff from(
select time , pvPerSec , lag(pvPerSec,1,pvPerSec) over() as lastPvPerSec from(
select count( )/(max(__time__) - min(__time__)) as pvPerSec , from_unixtime(__time__ - __time__ % 300) as time from log group by time order by time limit 10000 )
)
)
查询结果:
整个告警,为了逻辑清晰,用了四层嵌套查询,下边逐步拆解:
1. 获取每5分钟的平均流量
select count( )/(max(__time__) - min(__time__)) as pvPerSec , from_unixtime(__time__ - __time__ % 300) as time from log group by time order by time limit 10000
在查询中,之所以要除以(max(__time__) - min(__time__)
,是为了保持每个窗口内的单位是一致的,因为我们在查询时,可能最后一个窗口,和第一个窗口,不是一个完整的5分钟。看一个样例:
从样例中可以看到,最后一个区间和其他差别非常大,完全没法比较。所以要除以区间内的时间范围,保持单位一致,都是每秒钟的请求数。
2. 利用窗口函数,把前一个区间的值,和当前区间的值,放到同一行
select time , pvPerSec , lag(pvPerSec,1,pvPerSec) over() as lastPvPerSec
lag() over() 表示获取前边第N行的值。lag(pvPerSec,1,pvPerSec)表示,获取pvPerSec这一列,前一行的值,如果前一行不存在,则那当前行作为结果。看个查询结果:
可以看到,lastPvPerSec是拿pvPerSec前一行的结果。
3. 求两个相邻窗口的比例
select time,pvPerSec, lastPvPerSec, pvPerSec*1.0/lastPvPerSec as diff
在求比例时,必须先乘以1.0,转化成整数。结果样例:
4. 判断是否满足报警条件
select time,pvPerSec, lastPvPerSec, diff,diff >1.2 or diff < 0.8
通过判断diff >1.2 or diff < 0.8 ,表示增加20%,或降低20%时,触发报警。 结果展示:
如果最后一列是true,则触发报警,可以在报警设置中,判断_col4 =true是触发短信报警。