You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@kafka.apache.org by "Bob Barrett (Jira)" <ji...@apache.org> on 2020/12/16 19:12:00 UTC

[jira] [Created] (KAFKA-10860) JmxTool fails with NPE when object-name contains a wildcard

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)