经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
zabbix user parameters和Loadable modules的使用方法介绍
来源:cnblogs  作者:丁壮  时间:2018/11/6 19:38:27  对本文有异议

 

目录

  需求

  实现

  原理

  前端配置

  后端配置

    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: 不需要交换就可以启动新应用程序的内存

 


 

前端配置

  我们在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

  脚本:

  1. #!/usr/bin/python
  2. import re
  3.  
  4. def get_memory():
  5. i = 0
  6. key_num = re.compile('\d+')
  7. with open('/proc/meminfo', 'r') as f:
  8. for line in f:
  9. if line.startswith('MemFree') or line.startswith('Buffers') or line.startswith('Cached'):
  10. num = key_num.findall(line)
  11. i += int(num[0])
  12. return i
  13.  
  14. if __name__ == '__main__':
  15. 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实现:

 

  1. /*
  2. 模块应该需要将内部函数定义为静态的,并使用与Zabbix内部不同的命名模式
  3. 避免和(zbx_*)和可加载模块API函数(zbx_module_*)冲突
  4. /*
  5. static int BUFFER_FREE(AGENT_REQUEST *request, AGENT_RESULT *result);
  6. /*
  7. *key代表item里的key
  8. *FLAG为CF_HAVEPARAMS或0(取决于项是否接受参数),
  9. *FUNCTION是实现功能的具体函数
  10. *test_param 是zabbix_agentd 使用-p启动时候用到的参数列表
  11. /*
  12. static ZBX_METRIC keys[] =
  13. /* KEY FLAG FUNCTION TEST PARAMETERS */
  14. {
  15. {"buffers.cache.memory", 0, BUFFER_FREE, NULL},
  16. {NULL}
  17. };
  18. /*
  19. *获取buffer_free的数值:MemFree+Buffers+Cached
  20. * */
  21.  
  22.  
  23. static int BUFFER_FREE(AGENT_REQUEST *request, AGENT_RESULT *result)
  24. {
  25. int ret = SYSINFO_RET_FAIL;
  26. char line[MAX_STRING_LEN];
  27. zbx_uint64_t buffer_free = 0;
  28. zbx_uint64_t value = 0;
  29. FILE *f;
  30. ZBX_UNUSED(request);
  31. if (NULL == (f = fopen("/proc/meminfo", "r")))
  32. {
  33. SET_MSG_RESULT(result, zbx_dsprintf(NULL, "Cannot open /proc/meminfo: %s", zbx_strerror(errno)));
  34. return SYSINFO_RET_FAIL;
  35. }
  36. while (NULL != fgets(line, sizeof(line), f))
  37. {
  38. if ((0 == strncmp(line, "MemFree:", 8)) || (0 == strncmp(line, "Buffers:", 8)) || (0 == strncmp(line, "Cached:", 7))) //匹配三个指定的line
  39. {
  40. if (1 == sscanf(line, "%*s " ZBX_FS_UI64, &value)) //跳过第一个字符串,读取第二个字符串
  41. {
  42. buffer_free += value;//汇总求和
  43. }
  44. }
  45. }
  46. SET_UI64_RESULT(result, buffer_free/1024);//K转换为M
  47. ret = SYSINFO_RET_OK;
  48. zbx_fclose(f);
  49. if (SYSINFO_RET_FAIL == ret)
  50. SET_MSG_RESULT(result, zbx_strdup(NULL, "Cannot find a line with \"haha\" in /proc/meminfo."));
  51. return ret;
  52. }
  53. /*
  54. *如果成功获得项值,函数应该返回SYSINFO_RET_OK。否则,应该返回SYSINFO_RET_FAIL
  55. */
  56.  

  编译:

    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]

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号