X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fvirt.c;fp=src%2Fvirt.c;h=a828c456bfcccd2cc5133f0c57b715145a723306;hb=c00630eab6161514c1044e8adb2895f179a535da;hp=c52a8a7eb6ab950dffd00478079a1a80fd3bef79;hpb=db13c6de0558fac44baed03c24af111c50dad7ec;p=collectd.git diff --git a/src/virt.c b/src/virt.c index c52a8a7e..a828c456 100644 --- a/src/virt.c +++ b/src/virt.c @@ -639,12 +639,6 @@ static time_t last_refresh = (time_t)0; static int refresh_lists(struct lv_read_instance *inst); -struct lv_info { - virDomainInfo di; - unsigned long long total_user_cpu_time; - unsigned long long total_syst_cpu_time; -}; - struct lv_block_info { virDomainBlockStatsStruct bi; @@ -708,59 +702,9 @@ static int get_block_info(struct lv_block_info *binfo, virErrorPtr err; \ err = (conn) ? virConnGetLastError((conn)) : virGetLastError(); \ if (err) \ - ERROR("%s: %s", (s), err->message); \ + ERROR(PLUGIN_NAME " plugin: %s failed: %s", (s), err->message); \ } while (0) -static void init_lv_info(struct lv_info *info) { - if (info != NULL) - memset(info, 0, sizeof(*info)); -} - -static int lv_domain_info(virDomainPtr dom, struct lv_info *info) { -#ifdef HAVE_CPU_STATS - virTypedParameterPtr param = NULL; - int nparams = 0; -#endif /* HAVE_CPU_STATS */ - int ret = virDomainGetInfo(dom, &(info->di)); - if (ret != 0) { - return ret; - } - -#ifdef HAVE_CPU_STATS - nparams = virDomainGetCPUStats(dom, NULL, 0, -1, 1, 0); - if (nparams < 0) { - VIRT_ERROR(conn, "getting the CPU params count"); - return -1; - } - - param = calloc(nparams, sizeof(virTypedParameter)); - if (param == NULL) { - ERROR("virt plugin: alloc(%i) for cpu parameters failed.", nparams); - return -1; - } - - ret = virDomainGetCPUStats(dom, param, nparams, -1, 1, 0); // total stats. - if (ret < 0) { - virTypedParamsClear(param, nparams); - sfree(param); - VIRT_ERROR(conn, "getting the disk params values"); - return -1; - } - - for (int i = 0; i < nparams; ++i) { - if (!strcmp(param[i].field, "user_time")) - info->total_user_cpu_time = param[i].value.ul; - else if (!strcmp(param[i].field, "system_time")) - info->total_syst_cpu_time = param[i].value.ul; - } - - virTypedParamsClear(param, nparams); - sfree(param); -#endif /* HAVE_CPU_STATS */ - - return 0; -} - static void init_value_list(value_list_t *vl, virDomainPtr dom) { const char *name; char uuid[VIR_UUID_STRING_BUFLEN]; @@ -892,14 +836,6 @@ static void submit_derive2(const char *type, derive_t v0, derive_t v1, submit(dom, type, devname, values, STATIC_ARRAY_SIZE(values)); } /* void submit_derive2 */ -static void pcpu_submit(virDomainPtr dom, struct lv_info *info) { -#ifdef HAVE_CPU_STATS - if (extra_stats & ex_stats_pcpu) - submit_derive2("ps_cputime", info->total_user_cpu_time, - info->total_syst_cpu_time, dom, NULL); -#endif /* HAVE_CPU_STATS */ -} - static double cpu_ns_to_percent(unsigned int node_cpus, unsigned long long cpu_time_old, unsigned long long cpu_time_new) { @@ -1411,13 +1347,13 @@ static int get_vcpu_stats(virDomainPtr domain, unsigned short nr_virt_cpu) { virVcpuInfoPtr vinfo = calloc(nr_virt_cpu, sizeof(vinfo[0])); if (vinfo == NULL) { - ERROR(PLUGIN_NAME " plugin: malloc failed."); + ERROR(PLUGIN_NAME " plugin: calloc failed."); return -1; } unsigned char *cpumaps = calloc(nr_virt_cpu, cpu_map_len); if (cpumaps == NULL) { - ERROR(PLUGIN_NAME " plugin: malloc failed."); + ERROR(PLUGIN_NAME " plugin: calloc failed."); sfree(vinfo); return -1; } @@ -1443,6 +1379,49 @@ static int get_vcpu_stats(virDomainPtr domain, unsigned short nr_virt_cpu) { return 0; } +#ifdef HAVE_CPU_STATS +static int get_pcpu_stats(virDomainPtr dom) { + int nparams = virDomainGetCPUStats(dom, NULL, 0, -1, 1, 0); + if (nparams < 0) { + VIRT_ERROR(conn, "getting the CPU params count"); + return -1; + } + + virTypedParameterPtr param = calloc(nparams, sizeof(virTypedParameter)); + if (param == NULL) { + ERROR(PLUGIN_NAME " plugin: alloc(%i) for cpu parameters failed.", nparams); + return -1; + } + + int ret = virDomainGetCPUStats(dom, param, nparams, -1, 1, 0); // total stats. + if (ret < 0) { + virTypedParamsClear(param, nparams); + sfree(param); + VIRT_ERROR(conn, "getting the CPU params values"); + return -1; + } + + unsigned long long total_user_cpu_time = 0; + unsigned long long total_syst_cpu_time = 0; + + for (int i = 0; i < nparams; ++i) { + if (!strcmp(param[i].field, "user_time")) + total_user_cpu_time = param[i].value.ul; + else if (!strcmp(param[i].field, "system_time")) + total_syst_cpu_time = param[i].value.ul; + } + + if (total_user_cpu_time > 0 || total_syst_cpu_time > 0) + submit_derive2("ps_cputime", total_user_cpu_time, total_syst_cpu_time, dom, + NULL); + + virTypedParamsClear(param, nparams); + sfree(param); + + return 0; +} +#endif /* HAVE_CPU_STATS */ + #ifdef HAVE_DOM_REASON static void domain_state_submit(virDomainPtr dom, int state, int reason) { @@ -1716,15 +1695,13 @@ static int get_job_stats(virDomainPtr domain) { #endif /* HAVE_JOB_STATS */ static int get_domain_metrics(domain_t *domain) { - struct lv_info info; - if (!domain || !domain->ptr) { - ERROR(PLUGIN_NAME ": get_domain_metrics: NULL pointer"); + ERROR(PLUGIN_NAME "plugin: get_domain_metrics: NULL pointer"); return -1; } - init_lv_info(&info); - int status = lv_domain_info(domain->ptr, &info); + virDomainInfo info; + int status = virDomainGetInfo(domain->ptr, &info); if (status != 0) { ERROR(PLUGIN_NAME " plugin: virDomainGetInfo failed with status %i.", status); @@ -1742,15 +1719,19 @@ static int get_domain_metrics(domain_t *domain) { } /* Gather remaining stats only for running domains */ - if (info.di.state != VIR_DOMAIN_RUNNING) + if (info.state != VIR_DOMAIN_RUNNING) return 0; - pcpu_submit(domain->ptr, &info); - cpu_submit(domain, info.di.cpuTime); +#ifdef HAVE_CPU_STATS + if (extra_stats & ex_stats_pcpu) + get_pcpu_stats(domain->ptr); +#endif + + cpu_submit(domain, info.cpuTime); - memory_submit(domain->ptr, (gauge_t)info.di.memory * 1024); + memory_submit(domain->ptr, (gauge_t)info.memory * 1024); - GET_STATS(get_vcpu_stats, "vcpu stats", domain->ptr, info.di.nrVirtCpu); + GET_STATS(get_vcpu_stats, "vcpu stats", domain->ptr, info.nrVirtCpu); GET_STATS(get_memory_stats, "memory stats", domain->ptr); #ifdef HAVE_PERF_STATS @@ -1775,7 +1756,7 @@ static int get_domain_metrics(domain_t *domain) { #endif /* Update cached virDomainInfo. It has to be done after cpu_submit */ - memcpy(&domain->info, &info.di, sizeof(domain->info)); + memcpy(&domain->info, &info, sizeof(domain->info)); return 0; }