• 自定义key解决zabbix端口监听取值不准确的问题


         今天有一个朋友问到我一个关于zabbix监控tcp端口的问题,明明端口在监听,但是通过net.tcp,listen取值取到的却是0。
      经过简单的goole发现这已经是一个历史悠久的问题:
      问题的根本原因是zabbix的这个key(net.tcp,listen)是通过读取 /proc/net/tcp这个文件来进行数据采集的,而/proc/下的文件并不是线程安全的,因此会出现取值不准确的问题。
    另外这种机制还存在另外一个隐患:当/proc/net/tcp文件的条目非常多的话,就会造成取值慢的情况,因此就有可能造成取值失败的问题。
     
         那我们该如果解决这个问题呢,网上也找到了解决办法,我在这里当一次大自然的搬运工~哈哈
    解决方法就是新添加一个用户自定义key来代替zabbix自己提供的监控方式,具体操作步骤如下:
     

    #1,添加自定义key --> net.tcp.listen.grep[*]

    添加方式,在zabbix客户端的agentd的配置文件中,或者在zabbix agentd所声明的Include配置文件目录下添加如下配置:
    UserParameter=net.tcp.listen.grep[*],grep -q $$(printf '%04X.00000000:0000.0A' $1) /proc/net/tcp && echo 1 || echo 0
    

      例如我的选在就是在/etc/zabbix/zabbix-agentd.conf.d目录下,创建了一个文件net_tcp_listen.conf,将上述key的声明写到文件里,因为我的zabbix_agentd.conf中已经做了配置文件目录包含的声明:

    thatsit:~ # grep ^Include /etc/zabbix/zabbix-agentd.conf
    Include=/etc/zabbix/zabbix-agentd.conf.d/
    thatsit:~ #
    thatsit:~ # cat  /etc/zabbix/zabbix-agentd.conf.d/net_tcp_listen.conf
    UserParameter=net.tcp.listen.grep[*],grep -q $$(printf '%04X.00000000:0000.0A' $1) /proc/net/tcp && echo 1 || echo 0
    thatsit:~ #

    #2,重启zabbix-agentd,使配置生效 

    shipeng:~ # /etc/init.d/zabbix-agentd restart
    Shutting down zabbix agentd                                              done
    Starting zabbix agentd                                                   done
    shipeng:~ #
    

    #3,使用zabbix_get进行测试

    thatsit:~ # zabbix_get -s 192.168.3.154 -k "net.tcp.listen.grep[22]"
    1
    thatsit:~ # zabbix_get -s 192.168.3.154 -k "net.tcp.listen.grep[23]"
    0
    thatsit:~ #
    

    #4,在web端,给指点的主机添加此监控项。

    监控项的key即是:net.tcp.listen.grep[要监控的端口号]

    #5,配置完成,排错思路

    至此配置已经完成,如果有问题,可以按照以下思路进行排查,一般的问题在日志中都可以找到端倪。

    # 排错思路:
    在添加在定义key的时候需要注意一下事项:
    注意配置文件或者自定义脚本的属主、属组配置
    如果用到了自定义的脚本,注意添加执行权限
    如果需要执行自定义脚本,还需要在zabbix_agentd.conf中开启如下参数:
    thatsit:~ # grep ^Unsafe /etc/zabbix/zabbix-agentd.conf
    UnsafeUserParameters=1
    thatsit:~ #
     
    参考链接:
  • 相关阅读:
    JSTL学习总结
    Spring 3 MVC: Create Hello World Application In Spring 3.0 MVC(reprint)
    如何查询端口号被哪个程序占用?
    php 共享内存
    php 消息队列
    php 快速fork出指定个子进程
    批量 kill mysql 中运行时间长的sql
    socket发送http请求
    TCP/IP、Http、Socket的区别
    文本协议和二进制协议
  • 原文地址:https://www.cnblogs.com/thatsit/p/5667321.html
Copyright © 2020-2023  润新知