本文共 2347 字,大约阅读时间需要 7 分钟。
cacti 是通过snmp来进行抓数据,当然后期可以通过snmp进行exec调取脚本中的数据
nagios是用来监控服务器的各种的状态,当然通过pnp也可以实现画图
但是我为什么要用graphite,其实他就一个功能,把收到的数据展现到页面上~
就这一个功能,我感觉就够用了~
需求:
脚本的执行的效率
系统某个日志的分析得到的数值
在线人数
到各个网络节点的质量,延迟
公司的开发人员想看看api的调用次数
某个程序的调用的次数
每个进程延迟的时间统计
这些都可以很好的画图,比自己用rrdtool画图要方便的多~
Graphite是一个企业级的监控工具,可以在廉价机硬件上运行。
Graphite是一个画图工具,将数据以图形的方式展现出来。它主要做两件事:
存储时间序列数据
根据需要呈现数据的图形
Graphite不收集数据,有一些工具知道如何发送数据给Graphite。虽然需要一点代码,但是非常简单。
Graphite由三个软件组件组成:
carbon - 一个守护进程,监听时间序列数据
whisper - 一个简单的数据库库,用来存储时间序列数据,在设计上类似于
graphite webapp - webapp,使用 来根据需要呈现图形
在这个图中我们可以看到Carbon先将数据写入到Whisper数据库文件中,然后Graphite Webapp去读取这个数据,然后显示出图形。但是实际上这个体系采用了缓存,数据可能先到缓存中,然后Webapp读取,显示出图形。这也是为什么在主机I/O反应不过来时Webapp的图形仍能以接近实时的方式显示。
相当简单,通常大部分的精力花在最开始收集数据时。当你发送数据点给Carbon, 他们马上可以在webapp中画图。webapp 提供几种方式创建和显示图形,包括简单的 ,这种呈现的方式可以很方便地将图形嵌入到其它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
sock.sendall(message)
time.sleep(delay)
转载地址:http://efwda.baihongyu.com/