Python性能监控Graphite

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

一、简介

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'     #开启此选项