zabbix的代码中有很多值得学习的地方,比如各种key值的获取,如果需要获取CPU、内存、网卡流量等设备状态值,可以参考zabbix的代码。
zabbix agent可以收集设备信息,从中可以找到各种采集信息的方法。我查看的是zabbix2.0.9的源码,寻找key对应的取值函数方法如下:
1、zabbix_agentd.c
main函数中:init_metrics()函数
void init_metrics()
{
int i;
commands = zbx_malloc(commands, sizeof(ZBX_METRIC));
commands[0].key = NULL;
#ifdef WITH_AGENT_METRICS
for (i = 0; NULL != parameters_agent[i].key; i++)
add_metric(¶meters_agent[i]);
#endif
#ifdef WITH_COMMON_METRICS
for (i = 0; NULL != parameters_common[i].key; i++)
add_metric(¶meters_common[i]);
#endif
#ifdef WITH_SPECIFIC_METRICS
for (i = 0; NULL != parameters_specific[i].key; i++)
add_metric(¶meters_specific[i]);
#endif
#ifdef WITH_SIMPLE_METRICS
for (i = 0; NULL != parameters_simple[i].key; i++)
add_metric(¶meters_simple[i]);
#endif
}
2、parameters_agent
ZBX_METRIC parameters_agent[] =
/* KEY FLAG FUNCTION ADD_PARAM TEST_PARAM */
{
{"agent.hostname", 0, AGENT_HOSTNAME, 0, 0},
{"agent.ping", 0, AGENT_PING, 0, 0},
{"agent.version", 0, AGENT_VERSION, 0, 0},
{NULL}
};
3、parameters_common
ZBX_METRIC parameters_common[] =
/* KEY FLAG FUNCTION ADD_PARAM TEST_PARAM */
{
{"system.localtime", CF_USEUPARAM, SYSTEM_LOCALTIME, 0, "utc"},
{"system.run", CF_USEUPARAM, SYSTEM_RUN, 0, "echo test"},
{"web.page.get", CF_USEUPARAM, WEB_PAGE_GET, 0, "localhost,,80"},
{"web.page.perf", CF_USEUPARAM, WEB_PAGE_PERF, 0, "localhost,,80"},
{"web.page.regexp", CF_USEUPARAM, WEB_PAGE_REGEXP, 0, "localhost,,80,OK"},
{"vfs.file.size", CF_USEUPARAM, VFS_FILE_SIZE, 0, VFS_TEST_FILE},
{"vfs.file.time", CF_USEUPARAM, VFS_FILE_TIME, 0, VFS_TEST_FILE ",modify"},
{"vfs.file.exists", CF_USEUPARAM, VFS_FILE_EXISTS, 0, VFS_TEST_FILE},
{"vfs.file.contents", CF_USEUPARAM, VFS_FILE_CONTENTS, 0, VFS_TEST_FILE},
{"vfs.file.regexp", CF_USEUPARAM, VFS_FILE_REGEXP, 0, VFS_TEST_FILE "," VFS_TEST_REGEXP},
{"vfs.file.regmatch", CF_USEUPARAM, VFS_FILE_REGMATCH, 0, VFS_TEST_FILE "," VFS_TEST_REGEXP},
{"vfs.file.md5sum", CF_USEUPARAM, VFS_FILE_MD5SUM, 0, VFS_TEST_FILE},
{"vfs.file.cksum", CF_USEUPARAM, VFS_FILE_CKSUM, 0, VFS_TEST_FILE},
{"net.dns", CF_USEUPARAM, NET_DNS, 0, ",zabbix.com"},
{"net.dns.record", CF_USEUPARAM, NET_DNS_RECORD, 0, ",zabbix.com"},
{"net.tcp.dns", CF_USEUPARAM, NET_DNS, 0, ",zabbix.com"}, /* deprecated */
{"net.tcp.dns.query", CF_USEUPARAM, NET_DNS_RECORD, 0, ",zabbix.com"}, /* deprecated */
{"net.tcp.port", CF_USEUPARAM, NET_TCP_PORT, 0, ",80"},
{"system.hostname", CF_USEUPARAM, SYSTEM_HOSTNAME, 0, 0},
{"system.uname", 0, SYSTEM_UNAME, 0, 0},
{"system.users.num", 0, SYSTEM_USERS_NUM, 0, 0},
{"log", CF_USEUPARAM, ONLY_ACTIVE, 0, "logfile"},
{"logrt", CF_USEUPARAM, ONLY_ACTIVE, 0, "logfile"},
{"eventlog", CF_USEUPARAM, ONLY_ACTIVE, 0, "system"},
{0}
};
4、parameters_specific
这个复杂一些,因为zabbix支持多种设备,所以这部分实现比较多。如下图所示:
以windows的实现为例:
ZBX_METRIC parameters_specific[] =
/* KEY FLAG FUNCTION ADD_PARAM TEST_PARAM */
{
{"vfs.fs.size", CF_USEUPARAM, VFS_FS_SIZE, NULL, "c:,free"},
{"vfs.fs.discovery", 0, VFS_FS_DISCOVERY, NULL, NULL},
{"net.tcp.listen", CF_USEUPARAM, NET_TCP_LISTEN, NULL, "80"},
{"net.if.in", CF_USEUPARAM, NET_IF_IN, NULL, "MS TCP Loopback interface,bytes"},
{"net.if.out", CF_USEUPARAM, NET_IF_OUT, NULL, "MS TCP Loopback interface,bytes"},
{"net.if.total", CF_USEUPARAM, NET_IF_TOTAL, NULL, "MS TCP Loopback interface,bytes"},
{"net.if.discovery", 0, NET_IF_DISCOVERY, NULL, NULL},
{"net.if.list", 0, NET_IF_LIST, NULL, NULL},
{"vm.memory.size", CF_USEUPARAM, VM_MEMORY_SIZE, NULL, "free"},
{"proc.num", CF_USEUPARAM, PROC_NUM, NULL, "svchost.exe,"},
{"system.cpu.util", CF_USEUPARAM, SYSTEM_CPU_UTIL, NULL, "all,system,avg1"},
{"system.cpu.load", CF_USEUPARAM, SYSTEM_CPU_LOAD, NULL, "all,avg1"},
{"system.cpu.num", CF_USEUPARAM, SYSTEM_CPU_NUM, NULL, "online"},
{"system.swap.size", CF_USEUPARAM, SYSTEM_SWAP_SIZE, NULL, "all,free"},
{"system.uptime", 0, SYSTEM_UPTIME, NULL, NULL},
{"service_state", CF_USEUPARAM, SERVICE_STATE, NULL, ZABBIX_SERVICE_NAME},
{"services", CF_USEUPARAM, SERVICES, NULL, NULL},
{"perf_counter", CF_USEUPARAM, PERF_COUNTER, NULL, "\\System\\Processes"},
{"proc_info", CF_USEUPARAM, PROC_INFO, NULL, "svchost.exe"},
{"__UserPerfCounter", CF_USEUPARAM, USER_PERF_COUNTER, NULL, ""},
{0}
};
5、parameters_simple
ZBX_METRIC parameters_simple[] =
/* KEY FLAG FUNCTION ADD_PARAM TEST_PARAM */
{
{"net.tcp.service", CF_USEUPARAM, CHECK_SERVICE, 0, "ssh,127.0.0.1,22"},
{"net.tcp.service.perf",CF_USEUPARAM, CHECK_SERVICE_PERF, 0, "ssh,127.0.0.1,22"},
{0}
};
从上面可以看到zabbix agent所有支持的key,上面表中KEY为监控项的名称,在web中配置时主机监控项时可以看到。FUNCTION为相应的key项的取值函数。选中该项,跳转即可查看具体实现。
至于key的使用以及传入参数的含义,可以根据zabbix使用时进行反推,参考如下链接:
http://blog.51cto.com/wsxxsl/1903222
http://bbs.chinaunix.net/thread-4257801-1-1.html