diff --git a/src/libs/zbxsysinfo/common/zbxkstat.c b/src/libs/zbxsysinfo/common/zbxkstat.c index b950b78..dbda5bd 100644 --- a/src/libs/zbxsysinfo/common/zbxkstat.c +++ b/src/libs/zbxsysinfo/common/zbxkstat.c @@ -26,6 +26,7 @@ static kstat_ctl_t *kc = NULL; static kid_t kc_id = 0; static kstat_t *kc_vminfo; +static kstat_t *kc_sysinfo; static zbx_mutex_t kstat_lock = ZBX_MUTEX_NULL; @@ -62,6 +63,14 @@ static int zbx_kstat_refresh(char **error) ret = FAIL; goto out; } + + if (NULL == (kc_sysinfo = kstat_lookup(kc, "unix", -1, "sysinfo"))) + { + *error = zbx_dsprintf(*error, "failed to find sysinfo data: %s", zbx_strerror(errno)); + ret = FAIL; + goto out; + } + ret = SUCCEED; out: zabbix_log(LOG_LEVEL_DEBUG, "End of %s()", __func__); @@ -147,10 +156,14 @@ void zbx_kstat_collect(zbx_kstat_t *kstat) kid_t kid; char *error = NULL; vminfo_t vminfo; + sysinfo_t sysinfo; zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __func__); - while (-1 == (kid = kstat_read(kc, kc_vminfo, &vminfo)) || kc_id != kid) + while (-1 == (kid = kstat_read(kc, kc_vminfo, &vminfo)) || + kc_id != kid || + -1 == (kid = kstat_read(kc, kc_sysinfo, &sysinfo)) || + kc_id != kid) { if (-1 == kid) zabbix_log(LOG_LEVEL_DEBUG, "cannot collect kstat data, kstat_read: %s", ZBX_NULL2STR(error)); @@ -168,7 +181,7 @@ void zbx_kstat_collect(zbx_kstat_t *kstat) kstat->vminfo_index ^= 1; kstat->vminfo[kstat->vminfo_index].freemem = vminfo.freemem; - kstat->vminfo[kstat->vminfo_index].updates = time(NULL); + kstat->vminfo[kstat->vminfo_index].updates = sysinfo.updates; zbx_mutex_unlock(kstat_lock); @@ -195,6 +208,7 @@ out: ******************************************************************************/ int zbx_kstat_get_freemem(zbx_uint64_t *value, zbx_uint64_t *pagesize, char **error) { + static int last_pagesize = FAIL; int sysconf_pagesize, last, prev, ret = FAIL; zbx_kstat_vminfo_t *vminfo; @@ -223,6 +237,18 @@ int zbx_kstat_get_freemem(zbx_uint64_t *value, zbx_uint64_t *pagesize, char **er if (NULL != pagesize) *pagesize = sysconf_pagesize; + + if (sysconf_pagesize != last_pagesize) + { + if (FAIL != last_pagesize) + { + zabbix_log(LOG_LEVEL_WARNING, + "sysconf(_SC_PAGESIZE) value has changed from [%d] to [%d]", + last_pagesize, sysconf_pagesize); + } + + last_pagesize = sysconf_pagesize; + } } else zabbix_log(LOG_LEVEL_DEBUG, "no new vminfo update is available");