Chinaunix首页 | 论坛 | 博客
  • 博客访问: 59692
  • 博文数量: 10
  • 博客积分: 393
  • 博客等级: 一等列兵
  • 技术积分: 124
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-09 09:37
文章分类

全部博文(10)

文章存档

2012年(1)

2011年(5)

2010年(4)

我的朋友

分类: 系统运维

2010-11-24 16:06:31

 weathermap 分析

【Realgod原创,转贴请注明,尊重别人的劳动果实,谢谢!】

前段时间简单搞了下weathermap,起因是因为我们这边网络部门需要weathermap。但是现实的情况是:我们目前网络的监控流量数据已经不存rrd,改存mysql了,而weathermap目前不支持,所以,没办法,只能对weathermap的代码开刀了,经过几天研究,小有收获,故分享一下。


weathermap运行模式:

1. CACTI集成
2. CLIENT方式运行。

第一种cacti集成的我就不解释了,哪个比较方便,而且脱离不了rrd,重点介绍第2种。

weathermap运行方法:

通过$path/weathermap --config conf_file --output xxx.png --htmloutput xxx.html来运行

实际weathermap在运行的时候干了啥事情呢??

1. 读参数,通过pear的Console_Getopt读了上述输入参数
2. 创建一个weathermap对象的实例:$map
3. 将运行模式设置成cli方式,并载入lib目录下的plugins。
4. 读--config指定的配置文件,如果不指定,则读当前目录下默认的weathermap.conf文件
5. 分析NODE,LINK数据
6. 读LINK下targent指定的DATA数据(这个是此次改造的重点)
7. 画图并生成html文件

根据上面的步骤,可以看到改造weathermap的重点在读数据,也就是他定义的ReadData方法上。
但是这东西具体是怎么工作的呢??通过读代码,知道了weathermap的设计思想:

所有的读数据插件均在如下目录: lib/datasources目录下,而且这目录下的文件命名是有规范的,比如你文件名叫abcd.php,则这个文件里面必须有一个名叫abcd的类定义,如果没有这个,则这个插件定义是无效的

weathermap首先读取这个lib/datasources目录下所有以.php结尾的文件,不是php结尾的将跳过,然后include_once($file),然后去掉文件的扩展名,这样,就得到了该文件中类的名字。。。然后初始化,调用Init方法,如果返回为TRUE,说明该插件可用,如果返回为FALSE,则不再include该文件!

OK,知道了插件的定义规范,咱就得来看看一条普通的target配置语句: TARGET 1.1.1.1_xxxx.rrd:in:out 是如何被识别并如何读取数据的呢??

原来:上述插件的没个类里面定义了如下几个方法:
Init   #顾名思义。。。
Recognise   #顾名思义,识别,这个很重要,是通过这个方法里面定义的preg_match来识别你的target字符串含义的!非常重要!!
ReadData #顾名思义,读数据接口,如果你熟悉rrdtool的话,看这段将非常容易,原来weathermap是这样来取最近一笔数据的啊!!

OK,介绍了上面最重要的3个方法,然后又了解到了函数的返回值,OK,我们可以来定义自己的数据接口插件了!!

首先,我们新建一个文件: weathermap_mysql.php,文件名定了,其实该文件中包含的类名称也就确定了,叫 weathermap_mysql
这个类下面,应该最少有这3个方法:Init,Recognise和ReadData
Init这个好说,也很简单,调用他,啥也不做,当然,你也可以做下你的环境检查,比如是否装有mysql-client等,根据检查结果返回true or false
Recognise,这个非常重要,这个里面的定义,其实就是conf文件里面target字段后面的那串东西了,只有在这里定义好,才能正确识别数据类型,比如我定义如下: 凡是开头为"MYSQL",第2字段:IP,第3字段:端口,第4字段:traffic_in的DS名称,第5字段:traffic_out的DS名称,这样的格式,才被认为是标准的自定义MYSQL数据,ok,有了标准,咱来写正则匹配就简单了preg_match("/^MYSQL:(.*):(.*):(\S+):(\S+)$/",$str,$match); 然后将$host=$match[1],$service=$match[2] 等,这样就取到了我们需要的数据了!!

最主要的ReadData方法:
其实也比较简单,既然已经有了主机,端口,IN,OUT的ds名称,大家根据各自的数据库表结构,搜结果就OK了。。。根据时间排序,取最近3笔数据,然后在从3笔数据中取最近的1个数据作为结果返回就OK了!!

好了,上述3个方法写完,就可以测试了。。。

编辑文件:test.conf
然后按照标准,定义NODE,定义LINK,注意,在LINK的TARGET栏目里面,根据我们的标准,写TARGET MYSQL:1.1.1.1:TRAFFIC_G0/1:traffic_in:traffic_out
其他的根据weathermap的标准写就OK

写好了保存退出,然后运行如下命令:
./weathermap --config ./test.conf --output test.png --htmloutput test.html --debug >~/test.log 2>&1
跑完看下结果,打开浏览器访问:
看能否正常出数据!如果有数据,恭喜你,你的数据库接口搞定!以后weathermap可以读取你自己的数据了,不再依赖rrd咯。。。

如果不行,请到~/test.log里面去查原因吧!
阅读(3258) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

exp072012-01-16 13:16:29

顶,mark

realgod2010-11-29 14:31:55

第一种? 你的意思是:你的weathermap是跟CACTI集成的?? 那个很简单啊。。。 请到weathermap官网上看下介绍就OK了,你只需要做简单的配置,完全不需要重新写类的,按官网上的介绍即可!

chinaunix网友2010-11-25 01:11:55

我的是第一种,实在是不知道怎么完成ReadData的……能给点指导么?

chinaunix网友2010-11-24 20:46:32

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com