SQL老司机:流量骤增骤减,可以这样设置告警

  • SQL老司机:流量骤增骤减,可以这样设置告警已关闭评论
  • 7 views
  • A+
所属分类:MySQL

摘要: 面向用户的在线产品,例如游戏行业,需要实时的关注流量情况,如果流量突然降低,那么我们得立刻检查,是否是宕机了,或者进程异常,避免影响用户体验。那么怎么设置这样的告警呢?接下来通过日志服务来介绍。 完整的报警语句 先贴个完整的告警语句: * | select time,pvPerSec, lastPvPerSec, diff,diff >1.

面向用户的在线产品,例如游戏行业,需要实时的关注流量情况,如果流量突然降低,那么我们得立刻检查,是否是宕机了,或者进程异常,避免影响用户体验。那么怎么设置这样的告警呢?接下来通过日志服务来介绍。

完整的报警语句

先贴个完整的告警语句:

* |  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  ) 
             )
   )

查询结果:

SQL老司机:流量骤增骤减,可以这样设置告警

整个告警,为了逻辑清晰,用了四层嵌套查询,下边逐步拆解:

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

SQL老司机:流量骤增骤减,可以这样设置告警

在查询中,之所以要除以(max(__time__) - min(__time__),是为了保持每个窗口内的单位是一致的,因为我们在查询时,可能最后一个窗口,和第一个窗口,不是一个完整的5分钟。看一个样例:

SQL老司机:流量骤增骤减,可以这样设置告警

从样例中可以看到,最后一个区间和其他差别非常大,完全没法比较。所以要除以区间内的时间范围,保持单位一致,都是每秒钟的请求数。

2. 利用窗口函数,把前一个区间的值,和当前区间的值,放到同一行

select  time , pvPerSec , lag(pvPerSec,1,pvPerSec) over() as lastPvPerSec

lag() over() 表示获取前边第N行的值。lag(pvPerSec,1,pvPerSec)表示,获取pvPerSec这一列,前一行的值,如果前一行不存在,则那当前行作为结果。看个查询结果:

SQL老司机:流量骤增骤减,可以这样设置告警

可以看到,lastPvPerSec是拿pvPerSec前一行的结果。

3. 求两个相邻窗口的比例

 select time,pvPerSec, lastPvPerSec, pvPerSec*1.0/lastPvPerSec as diff

在求比例时,必须先乘以1.0,转化成整数。结果样例:

SQL老司机:流量骤增骤减,可以这样设置告警

4. 判断是否满足报警条件

 select time,pvPerSec, lastPvPerSec, diff,diff >1.2 or diff < 0.8

通过判断diff >1.2 or diff < 0.8 ,表示增加20%,或降低20%时,触发报警。 结果展示:

SQL老司机:流量骤增骤减,可以这样设置告警

如果最后一列是true,则触发报警,可以在报警设置中,判断_col4 =true是触发短信报警。

  • 我的微信
  • 微信扫一扫
  • weinxin
  • 微信公众号
  • 微信公众号扫一扫
  • weinxin
avatar