sFhyoF.jpg
Zabbix-agent 功能简介:
Zabbix-agent是安装在被监控主机上的应用程序,主要负责数据的采集如:cpu占用率、内存使用情况、网络传输数据、端口连接状态、文件(如打开的文件个数)监控等一系列可监控的数据。采集到这些数据随后zabbix-agent将这些数据发送给服务端。

Zabbix-agent 流程分析:
开始 -> 依据命令行来确定COFIG_FILE(如果命令行没有设置则将COFIG_FILE设置为DEFAULT_CONFIG_FILE) -> 加载COFIG_FILE配置文件 –> 解析配置文件将命令及关键字设置到COMMAND结构体链表中(并对应加载动态链接库中的函数到该链表) –> 将标准输入输出通过管道链接到socket的接受和发送 -> 获取socket中的数据解析命令 –> 遍历COMMAND链表对比socket解析的命令键值 匹配后执行相应动作(采集数据) –> 数据发送。

Zabbix-agent源码说明:
zbx_getopt_long(argc, argv, "c:hVpt:", longopts, NULL) //解析命令行,通过命令行来判断执行动作或是获取configfile。
CONFIG_FILE = DEFAULT_CONFIG_FILE; //如果从命令行中获得configfile则设置CONFIG_FILE。

 zbx_load_config()         
 parse_cfg_file()         //读取解析配置文件按关键字存放如定义的cfg结构体中,其中包括设置了很多全局字符指针的初始化如:CONFIG_HOSTNAME_ITEM。

 Set_defaults()        
 process(CONFIG_HOSTNAME_ITEM, PROCESS_LOCAL_COMMAND, &result) //根据CONFIG_HOSTNAME_ITEM指向的字符串 通过特殊字符解析为key与parameters,将AGENT_RESULT中的str指向CONFIG_HOSTNAME,在command中找到key值对于的节点设置改点的函数指针command->function(&request, result);</code>

load_modules(CONFIG_LOAD_MODULE_PATH, CONFIG_LOAD_MODULE, CONFIG_TIMEOUT, 0))
metrics = func_list(); //metrics指向ZBX_MODULE_FUNC_ITEM_LIST(模块列表首地址)
add_metric(&metrics[i], error, sizeof(error))
commands[i].function = metric->function
… … //将动态链接库的函数加入到command结构中的function中

zbx_tcp_init(&s_in, (ZBX_SOCKET)fileno(stdin));
zbx_tcp_init(&s_out, (ZBX_SOCKET)fileno(stdout)); //将标准输入输出通过管道链接到socket的接受和发送

zbx_tcp_recv(&s_in, &command)) //获取socket中数据放入command中

process(command, 0, &result); //第二次调用该函数,第一次调用是解析配置文件,第二次调用是解析来自socket数据。遍历commands,通过解析的key值找到commands中对应的函数:
for(command = commands; NULL != command->key; command++ )
if (0 strcmp(command->key, key)) break;
command->function(&request, result) 该函数为:EXECUTE_USER_PARAMETER(AGENT_REQUEST *request, AGENT_RESULT *result)
调用
zbx_execute(command, &cmd_result, error, sizeof(error), CONFIG_TIMEOUT)
zbx_execute该函数中使用了windows和linux不同的机制执行command分别用宏区分开,返回值为cmd_result。

zbx_rtrim(cmd_result, ZBX_WHITESPACE);
SET_TEXT_RESULT(result, zbx_strdup(NULL, cmd_result))
利用cmd_result来填充AGENT_RESULT 。

value = GET_TEXT_RESULT(&result);
value = GET_MSG_RESULT(&result);
zbx_tcp_send(&s_out, *value);
发送数据

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Captcha Code