zoukankan      html  css  js  c++  java
  • zabbix user parameters和Loadable modules的使用方法介绍

    目录

      需求

      实现

      原理

      前端配置

      后端配置

        shell实现

        python实现

        C实现

     


     

    需求:

           采集主机的-/+ buffers/cache  free的数据


    实现:  

      采集/proc/meminfo中的数据,通过shell 、 python、 c分别来实现user parameters和Loadable modules监控方式


    原理:

      首先我们先来了解linux的内存参数

      我们在centos 5 和 centos 6上输入 free -k,会返回下面的输出:

      

      在centos 7 上输入 free -k 返回结果:

       

      上面输出的数据可以从 /proc/.meminfo中匹配到对应的数据:

       

      Centos 7 里有一个MemAvailable参数用来替代-/+ buffers/cache:

        MemAvailable:   59666176 kB

      对比下free输出和/proc/meminfo的信息:

    free output

    coresponding /proc/meminfo fields

    Mem: total

    MemTotal

    Mem: used

    MemTotal - MemFree

    Mem: free

    MemFree

    Mem: shared (can be ignored nowadays. It has no meaning.)

    N/A

    Mem: buffers

    Buffers

    Mem: cached

    Cached

    -/+ buffers/cache: used

    MemTotal - (MemFree + Buffers + Cached)

    -/+ buffers/cache: free

    MemFree + Buffers + Cached

    Swap: total

    SwapTotal

    Swap: used

    SwapTotal - SwapFree

    Swap: free

    SwapFree

      Centos7中的信息对比:

    free output

    coresponding /proc/meminfo fields

    Mem: total

    MemTotal

    Mem: used

    MemTotal - MemFree - Buffers - Cached - Slab

    Mem: free

    MemFree

    Mem: shared

    Shmem

    Mem: buff/cache

    Buffers + Cached + Slab

    Mem:available

    MemAvailable

    Swap: total

    SwapTotal

    Swap: used

    SwapTotal - SwapFree

    Swap: free

    SwapFree

      经常会用到的参数:

        centos 5 6 7

          MemTotal: 内存总量

          MemFree: 系统没有使用的物理内存

          Buffers: buffer cache中的内存

          Cached: pagecache中的内存

          SwapCached: 存储在主内存中的内存,同时也在swapfile中,节省I/O

        centos 7

          MemAvailable: 不需要交换就可以启动新应用程序的内存 (等同于 -/+ buffers/cache: free)


    前端配置

      我们在zabbix上新建一个监控项,点击configuration->Templates->你的系统模板->Items->Create Item

       


    后端配置

      使用shell和python来实现需要更改配置文件的Include选项,路径指向zabbix_agentd.conf.d

      Include=/usr/local/etc/zabbix_agentd.conf.d/*.conf

      修改配置后请重启zabbix_agentd服务

    shell实现:

      我们在/usr/local/etc/zabbix_agentd.conf.d/路径下新建一个memory.conf的文件,写入下面的内容:

      UserParameter=buffers.cache.memory,echo $((`grep -E 'MemFree|Buffers|Cached' /proc/meminfo  | head -3 | awk '{print $2}' | paste -sd+ | bc` /1024 ))

    测试:

      # zabbix_agentd -t buffers.cache.memory

      buffers.cache.memory                          [t|62525]

    python实现:

      在memory.conf里面增加一行配置:

      UserParameter=buffers.cache.memory_python,python get_memory.py

      脚本:

    #!/usr/bin/python
    import re
    
    def get_memory():
        i = 0
        key_num = re.compile('d+')
        with open('/proc/meminfo', 'r') as f:
            for line in f:
                if line.startswith('MemFree') or line.startswith('Buffers') or line.startswith('Cached'):
                    num = key_num.findall(line)
                    i += int(num[0])
        return i
    
    if __name__ == '__main__':
        print(get_memory())
    

      给权限:

        chmod 700 get_memory.py

        chown zabbix: get_memory.py

      测试:
        # zabbix_agentd -t buffers.cache.memory_python

        buffers.cache.memory_python                   [t|62534]

    C实现:

    /*
    
    模块应该需要将内部函数定义为静态的,并使用与Zabbix内部不同的命名模式
    
    避免和(zbx_*)和可加载模块API函数(zbx_module_*)冲突
    
    /*
    
     
    
    static int      BUFFER_FREE(AGENT_REQUEST *request, AGENT_RESULT *result);
    
     
    
    /*
    
    *key代表item里的key
    
    *FLAG为CF_HAVEPARAMS或0(取决于项是否接受参数),
    
    *FUNCTION是实现功能的具体函数
    
    *test_param 是zabbix_agentd 使用-p启动时候用到的参数列表
    
    /*
    
     
    
    static ZBX_METRIC keys[] =
    
    /*      KEY                     FLAG            FUNCTION        TEST PARAMETERS */
    
    {
    
            {"buffers.cache.memory",        0,      BUFFER_FREE,    NULL},
    
            {NULL}
    
    };
    
     
    
     
    
    /*
    
     *获取buffer_free的数值:MemFree+Buffers+Cached
    
     * */
    
     
    
    static int      BUFFER_FREE(AGENT_REQUEST *request, AGENT_RESULT *result)
    
    {
    
     
    
            int             ret = SYSINFO_RET_FAIL;
    
            char            line[MAX_STRING_LEN];
    
            zbx_uint64_t    buffer_free = 0;
    
            zbx_uint64_t    value = 0;
    
            FILE            *f;
    
     
    
            ZBX_UNUSED(request);
    
     
    
            if (NULL == (f = fopen("/proc/meminfo", "r")))
    
            {
    
                    SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot open /proc/meminfo: %s", zbx_strerror(errno)));
    
                    return SYSINFO_RET_FAIL;
    
            }
    
     
    
            while (NULL != fgets(line, sizeof(line), f))
    
            {
    
                    if ((0 == strncmp(line, "MemFree:", 8)) || (0 == strncmp(line, "Buffers:", 8)) || (0 == strncmp(line, "Cached:", 7))) //匹配三个指定的line
    
                    {
    
                            if (1 == sscanf(line, "%*s " ZBX_FS_UI64, &value)) //跳过第一个字符串,读取第二个字符串
    
                            {
    
                                    buffer_free += value;//汇总求和
    
                            }
    
                    }
    
            }
    
            SET_UI64_RESULT(result, buffer_free/1024);//K转换为M
    
            ret = SYSINFO_RET_OK;
    
            zbx_fclose(f);
    
     
    
            if (SYSINFO_RET_FAIL == ret)
    
                    SET_MSG_RESULT(result, zbx_strdup(NULL, "Cannot find a line with "haha" in /proc/meminfo."));
    
     
    
            return ret;
    
     
    
    }
    
    /*
    
    *如果成功获得项值,函数应该返回SYSINFO_RET_OK。否则,应该返回SYSINFO_RET_FAIL
    
    */
    
     

      编译:

        gcc -fPIC -shared -o buffer_free.so buffer_free .c -I ../../../include/

        这里的include在zabbix的源码编译安装文件里可以找到

      给权限

        chmod 700 buffer_free.so

        chown zabbix: buffer_free.so

      更改zabbix_agentd.conf的配置,增加:

        LoadModule= buffer_free.so

      重启zabbix_agentd服务,上面的shell和python在实际的监控应用中也是需要重启服务的,使用zabbix_agentd -t 只是测试,不需要重启服务

        service Zabbix_agentd restart

     

      测试:

        # zabbix_agentd -t buffers.cache.memory

        buffers.cache.memory                          [u|1250]

  • 相关阅读:
    hdu 2819 Swap
    匈牙利算法
    hdu 1281 棋盘游戏
    hdu 2444 The Accomodation of Students(最大匹配 + 二分图判断)
    hdu 1045 Fire Net(最小覆盖点+构图(缩点))
    Python实现时钟
    挥之不去的DDOS
    随机数
    wchar_t的用法
    Visual Studio函数被警告安全,如何修改
  • 原文地址:https://www.cnblogs.com/flashBoxer/p/9917170.html
Copyright © 2011-2022 走看看