注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

itoedr的it学苑

记录从IT文盲学到专家的历程

 
 
 

日志

 
 

Weathermap如何使用Zabbix\cacti  

2013-06-24 14:09:00|  分类: 系统维护 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

cacti与Weathermap整合;
http://www.network-weathermap.com/manual/latest/pages/install-cacti-editor.html
zabbix与Weathermap整合;
http://www.zabbix.com/forum/showthread.php?t=9873

weathermap-cacti-plugin(转存)


今天继续啃weathermap的php代码,因为lib的readdata里return了$inbw和$outbw,尝试在之前理解的ReadConfig()相应match处加上了一段 if($inbw=='0'){$this->width=0;$linematched++;}elseif…… 等几分钟后cache过期,一看weathermap效果,所有的链路曲线箭头图都变成了一根直线~~然后仔细看了看这串if之前的while,发现原来 weathermap不是每次针对数据进行config匹配,而是统一读取一次config。也就是说ReadConfig()里的任何修改都会对全局起 作用。

既然在源头的配置参数无法修改,那么就只能在末端的绘图的时候做出改变了,找到 draw_curve() 函数,这个函数就是画线的。最终由 Draw() 函数分别调用 calc_curve 描点,draw_curve 连线,drawlabel 画框。Draw() 内容是一个顺序处理过程,在最后的 drawlabel() 前面,可以很清晰的看到 $task[*] 是怎么取出的:

$outbound=array($q1_x,$q1_y,0,0,$this->outpercent,$this->bandwidth_out,$q1_angle);
$inbound=array($q3_x,$q3_y,0,0,$this->inpercent,$this->bandwidth_in,$q3_angle);

那么在draw_curve()前面,依葫芦画瓢来上一段就好了:

if(($this->bandwidth_out == '0') && ($this->bandwidth_in == '0'))
{
    $link_width='0';
}
else
{
    $link_width=$this->width;
}
draw_curve($im, $this->curvepoints, $link_width, $outline_colour, $comment_colour, array($link_in_colour, $link_out_colour), $this->name, $map);

这个改完当然不能看到效果,看到就该排障去了~不过可以采用一点变通的方法来验证一下,比如某些线路现在比较空闲,我们就把预定的阀值0(断网的流量)改大一些,刚好超过某个空载线路即可了:

比如改成 if ( $this->bandwidth_out < '1000' ) 的话,weathermap效果变成如下:

wethermap

其中两条流量小于1000bits的线路,其width就变成了0,只留下一条直线了~~

至于为了 width==0 却还留下了一条线,这就跟weathermap的绘图方式有关了。draw_curve 中是这么利用gd画图的:

  1. 根据node的位置,获取在二维空间上的x轴、y轴坐标,在两个node之间通过打点的方式进行矢量连线;
  2. 获取设定的width,将之前的坐标点平移相应的位置,再次打点;
  3. 在连线的中点处绘制箭头;
  4. 填充颜色。

如果要完全去除掉这根连线,或许可以在 draw_curve 中设定其连线长度为0?在 draw_curve() 中有一个变量叫 $totaldistance,指的是两个node之间的距离,之后包括箭头、文字等,都是以这个变量*50%来计算的。添加 if($this->bandwidth_out<1000){$totaldistance=0},等了十分钟再刷新,可图片依然没有更新!

继续看 $totaldistance 是怎么得出的,看到了 $this->curvepoints,而 $this->curvepoints 是通过 calc_curve($xpoints, $ypoints) 返回的。那么在 Draw() 中继续修改 $this->curvepoints 即可。变通一下上面的测试代码如下:

$link_width=$this->width;
$this->curvepoints = calc_curve($xpoints, $ypoints);
if ( $this->bandwidth_out < '2000' )
{
    $link_width=0; //没有连线的话,宽度设啥都一样了~
    $this->curvepoints = array( );
}

稍后刷新页面,看到原来的连线已经不见了~ 不过从效果图来看,少了连线反而不起眼了,还不如留着一根线容易引起警觉……

new-weathermap




zabbix与weathermap整合资料:


I just start to use Zabbix few weeks ago and I'm really impressed by the product philosophy and possibilities...

I'm an old nagios user and several things I actually use with nagios or cacti are missing.

First one was Network Weather Map (www.network-weathermap.com) integration.

So I made a datasource plugins in order to retrieve item value from zabbix history and use it in network weather map :

The Target syntax is : zabbix:itemid_of_IN_value:temid_of_OUT_value


You need to write down the itemid of each item you want to integrate with. A little bit anoying, but that's working !

Also The plugin use only History_uint table for retreiving data.


/weathermap/lib/datasources/WeatherMapDataSource_zabbix.php

Code:
<?php
// Zabbix Pluggable datasource for PHP Weathermap 0.9
// - read a pair of values from a database, and return it
// Actually the plugin look only in history_uint table
// TARGET zabbix:in:out

class WeatherMapDataSource_zabbix extends WeatherMapDataSource {

        function Init(&$map)
        {
                if(! function_exists("mysql_real_escape_string") ) return FALSE;
                if(! function_exists("mysql_connect") ) return FALSE;

                return(TRUE);
        }

        function Recognise($targetstring)
        {

         if(preg_match("/^zabbix:([\-a-zA-Z0-9_]+):([\-a-zA-Z0-9_]+)$/",$targetstring,$matches))

                {
                        return TRUE;
                }
                else
                {
                        return FALSE;
                }
        }

        function ReadData($targetstring, &$map, &$item)
        {
                $data[IN] = NULL;
                $data[OUT] = NULL;
                $data_time = 0;

                if(preg_match("/^zabbix:([\-a-zA-Z0-9_]+):([\-a-zA-Z0-9_]+)$/",$targetstring,$matches))
                {
                        $database_user = $map->get_hint('zabbix_dbuser');
                        $database_pass = $map->get_hint('zabbix_dbpass');
                        $database_name = $map->get_hint('zabbix_dbname');
                        $database_host = $map->get_hint('zabbix_dbhost');

                        $raw_in = mysql_real_escape_string($matches[1]);
                        $raw_out= mysql_real_escape_string($matches[2]);

                        debug ("Found for IN Value :  $raw_in \n");
                        debug ("Found for OUT Value :  $raw_out \n");

                        $SQL_IN = "select value from history_uint where itemid=$raw_in order by clock desc limit 1";
                        $SQL_OUT = "select value,clock from history_uint where itemid=$raw_out order by clock desc limit 1";
                        if(mysql_connect($database_host,$database_user,$database_pass))
                        {
                                if(mysql_select_db($database_name))
                                {
                                        $result_IN = mysql_query($SQL_IN);
                                        if (!$result_IN)
                                        {
                                            warn("Zabbix ReadData: Invalid query for IN Value: " . mysql_error()."\n");
                                        }
                                        else
                                        {
                                                $row_IN = mysql_fetch_assoc($result_IN);
                                                $data[IN] = $row_IN['value'];
                                        }
                                        $result_OUT = mysql_query($SQL_OUT);
                                        if (!$result_OUT)
                                        {
                                            warn("Zabbix ReadData: Invalid query for OUT Value: " . mysql_error()."\n");
                                        }
                                        else
                                        {
                                                $row_OUT = mysql_fetch_assoc($result_OUT);
                                                $data[OUT] = $row_OUT['value'];
                                                $data_time = $row_OUT['clock'];
                                        }



                                }

                                else
                                {
                                        warn("Zabbix ReadData: failed to select database ($database_name): ".mysql_error()."\n");
                                }
                        }
                        else
                        {
                                warn("Zabbix ReadData: failed to connect to database server: ".mysql_error()."\n");
                        }

                //      $data_time = now();
                }


                debug ("RRD ReadData: Returning (".($data[IN]===NULL?'NULL':$data[IN]).",".($data[OUT]===NULL?'NULL':$data[IN]).",$data_time)\n");

                return( array($data[IN], $data[OUT], $data_time) );
        }
}
?>
  评论这张
 
阅读(1136)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017