Python性能监控Graphite

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

一、简介

Graphite 是一个Python写的web应用,采用django框架,Graphite用来进行收集服务器所有的及时状态,用户请求信息,Memcached命中率,RabbitMQ消息服务器的状态,Unix操作系统的负载状态,Graphite服务器大约每分钟需要有4800次更新操作,Graphite采用简单的文本协议和绘图功能可以方便地使用在任何操作系统上。


graphite有三个组件:

  • graphite-web:web接口

  • carbon:相当于network interface

  • whisper:相当于rrdtool


graphite官方文档:

http://graphite.wikidot.com/documentation


http://graphite.readthedocs.org/en/latest/


二、安装graphite

1、安装epel源

1
2
3
rpm  - ivh http: / / dl.fedoraproject.org / pub / epel / 6 / x86_64 / epel - release - 6 - 8.noarch .rpm
sed  - 's@^#@@'  / etc / yum.repos.d / epel.repo
sed  - 's@mirrorlist@#mirrorlist@'  / etc / yum.repos.d / epel.repo

2、安装适应版本的Django软件包,版本过高会出现bug

1
2
3
yum install python - simplejson
wget https: / / kojipkgs.fedoraproject.org / / packages / Django14 / 1.4 . 14 / 1.el6 / noarch / Django14 - 1.4 . 14 - 1.el6 .noarch.rpm
rpm  - ivh Django14 - 1.4 . 14 - 1.el6 .noarch.rpm

3、安装graphite

1
yum install graphite - web python - carbon python - whisper

4、安装MySQL数据库

1
2
3
4
5
yum install mysql mysql - server MySQL - python
service mysqld start
chkconfig mysqld on
mysqladmin  - uroot password  123456
mysql  - uroot  - p123456  - 'create database graphite;'

5、修改graphite配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# cat >> /etc/graphite-web/local_settings.py << EOF
SECRET_KEY  =  '123qwe'
ALLOWED_HOSTS  =  '*'  ]
TIME_ZONE  =  'Asia/Shanghai'
DEBUG  =  True
DATABASES  =  {
     'default' : {
         'NAME' 'graphite' ,
         'ENGINE' 'django.db.backends.mysql' ,
         'USER' 'root' ,
         'PASSWORD' '123456' ,
         'HOST' '127.0.0.1' ,
         'PORT' '3306'
     }
}
from  graphite.app_settings  import  *
EOF

6、同步数据库

1
2
3
4
5
6
7
8
mkdir  - / opt / graphite / storage
cd  / etc / graphite - web /
django - admin syncdb  - - settings = local_settings  - - pythonpath = .
yes
root
zhengys@allentuns.com
123456
123456

7、修改graphite数据目录

1
chown  - R apache.apache  / opt / graphite / storage

8、启动服务

1
2
3
4
/ etc / init.d / carbon - cache start
chkconfig carbon - cache on
/ etc / init.d / httpd start
chkconfig httpd on

三、访问展示graphite

1、Chrome浏览器访问Ghipte的地址:

wKiom1UaGbvgMgkrAAIEjT1B2Zk181.jpg

2、提供监控网卡流量的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
[root@Allentuns ~] # cat network_traffic.py 
#!/usr/bin/env python
 
from  subprocess  import  Popen,PIPE
import  socket
import  shlex
import  time
import  sys
import  os
 
def  get_traffic(f):
     =  Popen(shlex.split(f),stdout = PIPE,stderr = PIPE)
     result  =  p.stdout.read()
     =  [i  for  in   result.split( '\n' )[ 3 :]  if  i]
     dic_traffic  =  {}
     for  in  d:
         devname  =  i.split( ':' )[ 0 ].strip()
         Receive  =  i.split( ':' )[ 1 ].split()[ 0 ].strip()
         Transmit  =  i.split( ':' )[ 1 ].split()[ 8 ].strip()
         dic_traffic[devname]  =  { 'in' :Receive, 'out' :Transmit}
     return  dic_traffic 
 
if  __name__  = =  '__main__' :
     try :
         HOST  =  '127.0.0.1'
     PORT  =  2003
         =  socket.socket()
         s.connect((HOST,PORT))
     except :
     print  "Couldn't connect to %(server)s on port %(port)d, is carbon-agent.py running?"  %  {'server ':HOST,' port':PORT}
     sys.exit( 1 )
 
     while  True :
         cur_traffic  =  get_traffic( 'cat /proc/net/dev' )
         time.sleep( 5 )
         five_s_traffic  =  get_traffic( 'cat /proc/net/dev' )
         diff_dic  =  {}
         for  in  cur_traffic:
         traffic_in  =  int (five_s_traffic[k][ 'in' ])  -  int (cur_traffic[k][ 'in' ])
         traffic_out  =  int (five_s_traffic[k][ 'out' ])  -  int (cur_traffic[k][ 'out' ])
         diff_dic[k]  =  { 'in' :traffic_in, 'out' :traffic_out}
     now  =  int (time.time())
     for  k,v  in  diff_dic.items():
         net_in  =  'network.%s_in %s %s\n'  %  (k,v[ 'in' ],now)
         net_out  =  'network.%s_out %s %s\n'  %  (k,v[ 'out' ],now)
         s.sendall(net_in)
         s.sendall(net_out)
     time.sleep( 5 )

3、后台方式运行监控网卡流量脚本

1
[root@Allentuns ~] # python network_traffic.py &

四、安装Diamond

diamond :搜集器、用于搜集数据

diamond的github官方站点:https://github.com/python-diamond/Diamond/wiki

1、安装Diamond

1
2
3
4
5
6
7
yum install gcc gcc - c + +  python - configobj python - pip python - devel
pip install diamond = = 3.4 . 421   (有时候会安装不成功)
如果下载安装不成功可以使用以下方式进行
wget https: / / pypi.python.org / packages / source / d / diamond / diamond - 3.4 . 421.tar .gz #md5=080ab9f52a154d81f16a4fd27d11093a
tar xf diamond - 3.4 . 421.tar .gz
cd diamond - 3.4 . 421
python setup.py install

2、配置

1
2
3
4
5
6
7
8
9
10
11
12
13
cd  / etc / diamond /
cp diamond.conf.example diamond.conf
主要修改三个配置文件:
[root@Allentuns diamond] # vim /etc/diamond/diamond.conf
`GraphiteHandler`   / / 59
host  =  localhost
`default`            / / 173
interval  =  10      / / 时间搜集一次
 
[root@Allentuns diamond] # vim /etc/diamond/handlers/ArchiveHandler.conf
#log_file = ./storage/archive.log //注释此行
[root@Allentuns diamond] # vim /etc/diamond/handlers/GraphiteHandler.conf 
host  =  localhost

3、启动diamond服务

1
2
3
chmod  + / etc / init.d / diamond 
/ etc / init.d / diamond start
chkconfig diamond on

五、继续访问展示diamond自动采集信息

1、Chrome浏览器访问Ghipte的地址:

你会发现在Graphite下多了一个servers的目录,这个目录就是diamond自动采集的信息

wKioL1UaG8fRUruvAAPm1blb_Gk327.jpg

2、在这里提供了两个python脚本,用来搜集web站点的httpcode,是基于diamond的方式

1
2
3
4
5
6
[root@Allentuns ~] # cd /usr/share/diamond/collectors
[root@Allentuns collectors] # mkdir httpcode && cd $_
[root@Allentuns httpcode] # ll
总用量  8
- rwxr - xr - 1  root root  1356  3 月   31  11 : 12  filerev.py
- rwxr - xr - 1  root root  3737  3 月   31  11 : 12  httpcode.py

3、运行搜集httpcode的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
首先删除原来diamond生成的servers目录
[root@Allentuns httpcode] # rm -rf /var/lib/carbon/whisper/servers/
然后手动运行diamond的httpcode脚本
[root@Allentuns httpcode] # diamond -f -l -r ./httpcode.py  -c /etc/diamond/diamond.conf
ERROR: Pidfile exists. Server already running?      #需要手动停止diamond服务
[root@Allentuns httpcode] # /etc/init.d/diamond stop
Stopping diamond:                                          [确定]
[root@Allentuns httpcode] # diamond -f -l -r ./httpcode.py  -c /etc/diamond/diamond.conf
[ 2015 - 03 - 31  11 : 13 : 56 , 198 ] [MainThread] Changed UID:  0  () GID:  0  ().
[ 2015 - 03 - 31  11 : 13 : 56 , 198 ] [MainThread] Loaded Handler: diamond.handler.graphite.GraphiteHandler
[ 2015 - 03 - 31  11 : 13 : 56 , 201 ] [MainThread] GraphiteHandler: Established connection to graphite server localhost: 2003.
[ 2015 - 03 - 31  11 : 13 : 56 , 202 ] [MainThread] Loaded Handler: diamond.handler.archive.ArchiveHandler
[ 2015 - 03 - 31  11 : 13 : 56 , 206 ] [MainThread] Loading Collectors  from : .
[ 2015 - 03 - 31  11 : 13 : 56 , 209 ] [MainThread] Loaded Module: httpcode
[ 2015 - 03 - 31  11 : 13 : 56 , 209 ] [MainThread] Loaded Collector: httpcode.HttpCodeCollector
[ 2015 - 03 - 31  11 : 13 : 56 , 209 ] [MainThread] Initialized Collector: HttpCodeCollector
[ 2015 - 03 - 31  11 : 13 : 56 , 210 ] [MainThread] Skipped loading disabled Collector: HttpCodeCollector
[ 2015 - 03 - 31  11 : 13 : 56 , 210 ] [MainThread] Started task scheduler.
[ 2015 - 03 - 31  11 : 13 : 57 , 211 ] [MainThread] Stopping task scheduler.
[ 2015 - 03 - 31  11 : 14 : 01 , 217 ] [MainThread] Stopped task scheduler.
[ 2015 - 03 - 31  11 : 14 : 01 , 217 ] [MainThread] Exiting.
如果没有报错,则查看浏览器会发现多了一个servers目录;但是当时目录就是没有生成,我还真纳闷了。原来在配置文件中没有启动此配置
[root@Allentuns httpcode] # vim httpcode.py
......
config  =  super (HttpCodeCollector,  self ).get_default_config()
         config.update({
             'path' :      'weblog' ,
             'enabled' :   'True'     #开启此选项
         })
 
 
如果用diamond来搜集,则无需此选项,因为diamond有针对类的配置文件,在配置文件中开启会比在脚本中开启看起来更统一

4、在脚本中关闭,在diamond中的配置文件中自动启用此选项

1
2
3
4
5
# cd /etc/diamond/collectors/
# cp CPUCollector.conf HttpCodeCollector.conf
# cat HttpCodeCollector.conf 
byte_unit = byte,
enabled =  true


5、浏览器查看

Chrome刷新Ghipte的web页面,查看

Ghipte -> servers -> ec2-54-201-82-69 -> weblog(自定义) -> http 会出现以下监控曲线图

我们可以使用ab -c 100 -n 100 http://localhost/ 产生200状态码

使用刷新Ghipte的浏览器页面产生304的状态码

wKioL1UaHCijRVkoAAMpNTmsVaU913.jpg

另外补充一个截图

wKioL1Uecj3hzB26AAMHwHEaGbs679.jpg

wKioL1Uoj-fhVkN9AAREo3dHnig752.jpg


  • 目前主流的开源监控有Cacti、Nagios、Zabbix等等,社区活跃,功能强大

  • Graphite虽然在功能上和社区在无法与此对比,但是在灵活度上还是值得一提的,轻量级的监控程序,更为重要的是Graphite是Python编写的,所以在问题排查,脚本编写等都会非常顺手

  • 同样也非常感谢更多Python开源者的贡献!!!




     本文转自zys467754239 51CTO博客,原文链接:http://blog.51cto.com/467754239/1626736 ,如需转载请自行联系原作者

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
存储 监控 语音技术
python实战讲解之强版监控系统(下)
python实战讲解之强版监控系统(下)
|
3月前
|
编解码 监控 网络安全
python实战讲解之强版监控系统(上)
python实战讲解之强版监控系统
|
12月前
|
监控 测试技术 Shell
性能测试 基于Python结合InfluxDB及Grafana图表实时监控Android系统和应用进程
性能测试 基于Python结合InfluxDB及Grafana图表实时监控Android系统和应用进程
234 0
性能测试 基于Python结合InfluxDB及Grafana图表实时监控Android系统和应用进程
|
12月前
|
监控 Linux 测试技术
性能测试 基于Python结合InfluxDB及Grafana图表实时采集Linux多主机性能数据
性能测试 基于Python结合InfluxDB及Grafana图表实时采集Linux多主机性能数据
105 0
|
12月前
|
Prometheus Cloud Native Unix
Prometheus 使用Python推送指标数据到Pushgateway
Prometheus 使用Python推送指标数据到Pushgateway
387 0
|
缓存 监控 Unix
Jmeter系列(38)- 详解性能监控工具 nmon
Jmeter系列(38)- 详解性能监控工具 nmon
451 0
Jmeter系列(38)- 详解性能监控工具 nmon
python_大智慧SAR指标编写
python_大智慧SAR指标编写
326 0
|
运维 监控 Oracle
python自动化运维-系统信息监控
python自动化运维-系统信息监控
224 0
|
Python
Python时间库大盘点
Python时间库大盘点
142 0
|
监控 固态存储 Linux
Python对系统数据进行采集监控——psutil
介绍一个可以获取当前系统信息的库——psutil
348 0
Python对系统数据进行采集监控——psutil