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)

Reply via email to