在influxdb上使用HOLT_WINTERS 对数据流量趋势进行预测和预警

需求:针对数据流量异常进行预警,常规的阈值、心跳很难满足要求。
因此有必要对未来测量数据进行预测和拟合分析。目前,influxdb 、kapacitor 自带的唯一的预测分析方法是holt_winters(三次指数平滑法,),能预测出季节性特点,正好满足需求。
经过研究,使用两个tick脚本,可实现流量异常预警。
第一tick脚本,使用influxdb内置HOLT_WINTERS预测函数,提前预测出一定时间段的数据点,写入一专存储预测数据的measurement

#flume_holt.tick
var cronstr = '0 12 * * *'
var holt_winter_data = batchflume_holt.tick
    |query(''' SELECT HOLT_WINTERS_with_fit(sum("1MinuteRate"),24,24) as holt_1MinuteRate FROM "flume_metrics_database"."autogen".flume_FilterSuccessMessages where time >= now() - 5d and time < now() GROUP BY time(1h) ''')
         .period(5d)
         .cron(cronstr)
         .groupBy(time(1h))
holt_winter_data
    |influxDBOut()
        .database('flume_metrics_database')
        .retentionPolicy('autogen')
        .measurement('holt_winters_flume')
        .precision('s')

第二个tick脚本,将预测measurement和实际measurement进行join,使用RMSE(均方根误差)指标进行曲线拟合预警

#flume_holt_rmse.tick
// How often to run the prediction
var every = 1m
var groupbytime = 1h
var duration = 1d
var cronstr = '0 */1 * * *'
// Get flume batch data
var flume = batch
    |query('SELECT sum("1MinuteRate") FROM "flume_metrics_database"."autogen".flume_FilterSuccessMessages')
        .period(duration)
        .groupBy(time(groupbytime))
        .cron(cronstr)
        .fill(0)
// Get holt batch data
var holt = batch
    |query('SELECT sum(holt_1MinuteRate) FROM "flume_metrics_database"."autogen".holt_winters_flume')
        .period(duration)
        .groupBy(time(groupbytime))
        .cron(cronstr)
        .fill(0)

// Join flume and holt
var diff = flume
    |join(holt)
        .as('flume', 'holt')
    |eval(lambda: ("holt.sum" - "flume.sum"))
        .as('diffValue')
diff
    |eval(lambda: "diffValue" * "diffValue")
        // Give the resulting field a name
        .as('holtflume')
    |mean('holtflume')
        .as('mse')
    |eval(lambda: sqrt("mse"))
        .as('RMSE')
    |alert()
        .crit(lambda: sqrt("RMSE") >= 1000000)
        .log('/tmp/flume_holt_rmse.log')
    |influxDBOut()
        .database('telegraf')
        .measurement('flume_holt_rmse')

预测效果图
这里写图片描述

遇到的坑
HOLT_WINTERS参数调优
1、采样整点数据进行group by (time),避免采样例如:time >= ‘2017-10-27 12:53:00’ AND time <= ‘2017-11-01 12:53:00’ 此类非整点的数据
这是非整点效果图,预测曲线、周期不准确,
这里写图片描述

2、预测点精度太小时误差太大(例如十分钟或一分钟预测一个点)。经分析时间精度越小,噪点越多,对预测效果影响越大。经测试,对于flume整体流量预测。30分钟或一个小时预测一个点,效果良好
这是十分钟聚合效果图,周期不准
这里写图片描述

阅读更多
换一批

没有更多推荐了,返回首页