Various plugins: Convert more plugins to use "derive" instead of "counter".
[collectd.git] / src / gmond.c
index 006f5b8..3c746c4 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * collectd - src/gmond.c
- * Copyright (C) 2009  Florian octo Forster
+ * Copyright (C) 2009,2010  Florian octo Forster
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
@@ -16,7 +16,7 @@
  * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
  *
  * Authors:
- *   Florian octo Forster <octo at verplant.org>
+ *   Florian octo Forster <octo at collectd.org>
  **/
 
 #include "collectd.h"
@@ -541,6 +541,13 @@ static int staging_entry_update (const char *host, const char *name, /* {{{ */
     se->vl.values[ds_index].counter += value.counter;
   else if (ds_type == DS_TYPE_GAUGE)
     se->vl.values[ds_index].gauge = value.gauge;
+  else if (ds_type == DS_TYPE_DERIVE)
+    se->vl.values[ds_index].derive += value.derive;
+  else if (ds_type == DS_TYPE_ABSOLUTE)
+    se->vl.values[ds_index].absolute = value.absolute;
+  else
+    assert (23 == 42);
+
   se->flags |= (0x01 << ds_index);
 
   /* Check if all values have been set and submit if so. */
@@ -565,6 +572,7 @@ static int mc_handle_value_msg (Ganglia_value_msg *msg) /* {{{ */
 
   value_t value_counter;
   value_t value_gauge;
+  value_t value_derive;
 
   /* Fill in `host', `name', `value_counter', and `value_gauge' according to
    * the value type, or return with an error. */
@@ -580,32 +588,32 @@ static int mc_handle_value_msg (Ganglia_value_msg *msg) /* {{{ */
       name = msg_uint.metric_id.name;
       value_counter.counter = (counter_t) msg_uint.ui;
       value_gauge.gauge = (gauge_t) msg_uint.ui;
+      value_derive.derive = (derive_t) msg_uint.ui;
       break;
     }
 
     case gmetric_string:
     {
       Ganglia_gmetric_string msg_string;
-      char *endptr;
+      int status;
 
       msg_string = msg->Ganglia_value_msg_u.gstr;
 
       host = msg_string.metric_id.host;
       name = msg_string.metric_id.name;
 
-      endptr = NULL;
-      errno = 0;
-      value_counter.counter = (counter_t) strtoull (msg_string.str,
-          &endptr, /* base = */ 0);
-      if ((endptr == msg_string.str) || (errno != 0))
-        value_counter.counter = -1;
-
-      endptr = NULL;
-      errno = 0;
-      value_gauge.gauge = (gauge_t) strtod (msg_string.str, &endptr);
-      if ((endptr == msg_string.str) || (errno != 0))
+      status = parse_value (msg_string.str, &value_derive, DS_TYPE_DERIVE);
+      if (status != 0)
+        value_derive.derive = -1;
+
+      status = parse_value (msg_string.str, &value_gauge, DS_TYPE_GAUGE);
+      if (status != 0)
         value_gauge.gauge = NAN;
 
+      status = parse_value (msg_string.str, &value_counter, DS_TYPE_COUNTER);
+      if (status != 0)
+        value_counter.counter = 0;
+
       break;
     }
 
@@ -619,6 +627,7 @@ static int mc_handle_value_msg (Ganglia_value_msg *msg) /* {{{ */
       name = msg_float.metric_id.name;
       value_counter.counter = (counter_t) msg_float.f;
       value_gauge.gauge = (gauge_t) msg_float.f;
+      value_derive.derive = (derive_t) msg_float.f;
       break;
     }
 
@@ -632,6 +641,7 @@ static int mc_handle_value_msg (Ganglia_value_msg *msg) /* {{{ */
       name = msg_double.metric_id.name;
       value_counter.counter = (counter_t) msg_double.d;
       value_gauge.gauge = (gauge_t) msg_double.d;
+      value_derive.derive = (derive_t) msg_double.d;
       break;
     }
     default:
@@ -644,10 +654,24 @@ static int mc_handle_value_msg (Ganglia_value_msg *msg) /* {{{ */
 
   map = metric_lookup (name);
   if (map != NULL)
+  {
+    value_t val_copy;
+
+    if ((map->ds_type == DS_TYPE_COUNTER)
+        || (map->ds_type == DS_TYPE_ABSOLUTE))
+      val_copy = value_counter;
+    if (map->ds_type == DS_TYPE_GAUGE)
+      val_copy = value_gauge;
+    else if (map->ds_type == DS_TYPE_DERIVE)
+      val_copy = value_derive;
+    else
+      assert (23 == 42);
+
     return (staging_entry_update (host, name,
           map->type, map->type_instance,
           map->ds_index, map->ds_type,
-          (map->ds_type == DS_TYPE_COUNTER) ? value_counter : value_gauge));
+          val_copy));
+  }
 
   DEBUG ("gmond plugin: Cannot find a translation for %s.", name);
   return (-1);
@@ -693,7 +717,7 @@ static int mc_handle_metadata_msg (Ganglia_metadata_msg *msg) /* {{{ */
           map->type, map->type_instance,
           ds->ds_num);
       if (se != NULL)
-        se->vl.interval = (int) msg_meta.metric.tmax;
+        se->vl.interval = TIME_T_TO_CDTIME_T (msg_meta.metric.tmax);
       pthread_mutex_unlock (&staging_lock);
 
       if (se == NULL)