예제 #1
0
파일: gmond.c 프로젝트: boernd/collectd
static int mc_handle_metadata_msg (Ganglia_metadata_msg *msg) /* {{{ */
{
  switch (msg->id)
  {
    case gmetadata_full:
    {
      Ganglia_metadatadef msg_meta;
      staging_entry_t *se;
      const data_set_t *ds;
      metric_map_t *map;

      msg_meta = msg->Ganglia_metadata_msg_u.gfull;

      if (msg_meta.metric.tmax == 0)
        return (-1);

      map = metric_lookup (msg_meta.metric_id.name);
      if (map == NULL)
      {
        DEBUG ("gmond plugin: Not handling meta data %s.",
            msg_meta.metric_id.name);
        return (0);
      }

      ds = plugin_get_ds (map->type);
      if (ds == NULL)
      {
        WARNING ("gmond plugin: Could not find data set %s.", map->type);
        return (-1);
      }

      DEBUG ("gmond plugin: Received meta data for %s/%s.",
          msg_meta.metric_id.host, msg_meta.metric_id.name);

      pthread_mutex_lock (&staging_lock);
      se = staging_entry_get (msg_meta.metric_id.host,
          msg_meta.metric_id.name,
          map->type, map->type_instance,
          ds->ds_num);
      if (se != NULL)
        se->vl.interval = TIME_T_TO_CDTIME_T (msg_meta.metric.tmax);
      pthread_mutex_unlock (&staging_lock);

      if (se == NULL)
      {
        ERROR ("gmond plugin: staging_entry_get failed.");
        return (-1);
      }

      break;
    }

    default:
    {
      return (-1);
    }
  }

  return (0);
} /* }}} int mc_handle_metadata_msg */
예제 #2
0
파일: gmond.c 프로젝트: hasso/collectd
static int mc_handle_value_msg(Ganglia_value_msg *msg) /* {{{ */
{
  const char *host;
  const char *name;
  metric_map_t *map;

  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. */
  switch (msg->id) /* {{{ */
  {
  case gmetric_uint: {
    Ganglia_gmetric_uint msg_uint;

    msg_uint = msg->Ganglia_value_msg_u.gu_int;

    host = msg_uint.metric_id.host;
    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;
    int status;

    msg_string = msg->Ganglia_value_msg_u.gstr;

    host = msg_string.metric_id.host;
    name = msg_string.metric_id.name;

    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;
  }

  case gmetric_float: {
    Ganglia_gmetric_float msg_float;

    msg_float = msg->Ganglia_value_msg_u.gf;

    host = msg_float.metric_id.host;
    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;
  }

  case gmetric_double: {
    Ganglia_gmetric_double msg_double;

    msg_double = msg->Ganglia_value_msg_u.gd;

    host = msg_double.metric_id.host;
    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:
    DEBUG("gmond plugin: Value type not handled: %i", msg->id);
    return (-1);
  } /* }}} switch (msg->id) */

  assert(host != NULL);
  assert(name != NULL);

  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;
    else 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, val_copy));
  }

  DEBUG("gmond plugin: Cannot find a translation for %s.", name);
  return (-1);
} /* }}} int mc_handle_value_msg */