转贴请注明: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 配置文件的含义

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/

版权声明:本文为catkins原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/catkins/archive/2012/12/21/5270670.html