[Ganglia监控扩展]监控nginx的连接数

Ganglia监控支持多种脚本的功能扩展,本文介绍使用python扩展对nginx连接数进行监控,可以到网上下载监控脚本:https://github.com/csakatoku/ganglia-pymodule_nginx_status这个监控脚本主要是借助nginx自身的监控模块来实现,nginx需要开启--with-http_stub_status_module模块,如果没有开启,需要重新编译nginx(重新编译后需要kill -QUIT才能生效)。

第一步,配置nginx,开启nginx_status监控:
在nginx.conf中添加如下配置:
server {
    listen 12345;#监听的端口
    server_name 127.0.0.1;#当前机器的ip或域名
    location /nginx_status {
        stub_status on;
        access_log off;
        #allow xx.xx.xx.xx;#允许访问的IP地址
        #deny all;
        allow all;
    }
}
重启nginx,可以到http://127.0.0.1:12345/nginx_status下看到结果:

关于上面的结果的说明,请参考官方解释:http://wiki.nginx.org/HttpStubStatusModule,这里讲得很明白。

第二步,配置ganglia客户端,收集nginx_status数据:
在/etc/ganglia目录下新建conf.d和python_modules目录,把下载的扩展文件分别复制到这两个目录下,修改配置文件
nginx_status.pyconf里的nginx监控访问路径和nginx启动文件的路径;接下来需要修改gmond.conf文件,添加如下两段:
在modules下添加python支持:
module {
      name = "python_module"
      path = "modpython.so"#这里需要确定ganglia安装目录下的lib64里是否有这个文件
      params = "/etc/ganglia/python_modules"
  }
在文件最后导入python配置:
include ("/etc/ganglia/conf.d/*.pyconf")
重启gmond服务:service gmond restart,这样就开始收集这台机器上的nginx监控数据。

第三步,配置监控前端页面:
如果只需要查看单台机器的监控图表,直接在这台机器的节点里就可以看到,如下:


如果需要看整个集群的监控画面,则需要做一些配置,如下:
在gmetad运行的机器上把下载到的graph.d下的文件复制到ganglia web页面目录下的graph.d目录下面。

然后修改conf.php,找到$optional_graphs,去掉注释,修改为 $optional_graphs = array('nginx_accepts_ratio','nginx_scoreboard'),保存,刷新监控页面即可看到监控图(这个就不帖图了)。

第四步,定制自己的监控画面:
虽然插件提供了比较详细的监控画面,但我比较关注的是active、reading、writing和waiting这几个数据,并且在一张图形中显示。所以需要自己定制一个画图程序,在graph.d文件夹下新建一个叫nginx_report.php的文件,输入如下的内容(function的名称必须是graph_加上文件名):
  1 <?php
  2 
  3 function graph_nginx_report ( &$rrdtool_graph ) {
  4 
  5    global  $context,  
  6            $cpu_system_color
  7            $mem_swapped_color,
  8            $mem_shared_color,
  9            $mem_cached_color,
 10            $mem_buffered_color,
 11            $mem_used_color,
 12            $hostname,
 13            $range,
 14            $rrd_dir,
 15            $size,
 16        $strip_domainname,
 17        $graphreport_stats;
 18 
 19     if ($strip_domainname) {
 20         $hostname = strip_domainname($hostname);
 21     }
 22     
 23     $rrdtool_graph['height'] += ($size == 'medium') ? 28 : 0;
 24     if ( $graphreport_stats ) {
 25         $rrdtool_graph['height'] += ($size == 'medium') ? 52 : 0;
 26         $rmspace = '\\g';
 27     } else {
 28         $rmspace = '';
 29     }
 30     
 31     $title = 'Nginx';
 32     if ($context != 'host') {
 33        $rrdtool_graph['title'] = $title;
 34     } else {
 35        $rrdtool_graph['title'] = "$hostname $title last $range";
 36     }
 37 
 38     $rrdtool_graph['lower-limit']    = '0';
 39     $rrdtool_graph['vertical-label'] = 'num/sec';
 40     $rrdtool_graph['extras'] = '--base 1024';
 41     $rrdtool_graph['extras'] .= ($graphreport_stats == true) ? ' --font LEGEND:7' : '';
 42 
 43     if ($size == 'small') {
 44         $eol1 = '\\l';
 45         $space1 = ' ';
 46         $space2 = '      ';
 47     } else if ($size == 'medium' || $size == 'default') {
 48         $eol1 = '';
 49         $space1 = ' ';
 50         $space2 = '';
 51     } else if ($size == 'large') {
 52         $eol1 = '';
 53         $space1 = '                ';
 54         $space2 = '                ';
 55     }
 56 
 57     $series = "DEF:'nginx_reading'='${rrd_dir}/nginx_reading.rrd':'sum':AVERAGE "
 58             . "DEF:'nginx_writing'='${rrd_dir}/nginx_writing.rrd':'sum':AVERAGE "
 59             . "DEF:'nginx_waiting'='${rrd_dir}/nginx_waiting.rrd':'sum':AVERAGE "
 60             . "DEF:'nginx_active'='${rrd_dir}/nginx_active_connections.rrd':'sum':AVERAGE "
 61             . "LINE2:'nginx_reading'#$mem_cached_color:'Reading${rmspace}' ";
 62 
 63     if ( $graphreport_stats ) {
 64         $series .= "CDEF:nginxreading_pos=nginx_reading,0,INF,LIMIT "
 65                 . "VDEF:nginxreading_last=nginxreading_pos,LAST "
 66                 . "VDEF:nginxreading_min=nginxreading_pos,MINIMUM "
 67                 . "VDEF:nginxreading_avg=nginxreading_pos,AVERAGE "
 68                 . "VDEF:nginxreading_max=nginxreading_pos,MAXIMUM "
 69                 . "GPRINT:'nginxreading_last':' ${space1}Now\:%6.1lf%s' "
 70                 . "GPRINT:'nginxreading_min':'${space1}Min\:%6.1lf%s${eol1}' "
 71                 . "GPRINT:'nginxreading_avg':'${space2}Avg\:%6.1lf%s' "
 72                 . "GPRINT:'nginxreading_max':'${space1}Max\:%6.1lf%s\\l' ";
 73     }
 74 
 75     $series .= "LINE2:'nginx_writing'#$mem_used_color:'Writing${rmspace}' ";
 76 
 77     if ( $graphreport_stats ) {
 78         $series .= "CDEF:nginxwriting_pos=nginx_writing,0,INF,LIMIT "
 79                 . "VDEF:nginxwriting_last=nginxwriting_pos,LAST "
 80                 . "VDEF:nginxwriting_min=nginxwriting_pos,MINIMUM "
 81                 . "VDEF:nginxwriting_avg=nginxwriting_pos,AVERAGE "
 82                 . "VDEF:nginxwriting_max=nginxwriting_pos,MAXIMUM "
 83                 . "GPRINT:'nginxwriting_last':'${space1}Now\:%6.1lf%s' "
 84                 . "GPRINT:'nginxwriting_min':'${space1}Min\:%6.1lf%s${eol1}' "
 85                 . "GPRINT:'nginxwriting_avg':'${space2}Avg\:%6.1lf%s' "
 86                 . "GPRINT:'nginxwriting_max':'${space1}Max\:%6.1lf%s\\l' ";
 87     }
 88 
 89     $series .= "LINE2:'nginx_waiting'#$mem_swapped_color:'Waiting${rmspace}' ";
 90     
 91     if ( $graphreport_stats ) {
 92         $series .= "CDEF:nginxwaiting_pos=nginx_waiting,0,INF,LIMIT "
 93                 . "VDEF:nginxwaiting_last=nginxwaiting_pos,LAST "
 94                 . "VDEF:nginxwaiting_min=nginxwaiting_pos,MINIMUM "
 95                 . "VDEF:nginxwaiting_avg=nginxwaiting_pos,AVERAGE "
 96                 . "VDEF:nginxwaiting_max=nginxwaiting_pos,MAXIMUM "
 97                 . "GPRINT:'nginxwaiting_last':'${space1}Now\:%6.1lf%s' "
 98                 . "GPRINT:'nginxwaiting_min':'${space1}Min\:%6.1lf%s${eol1}' "
 99                 . "GPRINT:'nginxwaiting_avg':'${space2}Avg\:%6.1lf%s' "
100                 . "GPRINT:'nginxwaiting_max':'${space1}Max\:%6.1lf%s\\l' ";
101     }
102 
103 
104 
105     $series .= "LINE2:'nginx_active'#$cpu_system_color:'Active${rmspace}' ";
106     
107     if ( $graphreport_stats ) {
108         $series .= "CDEF:nginxactive_pos=nginx_active,0,INF,LIMIT "
109                 . "VDEF:nginxactive_last=nginxactive_pos,LAST "
110                 . "VDEF:nginxactive_min=nginxactive_pos,MINIMUM "
111                 . "VDEF:nginxactive_avg=nginxactive_pos,AVERAGE "
112                 . "VDEF:nginxactive_max=nginxactive_pos,MAXIMUM "
113                 . "GPRINT:'nginxactive_last':'${space1}Now\:%6.1lf%s' "
114                 . "GPRINT:'nginxactive_min':'${space1}Min\:%6.1lf%s${eol1}' "
115                 . "GPRINT:'nginxactive_avg':'${space2}Avg\:%6.1lf%s' "
116                 . "GPRINT:'nginxactive_max':'${space1}Max\:%6.1lf%s\\l' ";
117     }
118 
119 
120    $rrdtool_graph['series'] = $series
121 
122     return $rrdtool_graph;
123 }
124 ?>
完成后保存文件,在conf.php中$optional_graphs数组里添加一个元素'nginx'(文件名的_report.php之前的部分),刷新监控页面即可看到整个集群的nginx连接数信息。

如上,便完成了在ganglia中集成nginx监控的所有工作。

-->枪声依旧<--

posted on 2011-12-27 23:58 枪声依旧 阅读(3979) 评论(7)  编辑  收藏 所属分类: 运维

评论

# re: [Ganglia监控扩展]监控nginx的连接数 2011-12-29 08:59 tb

不错 学习了   回复  更多评论   

# re: [Ganglia监控扩展]监控nginx的连接数 2012-01-11 18:19 运维

你好,博主,是否可以看下nginx_status.pyconf的配置!!多谢多谢!  回复  更多评论   

# re: [Ganglia监控扩展]监控nginx的连接数 2012-01-11 22:24 枪声依旧

@运维,只需要把下载的nginx_status.pyconf文件最前面这段修改一下就行:
modules {
module {
name = 'nginx_status'
language = 'python'

param status_url {
value = 'http://127.0.0.1:12345/nginx_status'
}
param nginx_bin {
value = '/usr/local/nginx/sbin/nginx'
}
param refresh_rate {
value = '15'
}
}
}  回复  更多评论   

# re: [Ganglia监控扩展]监控nginx的连接数 2012-01-11 22:29 枪声依旧

@运维
如果没有运行成功,可能是python版本的问题,应该需要把python的版本至少升到2.7吧, nginx_status.py里的一些语法低版本的python不支持。你可以把第一行调到debug模式,执行一下这个文件,看下错误信息,好运!  回复  更多评论   

# re: [Ganglia监控扩展]监控nginx的连接数 2012-01-13 15:21 运维

好的,我试下!多谢!!  回复  更多评论   

# re: [Ganglia监控扩展]监控nginx的连接数[未登录] 2012-04-06 18:13 leo

你好,部署当中遇到点问题请教下,Python 己更新至2.7以上 ,单独使用python 执行nginx_status.py 终端实时有数据更新,但网页上的图片显示全是空白,没有任何数据,是不是哪还有什么问题? @枪声依旧  回复  更多评论   

# re: [Ganglia监控扩展]监控nginx的连接数 2013-03-20 18:24 运维

您好,
请教一个问题。
为啥我把这些代码贴进去后在出图的时候会报错。
ERROR: Could not parse color in ''
请问为啥会报这个错误?  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2011年12月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

导航

统计

常用链接

留言簿

随笔分类

随笔档案

文章分类

搜索

最新评论

阅读排行榜

评论排行榜