1.module简介
其实就是一个动态扩展库,可以动态的被agent加载,用来扩展agent本身没有的功能,你可以把一些item写进去,用c语言来高效实现。
源码自带了一个dummy模块,很好的一个例子,代码注释非常明确。
2.module用法
在config文件里面写入
重启agent即可加载,一般是有如下日志:
1 2 
  | 16784:20170603:142839.965 using configuration file: /etc/zabbix/zabbix_agentd.conf 16784:20170603:142839.965 loaded modules: tcpcount.so 
  | 
 
说明已经加载完成。以自带的dummy为例,我们先是在dummy目录下make,
1 2 3 4 
  | #make gcc -fPIC -shared -o dummy.so dummy.c -I../../../include #ls dummy.c  dummy.so  Makefile  README 
  | 
 
然后是加载模块,默认要放到/usr/lib64/zabbix/modules/下面:
进行测试:
1 2 
  | # zabbix_get -s 127.0.0.1 -k dummy.ping 1 
  | 
 
1 2 
  | #zabbix_get -s 127.0.0.1 -k dummy.echo[qym] qym 
  | 
 
1 2 
  | # zabbix_get -s 127.0.0.1 -k dummy.random[1,1000] 486 
  | 
 
3. 编码
其实上面三个例子已经给了很好的诠释,首先是定义函数
1 
  | int zbx_module_dummy_ping(AGENT_REQUEST *request, AGENT_RESULT *result) 
  | 
 
函数返回SYSINFO_RET_OK或者SYSINFO_RET_FAIL. result用SET_XXX_RESULT来设置,比如ping返回1
1 
  | SET_UI64_RESULT(result, 1); 
  | 
 
echo返回字符串:
1 
  | SET_STR_RESULT(result, strdup(param)); 
  | 
 
参数怎么获取呢,很简单有个get_rparam宏:
1 2 3 
  | param1 = get_rparam(request, 0);     param2 = get_rparam(request, 1); 
  | 
 
基本的骨架都有了,照着改改就行了。我写了个tcp count的模块,跟netstat的实现原理差不多,就是解析/proc/net/tcp下面的信息,
主要用的是sscanf这个函数,每行解析就可以了,实现上面跟https://github.com/mutz0623/zabbix_TCP-state-count-module类似,但是我只统计服务器端指定port的连接数,而且他的sscanf实现略有些笨拙,可以简化。
核心代码如下:
1 2 3 4 5 6 7 
  | while ((read = getline(&line, &len, fp)) != -1){ 	int st; 	sscanf(line, "%*d: %*08x:%04x %*08x:%*04x %02x",&port,&st); 	if(port == dport && st == dst) 		c++; } 
  | 
 
可以根据st ,也就是tcp状态信息字段来count,st的定义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
  | enum {     TCP_ESTABLISHED = 1,     TCP_SYN_SENT,     TCP_SYN_RECV,     TCP_FIN_WAIT1,     TCP_FIN_WAIT2,     TCP_TIME_WAIT,     TCP_CLOSE,     TCP_CLOSE_WAIT,     TCP_LAST_ACK,     TCP_LISTEN,     TCP_CLOSING,    /* Now a valid state */     TCP_MAX_STATES  /* Leave at the end! */ }; 
  | 
 
一般主要是TCP_ESTABLISHED和TCP_TIME_WAIT比较常见,配合模板使用,效果杠杠的。