cerebro_nodelist_t cerebro_get_metric_data(cerebro_t handle, const char *metric_name) { struct cerebro_nodelist *nodelist = NULL; if (_cerebro_handle_check(handle) < 0) goto cleanup; if (!metric_name || strlen(metric_name) > CEREBRO_MAX_METRIC_NAME_LEN) { handle->errnum = CEREBRO_ERR_PARAMETERS; goto cleanup; } if (!(nodelist = _cerebro_nodelist_create(handle, metric_name))) goto cleanup; if (_cerebro_metric_get_data(handle, nodelist, metric_name, _receive_metric_data_response) < 0) goto cleanup; if (_cerebro_nodelist_sort(nodelist) < 0) goto cleanup; handle->errnum = CEREBRO_ERR_SUCCESS; return nodelist; cleanup: if (nodelist) (void)cerebro_nodelist_destroy(nodelist); return NULL; }
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; }
/* * _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); }