基于web的资源视图(cpu、内存、流量)显示方案

本人第一次写blog,努力中。

言归正传。这篇博客完成的工作是在网页上以图表的方式,显示cpu、内存、流量等资源信息。先上一副效果图:

使用工具与环境:

web架构:基于python的django

画图工具:基于js的画图工具 highcharts 链接http://www.highcharts.com/

页面的基本显示由html代码负责,没啥可说的。html代码如下:

  
  
  
  
  1. <!DOCTYPE html>

  2. <htmllang="en">

  3. <head>

  4. <title>计算机资源视图</title>

  5. <metahttp-equiv="Content-Type"content="text/html; charset=utf-8">

  6. <linkrel="stylesheet"type="text/css"href="/media/css/basic.css"/>

  7. <scripttype="text/javascript"src="/media/js/jquery-1.4.2.min.js"></script>

  8. <scripttype="text/javascript"src="/media/jschart/highcharts.js"></script>

  9. <scripttype="text/javascript"src="/media/jschart/modules/exporting.js"></script>

  10. <scripttype="text/javascript"src="/media/mjs/physical.js"></script>

  11. </head>

  12. <body>

  13. <!--  #charts -->

  14. <charts>

  15. <divclass="charts">

  16. <divclass="chartshead"><span>主控节点 资源视图</span></div>

  17. <divid="cpu"></div>

  18. <divid="mem"></div>

  19. <divid="rx"></div>

  20. <divid="tx"></div>

  21. <brstyle="clear:both"/>

  22. </div>

  23. </charts>

  24. </body>

  25. </html>

画图主要是使用js代码,使用ajax机制定时异步获得数据,然后在图上添加数据点。每5秒添加一个新点。js代码如下:

  
  
  
  
  1. var chart_cpu;

  2. var chart_mem;

  3. var chart_rx;  

  4. var chart_tx;  

  5. var maxmem;

  6. var mem;

  7. var pre_cpu = 0

  8. var pre_cpu_total = 0

  9. var pre_rb = 0

  10. var pre_tb = 0

  11. var flag = 1

  12. var timeout = 5000

  13. //var para = window.location.search;      

  14. //更新

  15. function requestData() {

  16. var stime = new Date();

  17.            $.ajax({

  18. //async: false,

  19.                url:'/ajax/jsonmgt',  

  20.                success: function(point) {              

  21. // add 4 points

  22. var x = (new Date()).getTime() + 8*3600*1000; // 当前时间

  23. var out = eval("(" + point + ")")

  24. //var out = eval( point )

  25.               maxmem = out[0]

  26.               mem = out[1]

  27.               cpu_use = out[2]

  28.               cpu_total = out[3]

  29.               rb = out[4]

  30.               tb = out[5]

  31.               memrate = mem/maxmem * 100

  32. //cpu

  33.                    d_cpu = cpu_use - pre_cpu

  34.                    d_cpu_total = cpu_total - pre_cpu_total

  35.                    pre_cpu = cpu_use

  36.                    pre_cpu_total = cpu_total

  37.                    cpurate = d_cpu/d_cpu_total *100

  38. if(cpurate == 100)

  39.                  cpurate = 99.9

  40. //rb tb

  41.                    d_rb = rb - pre_rb

  42.                    d_tb = tb - pre_tb

  43.                    pre_rb = rb

  44.                    pre_tb = tb

  45.                    rkb = d_rb/1024

  46.                    tkb = d_tb/1024

  47. if(flag == 1){

  48.                     rkb = 0

  49.                    tkb = 0

  50.                    cpurate = 0

  51.                        memrate = 0

  52.                    flag =0

  53.                    }

  54. //add points

  55.               chart_cpu.series[0].addPoint([x,cpurate], true, true);

  56.               chart_mem.series[0].addPoint([x,memrate], true, true);

  57.               chart_rx.series[0].addPoint([x,rkb], true, true);

  58.               chart_tx.series[0].addPoint([x,tkb], true, true);

  59. var etime = new Date();

  60.               d_date=etime.getTime()-stime.getTime();

  61.                    setTimeout(requestData, timeout - d_date);  

  62.                },

  63.                cache: false

  64.            });

  65.        }

  66. //cpu

  67. $(document).ready(function(){  

  68.    chart_cpu = new Highcharts.Chart({  

  69.        chart: {  

  70.            renderTo: 'cpu', //图表放置的容器,DIV

  71.            defaultSeriesType: 'spline', //图表类型为曲线图

  72.            backgroundColor:'#DFFDFD',

  73.            events: {  

  74. //load: requestData

  75.                               }  

  76.                      },  

  77.        title: {  

  78.            text: 'CPU负载'//图表标题

  79.                      },  

  80.        xAxis: { //设置X轴

  81.            title: { text: '时间'   },  

  82.            type: 'datetime',       //X轴为日期时间类型

  83.            tickPixelInterval: 150  //X轴标签间隔

  84.                      },  

  85.        yAxis: { //设置Y轴

  86.            title: { text: 'CPU使用率'   },

  87.            labels: {

  88.                  formatter: function() {

  89. returnthis.value +'%';

  90.                              }

  91.                                 },

  92.            max: 100, //Y轴最大值

  93.            min: 0  //Y轴最小值

  94.                      },  

  95.        tooltip: {//当鼠标悬置数据点时的提示框

  96.            formatter: function() { //格式化提示信息

  97. return Highcharts.dateFormat('%H:%M:%S', this.x) +' '+  

  98.                Highcharts.numberFormat(this.y, 2)+'%';  

  99.                                }  

  100.                      },  

  101.        legend: {  

  102.            enabled: false//设置图例不可见

  103.                      },  

  104.        exporting: {  

  105.            enabled: false//设置导出按钮不可用

  106.                      },  

  107.        series: [{  

  108.            data: (function() { //设置默认数据,

  109. var data = [],  

  110.                time = (new Date()).getTime() + 8*3600*1000,  

  111.                i;  

  112. for (i = -19; i < 0; i++) {  

  113.                    data.push({  

  114.                        x: time + i * timeout,  

  115.                        y: 0 * 100  

  116.                                                      });  

  117.                                           }  

  118. return data;  

  119.                                 })()  

  120.                       }]  

  121.           });  

  122. });  

  123. //mem

  124. $(function() {  

  125.    chart_mem = new Highcharts.Chart({  

  126.        chart: {  

  127.            renderTo: 'mem', //图表放置的容器,DIV

  128.            defaultSeriesType: 'spline', //图表类型为曲线图

  129.            backgroundColor:'#DFFDFD',

  130.            events: {  

  131.                                 }  

  132.                      },  

  133.        title: {  

  134.            text: '内存负载'//图表标题

  135.                      },  

  136.        xAxis: { //设置X轴

  137.            title: { text: '时间'   },  

  138.            type: 'datetime',  //X轴为日期时间类型

  139.            tickPixelInterval: 150  //X轴标签间隔

  140.                     },  

  141.        yAxis: { //设置Y轴

  142.            title: { text: '内存使用记录'   },

  143.            labels: {

  144.                  formatter: function() {

  145. returnthis.value + '%';

  146.                              }

  147.                                 },

  148.            max: 100, //Y轴最大值

  149.            min: 0  //Y轴最小值

  150.                      },  

  151.        tooltip: {//当鼠标悬置数据点时的提示框

  152.            formatter: function() { //格式化提示信息

  153. return Highcharts.dateFormat('%H:%M:%S', this.x) +' '+  

  154.                Highcharts.numberFormat(this.y, 2) + '%' + ' ' +

  155.                     Highcharts.numberFormat(mem,0) + 'MB';

  156.                                }  

  157.                      },  

  158.        legend: {  

  159.            enabled: false//设置图例不可见

  160.                     },  

  161.        exporting: {  

  162.            enabled: false//设置导出按钮不可用

  163.                     },  

  164.        series: [{  

  165.            data: (function() { //设置默认数据,

  166. var data = [],  

  167.                time = (new Date()).getTime()+8*3600*1000,  

  168.                i;  

  169. for (i = -19; i < 0; i++) {  

  170.                    data.push({  

  171.                        x: time + i * timeout,  

  172.                        y: 0  

  173.                                                      });  

  174.                                            }  

  175. return data;  

  176.                                 })()  

  177.                      }]  

  178.         });  

  179. });  

  180. //rx

  181. $(function() {  

  182.    chart_rx = new Highcharts.Chart({  

  183.        chart: {  

  184.            renderTo: 'rx', //图表放置的容器,DIV

  185.            defaultSeriesType: 'spline', //图表类型为曲线图

  186.            backgroundColor:'#DFFDFD',   //背景颜色

  187.            events: {  

  188.                                 }  

  189.                      },  

  190.        title: {  

  191.            text: '网络接收流量'//图表标题

  192.                     },  

  193.        xAxis: { //设置X轴

  194.            title: { text: '时间'   },  

  195.            type: 'datetime',  //X轴为日期时间类型

  196.            tickPixelInterval: 150  //X轴标签间隔

  197.                      },  

  198.        yAxis: { //设置Y轴

  199.            title: { text: '接收网络流量'   },

  200.            labels: {

  201.                  formatter: function() {

  202. returnthis.value +'kb/s';

  203.                              }

  204.                                 },

  205. //max: 200, //Y轴最大值

  206.            min: 0  //Y轴最小值

  207.                      },  

  208.        tooltip: {//当鼠标悬置数据点时的提示框

  209.            formatter: function() { //格式化提示信息

  210. return Highcharts.dateFormat('%H:%M:%S', this.x) +' '+  

  211.                Highcharts.numberFormat(this.y, 2)+'kb/s';  

  212.                                }  

  213.                      },  

  214.        legend: {  

  215.            enabled: false//设置图例不可见

  216.                      },  

  217.        exporting: {  

  218.            enabled: false//设置导出按钮不可用

  219.                     },  

  220.        series: [{  

  221.            data: (function() { //设置默认数据,

  222. var data = [],  

  223.                time = (new Date()).getTime() + 8*3600*1000,  

  224.                i;  

  225. for (i = -19; i < 0; i++) {  

  226.                    data.push({  

  227.                        x: time + i * timeout,  

  228.                        y: 0  

  229.                                                      });  

  230.                                           }  

  231. return data;  

  232.                                })()  

  233.                     }]  

  234.          });  

  235. });  

  236. //tx

  237. $(function() {  

  238.    chart_tx = new Highcharts.Chart({  

  239.        chart: {  

  240.            renderTo: 'tx', //图表放置的容器,DIV

  241.            defaultSeriesType: 'spline', //图表类型为曲线图

  242.            backgroundColor:'#DFFDFD',

  243.            events: {  

  244.                 load: requestData

  245.                                 }  

  246.                      },  

  247.        title: {  

  248.            text: '网络发送流量'//图表标题

  249.                     },  

  250.        xAxis: { //设置X轴

  251.            title: { text: '时间'   },  

  252.            type: 'datetime',  //X轴为日期时间类型

  253.            tickPixelInterval: 150  //X轴标签间隔

  254.                      },  

  255.        yAxis: { //设置Y轴

  256.            title: { text: '发送网络流量'   },

  257.            labels: {

  258.                  formatter: function() {

  259. returnthis.value +'kb/s';

  260.                              }

  261.                                 },

  262. //max: 200, //Y轴最大值

  263.            min: 0  //Y轴最小值

  264.                      },  

  265.        tooltip: {//当鼠标悬置数据点时的提示框

  266.            formatter: function() { //格式化提示信息

  267. return Highcharts.dateFormat('%H:%M:%S', this.x) +' '+  

  268.                Highcharts.numberFormat(this.y, 2)+'kb/s';  

  269.                                }  

  270.                      },  

  271.        legend: {  

  272.            enabled: false//设置图例不可见

  273.                      },  

  274.        exporting: {  

  275.            enabled: false//设置导出按钮不可用

  276.                     },  

  277.        series: [{  

  278.            data: (function() { //设置默认数据,

  279. var data = [],  

  280.                time = (new Date()).getTime() + 8*3600*1000,  

  281.                i;  

  282. for (i = -19; i < 0; i++) {  

  283.                    data.push({  

  284.                        x: time + i * timeout,  

  285.                        y: 0

  286.                                                      });  

  287.                                           }  

  288. return data;  

  289.                                })()  

  290.                     }]  

  291.          });  

  292. })

使用ajax,就需要有数据源定期提供数据。使用c语言写一个程序(取名mgtinfo.c)抓取瞬时的cpu、内存、流量。代码如下:

  
  
  
  
  1. #include <stdlib.h>

  2. #include <stdio.h>

  3. #include <sys/stat.h>

  4. typedefstruct//定义一个cpu occupy的结构体

  5. {

  6. char name[20];      //定义一个char类型的数组名name有20个元素

  7. long user; //定义一个无符号的int类型的user

  8. long nice; //定义一个无符号的int类型的nice

  9. long system;//定义一个无符号的int类型的system

  10. long idle; //定义一个无符号的int类型的idle

  11. }CPU_OCCUPY;

  12. typedefstruct//定义一个mem occupy的结构体

  13. {

  14. char name[20];      //定义一个char类型的数组名name有20个元素

  15. long total;  

  16. //char name2[20];

  17. char unit[20];

  18. long free;

  19. long buffers;  

  20. long cached;                        

  21. }MEM_OCCUPY;

  22. typedefstruct//定义一个cpu occupy的结构体

  23. {

  24. char name[20];      //定义一个char类型的数组名name有20个元素

  25. long rb, rpkt, r_err, r_drop, r_fifo, r_frame, r_compr, r_mcast;  

  26. long tb, tpkt, t_err, t_drop, t_fifo, t_coll, t_carrier, t_compr;  

  27. }NET_OCCUPY;

  28. int get_memoccupy (MEM_OCCUPY *mem) //对无类型get函数含有一个形参结构体类弄的指针O

  29. {

  30. FILE *fd;          

  31. int n;              

  32. char buf[256];    

  33.    MEM_OCCUPY *m;

  34.    m=mem;

  35. long MemFree, Buffers, Cached;                                                                                                    

  36.    fd = fopen ("/proc/meminfo", "r");  

  37.    fgets (buf, sizeof(buf), fd);  

  38.    sscanf (buf, "%s %ld %s", &m->name, &m->total, &m->unit);  

  39.    fgets (buf, sizeof(buf), fd);  

  40.    sscanf (buf, "%s %ld %s", m->name, &m->free, m->unit);  

  41.    fgets (buf, sizeof(buf), fd);  

  42.    sscanf (buf, "%s %ld %s", m->name, &m->buffers, m->unit);  

  43.    fgets (buf, sizeof(buf), fd);  

  44.    sscanf (buf, "%s %ld %s", m->name, &m->cached, m->unit);  

  45.    fclose(fd);     //关闭文件fd

  46. return 0;

  47. }

  48. int get_cpuoccupy (CPU_OCCUPY *cpust) //对无类型get函数含有一个形参结构体类弄的指针O

  49. {    

  50. FILE *fd;          

  51. int n;            

  52. char buf[256];  

  53.    CPU_OCCUPY *cpu_occupy;

  54.    cpu_occupy=cpust;

  55. if ((fd = fopen ("/proc/stat", "r")) != NULL){  

  56. while (fgets (buf, sizeof(buf), fd)){  

  57. if( *buf == 'c' && *(buf + 1) == 'p') break;  

  58.                }  

  59.           fclose (fd);  

  60.      }  

  61. else

  62.         printf("read file failed\n");                                                                                              

  63.    sscanf (buf, "cpu %ld %ld %ld %ld", &cpu_occupy->user, &cpu_occupy->nice,&cpu_occupy->system, &cpu_occupy->idle);

  64. //printf("%ld\n", cpu_occupy->user);

  65. return 0;    

  66. }

  67. int get_netoccupy (NET_OCCUPY *net) //对无类型get函数含有一个形参结构体类弄的指针O

  68. {

  69. FILE *fd;                    

  70. char buf[256];    

  71.    NET_OCCUPY *net_occupy;

  72.    net_occupy = net;

  73. //long MemFree, Buffers, Cached;

  74.    fd = fopen ("/proc/net/dev", "r");  

  75.    fgets (buf, sizeof(buf), fd);  

  76.    fgets (buf, sizeof(buf), fd);  

  77.    fgets (buf, sizeof(buf), fd);  

  78.    fgets (buf, sizeof(buf), fd);  

  79. //printf("%s",buf);

  80.    sscanf (buf, "%s %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld", &net_occupy->name, &net_occupy->rb ,&net_occupy->rpkt, &net_occupy->r_err, &net_occupy->r_drop, &net_occupy->r_fifo ,&net_occupy->r_frame, &net_occupy->r_compr, &net_occupy->r_mcast, &net_occupy->tb, &net_occupy->tpkt);

  81.    fclose(fd);     //关闭文件fd

  82. return 0;

  83. }

  84. int cal_cpuoccupy (CPU_OCCUPY *o, CPU_OCCUPY *n)  

  85. {    

  86.    unsigned long od, nd;    

  87.    unsigned long id, sd;

  88. int cpu_use = 0;    

  89.    od = (unsigned long) (o->user + o->nice + o->system +o->idle);//第一次(用户+优先级+系统+空闲)的时间再赋给od

  90.    nd = (unsigned long) (n->user + n->nice + n->system +n->idle);//第二次(用户+优先级+系统+空闲)的时间再赋给od

  91.    id = (unsigned long) (n->user - o->user);    //用户第一次和第二次的时间之差再赋给id

  92.    sd = (unsigned long) (n->system - o->system);//系统第一次和第二次的时间之差再赋给sd

  93. if((nd-od) != 0)

  94.    cpu_use = (int)((sd+id)*10000)/(nd-od); //((用户+系统)乖100)除(第一次和第二次的时间差)再赋给g_cpu_used

  95. else cpu_use = 0;

  96. return cpu_use;

  97. }

  98. int main()

  99. {

  100.    CPU_OCCUPY cpu_stat;

  101.    MEM_OCCUPY mem_stat;

  102.    NET_OCCUPY net_stat;

  103. long cpu_use, cpu_total;

  104. //获取内存

  105.    get_memoccupy ((MEM_OCCUPY *)&mem_stat);

  106. //第一次获取cpu使用情况

  107.    get_cpuoccupy((CPU_OCCUPY *)&cpu_stat);

  108.     cpu_use = cpu_stat.user + cpu_stat.nice + cpu_stat.system;

  109.     cpu_total=cpu_stat.user + cpu_stat.nice + cpu_stat.system + cpu_stat.idle;

  110. //printf("%ld,%ld,%ld,%ld\n",cpu_stat.user,cpu_stat.nice,cpu_stat.system,cpu_stat.idle);

  111.     get_netoccupy((NET_OCCUPY *)&net_stat);

  112.    printf("%ld,%ld,%ld,%ld,%ld,%ld\n",mem_stat.total/1024,(mem_stat.total-mem_stat.free-mem_stat.buffers-mem_stat.cached)/1024,cpu_use,cpu_total,net_stat.rb,net_stat.tb);  

  113. return 0;

  114. }  

在django中,需要写一个函数jsonmgt,作为ajax请求的响应。每次执行,jsonmgt调用mgtinfo.c,获得瞬时cpu、内存、流量后,以json数据形式返回给页面。页面再用上面贴的js代码添加数据点绘图。

  
  
  
  
  1. # time data

  2. def jsonmgt( request ):

  3. print"calulate data"

  4.    cmd="cmd/./mgtinfo"

  5.    output = os.popen(cmd,'r')

  6.    ret = output.read()

  7.    info = ret.split(',')

  8.    maxmem = string.atof(info[0])

  9.    mem = string.atof(info[1])

  10.    cpu_use = string.atof(info[2])

  11.    cpu_total = string.atof(info[3])

  12.    rb = string.atof(info[4])

  13.    tb = string.atof(info[5])

  14.    output.close()

  15.    data = [maxmem,mem,cpu_use,cpu_total,rb,tb]

  16.    data = simplejson.dumps( data, cls = QuerySetEncoder )

  17. return HttpResponse( data )

  18. # django ajax

  19. class QuerySetEncoder( simplejson.JSONEncoder ):

  20. """

  21.        Encoding QuerySet into JSON format.

  22.    """

  23. def default( self, object ):

  24. try:

  25. return serializers.serialize( "python", object,ensure_ascii = False )

  26. except:

  27. return simplejson.JSONEncoder.default( self, object )


你可能感兴趣的:(Web)