首页 技术与阅读 生活 关于我

Zabbix源码分析 -- Zabbix Server的main_poller_loop()分析

相关数据结构

对于进程main_poller_loop()来说,最重要的变量为cachecache是一个类型为ZBX_DC_CACHE的结构体;进程main_poller_loop()的主要作用就是为cache赋值。

cache中,可以保存各item的历史数据,各item的趋势数据,各类型item历史数据的数量,以及相关的其它数据。

结构体ZBX_DC_CACHE的具体内容如下所示:

在ZBX_DC_CACHE中,用到了zbx_hashset_tZBX_DC_STATSZBX_DC_HISTORY等结构体,关于zbx_hashset_tZabbix Server源码分析之main_dbconfig_loop()已做了分析,此处不再赘述;接下来只对ZBX_DC_CACHE,ZBX_DC_HISTORY做相关介绍。

结构体ZBX_DC_HISTORY存储某一个item某一次的历史数据,其具体内容如下所示:

结构体ZBX_DC_STATS保存了各类型(总的item、类型为float的item、类型为uint的item、类型为str的item、类型为log的item、类型为text的item、暂不支持的item)item历史数据的数量,其具体内容如下所示:

在结构体ZBX_DC_ITEM中,存储有item公有的一些信息,根据item->value_type的不同,额外的信息会存入ZBX_DC_NUMITEMZBX_DC_LOGITEM中; 根据item->type的不同,额外的信息会存入ZBX_DC_SNMPITEMZBX_DC_IPMIITEMZBX_DC_FLEXITEMZBX_DC_TRAPITEMZBX_DC_DBITEMZBX_DC_SSHITEMZBX_DC_TELNETITEMZBX_DC_SIMPLEITEMZBX_DC_JMXITEMZBX_DC_CALCITEMZBX_DC_INTERFACE_ITEM中;ZBX_DC_ITEM具体内容如下所示:

如前所述,item的信息是存储于不同变量中的,为应用方便又定义了一个结构体DC_ITEM来存储item的所有信息,DC_ITEM具体内容如下所示:

一个item的值是有不同类型的,在Zabbix中item的值的类型包括floatstrloguinttext,这些信息存储于枚举类型zbx_item_value_type_t中,zbx_item_value_type_t具体内容如下所示:

一个item的值可以通过多种方式获取,根据获取方式的不同,一个item有不同的类型,在Zabbix中一个item的类型包括ITEM_TYPE_ZABBIXITEM_TYPE_SNMPv1ITEM_TYPE_TRAPPER等,这些信息存储于枚举类型zbx_item_type_t中,zbx_item_type_t具体内容如下所示:

进程main_poller_loop一次会获取一个或多个item的数据,这些数据不会直接一个一个的存入cache中,而是会先存入item_values中,最后再将item_values中的数据一次刷入cache中,item_values的类型为dc_item_value_tdc_item_value_t为一结构体,其具体内容如下所示:

config->hosts中存储的host的类型为ZBX_DC_HOSTZBX_DC_HOST的具体内容如下所示:

DC_ITEM中有个host字段的类型为DC_HOSTDC_HOST相比于ZBX_DC_HOST有着更全面的信息,DC_HOST的具体内容如下所示:

进程main_poller_loop()的主要函数

main_poller_loop主要作用是通过调用函数get_values(unsigned char poller_type)来获取监控数据,传入函数get_values的参数为poller_type,目前poller_type共有5种:ZBX_POLLER_TYPE_NORMALZBX_POLLER_TYPE_UNREACHABLEZBX_POLLER_TYPE_IPMIZBX_POLLER_TYPE_PINGERZBX_POLLER_TYPE_JAVA

函数get_values主要做三件事:1,准备items(prepare items),items指定了需要获取哪些item的数据;2,获取items中各item的数据(retrive item values);3,处理获取到的各item的数据(process item values),就是要把获取到的数据存入cache中。

如前所述,在函数get_values中共有3个步骤:prepare items, retrive item values, process item values;前面已对每个步骤做了大略的介绍,下面会对每个步骤做更为详细的讲解。

prepare items

调用函数DCconfig_get_poller_items时,向其传入了指向类型DC_ITEM的名为items的指针,在函数DCconfig_get_poller_items中会从config->queues中获取数据,然后存入items中;函数DCconfig_get_poller_items的返回值为itemsitem的数量。

retrive item values

函数get_value有两个参数item(类型为DC_ITEM),result(类型为AGENT_RESULT),参数item指明此次要获取哪一个item的数据,参数result用来存储获取到的item的数据。

函数get_value_agent会通过Zabbix agent获取item的值,并将结果存入result中。

process item values

process item values又可以分为两个步骤:1,将获取到的数据存入item_values中;2,将item_values中的数据存入cache中。

函数dc_add_history会根据itemvalue_type的不同,调用不同的函数向item_values中存入数据。

函数dc_local_add_history_dbl先从item_values中获取item_value,然后填写item_value中的某些字段。

函数dc_local_get_history_slot具体实现从item_values中获取item_value

函数dc_flush_history会将item_values中的数据存入cache中。

item_value->value_typeITEM_VALUE_TYPE_FLAOT时,会调用函数DCadd_history_dbl将某item_value中的数据存入cache中。

函数DCget_history_ptrcache中获取history的一个指针。

函数DCvacuum_history的作用未理清。

comments powered by Disqus

技术与阅读

生活

关于我