热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WEB监控系列第一篇:web监控搭建——graphite+statsd(单机搭建)

转贴请注明:http:blog.csdn.netcrazyhackingarticledetails8363235这篇写的太凌乱了,没有逻辑性ÿ

转贴请注明: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.

    Graphite简介 

    http://www.jsxubar.info/graphite-introduction.html/

    2.

    Graphite官方网站 

    http://graphite.wikidot.com/

  • 扩展阅读:

    1.

    Graphite安装

    http://www.jsxubar.info/graphite-installation.html/

    2.

    Graphite协作工具

    http://www.jsxubar.info/graphite-tools.html/

    3.

    Graphite和collectd建立监控服务器

    http://www.jsxubar.info/collectd-feed-graphite.html/

    4.

    Graphite Faq中文版

    http://www.jsxubar.info/graphite-faq-zh_cn.html/



五   问题:

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/


转:https://www.cnblogs.com/catkins/archive/2012/12/21/5270670.html



推荐阅读
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 大坑|左上角_pycharm连接服务器同步写代码(图文详细过程)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了pycharm连接服务器同步写代码(图文详细过程)相关的知识,希望对你有一定的参考价值。pycharm连接服务 ... [详细]
  • python3 logging
    python3logginghttps:docs.python.org3.5librarylogging.html,先3.5是因为我当前的python版本是3.5之所 ... [详细]
  • Django学习笔记之djangodebugtoolbar使用指南
    介绍django-debug-toolbar是一组可配置的面板,可显示有关当前请求响应的各种调试信息,并在单击时显示有关面板内容的更多详细信息。github地址文档地址安装配置1. ... [详细]
  • 都说Python处理速度慢,为何月活7亿的 Instagram依然在使用Python?
    点击“Python编程与实战”,选择“置顶公众号”第一时间获取Python技术干货!来自|简书作者|我爱学python链接|https:www.jian ... [详细]
  • 本文内容皆为作者原创,如需转载,请注明出处:https:www.cnblogs.comxuexianqip13045462.html1.自定义分页器的拷贝及使用当我们需要使用 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
author-avatar
usx7054252
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有