[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