跟我来看zabbix源码之zabbix_agentd.c客户端代码分析

接着上次zabbix server的源码,server的代码其实很大部分还没看,有一方面是自己的c实在很烂,再就是关于zabbix的代码,官方也没有啥文档,有的文档基本是图形操作和api相关的。这些对我来说,没太大的用处。

     正好这两天在搞爬虫性能的监控,看看’优秀‘的zabbix agentd是怎么玩的。  正题,zabbix_agentd.c 里面发现了include了不少的包,这些包是zabbix agent一些做监控的包,比如cpustat.c、vmstats.c、stats.c等。

这里特意申明下博客的原文地址,xiaorui.cc

可以看到在agentd.c源码中存在一些关于各种配置的线程的数目。  

static char		*TEST_METRIC = NULL;
int			threads_num = 0;
ZBX_THREAD_HANDLE	*threads = NULL;

unsigned char	daemon_type = ZBX_DAEMON_TYPE_AGENT;

ZBX_THREAD_LOCAL unsigned char process_type	= 255;	/* ZBX_PROCESS_TYPE_UNKNOWN */
ZBX_THREAD_LOCAL int process_num;
ZBX_THREAD_LOCAL int server_num			= 0;

ZBX_THREAD_ACTIVECHK_ARGS	*CONFIG_ACTIVE_ARGS = NULL;

int	CONFIG_ALERTER_FORKS		= 0;
int	CONFIG_DISCOVERER_FORKS		= 0;
int	CONFIG_HOUSEKEEPER_FORKS	= 0;
int	CONFIG_PINGER_FORKS		= 0;
int	CONFIG_POLLER_FORKS		= 0;
int	CONFIG_UNREACHABLE_POLLER_FORKS	= 0;
int	CONFIG_HTTPPOLLER_FORKS		= 0;
int	CONFIG_IPMIPOLLER_FORKS		= 0;
int	CONFIG_TIMER_FORKS		= 0;
int	CONFIG_TRAPPER_FORKS		= 0;
int	CONFIG_SNMPTRAPPER_FORKS	= 0;
int	CONFIG_JAVAPOLLER_FORKS		= 0;
int	CONFIG_ESCALATOR_FORKS		= 0;
int	CONFIG_SELFMON_FORKS		= 0;
int	CONFIG_WATCHDOG_FORKS		= 0;
int	CONFIG_DATASENDER_FORKS		= 0;
int	CONFIG_HEARTBEAT_FORKS		= 0;
int	CONFIG_PROXYPOLLER_FORKS	= 0;
int	CONFIG_HISTSYNCER_FORKS		= 0;
int	CONFIG_CONFSYNCER_FORKS		= 0;
int	CONFIG_VMWARE_FORKS		= 0;
int	CONFIG_COLLECTOR_FORKS		= 1;
int	CONFIG_PASSIVE_FORKS		= 3;	/* number of listeners for processing passive checks */
int	CONFIG_ACTIVE_FORKS		= 0;

parse_commandline 这个函数,很明显是用来检查args_parse参数的。 

zbx_validate_config 这个是为了检测配置文件,如果error,会写入日志。 

	if (NULL == CONFIG_HOSTNAME)
	{
		zabbix_log(LOG_LEVEL_CRIT, "\"Hostname\" configuration parameter is not defined");
		exit(EXIT_FAILURE);
	}

	if (FAIL == zbx_check_hostname(CONFIG_HOSTNAME, &ch_error))
	{
		zabbix_log(LOG_LEVEL_CRIT, "invalid \"Hostname\" configuration parameter: '%s': %s", CONFIG_HOSTNAME,
				ch_error);
		zbx_free(ch_error);
		exit(EXIT_FAILURE);
	}

	if (NULL != CONFIG_HOST_METADATA && HOST_METADATA_LEN < zbx_strlen_utf8(CONFIG_HOST_METADATA))
	{
		zabbix_log(LOG_LEVEL_CRIT, "the value of \"HostMetadata\" configuration parameter cannot be longer than"
				" %d characters", HOST_METADATA_LEN);
		exit(EXIT_FAILURE);
	}

	/* make sure active or passive check is enabled */
	if (0 == CONFIG_ACTIVE_FORKS && 0 == CONFIG_PASSIVE_FORKS)
	{
		zabbix_log(LOG_LEVEL_CRIT, "either active or passive checks must be enabled");
		exit(EXIT_FAILURE);
	}

zabbix agent启动的时候,会分别开启三个进程。 

collector_thread
用来收集本机的基本监控信息

listener_thread
用来实现zabbix master连接过来的被动监控

active_checks_thread 
这个是主动的推送数据,记得2.0以前的版本,貌似这段函数是在zabbix_agentd.c 里面的,但是看的时候,发现跑到active.c 。

        {
            case ZBX_PROCESS_TYPE_COLLECTOR:
                threads[i] = zbx_thread_start(collector_thread, thread_args);
                break;
            case ZBX_PROCESS_TYPE_LISTENER:
                thread_args->args = &listen_sock;
                threads[i] = zbx_thread_start(listener_thread, thread_args);
                break;
            case ZBX_PROCESS_TYPE_ACTIVE_CHECKS:
                thread_args->args = &CONFIG_ACTIVE_ARGS[j++];
                threads[i] = zbx_thread_start(active_checks_thread, thread_args);
                break;
        }

主动监控里面有个重要的逻辑,就是获取监控数据的refresh时间,应该是貌似是60s,但是如果你的配置有申明的话,那就按照config来说 。调用的是refresh_active_checks函数,序列化是用json处理的。 

static int  refresh_active_checks(const char *host, unsigned short port)

监控的项目有了,数据也收集了,但是如何去发送,zabbix调用的是send_buffer 函数方法。

if (ITEM_STATE_NOTSUPPORTED == el->state)
    zbx_json_adduint64(&json, ZBX_PROTO_TAG_STATE, ITEM_STATE_NOTSUPPORTED);
if (0 != el->lastlogsize)
    zbx_json_adduint64(&json, ZBX_PROTO_TAG_LOGLASTSIZE, el->lastlogsize);
if (el->mtime)
    zbx_json_adduint64(&json, ZBX_PROTO_TAG_MTIME, el->mtime);
if (el->timestamp)
    zbx_json_adduint64(&json, ZBX_PROTO_TAG_LOGTIMESTAMP, el->timestamp);
if (el->source)
    zbx_json_addstring(&json, ZBX_PROTO_TAG_LOGSOURCE, el->source, ZBX_JSON_TYPE_STRING);
if (el->severity)
    zbx_json_adduint64(&json, ZBX_PROTO_TAG_LOGSEVERITY, el->severity);
if (el->logeventid)
    zbx_json_adduint64(&json, ZBX_PROTO_TAG_LOGEVENTID, el->logeventid);

还有很多没怎么看懂,继续阅读zabbix代码,你还别说,看源码,治疗睡眠。 


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

4 Responses

  1. canghai 2015年3月24日 / 上午11:23

    < ,>代码被转码的厉害,博主写了自己不看么?

发表评论

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