zoukankan      html  css  js  c++  java
  • 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 配置文件的含义

    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/

  • 相关阅读:
    telnet退出
    Eclipse srever起来时,时间超过45s。
    maven报错 Failure to transfer org.apache.maven.plugins:maven-compiler-plugin:pom:3.5.0 from
    需求讨论
    PyTorch学习笔记之计算图
    PyTorch学习笔记之CBOW模型实践
    PyTorch学习笔记之n-gram模型实现
    PyTorch学习笔记之初识word_embedding
    7月3日-9日_周报
    python学习笔记之heapq内置模块
  • 原文地址:https://www.cnblogs.com/catkins/p/5270670.html
Copyright © 2011-2022 走看看