在这里我先讲解下他和cacti nagios的区别~ 还有我们为什么要用他~
cacti 是通过snmp来进行抓数据,当然后期可以通过snmp进行exec调取脚本中的数据
nagios是用来监控服务器的各种的状态,当然通过pnp也可以实现画图
但是我为什么要用graphite,其实他就一个功能,把收到的数据展现到页面上~
就这一个功能,我感觉就够用了~
需求:
脚本的执行的效率
系统某个日志的分析得到的数值
在线人数
到各个网络节点的质量,延迟
公司的开发人员想看看api的调用次数
某个程序的调用的次数
每个进程延迟的时间统计
这些都可以很好的画图,比自己用rrdtool画图要方便的多~
http://graphite.readthedocs.org/en/latest/index.html
一、 Graphite 项目简介
Graphite是一个企业级的监控工具,可以在廉价机硬件上运行。
二、 Graphite 功能
Graphite是一个画图工具,将数据以图形的方式展现出来。它主要做两件事:
-
存储时间序列数据
-
根据需要呈现数据的图形
Graphite不收集数据,有一些工具知道如何发送数据给Graphite。虽然需要一点代码,但是非常简单。
三、 简单架构
Graphite由三个软件组件组成:
在这个图中我们可以看到Carbon先将数据写入到Whisper数据库文件中,然后Graphite Webapp去读取这个数据,然后显示出图形。但是实际上这个体系采用了缓存,数据可能先到缓存中,然后Webapp读取,显示出图形。这也是为什么在主机I/O反应不过来时Webapp的图形仍能以接近实时的方式显示。
喂数据相当简单,通常大部分的精力花在最开始收集数据时。当你发送数据点给Carbon, 他们马上可以在webapp中画图。webapp 提供几种方式创建和显示图形,包括简单的URL API ,这种呈现的方式可以很方便地将图形嵌入到其它Web页面。
四、 使用效果
下图是在浏览器中的效果:
shell的例子
-
ORT=2003
-
SERVER=graphite.your.org
-
echo "local.random.diceroll 4 `date +%s`" | nc ${SERVER} ${PORT};
python的例子
-
#!/usr/bin/python
-
import sys
-
import time
-
import os
-
import platform
-
import subprocess
-
from socket import socket
-
CARBON_SERVER = '127.0.0.1'
-
CARBON_PORT = 2003
-
delay = 60
-
if len(sys.argv) > 1:
-
delay = int( sys.argv[1] )
-
def get_loadavg():
-
# For more details, "man proc" and "man uptime"
-
if platform.system() == "Linux":
-
return open('/proc/loadavg').read().strip().split()[:3]
-
else:
-
command = "uptime"
-
process = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
-
os.waitpid(process.pid, 0)
-
output = process.stdout.read().replace(',', ' ').strip().split()
-
lenlength = len(output)
-
return output[length - 3:length]
-
sock = socket()
-
try:
-
sock.connect( (CARBON_SERVER,CARBON_PORT) )
-
except:
-
print "Couldn't connect to %(server)s on port %(port)d, is carbon-agent.py running?" % { 'server':CARBON_SERVER, 'port':CARBON_PORT }
-
sys.exit(1)
-
while True:
-
now = int( time.time() )
-
lines = []
-
#We're gonna report all three loadavg values
-
loadavg = get_loadavg()
-
lines.append("system.loadavg_1min %s %d" % (loadavg[0],now))
-
lines.append("system.loadavg_5min %s %d" % (loadavg[1],now))
-
lines.append("system.loadavg_15min %s %d" % (loadavg[2],now))
-
message = '\n'.join(lines) + '\n' #all lines must end in a newline
-
print "sending message\n"
-
print '-' * 80
-
print message
-
print
-
sock.sendall(message)
-
time.sleep(delay)