Cacti进阶应用二:使用cacti获取snmp发送的自定义信息后作图
一、实际需求服务器运行了lighttpd,主要为了统计当前连接数,然后cacti来画出当前连接数的统计图:这里说一...
扫描右侧二维码阅读全文
09
2008/07

Cacti进阶应用二:使用cacti获取snmp发送的自定义信息后作图

一、实际需求

服务器运行了lighttpd,主要为了统计当前连接数,然后cacti来画出当前连接数的统计图:这里说一下有几个方法来实现这个功能:
1、snmpget直接取值,经常发生取值不准确的问题:

# snmpget -c public -v 2c 127.0.0.1 .1.3.6.1.2.1.6.9.0 TCP-MIB::tcpCurrEstab.0 = Gauge32: 0

2、用snmp抓取所有链接后统计行数,虽然信息比较准确,但效率低下,如果监控点超过千台,那几乎数据都是timeout收场:

# snmpget -c public -v 2c 127.0.0.1 .1.3.6.1.2.1.6.13.1.3 |wc -l 725

3、在本机上写脚本统计后用snmp发送信息,cacti收集后画图,具体方法;

二、解决方案

snmp提供了发送自定义信息的功能。查看snmpd.conf会看到有一个小节是关于外部脚本的,Executables/scripts。这个小节里面也举了例子,告诉你怎么通过snmp发送信息。

在snmpd.conf任意位置添加一行:
exec .1.3.6.1.4.1.2021.18 tcpCurrEstab /etc/tcpconn.sh
其中tcpCurrEstab是命令的名称,后面是命令以及参数。命令的名称可以随便起。脚本执行的结果类似下面:

# /etc/tcpconn.sh 80

脚本内容如下:

$ cat tcpconn.sh #!/bin/sh conn=`netstat -s -t | grep connections\ established |awk '{print $1}'` echo $conn

重启snmpd,然后远程通过snmpwalk接收一下数据看看:

# snmpwalk -c public -v 2c 127.0.0.1 .1.3.6.1.4.1.2021.18 UCD-SNMP-MIB::ucdavis.18.1.1 = INTEGER: 1 UCD-SNMP-MIB::ucdavis.18.2.1 = STRING: "tcpCurrEstab" UCD-SNMP-MIB::ucdavis.18.3.1 = STRING: "/etc/tcpconn_total.sh" UCD-SNMP-MIB::ucdavis.18.100.1 = INTEGER: 0 UCD-SNMP-MIB::ucdavis.18.101.1 = STRING: "488" UCD-SNMP-MIB::ucdavis.18.102.1 = INTEGER: 0 UCD-SNMP-MIB::ucdavis.18.103.1 = ""

其中我们需要的是UCD-SNMP-MIB::ucdavis.18.101.1 = STRING: "488"这一行:

# snmpwalk -v 1 192.168.1.201 -c public .1.3.6.1.4.1.2021.18.101.1 UCD-SNMP-MIB::ucdavis.18.101.1 = STRING: "488"

能采集到数据之后,就可以配置cacti来接收了。在cacti界面中console->Templates->Data Templates,然后点击右上角的Add,Data Templates中的name是给这个数据模板的命名,Data Source中的name将来显示在Data Sources中,我这里添加“|host_description| - Tcp Conn. - ESTBLISHED”,选get snmp data,Internal Data Source Name也可以随便添,这个用来给rrd文件命名。设置完后就可以save了,save之后会发现下面多了一些选项,在最下面那个添上我们需要的数据的 OID“.1.3.6.1.4.1.2021.18.101.1”,可以保存了。

此后需要创建一个Graph Templates,好让cacti生成图片。在cacti界面中console->Templates->Graph Templates,然后点击右上角的Add,Templates中的name是给这个数据模板的命名,Graph Template中的name是将来显示在图片上面中间的内容,我这里添加“|host_description| - Tcp Conn. - ESTBLISHED”,其他保持默认,保存之后上面会出来一些选项。

在Graph Template Items中添加一个item,Data Source选之前添加的,color选择一个图片的颜色,Graph Item Type选AREA,也就是区域,也可以选其他的线条,Text Format设置说明。然后再添加一个,Graph Item Type选GPRINT,Consolidation Function选LAST,也就是当前的值,Text Format输入current。你还可以添加一些Graph Item Type为COMMENT的注释说明等。
现在只要为host添加这个画图模板就可以看到画出来的图了。

Last modification:November 26th, 2018 at 04:16 pm
If you think my article is useful to you, please feel free to appreciate

34 comments

  1. sky

    我cacti安装在242机上,想监测209,209写了个脚本,且在209上配置了snmp加入下面这行,exec .1.3.6.1.4.1.2021.51 oracle_process /bin/sh /opt/script/oracle_process.sh
    然后在242cacti中出图,但是有图,无数据。在242上 snmpwalk -v 1 192.168.56.209 -c public .1.3.6.1.4.1.2021.51 也是能输出值的。那为什么有cacti中有图无数据,麻烦版主帮下忙。本人QQ:17541531.谢谢。

    1. Michael Field
      @sky

      建议先打开debug模式,检测下错误信息。
      还有看下graph 和 data 模板,设定是否正确。

  2. Michael Field

    @david
    cacti的你画的数据是哪个值?
    Custom Data [data input: Get SNMP Data]
    oid : .1.3.6.1.4.1.2021.59.101.1 这个是正确的!

  3. david

    我执行这个命令可以获取到数据
    leadshow1:/usr/local/shell # snmpwalk -c teeqee -v 2c 192.168.1.20 .1.3.6.1.4.1.2021.59
    UCD-SNMP-MIB::ucdavis.59.1.1 = INTEGER: 1
    UCD-SNMP-MIB::ucdavis.59.2.1 = STRING: "psaux"
    UCD-SNMP-MIB::ucdavis.59.3.1 = STRING: "/etc/init.d/psaux.sh"
    UCD-SNMP-MIB::ucdavis.59.100.1 = INTEGER: 0
    UCD-SNMP-MIB::ucdavis.59.101.1 = STRING: "116"
    UCD-SNMP-MIB::ucdavis.59.102.1 = INTEGER: 0
    UCD-SNMP-MIB::ucdavis.59.103.1 = ""

    cacti图像也出来了但是数据是0 咋回事

  4. Serwei

    之前做个一个实时日志分析的东西,获取nginx服务器连接数、块大小和下载速度,然后用cacti画图

  5. jack yang

    新添设备的时候总有一个红色的SNMP error ,怎么解决这个问题呢?
    我是参考这篇文章安装cacti的http://www.k-pig.net/read.php?173 然后新增了cacti用户,把rra,log的权限设为777了。执行poller.php也没问题。默认主机的图形数据都没问题,就是add一个device时就出现那个错误了,在Data Query Debug Information下有这样的信息
    + Running data query [2].
    + Found type = '3' [snmp query].
    + Found data query XML file at '/usr/share/cacti/site/resource/snmp_queries/net-snmp_disk.xml'
    + XML file parsed ok.
    + Executing SNMP walk for list of indexes @ '.1.3.6.1.4.1.2021.9.1.1'
    + No SNMP data returned
    + Found data query XML file at '/usr/share/cacti/site/resource/snmp_queries/net-snmp_disk.xml'
    + Found data query XML file at '/usr/share/cacti/site/resource/snmp_queries/net-snmp_disk.xml'
    + Found data query XML file at '/usr/share/cacti/site/resource/snmp_queries/net-snmp_disk.xml'
    用snmpwalk执行默认的那个本机设备没有问题,要是看别的主机信息就是
    Timeout: No Response from xx.xx.xx.xx
    怎么办呢?

  6. 海盗船长

    想跟贵站申请友情链接,博主都是高手级的人物,小弟希望能够向大家多多学习

  7. Michael Field

    小数点的问题:GPRINT Type -> Exact Numbers就可以啦!
    坐标问题你Maximum Value这里设定一下一般不会超过10w的!

  8. adam

    还有一点不明白,为什么获取到的连接数会有小数?例如你图片上的 MAX:630.99??

  9. adam

    我的问题解决了,原来被监控端也要加
    exec .1.3.6.1.4.1.2021.18 tcpCurrEstab /etc/tcpconn.sh

    /etc/tcpconn.sh

    不过还有个问题
    就是连接数超过100的时候,纵坐标为显示10M?
    少于100就显示数字,
    请问纵坐标的单位在哪里改呢?

  10. Michael Field

    请保证172.18.3.25的snmp版本和cacti所使用的相同;
    snmpwalk取不到数据可能由于snmpd.conf配置问题、防火墙问题;这些情况你在检查下!

    在snmpd.conf任意位置添加一行:
    exec .1.3.6.1.4.1.2021.18 tcpCurrEstab /etc/tcpconn.sh
    如果以上都没问题,请确保所有被监控的服务器snmp版本和cacti服务器的相同;net-snmp-5.3.1这个版本都没问题!

  11. adam

    [root@cacti snmp]# snmpwalk -c public -v 2c 172.18.3.25 .1.3.6.1.4.1.2021.18
    Timeout: No Response from 172.18.3.25
    明白了,这个原因是因为snmpd.confi里面是如下设置
    com2sec notConfigUser 127.0.0.1 public


    snmpwalk -v 2c -c public 172.18.3.26 system
    是可以获取数据的

    [root@cactiez snmp]# snmpwalk -c public -v 2c 172.18.3.26 .1.3.6.1.4.1.2021.18
    UCD-SNMP-MIB::ucdavis.18 = No Such Object available on this agent at this OID
    不知报这个错要怎么改呢?

  12. adam

    你好,现在数据模板OK了,但只有本机才能获取数据,不能获取到其他LINUX机,请教是什么原因??
    cacti服务器执行如下,其中172.18.3.25为cacti服务器,172.18.3.26为linux机
    [root@cacti snmp]#snmpwalk -c public -v 2c 127.0.0.1 .1.3.6.1.4.1.2021.18
    UCD-SNMP-MIB::ucdavis.18.1.1 = INTEGER: 1
    UCD-SNMP-MIB::ucdavis.18.2.1 = STRING: "tcpCurrEstab"
    UCD-SNMP-MIB::ucdavis.18.3.1 = STRING: "/etc/tcpconn.sh"
    UCD-SNMP-MIB::ucdavis.18.100.1 = INTEGER: 0
    UCD-SNMP-MIB::ucdavis.18.101.1 = STRING: "1"
    UCD-SNMP-MIB::ucdavis.18.102.1 = INTEGER: 0
    UCD-SNMP-MIB::ucdavis.18.103.1 = "

    [root@cacti snmp]# snmpwalk -c public -v 2c 172.18.3.25 .1.3.6.1.4.1.2021.18
    Timeout: No Response from 172.18.3.25

    [root@cactiez snmp]# snmpwalk -c public -v 2c 172.18.3.26 .1.3.6.1.4.1.2021.18
    UCD-SNMP-MIB::ucdavis.18 = No Such Object available on this agent at this OID

  13. Michael Field

    rrd文件设定有问题,data sources 里面看看debug!
    正确的为:
    rrdtool create \
    www_tcpcurrestab_18575.rrd \
    --step 300 \
    DS:tcp:GAUGE:600:0:100000 \
    RRA:AVERAGE:0.5:1:600 \
    RRA:AVERAGE:0.5:6:700 \
    RRA:AVERAGE:0.5:24:775 \
    RRA:AVERAGE:0.5:288:797 \
    RRA:MIN:0.5:1:600 \
    RRA:MIN:0.5:6:700 \
    RRA:MIN:0.5:24:775 \
    RRA:MIN:0.5:288:797 \
    RRA:MAX:0.5:1:600 \
    RRA:MAX:0.5:6:700 \
    RRA:MAX:0.5:24:775 \
    RRA:MAX:0.5:288:797 \
    RRA:LAST:0.5:1:600 \
    RRA:LAST:0.5:6:700 \
    RRA:LAST:0.5:24:775 \
    RRA:LAST:0.5:288:797 \

    应该是Data Templates设定有问题

  14. adam

    RRDTool 命令:

    /usr/local/rrdtool/bin/rrdtool graph - \
    --imgformat=PNG \
    --start=-86400 \
    --end=-300 \
    --title="服务器 - Tcp Conn. - ESTBLISHED" \
    --base=1000 \
    --height=120 \
    --width=500 \
    --alt-autoscale-max \
    --lower-limit=0 \
    --vertical-label="" \
    --slope-mode \
    --font TITLE:10: \
    --font AXIS:8: \
    --font LEGEND:8: \
    --font UNIT:8: \
    DEF:a="/var/www/html/rra/_ds_191.rrd":tcp:AVERAGE \
    DEF:b="/var/www/html/rra/_ds_191.rrd":tcp:LAST \
    DEF:c="/var/www/html/rra/_ds_191.rrd":tcp:MIN \
    DEF:d="/var/www/html/rra/_ds_191.rrd":tcp:MAX \
    AREA:a#FF0000FF:"TCP建立连接数" \
    GPRINT:b:LAST:"当前:%8.2lf %s" \
    GPRINT:a:AVERAGE:"Average\:%8.2lf %s" \
    GPRINT:d:MAX:"最大:%8.2lf %s\n"
    RRDTool 说:

    ERROR: No DS called 'tcp' in '/var/www/html/rra/_ds_191.rrd'

    是以上错误,不知是什么原因?

  15. Michael Field

    打开debug模式看看~
    模板什么设定正确吗?

  16. adam

    [root@cactiez etc]# snmpwalk -c public -v 2c 127.0.0.1 .1.3.6.1.4.1.2021.18
    UCD-SNMP-MIB::ucdavis.18.1.1 = INTEGER: 1
    UCD-SNMP-MIB::ucdavis.18.2.1 = STRING: "tcpCurrEstab"
    UCD-SNMP-MIB::ucdavis.18.3.1 = STRING: "/etc/tcpconn.sh"
    UCD-SNMP-MIB::ucdavis.18.100.1 = INTEGER: 0
    UCD-SNMP-MIB::ucdavis.18.101.1 = STRING: "1"
    UCD-SNMP-MIB::ucdavis.18.102.1 = INTEGER: 0
    UCD-SNMP-MIB::ucdavis.18.103.1 = ""

    这个是没有问题的,

  17. adam

    我配置后不能生成图片,0.8.7b的版本,不知哪里出问题了

  18. xueji03

    ok,linux下这种方式用起来挺方便,如果是在windows下呢,有无类似的通过snmp读取自定义脚本run出来的值并做图的解决办法?

  19. mageguoshi

    lz用的net-snmp的版本是5.3的吧,好像5.4到不能自定义OID,没有exec的命令。

  20. Michael Field

    To ying:
    用shell脚本调用是最简单的方法吧~
    或者编译为二进制直接执行,snmpd.conf同文中所写。

  21. ying

    如果脚本用其他语言写,比如JAVA或C,那应该如何做啊?snmpd.conf里面要怎么加?用程序编译的命令吗?

  22. mageguoshi

    重启了,
    nmpwalk -c public -v 2c 127.0.0.1 .1.3.6.1.4.1.2021.18
    UCD-SNMP-MIB::ucdavis.18 = No Such Object available on this agent at this OID

    是【18】,我用的是redhat自带到rpm包安装的net-snmp,是不要源码编译加上什么特殊的选项啊!
    加我的msn:mageguoshi@hotmail.com可以么

  23. Michael Field

    配置正确,怎么感觉没生效呢?
    .1.3.6.1.4.1.2021.【18】
    UCD-SNMP-MIB::ucdavis.【58】
    怎么不相符?改完配置有重启吗?

  24. mageguoshi

    下面是去掉注释和空行的snmpd.conf的输出:
    com2sec notConfigUser default public
    group notConfigGroup v1 notConfigUser
    group notConfigGroup v2c notConfigUser
    view systemview included .1.3.6.1.2.1.1
    view systemview included .1.3.6.1.2.1.25.1.1
    access notConfigGroup "" any noauth exact all none none
    view all included .1 80
    syslocation Unknown (edit /etc/snmp/snmpd.conf)
    syscontact Root (configure /etc/snmp/snmp.local.conf)
    pass .1.3.6.1.4.1.4413.4.1 /usr/bin/ucd5820stat
    exec .1.3.6.1.4.1.2021.18 tcpCurrEstab /etc/tcpconn.sh

  25. Michael Field

    OID指定有误,把snmpd.conf这段配置给我看下~

  26. 恍若如梦

    CACTI有这样的脚本,抓取TCP各种状态,不过通过自定义可以得到自己所需要的值,不错.赞一个~

  27. Michael Field

    贴一下个命令测试结果,还是netstat -st效率最高!

    # time awk '$4=="01"{a++}END{print a}' /proc/net/tcp
    855

    real 0m0.164s
    user 0m0.000s
    sys 0m0.164s
    # time netstat -ant |grep -ic estab
    860

    real 0m0.174s
    user 0m0.018s
    sys 0m0.163s
    # time cat /proc/net/tcp |awk '{print $4}' |grep -c 01
    862

    real 0m0.158s
    user 0m0.002s
    sys 0m0.158s
    #time netstat -s -t | grep connections\ established |awk '{print $1}'
    862
    real 0m0.005s
    user 0m0.001s
    sys 0m0.005s
    感谢花开提供的方法,我更正一下脚本;

  28. Michael Field

    /proc 直接是从内存中读取数据 我不认为会比netstat统计效率来的低。
    当然这个方法也可以采用。

  29. 花开

    使用这种方式取得tcpCurrEstab效率更高,netstat -s -t | grep connections\ established,所有的时间几乎是楼主提供的方法的1%。并且,随着连接数越大,这个方法的优势就越大。

  30. Martian Guo

    time awk '$4=="01"{a++}END{print a}' /proc/net/tcp
    time netstat -s -t | grep connections\ established

    可以试试看哪个效率更高,我想至少一个命令完成总是要比两个管道连接完成的命令要高吧?

  31. Martian Guo

    好像是netstat -s -t 速度快

  32. FinalBSD

    很好很值得学习。^_^

  33. mageguoshi

    楼主,我按照你的方法在snmpd.conf里添加配置之后,
    # snmpwalk -c public -v 2c 127.0.0.1 .1.3.6.1.4.1.2021.18
    然后报错:UCD-SNMP-MIB::ucdavis.58 = No Such Object available on this agent at this OID

    /etc/tcpconn.sh也添加了,
    snmpwalk -c public -v 2c 127.0.0.1 system 就有数据返回

Leave a Comment