From: rinigus Date: Tue, 5 Jul 2016 13:01:30 +0000 (+0300) Subject: adding CPU sleep plugin X-Git-Tag: collectd-5.6.0~91^2~9 X-Git-Url: https://git.octo.it/?a=commitdiff_plain;h=9e07a3a7d90542740cab85c4f12a06b1df14fb59;hp=d67b510b1ec7c17b6e1f65e40b8d8fdb2f33c857;p=collectd.git adding CPU sleep plugin --- diff --git a/README b/README index 5f249454..c915a539 100644 --- a/README +++ b/README @@ -64,6 +64,9 @@ Features - cpufreq CPU frequency (For laptops with speed step or a similar technology) + - cpusleep + CPU sleep: Time spent in suspend (For mobile devices which enter suspend automatically) + - curl Parse statistics from websites using regular expressions. diff --git a/configure.ac b/configure.ac index e2149ba4..2a4d98d2 100644 --- a/configure.ac +++ b/configure.ac @@ -5440,6 +5440,7 @@ plugin_conntrack="no" plugin_contextswitch="no" plugin_cpu="no" plugin_cpufreq="no" +plugin_cpusleep="no" plugin_curl_json="no" plugin_curl_xml="no" plugin_df="no" @@ -5490,6 +5491,7 @@ then plugin_contextswitch="yes" plugin_cpu="yes" plugin_cpufreq="yes" + plugin_cpusleep="yes" plugin_disk="yes" plugin_drbd="yes" plugin_entropy="yes" @@ -5854,6 +5856,7 @@ AC_PLUGIN([conntrack], [$plugin_conntrack], [nf_conntrack statis AC_PLUGIN([contextswitch], [$plugin_contextswitch], [context switch statistics]) AC_PLUGIN([cpu], [$plugin_cpu], [CPU usage statistics]) AC_PLUGIN([cpufreq], [$plugin_cpufreq], [CPU frequency statistics]) +AC_PLUGIN([cpusleep], [$plugin_cpusleep], [CPU sleep statistics]) AC_PLUGIN([csv], [yes], [CSV output plugin]) AC_PLUGIN([curl], [$with_libcurl], [CURL generic web statistics]) AC_PLUGIN([curl_json], [$plugin_curl_json], [CouchDB statistics]) @@ -6257,6 +6260,7 @@ Configuration: contextswitch . . . . $enable_contextswitch cpu . . . . . . . . . $enable_cpu cpufreq . . . . . . . $enable_cpufreq + cpusleep . . . . . . $enable_cpusleep csv . . . . . . . . . $enable_csv curl . . . . . . . . $enable_curl curl_json . . . . . . $enable_curl_json diff --git a/src/Makefile.am b/src/Makefile.am index d54094f6..37745117 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -257,6 +257,12 @@ cpufreq_la_SOURCES = cpufreq.c cpufreq_la_LDFLAGS = $(PLUGIN_LDFLAGS) endif +if BUILD_PLUGIN_CPUSLEEP +pkglib_LTLIBRARIES += cpusleep.la +cpusleep_la_SOURCES = cpusleep.c +cpusleep_la_LDFLAGS = $(PLUGIN_LDFLAGS) +endif + if BUILD_PLUGIN_CSV pkglib_LTLIBRARIES += csv.la csv_la_SOURCES = csv.c diff --git a/src/collectd.conf.in b/src/collectd.conf.in index 93644fa5..bd8b2560 100644 --- a/src/collectd.conf.in +++ b/src/collectd.conf.in @@ -104,6 +104,7 @@ #@BUILD_PLUGIN_CONTEXTSWITCH_TRUE@LoadPlugin contextswitch @BUILD_PLUGIN_CPU_TRUE@@BUILD_PLUGIN_CPU_TRUE@LoadPlugin cpu #@BUILD_PLUGIN_CPUFREQ_TRUE@LoadPlugin cpufreq +#@BUILD_PLUGIN_CPUSLEEP_TRUE@LoadPlugin cpusleep @LOAD_PLUGIN_CSV@LoadPlugin csv #@BUILD_PLUGIN_CURL_TRUE@LoadPlugin curl #@BUILD_PLUGIN_CURL_JSON_TRUE@LoadPlugin curl_json diff --git a/src/collectd.conf.pod b/src/collectd.conf.pod index b7a4f46c..e18ef45c 100644 --- a/src/collectd.conf.pod +++ b/src/collectd.conf.pod @@ -1431,6 +1431,15 @@ installed) to get the current CPU frequency. If this file does not exist make sure B (L) or a similar tool is installed and an "cpu governor" (that's a kernel module) is loaded. +=head2 Plugin C + +This plugin doesn't have any options. It reads CLOCK_BOOTTIME and +CLOCK_MONOTONIC and reports the differences between these +clocks. Since BOOTTIME clock increments while device is suspended and +MONOTONIC clock does not, the derivative of the difference between +these clocks gives the relative amount of time the device has spent in +suspend state. The recorded value is in milliseconds / seconds. + =head2 Plugin C =over 4 diff --git a/src/cpusleep.c b/src/cpusleep.c new file mode 100644 index 00000000..46f10409 --- /dev/null +++ b/src/cpusleep.c @@ -0,0 +1,87 @@ +/** + * collectd - src/cpusleep.c + * Copyright (C) 2016 rinigus + * + * +The MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + * Authors: + * rinigus + + CPU sleep is reported in milliseconds / s. For that, derive type was + selected and the time difference between BOOT and MONOTONIC clocks + fed to RRD + + **/ + +#include "collectd.h" +#include "common.h" +#include "plugin.h" +#include + +static void cpusleep_submit (derive_t cpu_sleep) +{ + value_t values[1]; + value_list_t vl = VALUE_LIST_INIT; + + values[0].derive = (derive_t) cpu_sleep; + + vl.values = values; + vl.values_len = 1; + sstrncpy (vl.host, hostname_g, sizeof (vl.host)); + sstrncpy (vl.plugin, "cpusleep", sizeof (vl.plugin)); + sstrncpy (vl.type, "cpusleep", sizeof (vl.type)); + + plugin_dispatch_values (&vl); +} + +static int cpusleep_read (void) +{ + struct timespec b, m; + if ( clock_gettime(CLOCK_BOOTTIME, &b ) < 0 ) + { + ERROR("cpusleep plugin: clock_gettime CLOCK_MONOTONIC failed"); + return (-1); + } + + if ( clock_gettime(CLOCK_MONOTONIC, &m ) < 0 ) + { + ERROR("cpusleep plugin: clock_gettime CLOCK_MONOTONIC failed"); + return (-1); + } + + double db = b.tv_sec + 1e-9 * b.tv_nsec; + double dm = m.tv_sec + 1e-9 * m.tv_nsec; + + // to avoid false positives in counter overflow due to reboot, + // derive is used + derive_t sleep = (derive_t) ((db-dm) * 1000); + + cpusleep_submit (sleep); + + return 0; +} + +void module_register (void) +{ + plugin_register_read ("cpusleep", cpusleep_read); +} /* void module_register */ diff --git a/src/types.db b/src/types.db index 0c5a4334..e0d58067 100644 --- a/src/types.db +++ b/src/types.db @@ -30,6 +30,7 @@ count value:GAUGE:0:U counter value:COUNTER:U:U cpu value:DERIVE:0:U cpufreq value:GAUGE:0:U +cpusleep value:DERIVE:0:U current value:GAUGE:U:U current_connections value:GAUGE:0:U current_sessions value:GAUGE:0:U