flask与mysql写的简单监控系统示例

监控系统我们都知道用来监控服务器系统的一个稳定性了,下面整理了一篇flask + mysql写的简单监控系统的配置例子,希望对各位有帮助.

这里以监控内存使用率为例,写的一个简单demo性程序,具体操作根据51reboot提供的教程写如下.

一、建库建表,创建falcon数据库:

  1. mysql>createdatabasefalconcharactersetutf8;
  2. QueryOK,1rowaffected(0.00sec)

创建内存监控使用的表stat,表结构如下:

  1. CREATETABLE`stat`(
  2. `id`int(11)unsignedNOTNULLAUTO_INCREMENT,
  3. `host`varchar(256)DEFAULTNULL,
  4. `mem_free`int(11)DEFAULTNULL,
  5. `mem_usage`int(11)DEFAULTNULL,
  6. `mem_total`int(11)DEFAULTNULL,
  7. `load_avg`varchar(128)DEFAULTNULL,
  8. `time`bigint(11)DEFAULTNULL,
  9. PRIMARYKEY(`id`),
  10. KEY`host`(`host`(255))
  11. )ENGINE=InnoDBAUTO_INCREMENT=0DEFAULTCHARSET=utf8;

二、flask web端设置

首先我们设计一个web服务,实现如下功能,完成监控页面展示,接受POST提交上来的数据 ,提供json数据GET接口,具体框架结构图如下:

flask-monitor

目录结构如下:

  1. web
  2. ├──flask_web.py
  3. └──templates
  4. └──mon.html
  5. flask_web代码如下:
  6. importMySQLdbasmysql
  7. importjson
  8. fromflaskimportFlask,request,render_template
  9. app=Flask(__name__)
  10. db=mysql.connect(user="361way",passwd="123456",\
  11. db="falcon",charset="utf8")
  12. db.autocommit(True)
  13. c=db.cursor()
  14. @app.route("/",methods=["GET","POST"])
  15. defhello():
  16. sql=""
  17. ifrequest.method=="POST":
  18. data=request.json
  19. try:
  20. sql="INSERTINTO`stat`(`host`,`mem_free`,`mem_usage`,`mem_total`,`load_avg`,`time`)VALUES('%s','%d','%d','%d','%s','%d')"%(data['Host'],data['MemFree'],data['MemUsage'],data['MemTotal'],data['LoadAvg'],int(data['Time']))
  21. ret=c.execute(sql)
  22. exceptmysql.IntegrityError:
  23. pass
  24. return"OK"
  25. else:
  26. returnrender_template("mon.html")
  27. @app.route("/data",methods=["GET"])
  28. defgetdata():
  29. c.execute("SELECT`time`,`mem_usage`FROM`stat`")
  30. ones=[[i[0]*1000,i[1]]foriinc.fetchall()]
  31. return"%s(%s);"%(request.args.get('callback'),json.dumps(ones))//phpfensi.com
  32. if__name__=="__main__":
  33. app.run(host="0.0.0.0",port=8888,debug=True)

这里使用的汇图JS为highcharts、highstock,具体模板页面内容如下:

  1. [root@91ittemplates]#catmon.html
  2. <title>memorymonitor</title>
  3. <!DOCTYPEHTML>
  4. <html>
  5. <head>
  6. <metahttp-equiv="Content-Type"content="text/html;charset=utf-8">
  7. <title>HighstockExample</title>
  8. <!--<scripttype="text/javascript"src="{{url_for('static',filename='jquery.min.js')}}"></script>-->
  9. <scripttype="text/javascript"src="http://ajax.useso.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
  10. <styletype="text/css">
  11. ${demo.css}
  12. </style>
  13. <scripttype="text/javascript">
  14. $(function(){
  15. $.getJSON('/data?callback=?',function(data){
  16. //Createthechart
  17. $('#container').highcharts('StockChart',{
  18. rangeSelector:{
  19. inputEnabled:$('#container').width()>480,
  20. selected:1
  21. },
  22. title:{
  23. text:'memorymonitor'
  24. },
  25. series:[{
  26. name:'memorymonitor',
  27. data:data,
  28. type:'spline',
  29. tooltip:{
  30. valueDecimals:2
  31. }
  32. }]
  33. });
  34. });
  35. });
  36. </script>
  37. </head>
  38. <body>
  39. <!--<scriptsrc="{{url_for('static',filename='highstock.js')}}"></script>-->
  40. <scriptsrc="http://cdnjs.cloudflare.com/ajax/libs/highstock/2.0.4/highstock.js"></script>
  41. <!--<scriptsrc="{{url_for('static',filename='exporting.js')}}"></script>-->
  42. <scriptsrc="http://code.highcharts.com/modules/exporting.js"></script>
  43. <divid="container"style="height:400px"></div>
  44. </body>
  45. </html>

注:这里的JS代码都直接使用互联网上的代码,如果主机无法连接互联网的,可以将上面的三段代取取下来,在templates 的同级目录创建static 目录,将下载下来的三个文件放到该目录,删除模板中三处引用javascript处的代码,使用当前注释的三段.

三、agent被监控端设置

web展示页面完成了,运行起来:python flask_web.py 监听在8888端口上,我们需要做一个agent来采集数据,并通过post方法请求flask_web页面,将数据上传写入数据库,这里以监控内存为例,具体监控代码如下:

  1. #!/usr/bin/envpython
  2. #coding=utf-8
  3. importinspect
  4. importtime
  5. importurllib,urllib2
  6. importjson
  7. importsocket
  8. classmon:
  9. def__init__(self):
  10. self.data={}
  11. defgetTime(self):
  12. returnstr(int(time.time())+8*3600)
  13. defgetHost(self):
  14. returnsocket.gethostname()
  15. defgetLoadAvg(self):
  16. withopen('/proc/loadavg')asload_open:
  17. a=load_open.read().split()[:3]
  18. return','.join(a)
  19. defgetMemTotal(self):
  20. withopen('/proc/meminfo')asmem_open:
  21. a=int(mem_open.readline().split()[1])
  22. returna/1024
  23. defgetMemUsage(self,noBufferCache=True):
  24. ifnoBufferCache:
  25. withopen('/proc/meminfo')asmem_open:
  26. T=int(mem_open.readline().split()[1])
  27. F=int(mem_open.readline().split()[1])
  28. B=int(mem_open.readline().split()[1])
  29. C=int(mem_open.readline().split()[1])
  30. return(T-F-B-C)/1024
  31. else:
  32. withopen('/proc/meminfo')asmem_open:
  33. a=int(mem_open.readline().split()[1])-int(mem_open.readline().split()[1])
  34. returna/1024
  35. defgetMemFree(self,noBufferCache=True):
  36. ifnoBufferCache:
  37. withopen('/proc/meminfo')asmem_open:
  38. T=int(mem_open.readline().split()[1])
  39. F=int(mem_open.readline().split()[1])
  40. B=int(mem_open.readline().split()[1])
  41. C=int(mem_open.readline().split()[1])
  42. return(F+B+C)/1024
  43. else:
  44. withopen('/proc/meminfo')asmem_open:
  45. mem_open.readline()
  46. a=int(mem_open.readline().split()[1])
  47. returna/1024
  48. defrunAllGet(self):
  49. #自动获取mon类里的所有getXXX方法,用XXX作为key,getXXX()的返回值作为value,构造字典
  50. forfunininspect.getmembers(self,predicate=inspect.ismethod):
  51. iffun[0][:3]=='get':
  52. self.data[fun[0][3:]]=fun[1]()
  53. returnself.data
  54. if__name__=="__main__":
  55. whileTrue:
  56. m=mon()
  57. data=m.runAllGet()
  58. printdata
  59. req=urllib2.Request("http://test.361way.com:8888",json.dumps(data),{'Content-Type':'application/json'})
  60. f=urllib2.urlopen(req)
  61. response=f.read()
  62. printresponse
  63. f.close()
  64. time.sleep(60)

nohup python moniItems.py >/dev/null 2>&1 & 在被监控主机上运行,如果出于实验目的,想尽快的看到展示效果,可以将time.sleep(60) 改为time.sleep(2),这样每2秒就会取一次数据写入数据库.

访问 http://test.361way.com:8888 就可以看到我们的监控数据了.

flask-highcharts

highcharts支持将按时间拖动,也支持按指定时间段查看,并且查看到的图片可以直接保存为png、jpg或pdf、csv等格式查看.

这只是一个简单的监控系统了其实是非常的简单了,当然要做和高准确还是需要其它的专业工具来实现了.

相关广告
  • flask与mysql写的简单监控系统示例 flask与mysql写的简单监控系统示例 flask与mysql写的简单监控系统示例
相关阅读

flask与mysql写的简单监控系统示例

2019/10/10 17:45:20 | 谷歌SEO算法 | SEO