Пример #1
0
static int
_get_metric_data (cerebro_t ch, char *name, List rl)
{
    int retval; 
    cerebro_nodelist_t n = NULL;
    cerebro_nodelist_iterator_t nitr;
    cmetric_t c;
    unsigned int time, type, size;
    void *value;
    char *nodename;

    if (!(n = cerebro_get_metric_data (ch, name))) {
        if (lmt_conf_get_cbr_debug ())
            msg ("error getting metric data for %s: %s",
                 name, cerebro_strerror (cerebro_errnum (ch)));
        goto done;
    }
    if (!(nitr = cerebro_nodelist_iterator_create (n))) {
        if (lmt_conf_get_cbr_debug ())
            msg ("error creating nodelist iterator for %s metric data: %s",
                 name, cerebro_strerror (cerebro_errnum (ch)));
        goto done;
    }
    while (!cerebro_nodelist_iterator_at_end (nitr)) {
        if (cerebro_nodelist_iterator_nodename (nitr, &nodename) < 0 ||
            cerebro_nodelist_iterator_metric_value (nitr,
                                       &time, &type, &size, &value) < 0) {
            if (lmt_conf_get_cbr_debug ())
                msg ("error retrieving metric value for %s: %s", name,
                   cerebro_strerror (cerebro_nodelist_iterator_errnum (nitr)));
            goto done;
        }
        c = _create_cmetric (name, nodename, time, type, size, value);
        if (!(list_append (rl, c))) {
            _destroy_cmetric (c);
            goto done;
        }
        if (cerebro_nodelist_iterator_next (nitr) < 0) {
            if (lmt_conf_get_cbr_debug ())
                msg ("error iterating on metric %s: %s", name,
                   cerebro_strerror (cerebro_nodelist_iterator_errnum (nitr)));
            goto done;
        }
    }
    retval = 0;
done:
    if (n)
        cerebro_nodelist_destroy (n); /* side effect: destroys nitr */
    return retval;
}
Пример #2
0
/*
 * _metric_data
 *
 * Output list of all available metrics
 */
static void
_metric_data(void)
{
  const char *func = __FUNCTION__;
  cerebro_nodelist_t n = NULL;
  cerebro_nodelist_iterator_t nitr = NULL;
  List l = NULL;

  if (!(n = cerebro_get_metric_data(handle, metric_name)))
    {
      char *msg = cerebro_strerror(cerebro_errnum(handle));

      _clean_err_exit(cerebro_errnum(handle));
      err_exit("%s: cerebro_get_metric_data: %s", func, msg);
    }
  
  if (!(nitr = cerebro_nodelist_iterator_create(n)))
    {
      char *msg = cerebro_strerror(cerebro_nodelist_errnum(n));
      err_exit("%s: cerebro_nodelist_iterator_create: %s", func, msg);
    }

  l = List_create((ListDelF)_Free);

  while (!cerebro_nodelist_iterator_at_end(nitr))
    {
      struct node_metric_data *data = NULL;

      data = Malloc(sizeof(struct node_metric_data));
      memset(data, '\0', sizeof(struct node_metric_data));

      if (cerebro_nodelist_iterator_nodename(nitr, &(data->nodename)) < 0)
        {
          char *msg = cerebro_strerror(cerebro_nodelist_iterator_errnum(nitr));
          err_exit("%s: cerebro_nodelist_iterator_nodename: %s", func, msg);
        }

      if (cerebro_nodelist_iterator_metric_value(nitr, 
                                                 &(data->metric_value_received_time),
                                                 &(data->metric_value_type),
                                                 &(data->metric_value_len),
                                                 &(data->metric_value)) < 0)
        {
          char *msg = cerebro_strerror(cerebro_nodelist_iterator_errnum(nitr));
          err_exit("%s: cerebro_nodelist_iterator_metric_value: %s", func, msg);
        }

      List_append(l, data);
      
      if (cerebro_nodelist_iterator_next(nitr) < 0)
        {
          char *msg = cerebro_strerror(cerebro_nodelist_iterator_errnum(nitr));
          err_exit("%s: cerebro_nodelist_iterator_next: %s", func, msg);
        }
    }

  if (!strcmp(metric_name, CEREBRO_METRIC_CLUSTER_NODES))
    _cluster_nodes_output(l);
  else if (output_type == CEREBRO_STAT_NEWLINE)
    _newline_output(l);
  else if (output_type == CEREBRO_STAT_HOSTRANGE)
    _hostrange_output(l);

  /* List_destroy() and cerebro_nodelist_destory() destroy iterators too */
  List_destroy(l);
  (void)cerebro_nodelist_destroy(n);
}