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)