在这里我先讲解下他和cacti nagios的区别~  还有我们为什么要用他~

cacti 是通过snmp来进行抓数据,当然后期可以通过snmp进行exec调取脚本中的数据

nagios是用来监控服务器的各种的状态,当然通过pnp也可以实现画图

但是我为什么要用graphite,其实他就一个功能,把收到的数据展现到页面上~  

就这一个功能,我感觉就够用了~  

需求:

脚本的执行的效率

系统某个日志的分析得到的数值

在线人数

到各个网络节点的质量,延迟

公司的开发人员想看看api的调用次数

某个程序的调用的次数

每个进程延迟的时间统计

这些都可以很好的画图,比自己用rrdtool画图要方便的多~

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


一、 Graphite 项目简介

Graphite是一个企业级的监控工具,可以在廉价机硬件上运行。

二、 Graphite 功能

Graphite是一个画图工具,将数据以图形的方式展现出来。它主要做两件事:

  1. 存储时间序列数据

  2. 根据需要呈现数据的图形

Graphite不收集数据,有一些工具知道如何发送数据给Graphite。虽然需要一点代码,但是非常简单。

三、 简单架构

Graphite由三个软件组件组成:

  1. carbon - 一个Twisted守护进程,监听时间序列数据

  2. whisper - 一个简单的数据库库,用来存储时间序列数据,在设计上类似于RRD

  3. graphite webapp - Django webapp,使用 Cairo来根据需要呈现图形

架构图如下:
Graphite High Level

Graphite High Level

在这个图中我们可以看到Carbon先将数据写入到Whisper数据库文件中,然后Graphite Webapp去读取这个数据,然后显示出图形。但是实际上这个体系采用了缓存,数据可能先到缓存中,然后Webapp读取,显示出图形。这也是为什么在主机I/O反应不过来时Webapp的图形仍能以接近实时的方式显示。

喂数据相当简单,通常大部分的精力花在最开始收集数据时。当你发送数据点给Carbon, 他们马上可以在webapp中画图。webapp 提供几种方式创建和显示图形,包括简单的URL API ,这种呈现的方式可以很方便地将图形嵌入到其它Web页面。

四、 使用效果

下图是在浏览器中的效果:


000553402.jpg

shell的例子

 
  
  1. ORT=2003

  2. SERVER=graphite.your.org

  3. echo "local.random.diceroll 4 `date +%s`" | nc ${SERVER} ${PORT};

python的例子

 
  
  1. #!/usr/bin/python

  2. import sys

  3. import time

  4. import os

  5. import platform

  6. import subprocess

  7. from socket import socket

  8. CARBON_SERVER = '127.0.0.1'

  9. CARBON_PORT = 2003

  10. delay = 60

  11. if len(sys.argv) > 1:

  12. delay = int( sys.argv[1] )

  13. def get_loadavg():

  14.  # For more details, "man proc" and "man uptime"

  15.  if platform.system() == "Linux":

  16.    return open('/proc/loadavg').read().strip().split()[:3]

  17.  else:

  18. command = "uptime"

  19. process = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)

  20.    os.waitpid(process.pid, 0)

  21. output = process.stdout.read().replace(',', ' ').strip().split()

  22. lenlength = len(output)

  23.    return output[length - 3:length]

  24. sock = socket()

  25. try:

  26.  sock.connect( (CARBON_SERVER,CARBON_PORT) )

  27. except:

  28.  print "Couldn't connect to %(server)s on port %(port)d, is carbon-agent.py running?" % { 'server':CARBON_SERVER, 'port':CARBON_PORT }

  29.  sys.exit(1)

  30. while True:

  31. now = int( time.time() )

  32. lines = []

  33.  #We're gonna report all three loadavg values

  34. loadavg = get_loadavg()

  35.  lines.append("system.loadavg_1min %s %d" % (loadavg[0],now))

  36.  lines.append("system.loadavg_5min %s %d" % (loadavg[1],now))

  37.  lines.append("system.loadavg_15min %s %d" % (loadavg[2],now))

  38. message = '\n'.join(lines) + '\n' #all lines must end in a newline

  39.  print "sending message\n"

  40.  print '-' * 80

  41.  print message

  42.  print

  43.  sock.sendall(message)

  44.  time.sleep(delay)