Merge pull request #647 from manuelluis/mlsr/threshold-missing_time
authorPierre-Yves Ritschard <pyr@spootnik.org>
Sat, 26 Jul 2014 07:22:07 +0000 (09:22 +0200)
committerPierre-Yves Ritschard <pyr@spootnik.org>
Sat, 26 Jul 2014 07:22:07 +0000 (09:22 +0200)
Plugin threshold: time is not set in missing notifications.

1  2 
src/threshold.c

diff --combined src/threshold.c
  #include "plugin.h"
  #include "utils_avltree.h"
  #include "utils_cache.h"
 +#include "utils_threshold.h"
  
  #include <assert.h>
  #include <pthread.h>
  
  /*
 - * Private data structures
 - * {{{ */
 -#define UT_FLAG_INVERT  0x01
 -#define UT_FLAG_PERSIST 0x02
 -#define UT_FLAG_PERCENTAGE 0x04
 -#define UT_FLAG_INTERESTING 0x08
 -#define UT_FLAG_PERSIST_OK 0x10
 -typedef struct threshold_s
 -{
 -  char host[DATA_MAX_NAME_LEN];
 -  char plugin[DATA_MAX_NAME_LEN];
 -  char plugin_instance[DATA_MAX_NAME_LEN];
 -  char type[DATA_MAX_NAME_LEN];
 -  char type_instance[DATA_MAX_NAME_LEN];
 -  char data_source[DATA_MAX_NAME_LEN];
 -  gauge_t warning_min;
 -  gauge_t warning_max;
 -  gauge_t failure_min;
 -  gauge_t failure_max;
 -  gauge_t hysteresis;
 -  unsigned int flags;
 -  int hits;
 -  struct threshold_s *next;
 -} threshold_t;
 -/* }}} */
 -
 -/*
 - * Private (static) variables
 - * {{{ */
 -static c_avl_tree_t   *threshold_tree = NULL;
 -static pthread_mutex_t threshold_lock = PTHREAD_MUTEX_INITIALIZER;
 -/* }}} */
 -
 -/*
   * Threshold management
   * ====================
   * The following functions add, delete, search, etc. configured thresholds to
   * the underlying AVL trees.
   */
 -/*
 - * threshold_t *threshold_get
 - *
 - * Retrieve one specific threshold configuration. For looking up a threshold
 - * matching a value_list_t, see "threshold_search" below. Returns NULL if the
 - * specified threshold doesn't exist.
 - */
 -static threshold_t *threshold_get (const char *hostname,
 -    const char *plugin, const char *plugin_instance,
 -    const char *type, const char *type_instance)
 -{ /* {{{ */
 -  char name[6 * DATA_MAX_NAME_LEN];
 -  threshold_t *th = NULL;
 -
 -  format_name (name, sizeof (name),
 -      (hostname == NULL) ? "" : hostname,
 -      (plugin == NULL) ? "" : plugin, plugin_instance,
 -      (type == NULL) ? "" : type, type_instance);
 -  name[sizeof (name) - 1] = '\0';
 -
 -  if (c_avl_get (threshold_tree, name, (void *) &th) == 0)
 -    return (th);
 -  else
 -    return (NULL);
 -} /* }}} threshold_t *threshold_get */
  
  /*
   * int ut_threshold_add
@@@ -113,6 -171,58 +113,6 @@@ static int ut_threshold_add (const thre
    return (status);
  } /* }}} int ut_threshold_add */
  
 -/* 
 - * threshold_t *threshold_search
 - *
 - * Searches for a threshold configuration using all the possible variations of
 - * "Host", "Plugin" and "Type" blocks. Returns NULL if no threshold could be
 - * found.
 - * XXX: This is likely the least efficient function in collectd.
 - */
 -static threshold_t *threshold_search (const value_list_t *vl)
 -{ /* {{{ */
 -  threshold_t *th;
 -
 -  if ((th = threshold_get (vl->host, vl->plugin, vl->plugin_instance,
 -        vl->type, vl->type_instance)) != NULL)
 -    return (th);
 -  else if ((th = threshold_get (vl->host, vl->plugin, vl->plugin_instance,
 -        vl->type, NULL)) != NULL)
 -    return (th);
 -  else if ((th = threshold_get (vl->host, vl->plugin, NULL,
 -        vl->type, vl->type_instance)) != NULL)
 -    return (th);
 -  else if ((th = threshold_get (vl->host, vl->plugin, NULL,
 -        vl->type, NULL)) != NULL)
 -    return (th);
 -  else if ((th = threshold_get (vl->host, "", NULL,
 -        vl->type, vl->type_instance)) != NULL)
 -    return (th);
 -  else if ((th = threshold_get (vl->host, "", NULL,
 -        vl->type, NULL)) != NULL)
 -    return (th);
 -  else if ((th = threshold_get ("", vl->plugin, vl->plugin_instance,
 -        vl->type, vl->type_instance)) != NULL)
 -    return (th);
 -  else if ((th = threshold_get ("", vl->plugin, vl->plugin_instance,
 -        vl->type, NULL)) != NULL)
 -    return (th);
 -  else if ((th = threshold_get ("", vl->plugin, NULL,
 -        vl->type, vl->type_instance)) != NULL)
 -    return (th);
 -  else if ((th = threshold_get ("", vl->plugin, NULL,
 -        vl->type, NULL)) != NULL)
 -    return (th);
 -  else if ((th = threshold_get ("", "", NULL,
 -        vl->type, vl->type_instance)) != NULL)
 -    return (th);
 -  else if ((th = threshold_get ("", "", NULL,
 -        vl->type, NULL)) != NULL)
 -    return (th);
 -
 -  return (NULL);
 -} /* }}} threshold_t *threshold_search */
 -
  /*
   * Configuration
   * =============
@@@ -752,7 -862,7 +752,7 @@@ static int ut_check_one_threshold (cons
   *
   * Gets a list of matching thresholds and searches for the worst status by one
   * of the thresholds. Then reports that status using the ut_report_state
 - * function above. 
 + * function above.
   * Returns zero on success and if no threshold has been configured. Returns
   * less than zero on failure.
   */
@@@ -832,6 -942,7 +832,7 @@@ static int ut_missing (const value_list
    cdtime_t missing_time;
    char identifier[6 * DATA_MAX_NAME_LEN];
    notification_t n;
+   cdtime_t now;
  
    if (threshold_tree == NULL)
      return (0);
    if ((th == NULL) || ((th->flags & UT_FLAG_INTERESTING) == 0))
      return (0);
  
-   missing_time = cdtime () - vl->time;
+   now = cdtime ();
+   missing_time = now - vl->time;
    FORMAT_VL (identifier, sizeof (identifier), vl);
  
    NOTIFICATION_INIT_VL (&n, vl);
    ssnprintf (n.message, sizeof (n.message),
        "%s has not been updated for %.3f seconds.",
        identifier, CDTIME_T_TO_DOUBLE (missing_time));
+   n.time = now;
  
    plugin_dispatch_notification (&n);
  
@@@ -880,7 -993,7 +883,7 @@@ int ut_config (oconfig_item_t *ci
    th.hits = 0;
    th.hysteresis = 0;
    th.flags = UT_FLAG_INTERESTING; /* interesting by default */
 -    
 +
    for (i = 0; i < ci->children_num; i++)
    {
      oconfig_item_t *option = ci->children + i;