WEB监控系列第一篇:web监控搭建——graphite+statsd(单机搭建)
转贴请注明:http://blog.csdn.net/crazyhacking/article/details/8363235
这篇写的太凌乱了,没有逻辑性,不过内容稍多。请参考第二篇文章:WEB监控系列第二篇:web监控搭建——graphite+statsd(服务器上搭建)
一 graphite
1 简介
参考自:http://www.jsxubar.info/graphite-introduction.html/
基本
Graphite是一个企业级的监控工具,可以在廉价机硬件上运行.
简介
Graphite是一个画图工具,将数据以图形的方式展现出来。它主要做两件事:
-
存储时间序列数据
根据需要呈现数据的图形
Graphite不收集数据,有一些工具知道如何发送数据给Graphite。虽然需要一点代码,但是非常简单
-
Graphite由三个软件组件组成:
- 简单架构
-
carbon – 一个Twisted守护进程,监听时间序列数据
whisper – 一个简单的数据库库,用来存储时间序列数据,在设计上类似于RRD
graphite webapp – Django webapp,使用 Cairo来根据需要呈现图形
架构图如下:
-
在这个图中我们可以看到Carbon先将数据写入到Whisper数据库文件中,然后Graphite Webapp去读取这个数据,然后显示出图形。但是实际上这个体系采用了缓存,数据可能先到缓存中,然后Webapp读取,显示出图形。这也是为什么在主机I/O反应不过来时Webapp的图形仍能以接近实时的方式显示。
2 安装
Graphite安装主要参考:http://www.jsxubar.info/graphite-installation.html (apache代替为nginx)
查看graphite
http://127.0.0.1:8080/
安装问题:
1 最后感觉一些正常,但是只能看到nginx的欢迎页面。原因是graphite没有启动。
./run-graphite-devel-server.py runserver
Running Graphite from runserver under django development server
/usr/bin/django-admin runserver –pythonpath runserver/webapp –settings graphite.settings 0.0.0.0:8080
Error: Could not import settings \’graphite.settings\’ (Is it on sys.path?): No module named graphite.settings
报错了,原因是找不到这个文件graphite.settings
sudo /opt/graphite/bin/run-graphite-devel-server.py –libs=/opt/graphite/webapp/ /opt/graphite/ &
3 运行
sudo /opt/graphite/bin/run-graphite-devel-server.py –libs=/opt/graphite/webapp/ /opt/graphite/ &
二 使用statsd
1概念
statsd产生数据,可以喂数据给graphite。 collectd也可以喂数据,但是不知道有没有可以监听web端口的功能。
statsd is a client for Etsy\’s node-js statsd server.
- 2安装:
官网(主要参考安装):https://github.com/etsy/statsd
ubuntu安装脚本:Turn an Ubuntu 10.04 server into a StatsD/Graphite server:https://gist.github.com/1142828
http://www.kinvey.com/blog/89/how-to-set-up-metric-collection-using-graphite-and-statsd-on-ubuntu-1204-lts
Understanding StatsD and Graphite:http://blog.pkhamre.com/2012/07/24/understanding-statsd-and-graphite/
statsd Installation and Configuration
- Install node.js
- Clone the project
- Create a config file from exampleConfig.js and put it somewhere
-
Start the Daemon:
node stats.js /path/to/config
- ./run_tests.sh
Cannot find nodeunit module.
Make sure to run \’npm install nodeunit\’
sudo /usr/local/bin/npm install nodeunit
./run_tests.sh
module.js:340
throw err;
^
node stats.js Config.js
25 Dec 19:56:57 – reading config file: Config.js
25 Dec 19:56:57 – server is up
events.js:71
throw arguments[1]; // Unhandled \’error\’ event
^
Error: listen EADDRINUSE
at errnoException (net.js:770:11)
at Server._listen2 (net.js:910:14)
at listen (net.js:937:10)
at Server.listen (net.js:986:5)
at /opt/statsd/stats.js:299:16
at exports.configFile (/opt/statsd/lib/config.js:36:5)
at EventEmitter.emit (events.js:96:17)
at Configurator.updateConfig (/opt/statsd/lib/config.js:18:12)
at fs.readFile (fs.js:176:14)
at Object.oncomplete (fs.js:297:15)
3 喂数据
参考自:http://www.jsxubar.info/graphite%E8%8E%B7%E5%8F%96%E6%95%B0%E6%8D%AE.html
Graphite信息格式
所有graphite信息格式如下:
1
|
metric_path value timestamp\n |
官方示例如下:
1
2
3
|
PORT=2003 SERVER=graphite.your.org echo "local.random.diceroll 4 `date +%s`" | nc ${SERVER} ${PORT}; |
比如使用shell script以每分钟一次的频率产生当前进程总数的数据,并将数据发送到本机的graphite,脚本运行1小时:
1
2
3
4
5
6
7
|
i=1; while [ $i -le 60 ] do echo "local.system.proc_numbers `ps aux |sed 1d |wc -l` `date +%s`" |nc 127.0.0.1 2003;
sleep 60 ;
let "i=i+1";
done |
其中单条数据内容(由“echo “local.system.proc_numbers `ps aux |sed 1d |wc -l` `date +%s`” |nc 127.0.0.1 2003; ”命令产生)类似如下:
1
2
3
4
5
6
|
local.system.proc_numbers 71 1341198181 local.system.proc_numbers 71 1341198182 local.system.proc_numbers 71 1341198183 local.system.proc_numbers 71 1341198184 local.system.proc_numbers 70 1341198185 local.system.proc_numbers 70 1341198186 |
也就是说只要符合上面格式的都可以发过去。
nc命令是一个网络端口通信命令。把数据发到127.0.0.1 2003这个地方。
这样,一条命令就可以把数据过去。
三Graphite和stastd配合使用
1配置
graphite配置文件
(1)run-graphite-devel-server.py:option_parser.add_option(\’–port\’, default=8080, action=\’store\’, type=int, help=\’Port to listen on\’)
8080 这个配置graphite的监听端口。也就是说打开这个端口就能看到graphite的界面。
(1)carbon 配置
carbon.conf
conf/carbon.conf:LINE_RECEIVER_PORT = 2003
conf/carbon.conf:UDP_RECEIVER_PORT = 2003
2003 设置carbon的接收数据端口,把数据传到这个端口上
conf/carbon.conf:LINE_RECEIVER_INTERFACE = 0.0.0.0
设置carbon的接收数据地址,把数据传到这个IP地址上
(2)whisper
storage-schemas.conf配置文件定义数据的存储格式。
(3)webapp(画图)
/opt/graphite/webapp/graphite/local-settings.py #时间需要修改。TIME_ZONE = \’America/Los_Angeles改成TIME_ZONE = \’Asia/Shanghai\’
(4)graphite.wsgi配置文件配置django
2 图像与数据对应的问题
(1) 直接用脚本语言等比较简单。用statsd喂数据的话 看不出图像与数据的对应关系。
xiao.incr(“test”,50)
xiao.incr(“test”,50)
xiao.incr(“test”,50)
xiao.incr(“test”,50)
xiao.incr(“test”,50)
xiao.incr(“test”,50)
连续发送6次,结果显示是30,是应得结果的1/10.
一连串数据发出后 图像显示波峰后,会自动变为0。
解释:
storage-schemas.conf中:
pattern = ^stats\..*
retentions = 10s:6h,1m:7d,10m:1y
这个数据test是stats.test。那么10s收集1次,10 s得到的结果是300,那么1s是30.图像显示的是每秒的平均值。
2 运行
1启动graphite
启动nginx,
启动carbon graphite/bin/carbon-cache.py start
启动graphite webapp sudo /opt/graphite/bin/run-graphite-devel-server.py –libs=/opt/graphite/webapp/ /opt/graphite/ &
2启动statsd
node stats.js /path/to/config
3 发送数据(使用方法参考statsd使用说明,并稍作修改)
python
import statsd
#使用help(statsd)查看这个模块的方法
ccc=statsd.client.StatsClient(host=\’127.0.0.1\’,port=8125)#
ccc.incr(“hello”,5)#
官方使用说明:
>>> import statsd >>> >>> # Open a connection to `server` on port `1234` with a `50%` sample rate >>> statsd_connection = statsd.Connection( ... host=\'server\', ... port=1234, ... sample_rate=0.5, ... ) >>> >>> # Create a client for this application >>> statsd_client = statsd.Client(__name__, statsd_connection) >>> >>> class SomeClass(object): ... def __init__(self): ... # Create a client specific for this class ... self.statsd_client = statsd_client.get_client( ... self.__class__.__name__) ... ... def do_something(self): ... # Create a `timer` client ... timer = self.statsd_client.get_client(class_=statsd.Timer) ... ... # start the measurement ... timer.start() ... ... # do something ... timer.interval(\'intermediate_value\') ... ... # do something else ... timer.stop(\'total\')
四 nginx 和 uWSGI 搭建web服务器
1简介
2安装
nginx 和 uWSGI主要参考:fedora16上搭建 nginx 和 uWSGI:http://hi.baidu.com/xiazhujie/item/e797d146d2e9492c11ee1e41
快速部署Python应用:Nginx+uWSGI配置详解:http://developer.51cto.com/art/201010/229615_1.htm
可以参考的文章和站点:
-
参考资料:
1.2. -
扩展阅读:
1.2.Graphite协作工具
3.Graphite和collectd建立监控服务器
4.Graphite Faq中文版
五 问题:
1 配置文件的含义
statsd的配置文件 /opt/statsd/Config.js
graphitePort: 2003 #port of Graphite server
, graphiteHost: “127.0.0.1” #hostname or IP of Graphite server
, port: 8125 #port: StatsD listening port [default: 8125]
, backends: [ “./backends/graphite” ]
, repeater: [ { host: “10.8.3.214”, port: 8125 } ]
, repeaterProtocol: “udp4”
}
六 安装过程涉及到的其他软件
1 node.js
Node入门
http://www.nodebeginner.org/index-zh-cn.html 适合初学者的书籍
参考:http://www.infoq.com/cn/articles/what-is-nodejs
Node.js不是JS应用、而是JS运行平台
Node.js采用C++语言编写而成,是一个Javascript的运行环境。既然不是Javascript应用,为何叫.js呢?因为Node.js是一个Javascript的运行环境。提到Javascript,大家首先想到的是日常使用的浏览器,现代浏览器包含了各种组件,包括渲染引擎、Javascript引擎等,其中Javascript引擎负责解释执行网页中的Javascript代码。作为Web前端最重要的语言之一,Javascript一直是前端工程师的专利。不过,Node.js是一个后端的Javascript运行环境(支持的系统包括*nux、Windows),这意味着你可以编写系统级或者服务器端的Javascript代码,交给Node.js来解释执行,简单的命令类似于:
#node helloworld.js
2 Django
使用Django开发一个图书管理系统 http://www.cnblogs.com/lt1983/archive/2012/05/17/2506439.html
3 Zabbix 或者nagios 可以用来报警
七 参考资料
debian wheezy下以uwsgi安装graphite
http://shell909090.com/blog/2012/07/debian-wheezy%E4%B8%8B%E4%BB%A5uwsgi%E5%AE%89%E8%A3%85graphite/