Merge branch 'collectd-4.6'
authorFlorian Forster <octo@leeloo.lan.home.verplant.org>
Sat, 14 Mar 2009 17:52:38 +0000 (18:52 +0100)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Sat, 14 Mar 2009 17:52:38 +0000 (18:52 +0100)
1  2 
src/bind.c
src/common.c
src/types.db

diff --combined src/bind.c
@@@ -239,6 -239,19 +239,6 @@@ static int memsummary_translation_table
    STATIC_ARRAY_SIZE (memsummary_translation_table);
  /* }}} */
  
 -static void remove_special (char *buffer, size_t buffer_size) /* {{{ */
 -{
 -  size_t i;
 -
 -  for (i = 0; i < buffer_size; i++)
 -  {
 -    if (buffer[i] == 0)
 -      return;
 -    if ((!isalnum ((int) buffer[i])) && (buffer[i] != '-'))
 -      buffer[i] = '_';
 -  }
 -} /* }}} void remove_special */
 -
  static void submit (time_t ts, const char *plugin_instance, /* {{{ */
      const char *type, const char *type_instance, value_t value)
  {
    if (plugin_instance) {
      sstrncpy(vl.plugin_instance, plugin_instance,
          sizeof(vl.plugin_instance));
 -    remove_special (vl.plugin_instance, sizeof (vl.plugin_instance));
 +    replace_special (vl.plugin_instance, sizeof (vl.plugin_instance));
    }
    sstrncpy(vl.type, type, sizeof(vl.type));
    if (type_instance) {
      sstrncpy(vl.type_instance, type_instance,
          sizeof(vl.type_instance));
 -    remove_special (vl.plugin_instance, sizeof (vl.plugin_instance));
 +    replace_special (vl.plugin_instance, sizeof (vl.plugin_instance));
    }
    plugin_dispatch_values(&vl);
  } /* }}} void submit */
@@@ -484,7 -497,7 +484,7 @@@ static int bind_parse_generic_name_valu
      list_callback_t list_callback,
      void *user_data,
      xmlDoc *doc, xmlXPathContext *xpathCtx,
-     time_t current_time)
+     time_t current_time, int ds_type)
  {
    xmlXPathObject *xpathObj = NULL;
    int num_entries;
        value_t value;
        int status;
  
-       status = bind_xml_read_counter (doc, counter, &value.counter);
+       if (ds_type == DS_TYPE_GAUGE)
+         status = bind_xml_read_gauge (doc, counter, &value.gauge);
+       else
+         status = bind_xml_read_counter (doc, counter, &value.counter);
        if (status != 0)
          continue;
  
@@@ -796,7 -812,7 +799,7 @@@ static int bind_xml_stats_handle_view (
      list_info_ptr_t list_info =
      {
        plugin_instance,
-       /* type = */ "dns_qtype"
+       /* type = */ "dns_qtype_gauge"
      };
  
      ssnprintf (plugin_instance, sizeof (plugin_instance), "%s-qtypes",
      bind_parse_generic_name_value (/* xpath = */ "rdtype",
          /* callback = */ bind_xml_list_callback,
          /* user_data = */ &list_info,
-         doc, path_ctx, current_time);
+         doc, path_ctx, current_time, DS_TYPE_COUNTER);
    } /* }}} */
  
    if (view->resolver_stats != 0) /* {{{ */
      bind_parse_generic_name_value ("resstat",
          /* callback = */ bind_xml_table_callback,
          /* user_data = */ &table_ptr,
-         doc, path_ctx, current_time);
+         doc, path_ctx, current_time, DS_TYPE_COUNTER);
    } /* }}} */
  
    if (view->cacherrsets != 0) /* {{{ */
      list_info_ptr_t list_info =
      {
        plugin_instance,
-       /* type = */ "dns_qtype"
+       /* type = */ "dns_qtype_gauge"
      };
  
      ssnprintf (plugin_instance, sizeof (plugin_instance), "%s-cache_rr_sets",
      bind_parse_generic_name_value (/* xpath = */ "cache/rrset",
          /* callback = */ bind_xml_list_callback,
          /* user_data = */ &list_info,
-         doc, path_ctx, current_time);
+         doc, path_ctx, current_time, DS_TYPE_GAUGE);
    } /* }}} */
  
    if (view->zones_num > 0)
@@@ -931,7 -947,7 +934,7 @@@ static int bind_xml_stats (int version
      bind_parse_generic_name_value (/* xpath = */ "server/requests/opcode",
          /* callback = */ bind_xml_list_callback,
          /* user_data = */ &list_info,
-         doc, xpathCtx, current_time);
+         doc, xpathCtx, current_time, DS_TYPE_COUNTER);
    }
  
    /* XPath:     server/queries-in/rdtype
      bind_parse_generic_name_value (/* xpath = */ "server/queries-in/rdtype",
          /* callback = */ bind_xml_list_callback,
          /* user_data = */ &list_info,
-         doc, xpathCtx, current_time);
+         doc, xpathCtx, current_time, DS_TYPE_COUNTER);
    }
    
    /* XPath:     server/nsstats, server/nsstat
        bind_parse_generic_name_value ("server/nsstat",
            /* callback = */ bind_xml_table_callback,
            /* user_data = */ &table_ptr,
-           doc, xpathCtx, current_time);
+           doc, xpathCtx, current_time, DS_TYPE_COUNTER);
      }
    }
  
        bind_parse_generic_name_value ("server/zonestat",
            /* callback = */ bind_xml_table_callback,
            /* user_data = */ &table_ptr,
-           doc, xpathCtx, current_time);
+           doc, xpathCtx, current_time, DS_TYPE_COUNTER);
      }
    }
  
        bind_parse_generic_name_value ("server/resstat",
            /* callback = */ bind_xml_table_callback,
            /* user_data = */ &table_ptr,
-           doc, xpathCtx, current_time);
+           doc, xpathCtx, current_time, DS_TYPE_COUNTER);
      }
    }
  
diff --combined src/common.c
@@@ -253,7 -253,7 +253,7 @@@ int strsplit (char *string, char **fiel
                        break;
        }
  
 -      return (i);
 +      return ((int) i);
  }
  
  int strjoin (char *dst, size_t dst_len,
@@@ -317,40 -317,6 +317,40 @@@ int strsubstitute (char *str, char c_fr
        return (ret);
  } /* int strsubstitute */
  
 +int strunescape (char *buf, size_t buf_len)
 +{
 +      size_t i;
 +
 +      for (i = 0; (i < buf_len) && (buf[i] != '\0'); ++i)
 +      {
 +              if (buf[i] != '\\')
 +                      continue;
 +
 +              if ((i >= buf_len) || (buf[i + 1] == '\0')) {
 +                      ERROR ("string unescape: backslash found at end of string.");
 +                      return (-1);
 +              }
 +
 +              switch (buf[i + 1]) {
 +                      case 't':
 +                              buf[i] = '\t';
 +                              break;
 +                      case 'n':
 +                              buf[i] = '\n';
 +                              break;
 +                      case 'r':
 +                              buf[i] = '\r';
 +                              break;
 +                      default:
 +                              buf[i] = buf[i + 1];
 +                              break;
 +              }
 +
 +              memmove (buf + i + 1, buf + i + 2, buf_len - i - 2);
 +      }
 +      return (0);
 +} /* int strunescape */
 +
  int escape_slashes (char *buf, int buf_len)
  {
        int i;
        return (0);
  } /* int escape_slashes */
  
 +void replace_special (char *buffer, size_t buffer_size)
 +{
 +      size_t i;
 +
 +      for (i = 0; i < buffer_size; i++)
 +      {
 +              if (buffer[i] == 0)
 +                      return;
 +              if ((!isalnum ((int) buffer[i])) && (buffer[i] != '-'))
 +                      buffer[i] = '_';
 +      }
 +} /* void replace_special */
 +
  int timeval_cmp (struct timeval tv0, struct timeval tv1, struct timeval *delta)
  {
        struct timeval *larger;
@@@ -578,26 -531,26 +578,26 @@@ int check_create_dir (const char *file_
  int get_kstat (kstat_t **ksp_ptr, char *module, int instance, char *name)
  {
        char ident[128];
+       *ksp_ptr = NULL;
        
        if (kc == NULL)
                return (-1);
  
        ssnprintf (ident, sizeof (ident), "%s,%i,%s", module, instance, name);
  
+       *ksp_ptr = kstat_lookup (kc, module, instance, name);
        if (*ksp_ptr == NULL)
        {
-               if ((*ksp_ptr = kstat_lookup (kc, module, instance, name)) == NULL)
-               {
-                       ERROR ("Cound not find kstat %s", ident);
-                       return (-1);
-               }
+               ERROR ("get_kstat: Cound not find kstat %s", ident);
+               return (-1);
+       }
  
-               if ((*ksp_ptr)->ks_type != KSTAT_TYPE_NAMED)
-               {
-                       WARNING ("kstat %s has wrong type", ident);
-                       *ksp_ptr = NULL;
-                       return (-1);
-               }
+       if ((*ksp_ptr)->ks_type != KSTAT_TYPE_NAMED)
+       {
+               ERROR ("get_kstat: kstat %s has wrong type", ident);
+               *ksp_ptr = NULL;
+               return (-1);
        }
  
  #ifdef assert
  
        if (kstat_read (kc, *ksp_ptr, NULL) == -1)
        {
-               WARNING ("kstat %s could not be read", ident);
+               ERROR ("get_kstat: kstat %s could not be read", ident);
                return (-1);
        }
  
        if ((*ksp_ptr)->ks_type != KSTAT_TYPE_NAMED)
        {
-               WARNING ("kstat %s has wrong type", ident);
+               ERROR ("get_kstat: kstat %s has wrong type", ident);
                return (-1);
        }
  
@@@ -837,30 -790,6 +837,30 @@@ int parse_identifier (char *str, char *
        return (0);
  } /* int parse_identifier */
  
 +int parse_value (const char *value, value_t *ret_value, const data_source_t ds)
 +{
 +      char *endptr = NULL;
 +
 +      if (DS_TYPE_COUNTER == ds.type)
 +              ret_value->counter = (counter_t)strtoll (value, &endptr, 0);
 +      else if (DS_TYPE_GAUGE == ds.type)
 +              ret_value->gauge = (gauge_t)strtod (value, &endptr);
 +      else {
 +              ERROR ("parse_value: Invalid data source \"%s\" "
 +                              "(type = %i).", ds.name, ds.type);
 +              return -1;
 +      }
 +
 +      if (value == endptr) {
 +              ERROR ("parse_value: Failed to parse string as number: %s.", value);
 +              return -1;
 +      }
 +      else if ((NULL != endptr) && ('\0' != *endptr))
 +              WARNING ("parse_value: Ignoring trailing garbage after number: %s.",
 +                              endptr);
 +      return 0;
 +} /* int parse_value */
 +
  int parse_values (char *buffer, value_list_t *vl, const data_set_t *ds)
  {
        int i;
                }
                else
                {
 -                      if (strcmp ("U", ptr) == 0)
 +                      if ((strcmp ("U", ptr) == 0) && (ds->ds[i].type == DS_TYPE_GAUGE))
                                vl->values[i].gauge = NAN;
 -                      else if (ds->ds[i].type == DS_TYPE_COUNTER)
 -                              vl->values[i].counter = atoll (ptr);
 -                      else if (ds->ds[i].type == DS_TYPE_GAUGE)
 -                              vl->values[i].gauge = atof (ptr);
 +                      else if (0 != parse_value (ptr, &vl->values[i], ds->ds[i]))
 +                              return -1;
                }
  
                i++;
diff --combined src/types.db
@@@ -20,20 -20,21 +20,21 @@@ disk_octets                read:COUNTER:0:17179869183
  disk_ops              read:COUNTER:0:4294967295, write:COUNTER:0:4294967295
  disk_time             read:COUNTER:0:1000000, write:COUNTER:0:1000000
  dns_answer            value:COUNTER:0:65535
+ dns_notify            value:COUNTER:0:65535
  dns_octets            queries:COUNTER:0:125000000, responses:COUNTER:0:125000000
  dns_opcode            value:COUNTER:0:65535
  dns_qtype             value:COUNTER:0:65535
+ dns_qtype_cached      value:GAUGE:0:4294967295
+ dns_query             value:COUNTER:0:65535
  dns_question          value:COUNTER:0:65535
  dns_rcode             value:COUNTER:0:65535
+ dns_reject            value:COUNTER:0:65535
  dns_request           value:COUNTER:0:65535
  dns_resolver          value:COUNTER:0:65535
+ dns_response          value:COUNTER:0:65535
+ dns_transfer          value:COUNTER:0:65535
  dns_update            value:COUNTER:0:65535
  dns_zops              value:COUNTER:0:65535
- dns_notify            value:COUNTER:0:65535
- dns_transfer          value:COUNTER:0:65535
- dns_query             value:COUNTER:0:65535
- dns_response          value:COUNTER:0:65535
- dns_reject            value:COUNTER:0:65535
  email_check           value:GAUGE:0:U
  email_count           value:GAUGE:0:U
  email_size            value:GAUGE:0:U
@@@ -84,11 -85,8 +85,11 @@@ pg_numbackends              value:GAUGE:0:
  pg_scan                       value:COUNTER:0:U
  pg_xact                       value:COUNTER:0:U
  ping                  ping:GAUGE:0:65535
 +ping_droprate         value:GAUGE:0:100
 +ping_stddev           value:GAUGE:0:65535
  players                       value:GAUGE:0:1000000
  power                 value:GAUGE:0:U
 +protocol_counter      value:COUNTER:0:U
  ps_count              processes:GAUGE:0:1000000, threads:GAUGE:0:1000000
  ps_cputime            user:COUNTER:0:16000000, syst:COUNTER:0:16000000
  ps_pagefaults         minflt:COUNTER:0:9223372036854775807, majflt:COUNTER:0:9223372036854775807