Code

src/utils_cache.c: Implement “uc_{get,set,inc}_hits”.
authorAndrés J. Díaz <ajdiaz@connectical.com>
Mon, 31 Aug 2009 16:06:15 +0000 (18:06 +0200)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Mon, 31 Aug 2009 19:38:43 +0000 (21:38 +0200)
Hi

I've attached a patch to add hit counter to thresholds, that is, each
time when threhsold raised, then an internal hit counter is incremented,
when the value of the counter raise a specific value setted in
configuration, then the notification is generated and counter is reset.
Here are an example of threshold configuration with hit conter:

<Threshold>
  <Plugin load>
    <Type load>
       WarninMax 1
       Hits 3
    </Type>
   </Plugin>
</Threshold>

In this example the notification will be generated when load value is
greater than 1 for 3 intervals.

Here are two patches, the first one adds hit feature to the collectd
cached and the second one use hits in thresholds,

Of course comments and suggestions are welcome :)

Enjoy!

Regards,
  Andres

Signed-off-by: Florian Forster <octo@leeloo.lan.home.verplant.org>
src/utils_cache.c
src/utils_cache.h

index 956f8269c786a04614b089a088d5640be0b3ce83..9e7bc067dc8198605de7a4fd8fdac5798b9dbe41 100644 (file)
@@ -46,6 +46,7 @@ typedef struct cache_entry_s
         * (for purding old entries) */
        int interval;
        int state;
+       int hits;
 
        /*
         * +-----+-----+-----+-----+-----+-----+-----+-----+-----+----
@@ -895,6 +896,83 @@ int uc_get_history (const data_set_t *ds, const value_list_t *vl,
   return (uc_get_history_by_name (name, ret_history, num_steps, num_ds));
 } /* int uc_get_history */
 
+int uc_get_hits (const data_set_t *ds, const value_list_t *vl)
+{
+  char name[6 * DATA_MAX_NAME_LEN];
+  cache_entry_t *ce = NULL;
+  int ret = STATE_ERROR;
+
+  if (FORMAT_VL (name, sizeof (name), vl) != 0)
+  {
+    ERROR ("uc_get_state: FORMAT_VL failed.");
+    return (STATE_ERROR);
+  }
+
+  pthread_mutex_lock (&cache_lock);
+
+  if (c_avl_get (cache_tree, name, (void *) &ce) == 0)
+  {
+    assert (ce != NULL);
+    ret = ce->hits;
+  }
+
+  pthread_mutex_unlock (&cache_lock);
+
+  return (ret);
+} /* int uc_get_hits */
+
+int uc_set_hits (const data_set_t *ds, const value_list_t *vl, int hits)
+{
+  char name[6 * DATA_MAX_NAME_LEN];
+  cache_entry_t *ce = NULL;
+  int ret = -1;
+
+  if (FORMAT_VL (name, sizeof (name), vl) != 0)
+  {
+    ERROR ("uc_get_state: FORMAT_VL failed.");
+    return (STATE_ERROR);
+  }
+
+  pthread_mutex_lock (&cache_lock);
+
+  if (c_avl_get (cache_tree, name, (void *) &ce) == 0)
+  {
+    assert (ce != NULL);
+    ret = ce->hits;
+    ce->hits = hits;
+  }
+
+  pthread_mutex_unlock (&cache_lock);
+
+  return (ret);
+} /* int uc_set_hits */
+
+int uc_inc_hits (const data_set_t *ds, const value_list_t *vl, int step)
+{
+  char name[6 * DATA_MAX_NAME_LEN];
+  cache_entry_t *ce = NULL;
+  int ret = -1;
+
+  if (FORMAT_VL (name, sizeof (name), vl) != 0)
+  {
+    ERROR ("uc_get_state: FORMAT_VL failed.");
+    return (STATE_ERROR);
+  }
+
+  pthread_mutex_lock (&cache_lock);
+
+  if (c_avl_get (cache_tree, name, (void *) &ce) == 0)
+  {
+    assert (ce != NULL);
+    ret = ce->hits;
+    ce->hits = ret + step;
+  }
+
+  pthread_mutex_unlock (&cache_lock);
+
+  return (ret);
+} /* int uc_inc_hits */
+
 /*
  * Meta data interface
  */
index 91a6a6d80913dbd3258974c703760050c4995d4f..f8059ecaf077dda6924122e3dc6452b4babfb282 100644 (file)
@@ -39,6 +39,9 @@ int uc_get_names (char ***ret_names, time_t **ret_times, size_t *ret_number);
 
 int uc_get_state (const data_set_t *ds, const value_list_t *vl);
 int uc_set_state (const data_set_t *ds, const value_list_t *vl, int state);
+int uc_get_hits (const data_set_t *ds, const value_list_t *vl);
+int uc_set_hits (const data_set_t *ds, const value_list_t *vl, int hits);
+int uc_inc_hits (const data_set_t *ds, const value_list_t *vl, int step);
 
 int uc_get_history (const data_set_t *ds, const value_list_t *vl,
     gauge_t *ret_history, size_t num_steps, size_t num_ds);