有几个朋友一直问我,页面的实时监控咋做。

他们在做idc节点的监控,我推荐用smokeping和zabbix接口的方式测试。但那哥们挺执着的,非要好看点的图表~

关于运维业务的实时监控,我做过两套方案:

第一种是用websocket的方式,这个时效性最强,也最快最及时。第二套用的是节点自己插入数据库,或者是通过接口插入到数据库,然后页面通过刷新来取出数据库里面的值,来渲染页面。。。。

这两个都有点开发比较麻烦,维护也麻烦。。。正好我这段时间在搞saltstack,一直想利用mq的速度来做小型的监控方案。。。

下面的小例子,就可以实现。。。。

我们先用cmd.run实现下,再用grains采集信息。。。


先放出一个小demo~

原文地址:http://rfyiamcool.blog.51cto.com/1030776/1266437

很简单的实现过程

1.  通过saltstack modules 和grains 收集信息

2.  然后放到页面中


今天找个时间写出来.


用Saltstack的modules和grains实现实时监控平台_第1张图片



安装flask  然后直接跑就行了~

用Saltstack的modules和grains实现实时监控平台_第2张图片


先简单写了个点击刷新信息页面~


这里缺一个bootstrap的css  需要大家自己引入。。。

放到同一个目录下就行啦~


#!/usr/bin/env python
#coding=utf-8
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
from flask import Flask,url_for,request,render_template,redirect,abort,escape,session
from werkzeug import secure_filename
import os
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
print __name__
app = Flask(__name__)
app.secret_key = 'hello'
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
@app.route('/')
def index():
    p=os.popen('salt \'*\' grains.item psnum netnum').read()
    p=os.popen('salt \* cmd.run \'netstat -an|wc -l\'').read()
    return '''



    
    xiaorui.cc
    
    
    
    
    
    
    
    
    
    
    
    
      
                    
                                   
  
  
    

%s
刷新


'''%p @app.route('/user/') def show_username(username): return username @app.route('/post/') def show_post(post_id): return 'post_id:%d' % post_id @app.route('/index/') def test_session(): if 'username' in session: return 'logged in as %s' % escape(session['username']) return redirect(url_for('login')) @app.route('/login/',methods=['GET','POST']) def login(): if request.method == 'POST': session['username'] = request.form['username'] return redirect(url_for('test_session')) else: return '''
''' @app.route('/setcookie') def set_cookie(): if 'num' in request.cookies: count = int(request.cookies['num']) + 1 else: count = 0 response = app.make_response(str(count)) response.set_cookie('num',value=count,max_age=None,expires=None,domain=None) return response if __name__ == "__main__": app.run(host="10.10.10.66",port=8888,debug=True)




xiaorui.cc

花了半小时把图表展现给更新出来,这个只是简单的demo。

让大家体验下 数据填充图表的做法。

后端数据都是静态的,下次再写个动态的渲染。

关于这些业务数据,大家可以把执行结果往库里仍,然后从库里拉出来。可以用saltstack的returners把数据搞到mysql或者mongodb。

或者是放一个全局的变量,把数据往list的最后面放,满12个数值话,开始清除第一个,然后把数据往后放。。。。

或者是把saltstack的执行结果放到文本里面,两个列  一个是时间轴 一个是数据轴。然后搞出来,渲染到前端。

总之,能搞出规律的x轴和y轴就行啦。。。


用Saltstack的modules和grains实现实时监控平台_第3张图片



#!/usr/bin/env python
#coding=utf-8
#xiaorui.cc
from flask import Flask,url_for,request,render_template,redirect,abort,escape,session
from werkzeug import secure_filename
import os
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
print __name__
app = Flask(__name__)
app.secret_key = 'hello'
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
@app.route('/')
def index():
    p=os.popen('salt \'*\' grains.item psnum netnum').read()
    p=os.popen('salt \* cmd.run \'netstat -an|wc -l\'').read()
    return '''



    
    xiaorui.cc
    
    
    
    
    
    
    
    
    
    
    
    
      
                    
                                   
  
  
    

%s
刷新


'''%p @app.route('/charts.html') def show_username(): p=[1,2,3,4,5,6,7,8,9,1,2,3] return ''' xiaorui.cc



'''%p @app.route('/post/') def show_post(post_id): return 'post_id:%d' % post_id @app.route('/index/') def test_session(): if 'username' in session: return 'logged in as %s' % escape(session['username']) return redirect(url_for('login')) @app.route('/login/',methods=['GET','POST']) def login(): if request.method == 'POST': session['username'] = request.form['username'] return redirect(url_for('test_session')) else: return '''
''' if __name__ == "__main__": app.run(host="10.10.10.66",port=8888,debug=True)



还有一种展现方式,就是油表

用Saltstack的modules和grains实现实时监控平台_第4张图片

这个数据很方面的传到页面上去的。

通过后端改变value的值就行啦~




要是不显示的话,再加上这段语句
$(".dial").knob({
'min':-40
,'max':70
})




这里说下 saltstack  grains 的采集~ 例子如下

用Saltstack的modules和grains实现实时监控平台_第5张图片

我要可以取出 name和lang的值。    [xiaorui.cc]

用Saltstack的modules和grains实现实时监控平台_第6张图片


采集全部信息

salt '*' grains.items


用Saltstack的modules和grains实现实时监控平台_第7张图片

用Saltstack的modules和grains实现实时监控平台_第8张图片

用Saltstack的modules和grains实现实时监控平台_第9张图片

我们通过items查看 很多的系统信息。

原文地址:http://rfyiamcool.blog.51cto.com/1030776/1266437

实时采集的话,就要取消master对grains的缓存

用Saltstack的modules和grains实现实时监控平台_第10张图片


更新数据缓存,结果

用Saltstack的modules和grains实现实时监控平台_第11张图片


貌似刷新有点问题~   应该是他的一个bug吧~


经过 saltstack 专业人士  大牛  大神 帅锅 沈灿 的一段时间折腾得知,grains信息是每次客户端启动后 就确定了的   除非你每次采集钱都 重启 minion 或者 重新同步下 grains。

原文地址:http://rfyiamcool.blog.51cto.com/1030776/1266437

页面上又增加了几个功能,其实睡觉前写完了,但是有些bug

  等都调试好了后,在给大家贴下实现代码。

多选控件                          【xiaorui.cc】

用Saltstack的modules和grains实现实时监控平台_第12张图片

模块上传

用Saltstack的modules和grains实现实时监控平台_第13张图片


编辑各种              【xiaorui.cc】

用Saltstack的modules和grains实现实时监控平台_第14张图片


连载中~

找个时间更新下~