[collectd] [PATCH] utils_format_json: serialize nan and inf as null, as per JSON spec
Chris Buben
cbuben at eventlogic.com
Thu Feb 4 09:52:30 CET 2010
I'm deserializing JSON output from the write_http plugin using ruby-yajl.
yajl was puking on the literal value nan encoded in the output.
[
{
"plugin": "memcached",
"interval": 10,
"host": "myhost",
"values": [
nan,
5
],
"time": 1265239180,
"plugin_instance": "",
"type_instance": "",
"type": "ps_count"
}
]
After some research, ECMA-262 15.12.3 says nan and infinite numbers
aren't representable in JSON and should be serialized as the string
null. I figure any strictly-compliant JSON parser will fail on parsing
JSON data containing nans as emitted by collectd's utils_format_json
routines.
This patch makes collectd's JSON output compliant in the case of
infinite or nan gauge values.
---
src/utils_format_json.c | 7 ++++++-
1 files changed, 6 insertions(+), 1 deletions(-)
diff --git a/src/utils_format_json.c b/src/utils_format_json.c
index a919316..dda2234 100644
--- a/src/utils_format_json.c
+++ b/src/utils_format_json.c
@@ -98,7 +98,12 @@ static int values_to_json (char *buffer, size_t buffer_size, /* {{{ */
BUFFER_ADD (",");
if (ds->ds[i].type == DS_TYPE_GAUGE)
- BUFFER_ADD ("%g", vl->values[i].gauge);
+ {
+ if(isnan(vl->values[i].gauge) || isinf(vl->values[i].gauge))
+ BUFFER_ADD ("null");
+ else
+ BUFFER_ADD ("%g", vl->values[i].gauge);
+ }
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)
--
1.6.5.2
More information about the collectd
mailing list