Bob Barrett created KAFKA-10860:
-----------------------------------

             Summary: JmxTool fails with NPE when object-name contains a 
wildcard
                 Key: KAFKA-10860
                 URL: https://issues.apache.org/jira/browse/KAFKA-10860
             Project: Kafka
          Issue Type: Bug
            Reporter: Bob Barrett


When running JmxTool with a wildcard in the object name, the tool fails with a 
NullPointerException:
{code:java}
bin/kafka-run-class kafka.tools.JmxTool --jmx-url 
service:jmx:rmi:///jndi/rmi://localhost:7777/jmxrmi --object-name 
kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec,topic=*
Trying to connect to JMX url: 
service:jmx:rmi:///jndi/rmi://localhost:7777/jmxrmi.
Exception in thread "main" java.lang.NullPointerException at 
kafka.tools.JmxTool$.main(JmxTool.scala:194) at 
kafka.tools.JmxTool.main(JmxTool.scala)
{code}
It seems that we never populate the `names` variable when the object name 
includes a pattern:
{code:java}
var names: Iterable[ObjectName] = null
def namesSet = Option(names).toSet.flatten
def foundAllObjects = queries.toSet == namesSet
val waitTimeoutMs = 10000
if (!hasPatternQueries) {
  val start = System.currentTimeMillis
  do {
    if (names != null) {
      System.err.println("Could not find all object names, retrying")
      Thread.sleep(100)
    }
    names = queries.flatMap((name: ObjectName) => mbsc.queryNames(name, 
null).asScala)
  } while (wait && System.currentTimeMillis - start < waitTimeoutMs && 
!foundAllObjects)
}

if (wait && !foundAllObjects) {
  val missing = (queries.toSet - namesSet).mkString(", ")
  System.err.println(s"Could not find all requested object names after 
$waitTimeoutMs ms. Missing $missing")
  System.err.println("Exiting.")
  sys.exit(1)
}

val numExpectedAttributes: Map[ObjectName, Int] =
  if (!attributesWhitelistExists)
    names.map{name: ObjectName =>
      val mbean = mbsc.getMBeanInfo(name)
      (name, mbsc.getAttributes(name, 
mbean.getAttributes.map(_.getName)).size)}.toMap
  else {
    if (!hasPatternQueries)
      names.map{name: ObjectName =>
        val mbean = mbsc.getMBeanInfo(name)
        val attributes = mbsc.getAttributes(name, 
mbean.getAttributes.map(_.getName))
        val expectedAttributes = 
attributes.asScala.asInstanceOf[mutable.Buffer[Attribute]]
          .filter(attr => attributesWhitelist.get.contains(attr.getName))
        (name, expectedAttributes.size)}.toMap.filter(_._2 > 0)
    else
      queries.map((_, attributesWhitelist.get.length)).toMap
  }
{code}
We need to add logic to query the object names that match the pattern when a 
pattern is part of the input.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to