利用collectd, influxdb和grafana进行简单的负载预警

本文仅仅是对负载预警的简单尝试,可以预测的场景也比较有限,可是做为预测工做的开始已经比较可以说明问题了。前端

利用collectd, influxdb和grafana进行监控系统搭建能够参考这篇文章Monitoring hosts with CollectD, InfluxDB and Grafana grafana的操做比nagios和cacti真的友好不少,可定制的能力也强不少。python

负载监控

虽然grafana有必定的报警能力(在grafana4.0版本以后,alert模块直接继承进来,因此推荐4.0的版本),可是可以提早十几分钟对于集群负载超标进行预警,一直是咱们的一个小目标。因此在这里,咱们就开始为这个小目标作了一点小努力。ios

在实际运行中,咱们安装了这个小插件。它可以对应用负载进行批量的显示,节约了好多体力活。git

图片描述

经过分析,咱们能够看到如下几种负载github

简单趋势型web

图片描述

周期型flask

图片描述

规律不明显型后端

而对于周期型咱们也能够看到在短时间是能够看到必定趋势的。服务器

在这里咱们仅采用线性回归对简单趋势进行预测。这点对于python很好实现机器学习

from datetime import datetime
from influxdb import DataFrameClient
import numpy as np
from scipy import stats

if __name__ == "__main__":
    host = 'localhost'
    port = 8086
    user = 'root'
    password = 'root'
    dbname = 'collectd'

    client = DataFrameClient(host, port, user, password, dbname)

    print("Create pandas DataFrame")
    start_time = datetime(2016, 11, 17, 3,10).timestamp()
    end_time = datetime(2016, 11, 17, 8,50).timestamp()
    query = "select * from load_midterm where host='web153' and time > " + str(int(start_time)) + "s and time < " \
            + str(int(end_time)) + "s"
    df = client.query(query)

    slope, intercept, r_value, p_value, std_err = stats.linregress(range(df['load_midterm'].shape[0]), df['load_midterm']['value'].values)
    print(slope)
    print(intercept)
    print(r_value)
    print(p_value)

在这里咱们用的是统计模块获得斜率和截距。须要注意的是,咱们还要对R2,p值以及方差进行评价。通常来讲r^2 >0.7, p<0.05, std_err<0.1

在这里,为何没有采用一些更复杂的机器学习方法呢?

不管采用什么模型,关键是要提取一些关键feature。我观察过简单的应用服务器的其余指标,包括tcp链接数,cpu,磁盘io等,与load的协同性比较高,很难成为15min后load的先导预测feature。若是从服务器集群的总体角度去找feature的话,也许是能够作的,将来会关注这块。

在具体实现上,后端基于python flask编写一个预测服务器,而前端开发能够基于grafana的clock插件进行开发:clock-panel

相关文章
相关标签/搜索