接着上次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代码,你还别说,看源码,治疗睡眠。
< ,>代码被转码的厉害,博主写了自己不看么?
以前是没有问题的,后来我转了模板后,就成这德行了
顺着代码看就行