summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: fdfc8dc)
raw | patch | inline | side by side (parent: fdfc8dc)
author | Pierre-Yves Ritschard <pyr@spootnik.org> | |
Wed, 15 Jan 2014 22:10:33 +0000 (23:10 +0100) | ||
committer | Pierre-Yves Ritschard <pyr@spootnik.org> | |
Wed, 15 Jan 2014 22:10:33 +0000 (23:10 +0100) |
src/cpu.c | patch | blob | history |
diff --git a/src/cpu.c b/src/cpu.c
index 5edb592301c7a8e64c3659915d3e49586ed88b84..a85eba760904ce09d7420e919511d3f6a4173f5e 100644 (file)
--- a/src/cpu.c
+++ b/src/cpu.c
# error "No applicable input method."
#endif
-static const char *submit_names[] = {
+static const char *cpu_state_names[] = {
"none",
"user",
"system",
static int pnumcpu;
#endif /* HAVE_PERFSTAT */
+static gauge_t percents[CPU_SUBMIT_MAX] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+int cpu_num = 0;
static _Bool report_by_cpu = 1;
static _Bool report_percent = 0;
+static _Bool report_active = 0;
static const char *config_keys[] =
{
"ReportByCpu",
+ "ReportActive",
"ValuesPercentage"
};
static int config_keys_num = STATIC_ARRAY_SIZE (config_keys);
}
if (strcasecmp (key, "ValuesPercentage") == 0)
report_percent = IS_TRUE (value) ? 1 : 0;
+ if (strcasecmp (key, "ReportActive") == 0)
+ report_active = IS_TRUE (value) ? 1 : 0;
return (-1);
}
return (0);
} /* int init */
-static void submit_value (int plugin_instance, int type_instance,
- derive_t val_d, gauge_t val_g)
+static void submit_value (int cpu_num, int cpu_state, const char *type, value_t value)
{
value_t values[1];
value_list_t vl = VALUE_LIST_INIT;
+ memcpy(&values[0], &value, sizeof(value));
- vl.values = values;
- vl.values_len = 1;
-
- if (report_percent)
- values[0].gauge = val_g;
- else
- values[0].derive = val_d;
+ vl.values = values;
+ vl.values_len = 1;
sstrncpy (vl.host, hostname_g, sizeof (vl.host));
sstrncpy (vl.plugin, "cpu", sizeof (vl.plugin));
- sstrncpy (vl.type, report_percent?"percent":"cpu", sizeof (vl.type));
- sstrncpy (vl.type_instance, submit_names[type_instance],
+ sstrncpy (vl.type, type, sizeof (vl.type));
+ sstrncpy (vl.type_instance, cpu_state_names[cpu_state],
sizeof (vl.type_instance));
- if (plugin_instance > 0) {
+ if (cpu_num > 0) {
ssnprintf (vl.plugin_instance, sizeof (vl.plugin_instance),
"%i", plugin_instance);
}
plugin_dispatch_values (&vl);
}
+static void submit_percent(int cpu_num, int cpu_state, gauge_t percent)
+{
+ value_t value;
+
+ value.gauge = percent;
+ submit_value (cpu_num, cpu_state, "percent", value;)
+}
+
+static void submit_derive(int cpu_num, int cpu_state, derive_t derive)
+{
+ value_t value;
+
+ value.derive = derive;
+ submit_value (cpu_num, cpu_state, "cpu", value;)
+}
+
+static void submit_flush (void)
+{
+ int i = 0;
+
+ if (report_by_cpu)
+ return;
+
+ for (i = 1; i < CPU_SUBMIT_MAX; i++) {
+ if (percents[i] == -1)
+ continue;
+ submit_percent (-1, i, percents[i] / numcpu);
+ }
+ numcpu = 0;
+ memset(percents, 0, sizeof(percents));
+}
+
static void submit (int cpu_num, derive_t *derives)
{
int i = 0;
derive_t cpu_active = 0;
derive_t cpu_total = 0;
- static int numcpu = 0;
- static gauge_t percents[CPU_SUBMIT_MAX] = {
- 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
- };
- gauge_t gauges[CPU_SUBMIT_MAX] = {
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
- };
-
- if (cpu_num == CPU_SUBMIT_FLUSH)
- {
- if (report_by_cpu)
- return;
- for (i = 1; i < CPU_SUBMIT_MAX; i++) {
- if (percents[i] == -1)
- continue;
- submit_value (-1, i, 0, percents[i] / numcpu);
- }
- numcpu = 0;
- memset(percents, 0, sizeof(percents));
- return;
- }
-
+ gauge_t percent;
+
if (!report_percent && report_by_cpu) {
for (i = 1; i < CPU_SUBMIT_ACTIVE; i++)
if (i != CPU_SUBMIT_IDLE)
cpu_active += derives[i];
- submit_value(cpu_num, i, derives[i], 0);
+ submit_derive(cpu_num, i, derives[i]);
}
- submit_value(cpu_num, CPU_SUBMIT_ACTIVE, cpu_active, 0);
+ if (report_active)
+ submit_derive(cpu_num, CPU_SUBMIT_ACTIVE, cpu_active);
}
else /* we are reporting percents */
{
if (i != CPU_SUBMIT_IDLE)
cpu_active += derives[i];
}
- derives[CPU_SUBMIT_ACTIVE] = cpu_active;
+ if (report_active)
+ derives[CPU_SUBMIT_ACTIVE] = cpu_active;
+ else
+ derives[CPU_SUBMIT_ACTIVE] = -1;
numcpu++;
for (i = 1; i < CPU_SUBMIT_MAX; i++) {
percents[i] = -1;
continue;
}
- gauges[i] = ((gauge_t)derives[i] / (gauge_t)cpu_total) * 100.0;
+ percent = ((gauge_t)derives[i] / (gauge_t)cpu_total) * 100.0;
if (report_by_cpu)
{
- submit_value (cpu_num, i, 0, gauges[i]);
- } else if (gauges[i] != -1) {
- percents[i] += gauges[i];
+ submit_percent (cpu_num, i, gauges[i]);
+ } else if (percents[i] != -1) {
+ percents[i] += percent;
}
}
}
#endif
host_t cpu_host;
- derive_t derives[CPU_SUBMIT_MAX];
for (cpu = 0; cpu < cpu_list_len; cpu++)
{
#if PROCESSOR_CPU_LOAD_INFO
+ derive_t derives[CPU_SUBMIT_MAX] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+ };
memset(derives, -1, sizeof(derives));
cpu_host = 0;
cpu_info_len = PROCESSOR_BASIC_INFO_COUNT;
cpu_temp_retry_step = 1;
#endif /* PROCESSOR_TEMPERATURE */
}
- submit(CPU_SUBMIT_FLUSH, NULL);
+ submit_flush ();
/* #endif PROCESSOR_CPU_LOAD_INFO */
#elif defined(KERNEL_LINUX)
int cpu;
- derive_t derives[CPU_SUBMIT_MAX];
FILE *fh;
char buf[1024];
while (fgets (buf, 1024, fh) != NULL)
{
+ derive_t derives[CPU_SUBMIT_MAX] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+ };
+
if (strncmp (buf, "cpu", 3))
continue;
if ((buf[3] < '0') || (buf[3] > '9'))
continue;
cpu = atoi (fields[0] + 3);
- memset(derives, -1, sizeof(derives));
derives[CPU_SUBMIT_USER] = atoll(fields[1]);
derives[CPU_SUBMIT_NICE] = atoll(fields[2]);
derives[CPU_SUBMIT_SYSTEM] = atoll(fields[3]);
}
submit(cpu, derives);
}
- submit(CPU_SUBMIT_FLUSH, NULL);
+ submit_flush();
fclose (fh);
/* #endif defined(KERNEL_LINUX) */
#elif defined(HAVE_LIBKSTAT)
int cpu;
- derive_t derives[]user, syst, idle, wait;
static cpu_stat_t cs;
if (kc == NULL)
for (cpu = 0; cpu < numcpu; cpu++)
{
+ derive_t derives[CPU_SUBMIT_MAX] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+ };
+
if (kstat_read (kc, ksp[cpu], &cs) == -1)
continue; /* error message? */
derives[CPU_SUBMIT_WAIT] = cs.cpu_sysinfo.cpu[CPU_WAIT];
submit (ksp[cpu]->ks_instance, derives);
}
- submit (CPU_SUBMIT_FLUSH, NULL);
+ submit_flush ();
/* #endif defined(HAVE_LIBKSTAT) */
#elif CAN_USE_SYSCTL
}
for (i = 0; i < numcpu; i++) {
- memset(derives, -1, sizeof(derives));
+ derive_t derives[CPU_SUBMIT_MAX] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+ };
+
derives[CPU_SUBMIT_USER] = cpuinfo[i][CP_USER];
derives[CPU_SUBMIT_NICE] = cpuinfo[i][CP_NICE];
derives[CPU_SUBMIT_SYSTEM] = cpuinfo[i][CP_SYS];
derives[CPU_SUBMIT_INTERRUPT] = cpuinfo[i][CP_INTR];
submit(i, derives);
}
- submit(CPU_SUBMIT_FLUSH, NULL);
+ submit_flush();
/* #endif CAN_USE_SYSCTL */
#elif defined(HAVE_SYSCTLBYNAME) && defined(HAVE_SYSCTL_KERN_CP_TIMES)
long cpuinfo[maxcpu][CPUSTATES];
size_t cpuinfo_size;
int i;
- derive_t derives[CPU_SUBMIT_MAX];
memset (cpuinfo, 0, sizeof (cpuinfo));
}
for (i = 0; i < numcpu; i++) {
- memset(derives, -1, sizeof(derives));
+ derive_t derives[CPU_SUBMIT_MAX] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+ };
+
derives[CPU_SUBMIT_USER] = cpuinfo[i][CP_USER];
derives[CPU_SUBMIT_NICE] = cpuinfo[i][CP_NICE];
derives[CPU_SUBMIT_SYSTEM] = cpuinfo[i][CP_SYS];
derives[CPU_SUBMIT_IDLE] = cpuinfo[i][CP_IDLE];
derives[CPU_SUBMIT_INTERRUPT] = cpuinfo[i][CP_INTR];
+ submit(i, derives);
}
- submit(CPU_SUBMIT_FLUSH, NULL);
+ submit_flush();
/* #endif HAVE_SYSCTL_KERN_CP_TIMES */
#elif defined(HAVE_SYSCTLBYNAME)
long cpuinfo[CPUSTATES];
size_t cpuinfo_size;
- derive_t derives[CPU_SUBMIT_MAX];
+ derive_t derives[CPU_SUBMIT_MAX] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+ };
cpuinfo_size = sizeof (cpuinfo);
return (-1);
}
- memset(derives, -1, sizeof(derives));
derives[CPU_SUBMIT_USER] = cpuinfo[CP_USER];
derives[CPU_SUBMIT_SYSTEM] = cpuinfo[CP_SYS];
derives[CPU_SUBMIT_NICE] = cpuinfo[CP_NICE];
derives[CPU_SUBMIT_IDLE] = cpuinfo[CP_IDLE];
derives[CPU_SUBMIT_INTERRUPT] = cpuinfo[CP_INTR];
submit(0, derives);
- submit(CPU_SUBMIT_FLUSH, NULL);
+ submit_flush();
/* #endif HAVE_SYSCTLBYNAME */
#elif defined(HAVE_LIBSTATGRAB)
sg_cpu_stats *cs;
- derive_t derives[CPU_SUBMIT_MAX];
+ derive_t derives[CPU_SUBMIT_MAX] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+ };
cs = sg_get_cpu_stats ();
if (cs == NULL)
return (-1);
}
- memset(derives, -1, sizeof(derives));
derives[CPU_SUBMIT_IDLE] = (derive_t) cs->idle;
derives[CPU_SUBMIT_NICE] = (derive_t) cs->nice;
derives[CPU_SUBMIT_SWAP] = (derive_t) cs->swap;
derives[CPU_SUBMIT_SYSTEM] = (derive_t) cs->kernel;
derives[CPU_SUBMIT_USER] = (derive_t) cs->user;
derives[CPU_SUBMIT_WAIT] = (derive_t) cs->iowait;
+ submit(0, derives);
+ submit_flush();
/* #endif HAVE_LIBSTATGRAB */
#elif defined(HAVE_PERFSTAT)
perfstat_id_t id;
int i, cpus;
- derive_t derives[CPU_SUBMIT_MAX];
numcpu = perfstat_cpu(NULL, NULL, sizeof(perfstat_cpu_t), 0);
if(numcpu == -1)
for (i = 0; i < cpus; i++)
{
- memset(derives, -1, sizeof(derives));
+ derive_t derives[CPU_SUBMIT_MAX] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+ };
derives[CPU_SUBMIT_IDLE] = perfcpu[i].idle;
derives[CPU_SUBMIT_SYSTEM] = perfcpu[i].sys;
derives[CPU_SUBMIT_USER] = perfcpu[i].user;
derives[CPU_SUBMIT_WAIT] = perfcpu[i].wait;
+ submit(i, derives);
}
- submit(CPU_SUBMIT_FLUSH, NULL);
+ submit_flush();
#endif /* HAVE_PERFSTAT */
return (0);