summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 600b824)
raw | patch | inline | side by side (parent: 600b824)
author | Yves Mettier <ymettier@free.fr> | |
Tue, 5 Aug 2014 08:17:53 +0000 (10:17 +0200) | ||
committer | Yves Mettier <ymettier@free.fr> | |
Tue, 5 Aug 2014 08:17:53 +0000 (10:17 +0200) |
diff --git a/src/collectd.conf.in b/src/collectd.conf.in
index 2d51aec7408479c6e37aaa065c0ec325d53d8bba..f4a31129eb32ea26dac2fbbc77f9d59f9ab3f818 100644 (file)
--- a/src/collectd.conf.in
+++ b/src/collectd.conf.in
#----------------------------------------------------------------------------#
#AutoLoadPlugin false
+#----------------------------------------------------------------------------#
+# When enabled, some internal statistics are recorded as values #
+# Disabled by default. #
+#----------------------------------------------------------------------------#
+#InternalStatistics false
+
#----------------------------------------------------------------------------#
# Interval at which to query values. This may be overwritten on a per-plugin #
# base by using the 'Interval' option of the LoadPlugin block: #
diff --git a/src/collectd.conf.pod b/src/collectd.conf.pod
index cc556a0d981ea5c240ed146f2fc2782cd5553f12..ba9b6cae89007fc5bf29635db658d51b86f7f3bd 100644 (file)
--- a/src/collectd.conf.pod
+++ b/src/collectd.conf.pod
the I<Threshold> configuration to dispatch notifications about missing values,
see L<collectd-threshold(5)> for details.
+=item B<InternalStatistics> I<true|false>
+
+Some internal statistics can be recorded to monitor Collectd itself.
+Default value : false.
+
=item B<ReadThreads> I<Num>
Number of threads to start for reading plugins. The default value is B<5>, but
diff --git a/src/configfile.c b/src/configfile.c
index 855681b5e10092755ff7190b0445ff43116212da..c099970940eee115f8bfca0c3594127060491fc7 100644 (file)
--- a/src/configfile.c
+++ b/src/configfile.c
{"WriteQueueLimitLow", NULL, NULL},
{"Timeout", NULL, "2"},
{"AutoLoadPlugin", NULL, "false"},
+ {"InternalStatistics", NULL, "false"},
{"PreCacheChain", NULL, "PreCache"},
{"PostCacheChain", NULL, "PostCache"}
};
diff --git a/src/plugin.c b/src/plugin.c
index 30a1ff1a304911f91e571fe56cd22c4d15535078..6e1f9722d2b7cfae6232d8ab232d652a3f66e67f 100644 (file)
--- a/src/plugin.c
+++ b/src/plugin.c
static long write_limit_high = 0;
static long write_limit_low = 0;
+static derive_t stats_values_dropped = 0;
+static _Bool record_statistics = 0;
+
/*
* Static functions
*/
return (plugindir);
}
+static void plugin_update_internal_statistics (void) { /* {{{ */
+ derive_t copy_write_queue_length;
+ value_list_t vl = VALUE_LIST_INIT;
+ value_t values[2];
+
+ copy_write_queue_length = write_queue_length;
+
+ /* Initialize `vl' */
+ vl.values = values;
+ vl.values_len = 2;
+ vl.time = 0;
+ sstrncpy (vl.host, hostname_g, sizeof (vl.host));
+ sstrncpy (vl.plugin, "internal", sizeof (vl.plugin));
+
+ vl.type_instance[0] = 0;
+ vl.values_len = 1;
+
+ /* Write queue */
+ sstrncpy (vl.plugin_instance, "write_queue",
+ sizeof (vl.plugin_instance));
+
+ /* Write queue : queue length */
+ vl.values[0].gauge = (gauge_t) copy_write_queue_length;
+ sstrncpy (vl.type, "queue_length", sizeof (vl.type));
+ vl.type_instance[0] = 0;
+ plugin_dispatch_values (&vl);
+
+ /* Write queue : Values dropped (queue length > low limit) */
+ vl.values[0].derive = (derive_t) stats_values_dropped;
+ sstrncpy (vl.type, "derive", sizeof (vl.type));
+ sstrncpy (vl.type_instance, "dropped", sizeof (vl.type_instance));
+ plugin_dispatch_values (&vl);
+
+ /* Cache */
+ sstrncpy (vl.plugin_instance, "cache",
+ sizeof (vl.plugin_instance));
+
+ /* Cache : Nb entry in cache tree */
+ vl.values[0].gauge = (gauge_t) uc_get_size();
+ sstrncpy (vl.type, "nb_values", sizeof (vl.type));
+ vl.type_instance[0] = 0;
+ plugin_dispatch_values (&vl);
+
+ return;
+} /* }}} void plugin_update_internal_statistics */
+
static void destroy_callback (callback_func_t *cf) /* {{{ */
{
if (cf == NULL)
/* Init the value cache */
uc_init ();
+ if (IS_TRUE (global_option_get ("InternalStatistics")))
+ record_statistics = 1;
+
chain_name = global_option_get ("PreCacheChain");
pre_cache_chain = fc_chain_get_by_name (chain_name);
/* TODO: Rename this function. */
void plugin_read_all (void)
{
+ if(record_statistics) {
+ plugin_update_internal_statistics ();
+ }
uc_check_timeout ();
return;
int plugin_dispatch_values (value_list_t const *vl)
{
int status;
+ static pthread_mutex_t statistics_lock = PTHREAD_MUTEX_INITIALIZER;
- if (check_drop_value ())
+ if (check_drop_value ()) {
+ pthread_mutex_lock(&statistics_lock);
+ stats_values_dropped++;
+ pthread_mutex_unlock(&statistics_lock);
return (0);
+ }
status = plugin_write_enqueue (vl);
if (status != 0)
diff --git a/src/utils_cache.c b/src/utils_cache.c
index 9d867815c2775b1854c42c547127817ef0bd8599..fe22f211bceafac758ad5734672526cc86df640c 100644 (file)
--- a/src/utils_cache.c
+++ b/src/utils_cache.c
return (ret);
} /* gauge_t *uc_get_rate */
+size_t uc_get_size() {
+ size_t size_arrays = 0;
+
+ pthread_mutex_lock (&cache_lock);
+ size_arrays = (size_t) c_avl_size (cache_tree);
+ pthread_mutex_unlock (&cache_lock);
+
+ return (size_arrays);
+}
+
int uc_get_names (char ***ret_names, cdtime_t **ret_times, size_t *ret_number)
{
c_avl_iterator_t *iter;
diff --git a/src/utils_cache.h b/src/utils_cache.h
index 16039aa850ce0ee2268077089dd263363eb6b781..ea3eb2f4db8342de2d85daef48271fe265024992 100644 (file)
--- a/src/utils_cache.h
+++ b/src/utils_cache.h
int uc_get_rate_by_name (const char *name, gauge_t **ret_values, size_t *ret_values_num);
gauge_t *uc_get_rate (const data_set_t *ds, const value_list_t *vl);
+size_t uc_get_size();
int uc_get_names (char ***ret_names, cdtime_t **ret_times, size_t *ret_number);
int uc_get_state (const data_set_t *ds, const value_list_t *vl);