利用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

相關文章
相關標籤/搜索