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]