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

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

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

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

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

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

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

先放出一个小demo~

原文地址:

很简单的实现过程

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

2.  然后放到页面中

今天找个时间写出来.

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

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

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

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

#!/usr/bin/env python#coding=utf-8                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          from flask import Flask,url_for,request,render_template,redirect,abort,escape,sessionfrom werkzeug import secure_filenameimport 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 responseif __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轴就行啦。。。

#!/usr/bin/env python#coding=utf-8#xiaorui.ccfrom flask import Flask,url_for,request,render_template,redirect,abort,escape,sessionfrom werkzeug import secure_filenameimport 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)

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

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

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

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

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

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

采集全部信息

salt '*' grains.items

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

原文地址:

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

更新数据缓存,结果

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

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

原文地址:

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

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

多选控件                          【xiaorui.cc】

模块上传

编辑各种              【xiaorui.cc】

连载中~

找个时间更新下~