Eric Sirianni created HDFS-5680: ----------------------------------- Summary: Double-JSON-encoding of JMX attributes yields malformed JSON Key: HDFS-5680 URL: https://issues.apache.org/jira/browse/HDFS-5680 Project: Hadoop HDFS Issue Type: Bug Components: datanode, namenode Reporter: Eric Sirianni Priority: Minor
The practice of "double JSON encoding" JMX attributes: # in the {{MXBean}} itself using Jetty's {{JSON.toString(...)}} # in the {{JMXJsonServlet}} using Jackson results in malformed JSON documents (technically not "malformed", but doesn't properly allow for traversal into nested JSON structures). For example: {noformat} $ curl http://localhost:50070/jmx?get=Hadoop:service=NameNode,name=NameNodeInfo::NodeUsage { "beans" : [ { "name" : "Hadoop:service=NameNode,name=NameNodeInfo", "modelerType" : "org.apache.hadoop.hdfs.server.namenode.FSNamesystem", "NodeUsage" : "{\"nodeUsage\":{\"min\":\"0.00%\",\"median\":\"0.01%\",\"max\":\"0.01%\",\"stdDev\":\"0.00%\"}}" } ] {noformat} The {{NodeUsage}} attribute should instead be: {noformat} "NodeUsage" : {"nodeUsage":{"min":"0.00%","median":"0.01%","max":"0.01%","stdDev":"0.00%"}} {noformat} The Web UI seems to be aware of this and has applied a workaround: {code:title=dfshealth.js} // Workarounds for the fact that JMXJsonServlet returns non-standard JSON strings {code} Putting JMX aside, one fix would be to let {{JMXJsonServlet}} do all the encoding and simply have the {{MXBean}} return a {{Map}}. That would, however, likely not encode properly for native JMX access. I'm not familiar enough with how JMX is used elsewhere in Hadoop to suggest an alternative. -- This message was sent by Atlassian JIRA (v6.1.4#6159)