X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Futils_format_json.c;h=65c886b6fc28239183be31d8a10a896ec5f7800c;hb=83077c18c3e78739c2d2d18debf99875944eaa72;hp=e8fcb35baac06cd6694f4926e18d391758b09876;hpb=670442e38158af0eb6b4a4efa6becfa6696129e7;p=collectd.git diff --git a/src/utils_format_json.c b/src/utils_format_json.c index e8fcb35b..65c886b6 100644 --- a/src/utils_format_json.c +++ b/src/utils_format_json.c @@ -112,27 +112,24 @@ static int values_to_json (char *buffer, size_t buffer_size, /* {{{ */ else BUFFER_ADD ("null"); } - else if (ds->ds[i].type == DS_TYPE_COUNTER) + else if (store_rates) { - if (store_rates != 0) + if (rates == NULL) + rates = uc_get_rate (ds, vl); + if (rates == NULL) { - if (rates == NULL) - rates = uc_get_rate (ds, vl); - if (rates == NULL) - { - WARNING ("utils_format_json: " - "uc_get_rate failed."); - sfree(rates); - return (-1); - } - if(isfinite (rates[i])) - BUFFER_ADD ("%g", rates[i]); - else - BUFFER_ADD ("null"); + WARNING ("utils_format_json: uc_get_rate failed."); + sfree(rates); + return (-1); } + + if(isfinite (rates[i])) + BUFFER_ADD ("%g", rates[i]); else - BUFFER_ADD ("%llu", vl->values[i].counter); + BUFFER_ADD ("null"); } + else if (ds->ds[i].type == DS_TYPE_COUNTER) + BUFFER_ADD ("%llu", vl->values[i].counter); else if (ds->ds[i].type == DS_TYPE_DERIVE) BUFFER_ADD ("%"PRIi64, vl->values[i].derive); else if (ds->ds[i].type == DS_TYPE_ABSOLUTE) @@ -141,6 +138,7 @@ static int values_to_json (char *buffer, size_t buffer_size, /* {{{ */ { ERROR ("format_json: Unknown data source type: %i", ds->ds[i].type); + sfree (rates); return (-1); } } /* for ds->ds_num */ @@ -153,6 +151,80 @@ static int values_to_json (char *buffer, size_t buffer_size, /* {{{ */ return (0); } /* }}} int values_to_json */ +static int dstypes_to_json (char *buffer, size_t buffer_size, /* {{{ */ + const data_set_t *ds, const value_list_t *vl) +{ + size_t offset = 0; + int i; + + memset (buffer, 0, buffer_size); + +#define BUFFER_ADD(...) do { \ + int status; \ + 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 ("["); + for (i = 0; i < ds->ds_num; i++) + { + if (i > 0) + BUFFER_ADD (","); + + BUFFER_ADD ("\"%s\"", DS_TYPE_TO_STRING (ds->ds[i].type)); + } /* for ds->ds_num */ + BUFFER_ADD ("]"); + +#undef BUFFER_ADD + + DEBUG ("format_json: dstypes_to_json: buffer = %s;", buffer); + + return (0); +} /* }}} int dstypes_to_json */ + +static int dsnames_to_json (char *buffer, size_t buffer_size, /* {{{ */ + const data_set_t *ds, const value_list_t *vl) +{ + size_t offset = 0; + int i; + + memset (buffer, 0, buffer_size); + +#define BUFFER_ADD(...) do { \ + int status; \ + 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 ("["); + for (i = 0; i < ds->ds_num; i++) + { + if (i > 0) + BUFFER_ADD (","); + + BUFFER_ADD ("\"%s\"", ds->ds[i].name); + } /* for ds->ds_num */ + BUFFER_ADD ("]"); + +#undef BUFFER_ADD + + DEBUG ("format_json: dsnames_to_json: buffer = %s;", buffer); + + return (0); +} /* }}} int dsnames_to_json */ + 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) { @@ -182,8 +254,18 @@ static int value_list_to_json (char *buffer, size_t buffer_size, /* {{{ */ 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); + BUFFER_ADD (",\"interval\":%.3f", CDTIME_T_TO_DOUBLE (vl->interval)); #define BUFFER_ADD_KEYVAL(key, value) do { \ status = escape_string (temp, sizeof (temp), (value)); \