Code

New InternalStatistics
authorYves Mettier <ymettier@free.fr>
Tue, 5 Aug 2014 08:17:53 +0000 (10:17 +0200)
committerYves Mettier <ymettier@free.fr>
Tue, 5 Aug 2014 08:17:53 +0000 (10:17 +0200)
src/collectd.conf.in
src/collectd.conf.pod
src/configfile.c
src/plugin.c
src/utils_cache.c
src/utils_cache.h

index 2d51aec7408479c6e37aaa065c0ec325d53d8bba..f4a31129eb32ea26dac2fbbc77f9d59f9ab3f818 100644 (file)
 #----------------------------------------------------------------------------#
 #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:               #
index cc556a0d981ea5c240ed146f2fc2782cd5553f12..ba9b6cae89007fc5bf29635db658d51b86f7f3bd 100644 (file)
@@ -222,6 +222,11 @@ on the I<Interval> information contained in each value list. This is used in
 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
index 855681b5e10092755ff7190b0445ff43116212da..c099970940eee115f8bfca0c3594127060491fc7 100644 (file)
@@ -117,6 +117,7 @@ static cf_global_option_t cf_global_options[] =
        {"WriteQueueLimitLow", NULL, NULL},
        {"Timeout",     NULL, "2"},
        {"AutoLoadPlugin", NULL, "false"},
+       {"InternalStatistics", NULL, "false"},
        {"PreCacheChain",  NULL, "PreCache"},
        {"PostCacheChain", NULL, "PostCache"}
 };
index 30a1ff1a304911f91e571fe56cd22c4d15535078..6e1f9722d2b7cfae6232d8ab232d652a3f66e67f 100644 (file)
@@ -127,6 +127,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
  */
@@ -140,6 +143,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, "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)
@@ -1468,6 +1517,9 @@ void plugin_init_all (void)
        /* 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);
 
@@ -1556,6 +1608,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;
@@ -2077,9 +2132,14 @@ 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 ()) {
+               pthread_mutex_lock(&statistics_lock);
+               stats_values_dropped++;
+               pthread_mutex_unlock(&statistics_lock);
                return (0);
+       }
 
        status = plugin_write_enqueue (vl);
        if (status != 0)
index 9d867815c2775b1854c42c547127817ef0bd8599..fe22f211bceafac758ad5734672526cc86df640c 100644 (file)
@@ -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;
index 16039aa850ce0ee2268077089dd263363eb6b781..ea3eb2f4db8342de2d85daef48271fe265024992 100644 (file)
@@ -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);