static int value_list_to_json(char *buffer, size_t buffer_size, /* {{{ */ const data_set_t *ds, const value_list_t *vl, int store_rates) { char temp[512]; size_t offset = 0; int status; memset(buffer, 0, buffer_size); #define BUFFER_ADD(...) \ do { \ status = ssnprintf(buffer + offset, buffer_size - offset, __VA_ARGS__); \ if (status < 1) \ return (-1); \ else if (((size_t)status) >= (buffer_size - offset)) \ return (-ENOMEM); \ else \ offset += ((size_t)status); \ } while (0) /* All value lists have a leading comma. The first one will be replaced with * a square bracket in `format_json_finalize'. */ BUFFER_ADD(",{"); status = values_to_json(temp, sizeof(temp), ds, vl, store_rates); if (status != 0) return (status); BUFFER_ADD("\"values\":%s", temp); status = dstypes_to_json(temp, sizeof(temp), ds); if (status != 0) return (status); BUFFER_ADD(",\"dstypes\":%s", temp); status = dsnames_to_json(temp, sizeof(temp), ds); if (status != 0) return (status); BUFFER_ADD(",\"dsnames\":%s", temp); BUFFER_ADD(",\"time\":%.3f", CDTIME_T_TO_DOUBLE(vl->time)); BUFFER_ADD(",\"interval\":%.3f", CDTIME_T_TO_DOUBLE(vl->interval)); #define BUFFER_ADD_KEYVAL(key, value) \ do { \ status = json_escape_string(temp, sizeof(temp), (value)); \ if (status != 0) \ return (status); \ BUFFER_ADD(",\"%s\":%s", (key), temp); \ } while (0) BUFFER_ADD_KEYVAL("host", vl->host); BUFFER_ADD_KEYVAL("plugin", vl->plugin); BUFFER_ADD_KEYVAL("plugin_instance", vl->plugin_instance); BUFFER_ADD_KEYVAL("type", vl->type); BUFFER_ADD_KEYVAL("type_instance", vl->type_instance); if (vl->meta != NULL) { char meta_buffer[buffer_size]; memset(meta_buffer, 0, sizeof(meta_buffer)); status = meta_data_to_json(meta_buffer, sizeof(meta_buffer), vl->meta); if (status != 0) return (status); BUFFER_ADD(",\"meta\":%s", meta_buffer); } /* if (vl->meta != NULL) */ BUFFER_ADD("}"); #undef BUFFER_ADD_KEYVAL #undef BUFFER_ADD DEBUG("format_json: value_list_to_json: buffer = %s;", buffer); return (0); } /* }}} int value_list_to_json */
int value_list_to_json (char *buffer, size_t buffer_size, /* {{{ */ const data_set_t *ds, const value_list_t *vl, int store_rates) { char temp[512]; size_t offset = 0; int status; memset (buffer, 0, buffer_size); #define BUFFER_ADD(...) do { \ status = ssnprintf (buffer + offset, buffer_size - offset, \ __VA_ARGS__); \ if (status < 1) \ return (-1); \ else if (((size_t) status) >= (buffer_size - offset)) \ return (-ENOMEM); \ else \ offset += ((size_t) status); \ } while (0) BUFFER_ADD ("{"); status = values_to_json (temp, sizeof (temp), ds, vl, store_rates); if (status != 0) return (status); BUFFER_ADD ("\"values\":%s", temp); status = dstypes_to_json (temp, sizeof (temp), ds, vl); if (status != 0) return (status); BUFFER_ADD (",\"dstypes\":%s", temp); status = dsnames_to_json (temp, sizeof (temp), ds, vl); if (status != 0) return (status); BUFFER_ADD (",\"dsnames\":%s", temp); BUFFER_ADD (",\"time\":%lu", (unsigned long) vl->time); BUFFER_ADD (",\"interval\":%i", vl->interval); #define BUFFER_ADD_KEYVAL(key, value) do { \ status = escape_string (temp, sizeof (temp), (value)); \ if (status != 0) \ return (status); \ BUFFER_ADD (",\"%s\":%s", (key), temp); \ } while (0) BUFFER_ADD_KEYVAL ("host", vl->host); BUFFER_ADD_KEYVAL ("plugin", vl->plugin); BUFFER_ADD_KEYVAL ("plugin_instance", vl->plugin_instance); BUFFER_ADD_KEYVAL ("type", vl->type); BUFFER_ADD_KEYVAL ("type_instance", vl->type_instance); BUFFER_ADD ("}"); #undef BUFFER_ADD_KEYVAL #undef BUFFER_ADD DEBUG ("format_json: value_list_to_json: buffer = %s;", buffer); return (0); } /* }}} int value_list_to_json */
static int value_list_to_kairosdb(char *buffer, size_t buffer_size, /* {{{ */ const data_set_t *ds, const value_list_t *vl, int store_rates, char const *const *http_attrs, size_t http_attrs_num, int data_ttl, char const *metrics_prefix) { char temp[512]; size_t offset = 0; int status; memset(buffer, 0, buffer_size); #define BUFFER_ADD(...) \ do { \ status = snprintf(buffer + offset, buffer_size - offset, __VA_ARGS__); \ if (status < 1) \ return -1; \ else if (((size_t)status) >= (buffer_size - offset)) \ return -ENOMEM; \ else \ offset += ((size_t)status); \ } while (0) #define BUFFER_ADD_KEYVAL(key, value) \ do { \ status = kairosdb_escape_string(temp, sizeof(temp), (value)); \ if (status != 0) \ return status; \ BUFFER_ADD(",\"%s\": %s", (key), temp); \ } while (0) for (size_t i = 0; i < ds->ds_num; i++) { /* All value lists have a leading comma. The first one will be replaced with * a square bracket in `format_kairosdb_finalize'. */ BUFFER_ADD(",{\"name\":\""); if (metrics_prefix != NULL) { BUFFER_ADD("%s.", metrics_prefix); } BUFFER_ADD("%s", vl->plugin); status = values_to_kairosdb(temp, sizeof(temp), ds, vl, store_rates, i); if (status != 0) return status; BUFFER_ADD("\", \"datapoints\": %s", temp); /* * Now adds meta data to metric as tags */ memset(temp, 0, sizeof(temp)); if (data_ttl != 0) BUFFER_ADD(", \"ttl\": %i", data_ttl); BUFFER_ADD(", \"tags\":\{"); BUFFER_ADD("\"host\": \"%s\"", vl->host); for (size_t j = 0; j < http_attrs_num; j += 2) { BUFFER_ADD(", \"%s\":", http_attrs[j]); BUFFER_ADD(" \"%s\"", http_attrs[j + 1]); } if (strlen(vl->plugin_instance)) BUFFER_ADD_KEYVAL("plugin_instance", vl->plugin_instance); BUFFER_ADD_KEYVAL("type", vl->type); if (strlen(vl->type_instance)) BUFFER_ADD_KEYVAL("type_instance", vl->type_instance); if (ds->ds_num != 1) BUFFER_ADD_KEYVAL("ds", ds->ds[i].name); BUFFER_ADD("}}"); } /* for ds->ds_num */ #undef BUFFER_ADD_KEYVAL #undef BUFFER_ADD DEBUG("format_kairosdb: value_list_to_kairosdb: buffer = %s;", buffer); return 0; } /* }}} int value_list_to_kairosdb */