Graphite简介

 

Graphite是一个用Python写的web应用,是一个企业级的系统监控工具...



很就没更新了,主要是之前写了一段时间文章后,发现写文章是一个掏空自己的过程,写着写着就感觉没什么可写的了,所以就停了。

最近在研究很多新的东西,感觉又有东西可以掰扯掰扯了,所以就厚着脸皮又开始折腾了 :P

言归正传,我们今天来掰扯掰扯Graphite这个开源工具。

Graphite引入的前提

之前公司的监控系统使用mysql做过物理设备cpu,内存,磁盘和网卡等资源的数据统计功能,但是效果并不好。因为这些统计数据不适合用mysql来存储,它们的量太大了,量一大,mysql数据库查询响应就变得非常缓慢。所以后来就把cpu,内存,磁盘和网卡等资源的数据统计功能去掉了。

最近对监控系统又增加了一些需求,主要也是一些数据统计的功能。所以如果还按以前的路来走,使用mysql来做,那么结局必然跟cpu,内存,磁盘和网卡等资源的数据统计功能是一样的。所以我们不能走老路,我们必须寻找新的解决方案。

后来经过调研,我们找到了Graphite这个工具。它天生就是用来做数据统计功能的,正好满足我们目前的需求,所以我们对它进行了研究。

Graphite简介

Graphite是一个用Python写的web应用,是一个企业级的系统监控工具,可以在廉价机硬件上运行。它由三个软件组件组成:

1:carbon - 一个Twisted守护进程,监听并接收时间序列数据

2:whisper - 一中固定大小的数据库,用来存储时间序列数据,在设计上类似于RRD

3:graphite-web – 使用Django框架实现的一个webapp,它可以从whisper数据库获取时间序列数据并且进行展示。

Graphite的系统架构如下所示(盗了一张别人的图):



图中的metrics就是发送给Graphite系统的数据指标,这些发送过来的数据指标,首先通过carbon模块进行收集,然后存储在whisper数据库中,最后graphite-web从whisper数据库中获取这些数据指标并进行展示。

如何给Graphite喂数据

Graphite不负责收集数据,数据的收集工作是由使用Graphite的人来做的。也就是说图中metrics的发送工作是由使用Graphite的人来做的。你想使用Graphite存储什么数据,你就给Graphite发送什么数据。Graphite采用简单的文本协议,给Graphite发送数据指标时,使用它定义好的数据格式给他发送数据指标就可以。

Graphite的指标数据的文本格式定义如下:

metric_path value timestamp

1:metric_path : 指标名称

2:value : 指标值1:metric_path : 指标名称

3;timestamp : 时间戳

下面是使用shell给Graphite发送指标的例子:

ORT=2003

SERVER=graphite.your.org

echo "local.random.diceroll 4 `date +%s`" | nc ${SERVER} ${PORT};

如果要使用代码给Graphite喂数据,那么应该是使用下面几个步骤:

1:使用Graphite所在机器的IP和端口(2003或者2004)建立一个到Graphite的网络连接

2:收集数据指标

3:把收集的数据指标格式化成“metric_path value timestamp
“格式的字符串

4:把格式化后的字符串通过之前建立的网络连接发送出去

Graphite跟现有监控系统整合

如果现有的监控系统想使用Graphite来做数据统计相关的功能,需要做以下三件事情:

1:在收集端添加给Graphite发送数据指标的代码

2:在展示端使用graphite-web提供的API接口获取whisper数据库里面的数据,并生成适合现有监控系统的API接口,供监控系统前端页面使用

3:增加各项指标的前端展示页面,展示这些指标

当然目前对于收集端和展示端,都有很多现成的开源组件可以使用,比如指标收集端的工具有Statsd等,指标展示端口的工具有grafana等。

使用开源的工具,还是基于graphite做二次开发,视自己的实际情况而定,应该来说都不复杂。


    关注 程序媛小菜


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册