From: Florian Forster Date: Mon, 8 Sep 2014 15:11:56 +0000 (+0200) Subject: Merge remote-tracking branch 'github/master' X-Git-Tag: collectd-5.5.0~204 X-Git-Url: https://git.octo.it/?a=commitdiff_plain;h=67411e0794cfcab38e322b2ebbe2e5207cbdd86a;hp=c0a9b7b38edf881e134f602b62990518a79bf191;p=collectd.git Merge remote-tracking branch 'github/master' --- diff --git a/src/collectd.conf.in b/src/collectd.conf.in index c9310ee0..7c9860f0 100644 --- a/src/collectd.conf.in +++ b/src/collectd.conf.in @@ -25,6 +25,13 @@ #AutoLoadPlugin false #----------------------------------------------------------------------------# +# When enabled, internal statistics are collected, using "collectd" as the # +# plugin name. # +# Disabled by default. # +#----------------------------------------------------------------------------# +#CollectInternalStats 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 d38c5c94..cabbb526 100644 --- a/src/collectd.conf.pod +++ b/src/collectd.conf.pod @@ -146,6 +146,18 @@ BPluginE...E> block acts as if it was immediately preceded by a B statement. B statements are still required for plugins that don't provide any configuration, e.g. the I. +=item B B|B + +When set to B, various statistics about the I daemon will be +collected, with "collectd" as the I. Defaults to B. + +The "write_queue" I reports the number of elements currently +queued and the number of elements dropped off the queue by the +B/B mechanism. + +The "cache" I reports the number of elements in the value list +cache (the cache you can interact with using L). + =item B I [I] If I points to a file, includes that file. If I points to a @@ -276,8 +288,11 @@ If B is set to non-zero and B is unset, the latter will default to half of B. If you do not want to randomly drop values when the queue size is between -I and I, set If B and -B to same value. +I and I, set B and B +to the same value. + +Enabling the B option is of great help to figure out the +values to set B and B to. =item B I diff --git a/src/configfile.c b/src/configfile.c index 9a5807ce..9841efda 100644 --- a/src/configfile.c +++ b/src/configfile.c @@ -117,6 +117,7 @@ static cf_global_option_t cf_global_options[] = {"WriteQueueLimitLow", NULL, NULL}, {"Timeout", NULL, "2"}, {"AutoLoadPlugin", NULL, "false"}, + {"CollectInternalStats", NULL, "false"}, {"PreCacheChain", NULL, "PreCache"}, {"PostCacheChain", NULL, "PostCache"}, {"MaxReadInterval", NULL, "86400"} diff --git a/src/plugin.c b/src/plugin.c index 5b9763ab..cd992044 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -131,6 +131,9 @@ static _Bool plugin_ctx_key_initialized = 0; 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 */ @@ -144,6 +147,52 @@ static const char *plugin_get_dir (void) 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, "collectd", 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, "cache_size", 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) @@ -1472,6 +1521,9 @@ void plugin_init_all (void) /* Init the value cache */ uc_init (); + if (IS_TRUE (global_option_get ("CollectInternalStats"))) + record_statistics = 1; + chain_name = global_option_get ("PreCacheChain"); pre_cache_chain = fc_chain_get_by_name (chain_name); @@ -1564,6 +1616,9 @@ void plugin_init_all (void) /* TODO: Rename this function. */ void plugin_read_all (void) { + if(record_statistics) { + plugin_update_internal_statistics (); + } uc_check_timeout (); return; @@ -2085,9 +2140,16 @@ static _Bool check_drop_value (void) /* {{{ */ 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 ()) { + if(record_statistics) { + 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 9d867815..fe22f211 100644 --- a/src/utils_cache.c +++ b/src/utils_cache.c @@ -570,6 +570,16 @@ gauge_t *uc_get_rate (const data_set_t *ds, const value_list_t *vl) 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 16039aa8..ea3eb2f4 100644 --- a/src/utils_cache.h +++ b/src/utils_cache.h @@ -40,6 +40,7 @@ int uc_update (const data_set_t *ds, const value_list_t *vl); 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);